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

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

ps3: hardcode keybindings for now and reactivate the gamma window.

  • 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-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
27extern int get_key_binding(char const *dir, int i);
28
29int key_players = 0;
30int morph_detail = MEDIUM_DETAIL;
31
32struct player_keys
33{
34    int joy, left, right, up, down, b1, b2, b3, b4;
35};
36
37static player_keys *key_map = NULL;
38
39static 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/*
56int 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/*
92void 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
127void 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#if !defined __CELLOS_LV2__
141        key_map[i].left = get_key_binding( "left", i + 1 );
142        key_map[i].right = get_key_binding( "right", i + 1 );
143        key_map[i].up = get_key_binding( "up", i + 1 );
144        key_map[i].down = get_key_binding( "down", i + 1 );
145        key_map[i].b4 = get_key_binding( "b4", i + 1 );
146        key_map[i].b3 = get_key_binding( "b3", i + 1 );
147        key_map[i].b2 = get_key_binding( "b2", i + 1 );
148        key_map[i].b1 = get_key_binding( "b1", i + 1 );
149#else
150        key_map[i].left = 258;
151        key_map[i].right = 259;
152        key_map[i].up = 256;
153        key_map[i].down = 257;
154        key_map[i].b4 = 281;
155        key_map[i].b3 = 261;
156        key_map[i].b2 = 32;
157        key_map[i].b1 = 0;
158#endif
159    }
160}
161
162
163#define is_pressed(x) the_game->key_down(x)
164
165void get_movement(int player, int &x, int &y, int &b1, int &b2, int &b3, int &b4)
166{
167    if( player < key_players )
168    {
169/*        if( key_map[player].joy )
170        {
171            joy_status( b1,b2,b3,x,y );
172            b3 = ( b1 && b2 );
173            b4 = 0;
174        }
175        else if( !wm )
176        {
177            x = y = b1 = b2 = b3 = b4 = 0;
178        }
179        else*/
180        {
181            if( is_pressed( key_map[player].left ) )
182                x = -1;
183            else if( is_pressed( key_map[player].right ) )
184                x=1;
185            else
186                x = 0;
187
188            if( is_pressed( key_map[player].up ) )
189                y = -1;
190            else if( is_pressed( key_map[player].down ) )
191                y = 1;
192            else y = 0;
193
194            if( is_pressed( key_map[player].b1 ) )
195                b1 = 1;
196            else
197                b1 = 0;
198
199            if( is_pressed( key_map[player].b2 ) )
200                b2 = 1;
201            else
202                b2 = 0;
203
204            if( is_pressed( key_map[player].b3 ) )
205                b3 = 1;
206            else
207                b3 = 0;
208
209            if( is_pressed( key_map[player].b4 ) )
210                b4 = 1;
211            else
212                b4 = 0;
213        }
214    }
215    else
216    {
217        x = y = b1 = b2 = b3 = 0;
218    }
219}
220
221void key_bindings(int player, int &left, int &right, int &up, int &down, int &b1, int &b2, int &b3, int &b4)
222{
223    left = key_map[player].left;
224    right = key_map[player].right;
225    up = key_map[player].up;
226    down = key_map[player].down;
227    b1 = key_map[player].b1;
228    b2 = key_map[player].b2;
229    b3 = key_map[player].b3;
230    b3 = key_map[player].b4;
231}
232
233
234void config_cleanup()
235{
236    if(key_map)
237    {
238        free(key_map);
239        key_map = NULL;
240    }
241}
242
243//
244// Get the keycode for the string 'str'
245// Returns -1 for an invalid key code
246//
247int get_keycode(char const *str)
248{
249    if( !str[0] )
250    {
251        return -1;
252    }
253    else if( !str[1] )
254    {
255        return str[0];
256    }
257    else
258    {
259        int j;
260        char buf[20];
261        for( j = 256; j < JK_MAX_KEY; j++ )
262        {
263            key_name( j, buf );
264            char *c = buf;
265            for( ; *c; c++ )
266            {
267                if( *c == ' ' )
268                {
269                    *c = '_';
270                }
271                else
272                {
273                    *c = tolower( *c );
274                }
275            }
276            if( strcmp( str, buf ) == 0 )
277            {
278                return j;
279            }
280        }
281    }
282    return -1;
283}
Note: See TracBrowser for help on using the repository browser.