5 * Copyright (C) 2003, 2007, 2008, 2009 Thomas Perl <thp@thpinfo.com>
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
32 static InputDevice devices
[MAX_INPUT_DEVICES
];
33 static int devices_count
;
43 SDL_JoystickEventState(SDL_ENABLE
);
46 /* keyboard presets */
47 devices
[devices_count
].type
= INPUT_TYPE_KEYBOARD
;
48 devices
[devices_count
].up_key
= 'w';
49 devices
[devices_count
].down_key
= 's';
50 devices
[devices_count
].input_keys
[INPUT_KEY_HIT
]= 'd';
51 devices
[devices_count
].input_keys
[INPUT_KEY_TOPSPIN
] = 'e';
52 devices
[devices_count
].input_keys
[INPUT_KEY_SMASH
] = 'f';
53 devices
[devices_count
].icon
= GR_INPUT_KEYBOARD_WS
;
54 devices
[devices_count
].exclusive_to_player
= 1;
55 strcpy(devices
[devices_count
].name
, "Keyboard (WS/DEF)");
58 /* keyboard presets */
59 devices
[devices_count
].type
= INPUT_TYPE_KEYBOARD
;
60 devices
[devices_count
].up_key
= 'o';
61 devices
[devices_count
].down_key
= 'l';
62 devices
[devices_count
].input_keys
[INPUT_KEY_HIT
]= 'k';
63 devices
[devices_count
].input_keys
[INPUT_KEY_TOPSPIN
] = 'i';
64 devices
[devices_count
].input_keys
[INPUT_KEY_SMASH
] = 'j';
65 devices
[devices_count
].icon
= GR_INPUT_KEYBOARD_OL
;
66 devices
[devices_count
].exclusive_to_player
= 2;
67 strcpy(devices
[devices_count
].name
, "Keyboard (OL/KIJ)");
71 /* keyboard presets */
72 devices
[devices_count
].type
= INPUT_TYPE_KEYBOARD
;
73 devices
[devices_count
].up_key
= SDLK_UP
;
74 devices
[devices_count
].down_key
= SDLK_DOWN
;
75 devices
[devices_count
].input_keys
[INPUT_KEY_HIT
]= SDLK_SPACE
;
76 devices
[devices_count
].input_keys
[INPUT_KEY_TOPSPIN
] = SDLK_LCTRL
;
77 devices
[devices_count
].input_keys
[INPUT_KEY_SMASH
] = SDLK_LALT
;
79 devices
[devices_count
].icon
= GR_INPUT_MAEMO_DPAD
;
80 strcpy(devices
[devices_count
].name
, "D-Pad");
81 devices
[devices_count
].input_keys
[INPUT_KEY_HIT
]= SDLK_RETURN
;
82 /* FIXME: No TOPSPIN and SMASH keys on Maemo yet with d-pad */
84 devices
[devices_count
].icon
= GR_INPUT_KEYBOARD_ARROWS
;
85 strcpy(devices
[devices_count
].name
, "Keyboard (arrows + space, lctrl, lalt)");
90 /* This will init Python and load all available bots */
95 devices
[devices_count
].type
= INPUT_TYPE_MOUSE
;
96 devices
[devices_count
].input_keys
[INPUT_KEY_HIT
]= SDL_BUTTON(1);
97 devices
[devices_count
].input_keys
[INPUT_KEY_TOPSPIN
] = SDL_BUTTON(2);
98 devices
[devices_count
].input_keys
[INPUT_KEY_SMASH
] = SDL_BUTTON(3);
100 devices
[devices_count
].icon
= GR_INPUT_TOUCHSCREEN
;
101 strcpy(devices
[devices_count
].name
, "Touchscreen");
103 devices
[devices_count
].icon
= GR_INPUT_MOUSE
;
104 strcpy(devices
[devices_count
].name
, "Mouse");
109 n
= SDL_NumJoysticks();
110 for (x
=0; x
<n
&& devices_count
<MAX_INPUT_DEVICES
; x
++) {
111 strcpy(devices
[devices_count
].name
, SDL_JoystickName(x
));
112 devices
[devices_count
].type
= INPUT_TYPE_JOYSTICK
;
113 devices
[devices_count
].joystick
= SDL_JoystickOpen(x
);
114 devices
[devices_count
].x_axis
= 0;
115 devices
[devices_count
].y_axis
= 0;
116 devices
[devices_count
].input_keys
[INPUT_KEY_HIT
]= 0;
117 devices
[devices_count
].input_keys
[INPUT_KEY_TOPSPIN
] = 1;
118 devices
[devices_count
].input_keys
[INPUT_KEY_SMASH
] = 2;
119 devices
[devices_count
].icon
= GR_INPUT_GAMEPAD
;
127 SDL_JoystickEventState(SDL_IGNORE
);
129 for (i
=0; i
<devices_count
; i
++) {
130 if (devices
[i
].type
== INPUT_TYPE_JOYSTICK
) {
131 SDL_JoystickClose(devices
[i
].joystick
);
133 } else if (devices
[i
].type
== INPUT_TYPE_AI_PYTHON
) {
134 tennixpy_unregister_bot(devices
[i
].py_bot_class
);
147 InputDevice
* find_input_devices(unsigned int* count
)
149 *count
= devices_count
;
153 void input_device_join_game(InputDevice
* device
, void* gamestate
, int player_id
)
155 if (device
== NULL
) {
156 /* player is a c-style bot with no device attached */
159 fprintf(stderr
, "Input Device %s joins the game\n", device
->name
);
161 if (device
->type
== INPUT_TYPE_AI_PYTHON
) {
162 device
->py_bot
= tennixpy_create_bot(device
->py_bot_class
, (GameState
*)gamestate
, player_id
);
167 void input_device_part_game(InputDevice
* device
)
169 if (device
== NULL
) {
170 /* player is a c-style bot with no device attached */
174 if (device
->type
== INPUT_TYPE_AI_PYTHON
) {
175 tennixpy_destroy_bot(device
->py_bot
);
176 device
->py_bot
= NULL
;
179 fprintf(stderr
, "Input Device %s leaves the game\n", device
->name
);
182 const char* input_device_get_name(InputDevice
* d
)
187 float input_device_get_axis(InputDevice
* d
, unsigned const char axis
) {
193 if (d
->type
== INPUT_TYPE_KEYBOARD
) {
194 keystate
= SDL_GetKeyState(NULL
);
195 if (axis
== INPUT_AXIS_X
) {
196 return 1.0*keystate
[d
->right_key
] + -1.0*keystate
[d
->left_key
];
198 return 1.0*keystate
[d
->down_key
] + -1.0*keystate
[d
->up_key
];
200 } else if (d
->type
== INPUT_TYPE_JOYSTICK
) {
201 if (axis
== INPUT_AXIS_X
) {
202 return JOYSTICK_PERCENTIZE(SDL_JoystickGetAxis(d
->joystick
, d
->x_axis
*2));
204 return JOYSTICK_PERCENTIZE(SDL_JoystickGetAxis(d
->joystick
, 1+d
->y_axis
*2));
206 } else if (d
->type
== INPUT_TYPE_MOUSE
) {
207 mb
= SDL_GetMouseState(&d
->mx
, &d
->my
);
208 if (axis
== INPUT_AXIS_X
) {
209 /* Not x-movement yet (PLAYER_MOVE_X is not defined!) */
210 /*if (fabsf(d->mx - d->player_x) > PLAYER_MOVE_X) {
211 if (d->mx > d->player_x) {
213 } else if (d->mx < d->player_x) {
218 if (fabsf(d
->my
- d
->player_y
) > PLAYER_MOVE_Y
) {
219 if (d
->my
> d
->player_y
) {
221 } else if (d
->my
< d
->player_y
) {
227 } else if (d
->type
== INPUT_TYPE_AI_PYTHON
) {
228 return tennixpy_bot_get_axis(d
->py_bot
, axis
);
236 char input_device_get_key(InputDevice
* d
, unsigned const char key
) {
240 if (d
->type
== INPUT_TYPE_KEYBOARD
) {
241 return SDL_GetKeyState(NULL
)[d
->input_keys
[key
]];
242 } else if (d
->type
== INPUT_TYPE_JOYSTICK
) {
243 return SDL_JoystickGetButton(d
->joystick
, d
->input_keys
[key
]);
244 } else if (d
->type
== INPUT_TYPE_MOUSE
) {
245 mb
= SDL_GetMouseState(NULL
, NULL
);
246 return (mb
& d
->input_keys
[key
]) != 0;
248 } else if (d
->type
== INPUT_TYPE_AI_PYTHON
) {
249 return tennixpy_bot_get_key(d
->py_bot
, key
);
260 void input_add_python_bot(PyObject
* bot_class
)
262 if (devices_count
< MAX_INPUT_DEVICES
) {
263 devices
[devices_count
].type
= INPUT_TYPE_AI_PYTHON
;
264 devices
[devices_count
].icon
= GR_INPUT_AI
;
265 devices
[devices_count
].py_bot_class
= bot_class
;
266 tennixpy_get_bot_name(bot_class
, devices
[devices_count
].name
, INPUT_DEVICE_NAME_MAX
);
267 fprintf(stderr
, "Added new bot: %s\n", devices
[devices_count
].name
);
270 fprintf(stderr
, "Warning: Cannot add any more Python bots.\n");
271 /* We carry a ref of bot_class, so give it up here */
272 tennixpy_unregister_bot(bot_class
);