From 30f4f7e944969d8276d80c115fe06e5c5c970095 Mon Sep 17 00:00:00 2001 From: Florian Schulze Date: Fri, 5 Jul 2002 13:22:05 +0000 Subject: [PATCH] Kaillera support by Gil Megidish. --- sdl/interrpt.c | 272 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 242 insertions(+), 30 deletions(-) diff --git a/sdl/interrpt.c b/sdl/interrpt.c index 8577c8f..c021898 100644 --- a/sdl/interrpt.c +++ b/sdl/interrpt.c @@ -35,57 +35,241 @@ #endif #include "globals.h" +#ifdef USE_KAILLERA +#include +#include +#include + +char local_keyb[256]; +#endif // USE_KAILLERA + char keyb[256]; char last_keys[50]; -unsigned char scancode2ascii[256] = { - 0, 0, 49, 50, 51, 52, 53, 54, 55, 56, /* 0-9 */ - 57, 48, 45, 0, 0, 0, 113, 119, 101, 114, /* 10-19 */ - 116, 121, 117, 105, 111, 112, 0, 0, 0, 0, /* 20-29 */ - 97, 115, 100, 102, 103, 104, 106, 107, 108, 0, /* 30-39 */ - 0, 0, 0, 0, 122, 120, 99, 118, 98, 110, /* 40-49 */ - 109, 44, 46, 47, 0, 0, 0, 32, 0, 0, /* 50-59 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 +#ifdef USE_KAILLERA + +/* information about the party in this session */ +static int my_player = -1; +static int my_numplayers = -1; + +/* semaphore for controlling kaillera thread */ +static SDL_sem *game_start_sem = NULL; + +/* keys supported on my end */ +static int my_player_up = -1; +static int my_player_left = -1; +static int my_player_right = 1; + +/* values for the kaillera client interface */ +static char kaillera_app_name[] = "Jump 'n Bump"; +static char kaillera_game_name[] = "Jump 'n Bump\0\0"; + +static int player_keys[4][3] = { + { + KEY_PL1_LEFT, + KEY_PL1_RIGHT, + KEY_PL1_JUMP + }, + { + KEY_PL2_LEFT, + KEY_PL2_RIGHT, + KEY_PL2_JUMP + }, + { + KEY_PL3_LEFT, + KEY_PL3_RIGHT, + KEY_PL3_JUMP + }, + { + KEY_PL4_LEFT, + KEY_PL4_RIGHT, + KEY_PL4_JUMP + } }; -int hook_keyb_handler(void) +static int WINAPI kaillera_game_callback(char *game, int player, int numplayers) { - SDL_EnableUNICODE(1); - memset((void *) last_keys, 0, sizeof(last_keys)); + int length; + int urand; + unsigned char random[8]; + + if (strcmp(game, kaillera_game_name) != 0) { + printf("unknown game selected: %s\n", game); + + my_player = -1; + goto release; + } + + printf("start network game with %d players\n", numplayers); + printf("I am player %d\n", player); + + my_player = player; + my_numplayers = numplayers; + + my_player_up = player_keys[player-1][0] & 0xff; + my_player_left = player_keys[player-1][1] & 0xff; + my_player_right = player_keys[player-1][2] & 0xff; + + /* initialize randomizer agreed by all players */ + random[0] = time(0) & 0xff; + random[1] = random[2] = random[3] = 0x00; + length = kailleraModifyPlayValues(&random, sizeof(random[0])); + if (length < 0) { + goto release; + } + + urand = random[3] << 24 | random[2] << 16 | random[1] << 8 | random[0]; + srand(urand); + +release: + + SDL_SemPost(game_start_sem); return 0; +} + +static kailleraInfos kaillera_data = { + kaillera_app_name, + kaillera_game_name, + kaillera_game_callback, + NULL, + NULL, + NULL +}; +static void print_version() +{ + char version[16]; + + kailleraGetVersion(version); + printf("using kaillera version %s\n", version); } +static int kaillera_thread(void *arg) +{ + kailleraInit(); + + /* print_version(); */ + + kailleraSetInfos(&kaillera_data); + + kailleraSelectServerDialog(0); + if (SDL_SemValue(game_start_sem) == 0) { + /* server dialog returned and game didnt start */ + + /* release blocking thread */ + my_player = -1; + SDL_SemPost(game_start_sem); + } + + return 0; +} + +static int start_kaillera_thread(void) +{ + SDL_Thread *thread; + + game_start_sem = SDL_CreateSemaphore(0); + + thread = SDL_CreateThread(kaillera_thread, NULL); + if (!thread) { + printf("SDL_CreateThread failed\n"); + return -1; + } + + return 0; +} + +int addkey(unsigned int key) +{ + /* it doesnt matter if a player presses keys + * that control other bunnies. whatever is sent + * is packed by pack_keys() + */ + if (!(key & 0x8000)) { + local_keyb[key & 0x7fff] = 1; + } else + local_keyb[key & 0x7fff] = 0; + return 0; +} void remove_keyb_handler(void) { + kailleraShutdown(); } +int pack_keys(void) +{ + int rv; + + rv = local_keyb[my_player_up]; + rv |= local_keyb[my_player_left] << 1; + rv |= local_keyb[my_player_right] << 2; + rv |= local_keyb[1] << 3; + return rv; +} + +void unpack_keys(int player, char value) +{ + keyb[player_keys[player][0] & 0xff] = (value >> 0) & 1; + keyb[player_keys[player][1] & 0xff] = (value >> 1) & 1; + keyb[player_keys[player][2] & 0xff] = (value >> 2) & 1; + + /* escape key is shared among all users */ + keyb[1] |= (value >> 3) & 1; +} + +int update_kaillera_keys(void) +{ + char keys[8]; + int length; + int player; + + keys[0] = pack_keys(); + length = kailleraModifyPlayValues(&keys, sizeof(keys[0])); + + if (length < 0) { + /* terminate session */ + printf("** LOST CONNECTION **\n"); + kailleraEndGame(); + my_player = -1; + return -1; + } + + for (player=0; player= 0) { + update_kaillera_keys(); + i=1; + } +#endif // USE_KAILLERA + return i; } -- 2.39.2