rnd-20051123-1-src
authorHolger Schemel <info@artsoft.org>
Tue, 22 Nov 2005 23:11:09 +0000 (00:11 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:49:23 +0000 (10:49 +0200)
src/conftime.h
src/editor.c
src/events.c
src/game.c
src/init.c
src/main.h
src/network.c
src/screens.c
src/screens.h
src/tape.c
src/tape.h

index 3352ec2e6f30df70ba54da384a7a9ae3f55855a2..ab6708a4cd210b25f8f46af5bcbcc8650f8c8d4a 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2005-11-22 02:31]"
+#define COMPILE_DATE_STRING "[2005-11-22 23:49]"
index 4385eb8b96e4ca5305caef2eafc8f565e0184d6b..9e3f01e5554c2b13a0db5c701cd0948ef6205895 100644 (file)
@@ -9462,13 +9462,18 @@ static void HandleControlButtons(struct GadgetInfo *gi)
 
        DrawCompleteVideoDisplay();
 
+       level_editor_test_game = TRUE;
+
+#if 1
+       StartGameActions(FALSE, setup.autorecord, NEW_RANDOMIZE);
+#else
        if (setup.autorecord)
          TapeStartRecording();
 
-       level_editor_test_game = TRUE;
        game_status = GAME_MODE_PLAYING;
 
        InitGame();
+#endif
       }
       break;
 
index debb368b11c0d06426fc6b00898a04af2f1b7a37..8c3be2c47229f15f6338e421383e754dc529f72b 100644 (file)
@@ -696,6 +696,9 @@ void HandleKey(Key key, int key_status)
 
   if (game_status == GAME_MODE_MAIN && key == setup.shortcut.toggle_pause)
   {
+#if 1
+    StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
+#else
     if (setup.autorecord)
       TapeStartRecording();
 
@@ -709,6 +712,7 @@ void HandleKey(Key key, int key_status)
       StopAnimation();
       InitGame();
     }
+#endif
 
     return;
   }
index 78a112f29bba5bcf059b50a0c211c58ca5c40230..d8039785faa95e2179dfd8d154821fcca63bb23c 100644 (file)
@@ -2196,7 +2196,8 @@ void InitGame()
 #endif
   }
 
-  CloseDoor(DOOR_CLOSE_1);
+  if (!game.restart_level)
+    CloseDoor(DOOR_CLOSE_1);
 
   /* !!! FIX THIS (START) !!! */
   if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
@@ -2220,40 +2221,48 @@ void InitGame()
   }
   /* !!! FIX THIS (END) !!! */
 
-  /* copy default game door content to main double buffer */
-  BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
-            DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY);
+  if (!game.restart_level)
+  {
+    /* copy default game door content to main double buffer */
+    BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
+              DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY);
+  }
 
   DrawGameDoorValues();
 
-  UnmapGameButtons();
-  UnmapTapeButtons();
-  game_gadget[SOUND_CTRL_ID_MUSIC]->checked = setup.sound_music;
-  game_gadget[SOUND_CTRL_ID_LOOPS]->checked = setup.sound_loops;
-  game_gadget[SOUND_CTRL_ID_SIMPLE]->checked = setup.sound_simple;
-  MapGameButtons();
-  MapTapeButtons();
+  if (!game.restart_level)
+  {
+    UnmapGameButtons();
+    UnmapTapeButtons();
+    game_gadget[SOUND_CTRL_ID_MUSIC]->checked = setup.sound_music;
+    game_gadget[SOUND_CTRL_ID_LOOPS]->checked = setup.sound_loops;
+    game_gadget[SOUND_CTRL_ID_SIMPLE]->checked = setup.sound_simple;
+    MapGameButtons();
+    MapTapeButtons();
 
-  /* copy actual game door content to door double buffer for OpenDoor() */
-  BlitBitmap(drawto, bitmap_db_door,
-            DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
+    /* copy actual game door content to door double buffer for OpenDoor() */
+    BlitBitmap(drawto, bitmap_db_door,
+              DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 
-  OpenDoor(DOOR_OPEN_ALL);
+    OpenDoor(DOOR_OPEN_ALL);
 
-  PlaySoundStereo(SND_GAME_STARTING, SOUND_MIDDLE);
+    PlaySoundStereo(SND_GAME_STARTING, SOUND_MIDDLE);
 
-  if (setup.sound_music)
-    PlayLevelMusic();
+    if (setup.sound_music)
+      PlayLevelMusic();
 
-  KeyboardAutoRepeatOffUnlessAutoplay();
+    KeyboardAutoRepeatOffUnlessAutoplay();
 
-  if (options.debug)
-  {
-    for (i = 0; i < MAX_PLAYERS; i++)
-      printf("Player %d %sactive.\n",
-            i + 1, (stored_player[i].active ? "" : "not "));
+    if (options.debug)
+    {
+      for (i = 0; i < MAX_PLAYERS; i++)
+       printf("Player %d %sactive.\n",
+              i + 1, (stored_player[i].active ? "" : "not "));
+    }
   }
 
+  game.restart_level = FALSE;
+
 #if 0
   printf("::: starting game [%d]\n", FrameCounter);
 #endif
@@ -7889,7 +7898,7 @@ static int getModifiedActionNumber(int value_old, int value_min, int value_max,
          value_new);
 }
 
-static void ExecuteCustomElementAction(int x, int y, int element, int page)
+static void ExecuteCustomElementAction(int element, int page)
 {
   struct ElementInfo *ei = &element_info[element];
   struct ElementChangeInfo *change = &ei->change_page[page];
@@ -7963,7 +7972,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page)
 
     case CA_RESTART_LEVEL:
     {
-      printf("::: CA_RESTART_LEVEL -- not yet implemented\n");
+      game.restart_level = TRUE;
 
       break;
     }
@@ -8550,7 +8559,7 @@ static void ChangeElement(int x, int y, int page)
 
 #if 1
     if (change->use_action)
-      ExecuteCustomElementAction(x, y, element, page);
+      ExecuteCustomElementAction(element, page);
 #endif
 
     if (ChangeElementNow(x, y, element, page))
index 718f43948c5d4e2656bb4e0463a0026e9078ccc3..60f11d7631ef4582c26b671573069dc1236b66e6 100644 (file)
@@ -3949,6 +3949,12 @@ void InitElementPropertiesEngine(int engine_version)
       if (element_info[i].change_page[j].can_change)
        SET_PROPERTY(i, EP_CAN_CHANGE, TRUE);
 
+    /* ---------- HAS_ACTION ----------------------------------------------- */
+    SET_PROPERTY(i, EP_HAS_ACTION, FALSE);     /* default: has no action */
+    for (j = 0; j < element_info[i].num_change_pages; j++)
+      if (element_info[i].change_page[j].use_action)
+       SET_PROPERTY(i, EP_HAS_ACTION, TRUE);
+
     /* ---------- GFX_CRUMBLED --------------------------------------------- */
 #if 1
     SET_PROPERTY(i, EP_GFX_CRUMBLED,
@@ -4280,6 +4286,11 @@ static void InitSetup()
     options.verbose = TRUE;
 }
 
+static void InitGameInfo()
+{
+  game.restart_level = FALSE;
+}
+
 static void InitPlayerInfo()
 {
   int i;
@@ -4838,6 +4849,7 @@ void OpenAll()
 
   InitSetup();
 
+  InitGameInfo();
   InitPlayerInfo();
   InitArtworkInfo();           /* needed before loading gfx, sound & music */
   InitArtworkConfig();         /* needed before forking sound child process */
index a5b300d725a6422d8cdb207d48bca35bed516d37..c8aca94af96d16e06271779961fb97522ed3f0f0 100644 (file)
 #define EP_WALK_TO_OBJECT      81
 #define EP_DEADLY              82
 
-#define NUM_ELEMENT_PROPERTIES 83
+/* values for internal purpose only (game engine) */
+#define EP_HAS_ACTION          83
+
+#define NUM_ELEMENT_PROPERTIES 84
 
 #define NUM_EP_BITFIELDS       ((NUM_ELEMENT_PROPERTIES + 31) / 32)
 #define EP_BITFIELD_BASE       0
                                HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_EXPLOSION)
 #define COULD_MOVE_INTO_ACID(e)        HAS_PROPERTY(e, EP_COULD_MOVE_INTO_ACID)
 #define MAYBE_DONT_COLLIDE_WITH(e) HAS_PROPERTY(e, EP_MAYBE_DONT_COLLIDE_WITH)
+#define HAS_ACTION(e)          HAS_PROPERTY(e, EP_HAS_ACTION)
 
 /* special macros used in game engine */
 #define IS_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&              \
@@ -1862,6 +1866,9 @@ struct GameInfo
   int player_boring_delay_random;
   int player_sleeping_delay_fixed;
   int player_sleeping_delay_random;
+
+  /* values for special game initialization control */
+  boolean restart_level;
 };
 
 struct GlobalInfo
index 575e846b38fe3c49fc001528be157055738da28b..104b83f9bb2df69b3e36c2f83107fe37d0bd6772 100644 (file)
@@ -500,12 +500,12 @@ static void Handle_OP_START_PLAYING()
 {
   LevelDirTree *new_leveldir;
   int new_level_nr;
-  int dummy;                           /* !!! HAS NO MEANING ANYMORE !!! */
+  int dummy;
   unsigned long new_random_seed;
   char *new_leveldir_identifier;
 
   new_level_nr = (buffer[2] << 8) + buffer[3];
-  dummy = (buffer[4] << 8) + buffer[5];
+  dummy = (buffer[4] << 8) + buffer[5];                        /* (obsolete) */
   new_random_seed =
     (buffer[6] << 24) | (buffer[7] << 16) | (buffer[8] << 8) | (buffer[9]);
   new_leveldir_identifier = (char *)&buffer[10];
@@ -532,6 +532,9 @@ static void Handle_OP_START_PLAYING()
   LoadTape(level_nr);
   LoadLevel(level_nr);
 
+#if 1
+  StartGameActions(FALSE, setup.autorecord, new_random_seed);
+#else
   if (setup.autorecord)
     TapeStartRecording();
 
@@ -542,6 +545,7 @@ static void Handle_OP_START_PLAYING()
 
   game_status = GAME_MODE_PLAYING;
   InitGame();
+#endif
 }
 
 static void Handle_OP_PAUSE_PLAYING()
index 7d783a9b21a3f672e3f5c13ce5574d63db856b8a..c8bcf368cc70cfa75970449d2bbab67f280764f0 100644 (file)
@@ -511,6 +511,9 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       }
       else if (y == 5)
       {
+#if 1
+       StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
+#else
        if (setup.autorecord)
          TapeStartRecording();
 
@@ -524,6 +527,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
          StopAnimation();
          InitGame();
        }
+#endif
       }
       else if (y == 6)
       {
@@ -3082,6 +3086,9 @@ void HandleGameActions()
   }
   else
   {
+    if (game.restart_level)
+      StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
+
     if (local_player->LevelSolved)
       GameWon();
 
@@ -3096,6 +3103,30 @@ void HandleGameActions()
   }
 }
 
+void StartGameActions(boolean init_network_game, boolean record_tape,
+                     long random_seed)
+{
+  if (record_tape)
+    TapeStartRecording(random_seed);
+
+#if defined(NETWORK_AVALIABLE)
+  if (init_network_game)
+  {
+    SendToServer_StartPlaying();
+
+    return;
+  }
+#endif
+
+  StopAnimation();
+
+  game_status = GAME_MODE_PLAYING;
+
+  InitRND(random_seed);
+
+  InitGame();
+}
+
 /* ---------- new screen button stuff -------------------------------------- */
 
 /* graphic position and size values for buttons and scrollbars */
index 949267f001e0586a8b9e2ffd078ca0648785d53a..58ea5ddbb4cff8b88b54e85b90d6058032749ece 100644 (file)
@@ -32,6 +32,8 @@ void HandleSetupScreen(int, int, int, int, int);
 void HandleTypeName(int, Key);
 void HandleGameActions(void);
 
+void StartGameActions(boolean, boolean, long);
+
 void CreateScreenGadgets();
 void FreeScreenGadgets();
 
index 05c6f7c2d2c8640a4db2c62f74f52cdfa5ce3ad2..4406288567f7453dd81a7da6b3fb7b253e922b9c 100644 (file)
@@ -711,13 +711,19 @@ static void TapeRewind()
   InitRND(tape.random_seed);
 }
 
-void TapeStartRecording()
+static void TapeSetRandomSeed(long random_seed)
+{
+  tape.random_seed = InitRND(random_seed);
+}
+
+void TapeStartRecording(long random_seed)
 {
   if (!TAPE_IS_STOPPED(tape))
     TapeStop();
 
   TapeErase();
   TapeRewind();
+  TapeSetRandomSeed(random_seed);
 
   tape.recording = TRUE;
 
@@ -732,7 +738,7 @@ void TapeStartRecording()
 
 static void TapeStartGameRecording()
 {
-  TapeStartRecording();
+  TapeStartRecording(NEW_RANDOMIZE);
 
 #if defined(NETWORK_AVALIABLE)
   if (options.network)
index 4bddf23b6497305256d276882e0c380a7bbf587f..3cb2038a46e85874f851767754745a04fad98a10 100644 (file)
@@ -98,7 +98,7 @@ void DrawCompleteVideoDisplay(void);
 void TapeDeactivateDisplayOn();
 void TapeDeactivateDisplayOff(boolean);
 
-void TapeStartRecording(void);
+void TapeStartRecording(long);
 void TapeHaltRecording(void);
 void TapeStopRecording(void);
 void TapeRecordAction(byte *);