Kaillera support by Gil Megidish.
authorFlorian Schulze <crow@icculus.org>
Fri, 5 Jul 2002 13:22:05 +0000 (13:22 +0000)
committerFlorian Schulze <crow@icculus.org>
Fri, 5 Jul 2002 13:22:05 +0000 (13:22 +0000)
sdl/interrpt.c

index 8577c8f..c021898 100644 (file)
 #endif
 #include "globals.h"
 
 #endif
 #include "globals.h"
 
+#ifdef USE_KAILLERA
+#include <SDL_thread.h>
+#include <SDL_mutex.h>
+#include <kailleraclient.h>
+
+char local_keyb[256];
+#endif // USE_KAILLERA
+
 char keyb[256];
 char last_keys[50];
 
 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;
        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)
 {
 
 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<length; player++) {
+               unpack_keys(player, keys[player]);
+       }
+
+       return 0;
+}
+
+int hook_keyb_handler(void)
+{
+       SDL_EnableUNICODE(1);
+       memset((void *) last_keys, 0, sizeof(last_keys));
+
+       start_kaillera_thread();
+       SDL_SemWait(game_start_sem);
+       if (my_player < 0) {
+               printf("GAME ABORTED!\n");
+               return -1;
+       }
+
+       printf("GAME STARTS!\n");
+       return 0;
+}
 
 int key_pressed(int key)
 {
 
 int key_pressed(int key)
 {
+       if (key == 1 && my_player < 0) {
+               /* if game completed or aborted, post ESC */
+               return 1;
+       }
+
        return keyb[(unsigned char) key];
 }
 
        return keyb[(unsigned char) key];
 }
 
+#else // USE_KAILLERA
+
 int addkey(unsigned int key)
 {
        int c1;
 int addkey(unsigned int key)
 {
        int c1;
@@ -100,6 +284,26 @@ int addkey(unsigned int key)
        return 0;
 }
 
        return 0;
 }
 
+void remove_keyb_handler(void)
+{
+}
+
+int hook_keyb_handler(void)
+{
+       SDL_EnableUNICODE(1);
+       memset((void *) last_keys, 0, sizeof(last_keys));
+
+       return 0;
+}
+
+int key_pressed(int key)
+{
+       return keyb[(unsigned char) key];
+}
+
+
+#endif // USE_KAILLERA
+
 int intr_sysupdate()
 {
        SDL_Event e;
 int intr_sysupdate()
 {
        SDL_Event e;
@@ -145,6 +349,7 @@ int intr_sysupdate()
                }
                i++;
        }
                }
                i++;
        }
+
        SDL_Delay(1);
        now = SDL_GetTicks();
        time_diff = now - last_time;
        SDL_Delay(1);
        now = SDL_GetTicks();
        time_diff = now - last_time;
@@ -171,5 +376,12 @@ int intr_sysupdate()
        then = now;
 */
 
        then = now;
 */
 
+#ifdef USE_KAILLERA
+       if (my_player >= 0) {
+               update_kaillera_keys();
+               i=1;
+       }
+#endif // USE_KAILLERA
+
        return i;
 }
        return i;
 }