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

Last change on this file since 66 was 66, checked in by Sam Hocevar, 12 years ago
  • Added the proper .h and .hpp files to _SOURCES variables. As a result, "make dist" now generates a buildable tarball.
File size: 5.0 KB
Line 
1/*
2 *  Abuse - dark 2D side-scrolling platform game
3 *  Copyright (c) 1995 Crack dot Com
4 *
5 *  This software was released into the Public Domain. As with most public
6 *  domain software, no warranty is made or implied by Crack dot Com or
7 *  Jonathan Clark.
8 */
9
10#include "config.h"
11
12#include <ctype.h>
13
14#include "sdlport/joy.hpp"
15
16#include "keys.hpp"
17#include "lisp.hpp"
18#include "jwindow.hpp"
19#include "config.hpp"
20#include "game.hpp"
21
22extern int get_key_binding(char const *dir, int i);
23
24extern window_manager *eh;
25int key_players = 0;
26int morph_detail = MEDIUM_DETAIL;
27
28struct player_keys
29{
30        int joy, left, right, up, down, b1, b2, b3, b4;
31};
32
33player_keys *key_map = NULL;
34
35static int binding_for_player( int player )
36{
37        char tmp[40];
38        sprintf( tmp, "player%d", player );
39        Cell *f = find_symbol( tmp );
40        if( !NILP( f ) && DEFINEDP( symbol_value( f ) ) )
41        {
42                void *what = symbol_value( f );
43                if( what == make_find_symbol( "keyboard" ) )
44                        return 1;
45                else if( what == make_find_symbol( "joystick" ) )
46                        return 2;
47        }
48        return 0;
49}
50
51/*
52int get_key_binding(char const *dir, int i)
53{
54        char tmp[100], kn[50];
55        sprintf( tmp, "player%d-%s", i, dir );
56        Cell *f = find_symbol( tmp );
57        if( NILP(f) || !DEFINEDP( symbol_value( f ) ) )
58                return 0;
59        void *k = symbol_value( f );
60
61        if( item_type( k ) != L_SYMBOL )
62                return 0;
63
64#ifdef SCADALISP
65        strcpy( tmp, symbol_name( k ) );
66#else
67        strcpy( tmp, lstring_value( symbol_name( k ) ) );
68#endif
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/*
92void get_key_bindings()
93{
94        if( key_map )
95        {
96                jfree( 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 *)jmalloc(sizeof(player_keys)*key_players,"key bindings");
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
127void get_key_bindings()
128{
129        if( key_map )
130        {
131                jfree( key_map );
132        }
133        key_map = NULL;
134
135        key_players = 1;
136        key_map = (player_keys *)jmalloc( sizeof( player_keys ) * key_players, "key bindings" );
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
154void 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( !eh )
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
210void 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
223void config_cleanup()
224{
225        if( key_map )
226        {
227                jfree( key_map );
228        }
229}
230
231//
232// Get the keycode for the string 'str'
233// Returns -1 for an invalid key code
234//
235int get_keycode(char const *str)
236{
237        if( !str[0] )
238        {
239                return -1;
240        }
241        else if( !str[1] )
242        {
243                return str[0];
244        }
245        else
246        {
247                int j;
248                char buf[20];
249                for( j = 256; j < JK_MAX_KEY; j++ )
250                {
251                        key_name( j, buf );
252                        char *c = buf;
253                        for( ; *c; c++ )
254                        {
255                                if( *c == ' ' )
256                                {
257                                        *c = '_';
258                                }
259                                else
260                                {
261                                        *c = tolower( *c );
262                                }
263                        }
264                        if( strcmp( str, buf ) == 0 )
265                        {
266                                return j;
267                        }
268                }
269        }
270        return -1;
271}
Note: See TracBrowser for help on using the repository browser.