rnd-19981003-2
authorHolger Schemel <info@artsoft.org>
Sat, 3 Oct 1998 13:08:05 +0000 (15:08 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:30:59 +0000 (10:30 +0200)
14 files changed:
src/events.c
src/game.c
src/game.h
src/init.c
src/main.h
src/misc.c
src/misc.h
src/network.c
src/network.h
src/screens.c
src/screens.h
src/sound.c
src/tape.c
src/tape.h

index f3a720de1421cc8e4f7b25280d4ff0e7f87bd7ab..e77b7510ea1c02ec2b30d74378ac34dc0cfc21ea 100644 (file)
@@ -788,7 +788,7 @@ void HandleJoystick()
       if (tape.pausing || AllPlayersGone)
        joy = 0;
 
-      HandleGameActions(joy);
+      HandleGameActions((byte)joy);
       break;
 
     default:
index 67db98a9aefcb34b8842b27143a7dd9a90be0cb7..b96fa7addac29c8901251469c1216ddda9f8111e 100644 (file)
@@ -21,6 +21,7 @@
 #include "files.h"
 #include "tape.h"
 #include "joystick.h"
+#include "network.h"
 
 void GetPlayerConfig()
 {
@@ -2764,9 +2765,9 @@ void CheckForDragon(int x, int y)
   }
 }
 
-void PlayerActions(struct PlayerInfo *player, int player_action)
+void PlayerActions(struct PlayerInfo *player, byte player_action)
 {
-  static int stored_player_action[MAX_PLAYERS];
+  static byte stored_player_action[MAX_PLAYERS];
   static int num_stored_actions = 0;
   BOOL moved = FALSE, snapped = FALSE, bombed = FALSE;
   int jx = player->jx, jy = player->jy;
@@ -2849,7 +2850,7 @@ void PlayerActions(struct PlayerInfo *player, int player_action)
   }
 }
 
-void GameActions(int player_action)
+void GameActions(byte player_action)
 {
   static long action_delay = 0;
   long action_delay_value;
@@ -2876,6 +2877,8 @@ void GameActions(int player_action)
   else
     recorded_player_action = NULL;
 
+  SendToServer_MovePlayer(player_action);
+
   for(i=0; i<MAX_PLAYERS; i++)
   {
     int actual_player_action = player_action;
index fce926030bcb7489bc8ae610e9d7d5e7184a8654..901254c2e471cf60648952c9b7066a6d46e63db4 100644 (file)
@@ -74,7 +74,7 @@ void AusgangstuerBlinken(int, int);
 void EdelsteinFunkeln(int, int);
 void MauerWaechst(int, int);
 void MauerAbleger(int, int);
-void GameActions(int);
+void GameActions(byte);
 void ScrollLevel(int, int);
 
 BOOL MoveFigureOneStep(struct PlayerInfo *, int, int, int, int);
index d466c7e5a215b132c128eaf448bb10478d08626f..88050961f227a372b6fcfdd17d5fc1d509e901a4 100644 (file)
@@ -93,7 +93,8 @@ void InitLevelAndPlayerInfo()
 
 void InitServer()
 {
-  standalone = FALSE + TRUE;
+  standalone = FALSE;
+  networking = !standalone;
 
   if (standalone)
     return;
@@ -101,8 +102,8 @@ void InitServer()
   if (!ConnectToServer(server_host, server_port))
     Error(ERR_EXIT, "cannot connect to multiplayer server");
 
-  SendNicknameToServer(local_player->alias_name);
-  SendProtocolVersionToServer();
+  SendToServer_Nickname(local_player->alias_name);
+  SendToServer_ProtocolVersion();
 }
 
 void InitSound()
index 0d3bfe5eff56bc928026f181ca52744993ed3401..dc5da4ffe71166dc8ca237d9129581dd3328ad87 100644 (file)
@@ -40,6 +40,7 @@
 #endif  /* #ifndef MSDOS */
 
 typedef int BOOL;
+typedef unsigned char byte;
 
 #ifndef FALSE
 #define FALSE 0
@@ -288,8 +289,8 @@ struct RecordingInfo
   BOOL changed;
   struct
   {
-    unsigned char joystickdata[MAX_PLAYERS];
-    unsigned char delay;
+    byte joystickdata[MAX_PLAYERS];
+    byte delay;
   } pos[MAX_TAPELEN];
 };
 
index 6445ee2894655da2331d777b733e12b81fe847cf..8d36c27a186cc2e59c027580ffa742212cd8b73e 100644 (file)
@@ -208,7 +208,7 @@ void GetOptions(char *argv[])
       break;
 
     if (option_len >= MAX_OPTION_LEN)
-      Error(ERR_EXITHELP, "unrecognized option '%s'", option);
+      Error(ERR_EXIT_HELP, "unrecognized option '%s'", option);
 
     if (strncmp(option, "--", 2) == 0)         /* treat '--' like '-' */
       option++;
@@ -220,13 +220,13 @@ void GetOptions(char *argv[])
     {
       *option_arg++ = '\0';                    /* cut argument from option */
       if (*option_arg == '\0')                 /* no argument after '=' */
-       Error(ERR_EXITHELP, "option '%s' has invalid argument", option_str);
+       Error(ERR_EXIT_HELP, "option '%s' has invalid argument", option_str);
     }
 
     option_len = strlen(option);
 
     if (strcmp(option, "-") == 0)
-      Error(ERR_EXITHELP, "unrecognized option '%s'", option);
+      Error(ERR_EXIT_HELP, "unrecognized option '%s'", option);
     else if (strncmp(option, "-help", option_len) == 0)
     {
       printf("Usage: %s [options] [server.name [port]]\n"
@@ -240,7 +240,7 @@ void GetOptions(char *argv[])
     else if (strncmp(option, "-display", option_len) == 0)
     {
       if (option_arg == NULL)
-       Error(ERR_EXITHELP, "option '%s' requires an argument", option_str);
+       Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str);
 
       display_name = option_arg;
       if (option_arg == next_option)
@@ -251,7 +251,7 @@ void GetOptions(char *argv[])
     else if (strncmp(option, "-levels", option_len) == 0)
     {
       if (option_arg == NULL)
-       Error(ERR_EXITHELP, "option '%s' requires an argument", option_str);
+       Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str);
 
       level_directory = option_arg;
       if (option_arg == next_option)
@@ -266,7 +266,7 @@ void GetOptions(char *argv[])
       verbose = TRUE;
     }
     else if (*option == '-')
-      Error(ERR_EXITHELP, "unrecognized option '%s'", option_str);
+      Error(ERR_EXIT_HELP, "unrecognized option '%s'", option_str);
     else if (server_host == NULL)
     {
       server_host = *options_left;
@@ -277,12 +277,12 @@ void GetOptions(char *argv[])
     {
       server_port = atoi(*options_left);
       if (server_port < 1024)
-       Error(ERR_EXITHELP, "bad port number '%d'", server_port);
+       Error(ERR_EXIT_HELP, "bad port number '%d'", server_port);
 
       printf("port == %d\n", server_port);
     }
     else
-      Error(ERR_EXITHELP, "too many arguments");
+      Error(ERR_EXIT_HELP, "too many arguments");
 
     options_left++;
   }
@@ -291,6 +291,10 @@ void GetOptions(char *argv[])
 void Error(int mode, char *format_str, ...)
 {
   FILE *output_stream = stderr;
+  char *process_name = "";
+
+  if (mode == ERR_EXIT_SOUNDSERVER)
+    process_name = " sound server";
 
   if (format_str)
   {
@@ -300,7 +304,7 @@ void Error(int mode, char *format_str, ...)
     int i_value;
     double d_value;
 
-    fprintf(output_stream, "%s: ", program_name);
+    fprintf(output_stream, "%s%s: ", program_name, process_name);
 
     va_start(ap, format_str);  /* ap points to first unnamed argument */
   
@@ -330,7 +334,8 @@ void Error(int mode, char *format_str, ...)
          break;
   
        default:
-         fprintf(stderr, "\nError(): invalid format string: %s\n",format_str);
+         fprintf(stderr, "\n%s: Error(): invalid format string: %s\n",
+                 program_name, format_str);
          CloseAllAndExit(10);
       }
     }
@@ -340,13 +345,13 @@ void Error(int mode, char *format_str, ...)
     fprintf(output_stream, "\n");
   }
   
-  if (mode == ERR_EXITHELP)
+  if (mode == ERR_EXIT_HELP)
     fprintf(output_stream, "%s: Try option '--help' for more information.\n",
            program_name);
 
-  if (mode == ERR_EXIT || mode == ERR_EXITHELP)
+  if (mode != ERR_RETURN)
   {
-    fprintf(output_stream, "%s: aborting\n", program_name);
+    fprintf(output_stream, "%s%s: aborting\n", program_name, process_name);
     CloseAllAndExit(1);
   }
 }
index 8b483c520871c4a239a8409858c00588a1526fec..260d7803ff103e67f5794fe9894c2ce7243c4806 100644 (file)
@@ -23,7 +23,8 @@
 
 #define ERR_RETURN             0
 #define ERR_EXIT               1
-#define ERR_EXITHELP           2
+#define ERR_EXIT_HELP          2
+#define ERR_EXIT_SOUNDSERVER   3
 
 void InitCounter(void);
 unsigned long Counter(void);
index 033bed0d7c47115f978b9711ca50b53b92945c15..14ea8656fbc75a882e95ae6e21f771f9379b6ae9 100644 (file)
 #include <errno.h>
 
 #include "network.h"
+#include "game.h"
+#include "tape.h"
+#include "files.h"
+#include "misc.h"
 
 int norestart = 0;
 int nospeedup = 0;
@@ -38,7 +42,7 @@ int nospeedup = 0;
 
 #define OP_NICK 1
 #define OP_PLAY 2
-#define OP_FALL 3
+#define OP_MOVE 3
 #define OP_DRAW 4
 #define OP_LOST 5
 #define OP_GONE 6
@@ -60,6 +64,22 @@ int nospeedup = 0;
 #define OP_WON 22
 #define OP_ZERO 23
 
+#define MAXNICKLEN 14
+
+struct user
+{
+  byte nr;
+  char name[MAXNICKLEN+2];
+  struct user *next;
+};
+
+struct user me =
+{
+  0,
+  "no name",
+  NULL
+};
+
 /* server stuff */
 
 #define BUFLEN         4096
@@ -88,6 +108,16 @@ void fatal(char *s)
   exit(1);
 }
 
+void *mmalloc(int n)
+{
+  void *r;
+
+  r = malloc(n);
+  if (r == NULL)
+    fatal("Out of memory");
+  return r;
+}
+
 void u_sleep(int i)
 {
   struct timeval tm;
@@ -119,6 +149,34 @@ void sendbuf(int len)
   }
 }
 
+struct user *finduser(unsigned char c)
+{
+  struct user *u;
+
+  for (u = &me; u; u = u->next)
+    if (u->nr == c)
+      return u;
+  
+  fatal("Protocol error: reference to non-existing user");
+  return NULL; /* so that gcc -Wall doesn't complain */
+}
+
+char *get_user_name(unsigned char c)
+{
+  struct user *u;
+
+  if (c == 0)
+    return("the server");
+  else if (c == me.nr)
+    return("you");
+  else
+    for (u = &me; u; u = u->next)
+      if (u->nr == c && u->name && strlen(u->name))
+       return(u->name);
+
+  return("no name");
+}
+
 void startserver()
 {
   char *options[2];
@@ -217,7 +275,7 @@ BOOL ConnectToServer(char *host, int port)
   return(TRUE);
 }
 
-void SendNicknameToServer(char *nickname)
+void SendToServer_Nickname(char *nickname)
 {
   static char msgbuf[300];
 
@@ -228,7 +286,7 @@ void SendNicknameToServer(char *nickname)
   sysmsg(msgbuf);
 }
 
-void SendProtocolVersionToServer()
+void SendToServer_ProtocolVersion()
 {
   buf[1] = OP_VERSION;
   buf[2] = PROT_VERS_1;
@@ -237,9 +295,28 @@ void SendProtocolVersionToServer()
   sendbuf(5);
 }
 
+void SendToServer_StartPlaying()
+{
+  buf[1] = OP_PLAY;
+  buf[2] = (unsigned char)(level_nr / 256);
+  buf[3] = (unsigned char)(level_nr % 256);
+  buf[4] = (unsigned char)(leveldir_nr / 256);
+  buf[5] = (unsigned char)(leveldir_nr % 256);
+  strcpy(&buf[6], leveldir[leveldir_nr].name);
+  sendbuf(strlen(leveldir[leveldir_nr].name)+1 + 6);
+}
+
+void SendToServer_MovePlayer(byte player_action)
+{
+  buf[1] = OP_MOVE;
+  buf[2] = player_action;
+  sendbuf(3);
+}
+
 void handlemessages()
 {
   unsigned int len;
+  struct user *u, *v = NULL;
   static char msgbuf[300];
 
   while (nread >= 4 && nread >= 4 + readbuf[3])
@@ -256,33 +333,107 @@ void handlemessages()
     {
       case OP_YOUARE:
        printf("OP_YOUARE: %d\n", buf[0]);
+       me.nr = buf[0];
+
+       TestPlayer = buf[0] - 1;
+
        break;
 
       case OP_NEW:
        printf("OP_NEW: %d\n", buf[0]);
        sprintf(msgbuf, "new client %d connected", buf[0]);
        sysmsg(msgbuf);
+
+       for (u = &me; u; u = u->next)
+       {
+         if (u->nr == buf[0])
+           Error(ERR_EXIT, "multiplayer server sent duplicate player id");
+         else
+           v = u;
+       }
+
+       v->next = u = mmalloc(sizeof(struct user));
+       u->nr = buf[0];
+       u->name[0] = '\0';
+       u->next = NULL;
+
+       break;
+
+      case OP_NICK:
+       printf("OP_NICK: %d\n", buf[0]);
+       u = finduser(buf[0]);
+       buf[len] = 0;
+       sprintf(msgbuf, "client %d calls itself \"%s\"", buf[0], &buf[2]);
+       sysmsg(msgbuf);
+       strncpy(u->name, &buf[2], MAXNICKLEN);
        break;
       
       case OP_GONE:
        printf("OP_GONE: %d\n", buf[0]);
-       sprintf(msgbuf, "client %d disconnected", buf[0]);
+       u = finduser(buf[0]);
+       sprintf(msgbuf, "client %d (%s) disconnected",
+               buf[0], get_user_name(buf[0]));
        sysmsg(msgbuf);
+
+       for (v = &me; v; v = v->next)
+         if (v->next == u)
+           v->next = u->next;
+       free(u);
+
        break;
 
       case OP_BADVERS:
-       {
-         static char tmpbuf[128];
-
-         sprintf(tmpbuf, "Protocol version mismatch: server expects %d.%d.x instead of %d.%d.%d\n", buf[2], buf[3], PROT_VERS_1, PROT_VERS_2, PROT_VERS_3);
-         fatal(tmpbuf);
-       }
+       Error(ERR_RETURN, "protocol version mismatch");
+       Error(ERR_EXIT, "server expects %d.%d.x instead of %d.%d.%d",
+             buf[2], buf[3], PROT_VERS_1, PROT_VERS_2, PROT_VERS_3);
        break;
-      
+
       case OP_PLAY:
        printf("OP_PLAY: %d\n", buf[0]);
-       sprintf(msgbuf, "client %d starts game", buf[0]);
+       sprintf(msgbuf, "client %d starts game [level %d from levedir %d (%s)]\n",
+               buf[0],
+               (buf[2] << 8) + buf[3],
+               (buf[4] << 8) + buf[5],
+               &buf[6]);
        sysmsg(msgbuf);
+
+       if (strcmp(leveldir[(buf[4] << 8) + buf[5]].name, &buf[6]) == 0)
+       {
+         leveldir_nr = (buf[4] << 8) + buf[5];
+
+         local_player->leveldir_nr = leveldir_nr;
+         LoadPlayerInfo(PLAYER_LEVEL);
+         SavePlayerInfo(PLAYER_SETUP);
+
+         level_nr = (buf[2] << 8) + buf[3];
+
+         TapeErase();
+         LoadLevelTape(level_nr);
+
+         GetPlayerConfig();
+         LoadLevel(level_nr);
+
+         {
+           if (autorecord_on)
+             TapeStartRecording();
+
+           game_status = PLAYING;
+           InitGame();
+         }
+       }
+       else
+       {
+         Error(ERR_RETURN, "no such level directory: '%s'", &buf[6]);
+       }
+       break;
+
+      case OP_MOVE:
+       if (buf[2])
+       {
+         printf("OP_MOVE: %d\n", buf[0]);
+         sprintf(msgbuf, "client %d moves player [0x%02x]", buf[0], buf[2]);
+         sysmsg(msgbuf);
+       }
        break;
 
       case OP_PAUSE:
@@ -309,12 +460,6 @@ void handlemessages()
        sysmsg(msgbuf);
        break;
 
-      case OP_NICK:
-       printf("OP_NICK: %d\n", buf[0]);
-        sprintf(msgbuf, "client %d calls itself \"%s\"", buf[0], &buf[2]);
-        sysmsg(msgbuf);
-       break;
-
       case OP_MSG:
        printf("OP_MSG: %d\n", buf[0]);
        sprintf(msgbuf, "client %d sends message", buf[0]);
index e8456b4c5e674a6b6033d2001bbd0aa9cb91bd31..5465cae174965c18a3a1fdba576a3dd2cc949ff2 100644 (file)
 #include "main.h"
 
 BOOL ConnectToServer(char *, int);
-void SendNicknameToServer(char *);
-void SendProtocolVersionToServer(void);
+void SendToServer_Nickname(char *);
+void SendToServer_ProtocolVersion(void);
+void SendToServer_StartPlaying(void);
+void SendToServer_MovePlayer(byte);
 void HandleNetworking(void);
 
 #endif
index 86a1235d1549547c18ff94da1a756e22e5dd7862..baa76948c4270dab4bc47824ec5bf1953f8e4fce 100644 (file)
@@ -23,6 +23,7 @@
 #include "tape.h"
 #include "joystick.h"
 #include "cartoons.h"
+#include "network.h"
 
 #ifdef MSDOS
 extern unsigned char get_ascii(KeySym);
@@ -214,11 +215,16 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       }
       else if (y==8)
       {
-       if (autorecord_on)
-         TapeStartRecording();
+       if (standalone)
+       {
+         if (autorecord_on)
+           TapeStartRecording();
 
-       game_status = PLAYING;
-       InitGame();
+         game_status = PLAYING;
+         InitGame();
+       }
+       else
+         SendToServer_StartPlaying();
       }
       else if (y==9)
       {
@@ -1298,7 +1304,7 @@ void CalibrateJoystick()
   DrawSetupScreen();
 }
 
-void HandleGameActions(int player_action)
+void HandleGameActions(byte player_action)
 {
   if (game_status != PLAYING)
     return;
index bde71a06a4cba21f33dedfbd5feef1027e3c5f3d..4095a0a0c6745ca50f7914d54aa9acbf2ea99f1a 100644 (file)
@@ -37,7 +37,7 @@ void HandleHallOfFame(int);
 void DrawSetupScreen(void);
 void HandleSetupScreen(int, int, int, int, int);
 void CalibrateJoystick(void);
-void HandleGameActions(int);
+void HandleGameActions(byte);
 void HandleVideoButtons(int, int, int);
 void HandleSoundButtons(int, int, int);
 void HandleGameButtons(int, int, int);
index 4a323818ca6af535076445b403789ad18052fcad..1858a8f331356abf3a6d0cd6ac92ba809398a216 100644 (file)
@@ -73,7 +73,7 @@ void SoundServer()
     if (!FD_ISSET(sound_pipe[0], &sound_fdset))
       continue;
     if (read(sound_pipe[0], &snd_ctrl, sizeof(snd_ctrl)) != sizeof(snd_ctrl))
-      Error(ERR_EXIT, "broken pipe - no sounds");
+      Error(ERR_EXIT_SOUNDSERVER, "broken pipe - no sounds");
 
 #ifdef VOXWARE
 
@@ -483,13 +483,13 @@ void HPUX_Audio_Control()
 
   audio_ctl = open("/dev/audioCtl", O_WRONLY | O_NDELAY);
   if (audio_ctl == -1)
-    Error(ERR_EXIT, "cannot open /dev/audioCtl - no sounds");
+    Error(ERR_EXIT_SOUNDSERVER, "cannot open /dev/audioCtl - no sounds");
 
   if (ioctl(audio_ctl, AUDIO_DESCRIBE, &ainfo) == -1)
-    Error(ERR_EXIT, "no audio info - no sounds");
+    Error(ERR_EXIT_SOUNDSERVER, "no audio info - no sounds");
 
   if (ioctl(audio_ctl, AUDIO_SET_DATA_FORMAT, AUDIO_FORMAT_ULAW) == -1)
-    Error(ERR_EXIT, "ulaw audio not available - no sounds");
+    Error(ERR_EXIT_SOUNDSERVER, "ulaw audio not available - no sounds");
 
   ioctl(audio_ctl, AUDIO_SET_CHANNELS, 1);
   ioctl(audio_ctl, AUDIO_SET_SAMPLE_RATE, 8000);
index 53ce1d9ed3cee0a7f654f7b01486526006670071..6d6a8d5ce7cd998f5be47c9c9c92ec233da356c3 100644 (file)
@@ -58,7 +58,7 @@ void TapeStopRecording()
   DrawVideoDisplay(VIDEO_STATE_REC_OFF,0);
 }
 
-void TapeRecordAction(int joy[MAX_PLAYERS])
+void TapeRecordAction(byte joy[MAX_PLAYERS])
 {
   int i;
 
index aa1b58263240562bcfdf58bafb64d6b05c578c2f..9ae745814f8bd31b4d9b3751036693f9648dc68f 100644 (file)
@@ -20,7 +20,7 @@
 
 void TapeStartRecording(void);
 void TapeStopRecording(void);
-void TapeRecordAction(int *);
+void TapeRecordAction(byte *);
 void TapeRecordDelay(void);
 void TapeTogglePause(void);
 void TapeStartPlaying(void);