source: abuse/branches/lol/src/configuration.cpp @ 732

Last change on this file since 732 was 732, checked in by Sam Hocevar, 8 years ago

build: SDL2 compilation fixes.

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