source: abuse/trunk/src/config.cpp @ 2

Last change on this file since 2 was 2, checked in by Sam Hocevar, 18 years ago
  • imported original 0.7.0 tarball
File size: 4.7 KB
Line 
1#include "keys.hpp"
2#include "lisp.hpp"
3#include <ctype.h>
4#include "joy.hpp"
5#include "jwindow.hpp"
6#include "config.hpp"
7#include "game.hpp"
8
9extern int get_key_binding( char *dir, int i );
10
11extern window_manager *eh;
12int key_players = 0;
13int morph_detail = MEDIUM_DETAIL;
14
15struct player_keys
16{
17        int joy, left, right, up, down, b1, b2, b3, b4;
18};
19
20player_keys *key_map = NULL;
21
22int binding_for_player( int player )
23{
24        char tmp[40];
25        sprintf( tmp, "player%d", player );
26        Cell *f = find_symbol( tmp );
27        if( !NILP( f ) && DEFINEDP( symbol_value( f ) ) )
28        {
29                void *what = symbol_value( f );
30                if( what == make_find_symbol( "keyboard" ) )
31                        return 1;
32                else if( what == make_find_symbol( "joystick" ) )
33                        return 2;
34        }
35        return 0;
36}
37
38/*
39int get_key_binding(char *dir, int i)
40{
41        char tmp[100], kn[50];
42        sprintf( tmp, "player%d-%s", i, dir );
43        Cell *f = find_symbol( tmp );
44        if( NILP(f) || !DEFINEDP( symbol_value( f ) ) )
45                return 0;
46        void *k = symbol_value( f );
47
48        if( item_type( k ) != L_SYMBOL )
49                return 0;
50
51#ifdef SCADALISP
52        strcpy( tmp, symbol_name( k ) );
53#else
54        strcpy( tmp, lstring_value( symbol_name( k ) ) );
55#endif
56
57        for( char *c = tmp; *c; c++ )
58        {
59                *c = tolower( *c );
60                if( *c == '_' )
61                        *c = ' ';
62        }
63
64        for( int j = 0; j < JK_MAX_KEY; j++ )
65        {
66                key_name( j, kn );
67                for( char *c = kn; *c; c++ )
68                {
69                        *c = tolower(*c);
70                }
71                if( !strcmp( kn, tmp ) )
72                        return j;
73        }
74        return 0;
75}
76*/
77
78/*
79void get_key_bindings()
80{
81        if( key_map )
82        {
83                jfree( key_map );
84        }
85        key_map = NULL;
86
87        for( key_players = 0; binding_for_player( key_players + 1); key_players++ );
88        if( key_players )
89        {
90                key_map = ( player_keys *)jmalloc(sizeof(player_keys)*key_players,"key bindings");
91                for( int i = 0; i < key_players; i++ )
92                {
93                        key_map[i].joy = ( binding_for_player( i + 1 ) == 2 );
94                        if( !key_map[i].joy )
95                        {
96                                key_map[i].left = get_key_binding( "left", i + 1 );
97                                key_map[i].right = get_key_binding( "right", i + 1 );
98                                key_map[i].up = get_key_binding( "up", i + 1 );
99                                key_map[i].down = get_key_binding( "down", i + 1 );
100                                key_map[i].b4 = get_key_binding( "b4", i + 1 );
101                                key_map[i].b3 = get_key_binding( "b3", i + 1 );
102                                key_map[i].b2 = get_key_binding( "b2", i + 1 );
103                                key_map[i].b1 = get_key_binding( "b1", i + 1 );
104                        }
105                }
106        }
107        else
108        {
109                key_map = NULL;
110        }
111}*/
112
113// AK
114void get_key_bindings()
115{
116        if( key_map )
117        {
118                jfree( key_map );
119        }
120        key_map = NULL;
121
122        key_players = 1;
123        key_map = (player_keys *)jmalloc( sizeof( player_keys ) * key_players, "key bindings" );
124        for( int i = 0; i < key_players; i++ )
125        {
126                key_map[i].joy = 0;
127                key_map[i].left = get_key_binding( "left", i + 1 );
128                key_map[i].right = get_key_binding( "right", i + 1 );
129                key_map[i].up = get_key_binding( "up", i + 1 );
130                key_map[i].down = get_key_binding( "down", i + 1 );
131                key_map[i].b4 = get_key_binding( "b4", i + 1 );
132                key_map[i].b3 = get_key_binding( "b3", i + 1 );
133                key_map[i].b2 = get_key_binding( "b2", i + 1 );
134                key_map[i].b1 = get_key_binding( "b1", i + 1 );
135        }
136}
137
138
139#define is_pressed(x) the_game->key_down(x)
140
141void get_movement(int player, int &x, int &y, int &b1, int &b2, int &b3, int &b4)
142{
143        if( player < key_players )
144        {
145/*              if( key_map[player].joy )
146                {
147                        joy_status( b1,b2,b3,x,y );
148                        b3 = ( b1 && b2 );
149                        b4 = 0;
150                }
151                else if( !eh )
152                {
153                        x = y = b1 = b2 = b3 = b4 = 0;
154                }
155                else*/
156                {
157                        if( is_pressed( key_map[player].left ) )
158                                x = -1;
159                        else if( is_pressed( key_map[player].right ) )
160                                x=1;
161                        else
162                                x = 0;
163
164                        if( is_pressed( key_map[player].up ) )
165                                y = -1;
166                        else if( is_pressed( key_map[player].down ) )
167                                y = 1;
168                        else y = 0;
169
170                        if( is_pressed( key_map[player].b1 ) )
171                                b1 = 1;
172                        else
173                                b1 = 0;
174
175                        if( is_pressed( key_map[player].b2 ) )
176                                b2 = 1;
177                        else
178                                b2 = 0;
179
180                        if( is_pressed( key_map[player].b3 ) )
181                                b3 = 1;
182                        else
183                                b3 = 0;
184
185                        if( is_pressed( key_map[player].b4 ) )
186                                b4 = 1;
187                        else
188                                b4 = 0;
189                }
190        }
191        else
192        {
193                x = y = b1 = b2 = b3 = 0;
194        }
195}
196
197void key_bindings(int player, int &left, int &right, int &up, int &down, int &b1, int &b2, int &b3, int &b4)
198{
199        left = key_map[player].left;
200        right = key_map[player].right;
201        up = key_map[player].up;
202        down = key_map[player].down;
203        b1 = key_map[player].b1;
204        b2 = key_map[player].b2;
205        b3 = key_map[player].b3;
206        b3 = key_map[player].b4;
207}
208
209
210void config_cleanup()
211{
212        if( key_map )
213        {
214                jfree( key_map );
215        }
216}
217
218//
219// Get the keycode for the string 'str'
220// Returns -1 for an invalid key code
221//
222int get_keycode( char *str )
223{
224        if( !str[0] )
225        {
226                return -1;
227        }
228        else if( !str[1] )
229        {
230                return str[0];
231        }
232        else
233        {
234                int j;
235                char buf[20];
236                for( j = 256; j < JK_MAX_KEY; j++ )
237                {
238                        key_name( j, buf );
239                        char *c = buf;
240                        for( ; *c; c++ )
241                        {
242                                if( *c == ' ' )
243                                {
244                                        *c = '_';
245                                }
246                                else
247                                {
248                                        *c = tolower( *c );
249                                }
250                        }
251                        if( strcmp( str, buf ) == 0 )
252                        {
253                                return j;
254                        }
255                }
256        }
257        return -1;
258}
Note: See TracBrowser for help on using the repository browser.