source: abuse/trunk/src/configuration.cpp @ 534

Last change on this file since 534 was 534, checked in by Sam Hocevar, 11 years ago

imlib: remove a lot of dead code, especially from the linked list and
the WAV reader.

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