rnd-19990314-1-src
authorHolger Schemel <info@artsoft.org>
Sun, 14 Mar 1999 01:17:28 +0000 (02:17 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:33:54 +0000 (10:33 +0200)
src/editor.c
src/game.c
src/init.c
src/main.h
src/tools.c

index 856523def1fd6ba8b99c168ce521b93170cde8bd..bf51938f137493e71415709821e209493379b7bf 100644 (file)
@@ -811,8 +811,8 @@ int editor_element[] =
   EL_MORAST_LEER,
   EL_MORAST_VOLL,
 
-  EL_DYNAMIT_AUS,
-  EL_DYNAMIT,
+  EL_DYNAMITE_INACTIVE,
+  EL_DYNAMITE_ACTIVE,
   EL_AUSGANG_ZU,
   EL_AUSGANG_AUF,
 
@@ -2467,7 +2467,7 @@ static void DrawPropertiesWindow()
     { EL_PACMAN_L,     &level.score[SC_PACMAN],        TEXT_SMASHING },
     { EL_PACMAN_U,     &level.score[SC_PACMAN],        TEXT_SMASHING },
     { EL_KOKOSNUSS,    &level.score[SC_KOKOSNUSS],     TEXT_CRACKING },
-    { EL_DYNAMIT_AUS,  &level.score[SC_DYNAMIT],       TEXT_COLLECTING },
+    { EL_DYNAMITE_INACTIVE,&level.score[SC_DYNAMIT],   TEXT_COLLECTING },
     { EL_SCHLUESSEL1,  &level.score[SC_SCHLUESSEL],    TEXT_COLLECTING },
     { EL_SCHLUESSEL2,  &level.score[SC_SCHLUESSEL],    TEXT_COLLECTING },
     { EL_SCHLUESSEL3,  &level.score[SC_SCHLUESSEL],    TEXT_COLLECTING },
index b4e3fc970304b40ee27dc3be0748b7bbff1b055c..1fbb21a5cef1115e2672f62d0f3dd47f907f9da4 100644 (file)
@@ -280,7 +280,7 @@ static void InitField(int x, int y, boolean init_game)
       }
       break;
 
-    case EL_DYNAMIT:
+    case EL_DYNAMITE_ACTIVE:
       MovDelay[x][y] = 96;
       break;
 
@@ -359,7 +359,7 @@ void InitGame()
 
     player->dynamite = 0;
     player->dynabomb_count = 0;
-    player->dynabomb_size = 0;
+    player->dynabomb_size = 1;
     player->dynabombs_left = 0;
     player->dynabomb_xl = FALSE;
 
@@ -1054,7 +1054,7 @@ void DrawDynamite(int x, int y)
   if (Store[x][y])
     DrawGraphic(sx, sy, el2gfx(Store[x][y]));
 
-  if (Feld[x][y] == EL_DYNAMIT)
+  if (Feld[x][y] == EL_DYNAMITE_ACTIVE)
   {
     if ((phase = (96 - MovDelay[x][y]) / 12) > 6)
       phase = 6;
@@ -1083,10 +1083,13 @@ void CheckDynamite(int x, int y)
       if (!(MovDelay[x][y] % 12))
        PlaySoundLevel(x, y, SND_ZISCH);
 
-      if (Feld[x][y] == EL_DYNAMIT && !(MovDelay[x][y] % 12))
-       DrawDynamite(x, y);
-      else if (Feld[x][y] == EL_DYNABOMB && !(MovDelay[x][y] % 6))
-       DrawDynamite(x, y);
+      if (IS_ACTIVE_BOMB(Feld[x][y]))
+      {
+       int delay = (Feld[x][y] == EL_DYNAMITE_ACTIVE ? 12 : 6);
+
+       if (!(MovDelay[x][y] % delay))
+         DrawDynamite(x, y);
+      }
 
       return;
     }
@@ -1127,8 +1130,8 @@ void Explode(int ex, int ey, int phase, int mode)
       if (!IN_LEV_FIELD(x, y) || IS_MASSIVE(element) || element == EL_BURNING)
        continue;
 
-      if ((mode!=EX_NORMAL || center_element == EL_AMOEBA2DIAM) &&
-         (x!=ex || y!=ey))
+      if ((mode != EX_NORMAL || center_element == EL_AMOEBA2DIAM) &&
+         (x != ex || y != ey))
        continue;
 
       if (element == EL_EXPLODING)
@@ -1277,7 +1280,9 @@ void Explode(int ex, int ey, int phase, int mode)
 void DynaExplode(int ex, int ey)
 {
   int i, j;
-  struct PlayerInfo *player = &stored_player[Store2[ex][ey] - EL_SPIELER1];
+  int dynabomb_size = 1;
+  boolean dynabomb_xl = FALSE;
+  struct PlayerInfo *player;
   static int xy[4][2] =
   {
     { 0, -1 },
@@ -1286,16 +1291,22 @@ void DynaExplode(int ex, int ey)
     { 0, +1 }
   };
 
-  Store2[ex][ey] = 0;  /* delete player information */
+  if (IS_ACTIVE_BOMB(Feld[ex][ey]))
+  {
+    player = &stored_player[Feld[ex][ey] - EL_DYNABOMB_ACTIVE_1];
+    dynabomb_size = player->dynabomb_size;
+    dynabomb_xl = player->dynabomb_xl;
+    player->dynabombs_left++;
+  }
 
   Explode(ex, ey, EX_PHASE_START, EX_CENTER);
 
   for (i=0; i<4; i++)
   {
-    for (j=1; j<=player->dynabomb_size; j++)
+    for (j=1; j<=dynabomb_size; j++)
     {
-      int x = ex+j*xy[i%4][0];
-      int y = ey+j*xy[i%4][1];
+      int x = ex + j * xy[i % 4][0];
+      int y = ey + j * xy[i % 4][1];
       int element;
 
       if (!IN_LEV_FIELD(x, y) || IS_MASSIVE(Feld[x][y]))
@@ -1307,12 +1318,10 @@ void DynaExplode(int ex, int ey)
       if (element != EL_LEERRAUM &&
          element != EL_ERDREICH &&
          element != EL_EXPLODING &&
-         !player->dynabomb_xl)
+         !dynabomb_xl)
        break;
     }
   }
-
-  player->dynabombs_left++;
 }
 
 void Bang(int x, int y)
@@ -1340,7 +1349,10 @@ void Bang(int x, int y)
       RaiseScoreElement(element);
       Explode(x, y, EX_PHASE_START, EX_NORMAL);
       break;
-    case EL_DYNABOMB:
+    case EL_DYNABOMB_ACTIVE_1:
+    case EL_DYNABOMB_ACTIVE_2:
+    case EL_DYNABOMB_ACTIVE_3:
+    case EL_DYNABOMB_ACTIVE_4:
     case EL_DYNABOMB_NR:
     case EL_DYNABOMB_SZ:
     case EL_DYNABOMB_XL:
@@ -3579,7 +3591,7 @@ void GameActions()
     }
     else if (IS_MOVING(x, y))
       ContinueMoving(x, y);
-    else if (element == EL_DYNAMIT || element == EL_DYNABOMB)
+    else if (IS_ACTIVE_BOMB(element))
       CheckDynamite(x, y);
     else if (element == EL_EXPLODING)
       Explode(x, y, Frame[x][y], EX_NORMAL);
@@ -4385,11 +4397,11 @@ int DigField(struct PlayerInfo *player,
       PlaySoundLevel(x, y, SND_PONG);
       break;
 
-    case EL_DYNAMIT_AUS:
+    case EL_DYNAMITE_INACTIVE:
     case EL_SP_DISK_RED:
       RemoveField(x, y);
       player->dynamite++;
-      RaiseScoreElement(EL_DYNAMIT);
+      RaiseScoreElement(EL_DYNAMITE_INACTIVE);
       DrawText(DX_DYNAMITE, DY_DYNAMITE,
               int2str(local_player->dynamite, 3),
               FS_SMALL, FC_YELLOW);
@@ -4403,21 +4415,21 @@ int DigField(struct PlayerInfo *player,
       RemoveField(x, y);
       player->dynabomb_count++;
       player->dynabombs_left++;
-      RaiseScoreElement(EL_DYNAMIT);
+      RaiseScoreElement(EL_DYNAMITE_INACTIVE);
       PlaySoundLevel(x, y, SND_PONG);
       break;
 
     case EL_DYNABOMB_SZ:
       RemoveField(x, y);
       player->dynabomb_size++;
-      RaiseScoreElement(EL_DYNAMIT);
+      RaiseScoreElement(EL_DYNAMITE_INACTIVE);
       PlaySoundLevel(x, y, SND_PONG);
       break;
 
     case EL_DYNABOMB_XL:
       RemoveField(x, y);
       player->dynabomb_xl = TRUE;
-      RaiseScoreElement(EL_DYNAMIT);
+      RaiseScoreElement(EL_DYNAMITE_INACTIVE);
       PlaySoundLevel(x, y, SND_PONG);
       break;
 
@@ -4794,8 +4806,7 @@ boolean PlaceBomb(struct PlayerInfo *player)
   element = Feld[jx][jy];
 
   if ((player->dynamite == 0 && player->dynabombs_left == 0) ||
-      element == EL_DYNAMIT || element == EL_DYNABOMB ||
-      element == EL_EXPLODING)
+      IS_ACTIVE_BOMB(element) || element == EL_EXPLODING)
     return FALSE;
 
   if (element != EL_LEERRAUM)
@@ -4803,7 +4814,7 @@ boolean PlaceBomb(struct PlayerInfo *player)
 
   if (player->dynamite)
   {
-    Feld[jx][jy] = EL_DYNAMIT;
+    Feld[jx][jy] = EL_DYNAMITE_ACTIVE;
     MovDelay[jx][jy] = 96;
     player->dynamite--;
     DrawText(DX_DYNAMITE, DY_DYNAMITE, int2str(local_player->dynamite, 3),
@@ -4818,8 +4829,7 @@ boolean PlaceBomb(struct PlayerInfo *player)
   }
   else
   {
-    Feld[jx][jy] = EL_DYNABOMB;
-    Store2[jx][jy] = player->element_nr;       /* for DynaExplode() */
+    Feld[jx][jy] = EL_DYNABOMB_ACTIVE_1 + (player->element_nr - EL_SPIELER1);
     MovDelay[jx][jy] = 96;
     player->dynabombs_left--;
     if (IN_SCR_FIELD(SCREENX(jx), SCREENY(jy)))
@@ -4909,7 +4919,7 @@ void RaiseScoreElement(int element)
     case EL_KOKOSNUSS:
       RaiseScore(level.score[SC_KOKOSNUSS]);
       break;
-    case EL_DYNAMIT:
+    case EL_DYNAMITE_INACTIVE:
       RaiseScore(level.score[SC_DYNAMIT]);
       break;
     case EL_SCHLUESSEL:
index 85339702a27243982d20cfaeeed5811d4f3f6b09..4f18c12a2e613f62bd5a69fd26d7eaf4b7cdf639 100644 (file)
@@ -1313,7 +1313,7 @@ void InitElementProperties()
     EL_EM_GATE_2X,
     EL_EM_GATE_3X,
     EL_EM_GATE_4X,
-    EL_DYNAMIT_AUS,
+    EL_DYNAMITE_INACTIVE,
     EL_UNSICHTBAR,
     EL_BIRNE_AUS,
     EL_BIRNE_EIN,
@@ -1379,9 +1379,12 @@ void InitElementProperties()
   static int ep_explosive[] =
   {
     EL_BOMBE,
-    EL_DYNAMIT,
-    EL_DYNAMIT_AUS,
-    EL_DYNABOMB,
+    EL_DYNAMITE_ACTIVE,
+    EL_DYNAMITE_INACTIVE,
+    EL_DYNABOMB_ACTIVE_1,
+    EL_DYNABOMB_ACTIVE_2,
+    EL_DYNABOMB_ACTIVE_3,
+    EL_DYNABOMB_ACTIVE_4,
     EL_DYNABOMB_NR,
     EL_DYNABOMB_SZ,
     EL_DYNABOMB_XL,
@@ -1538,6 +1541,16 @@ void InitElementProperties()
   };
   static int ep_over_player_num = sizeof(ep_over_player)/sizeof(int);
 
+  static int ep_active_bomb[] =
+  {
+    EL_DYNAMITE_ACTIVE,
+    EL_DYNABOMB_ACTIVE_1,
+    EL_DYNABOMB_ACTIVE_2,
+    EL_DYNABOMB_ACTIVE_3,
+    EL_DYNABOMB_ACTIVE_4
+  };
+  static int ep_active_bomb_num = sizeof(ep_active_bomb)/sizeof(int);
+
   static long ep_bit[] =
   {
     EP_BIT_AMOEBALIVE,
@@ -1569,7 +1582,8 @@ void InitElementProperties()
     EP_BIT_EATABLE,
     EP_BIT_SP_ELEMENT,
     EP_BIT_QUICK_GATE,
-    EP_BIT_OVER_PLAYER
+    EP_BIT_OVER_PLAYER,
+    EP_BIT_ACTIVE_BOMB
   };
   static int *ep_array[] =
   {
@@ -1602,7 +1616,8 @@ void InitElementProperties()
     ep_eatable,
     ep_sp_element,
     ep_quick_gate,
-    ep_over_player
+    ep_over_player,
+    ep_active_bomb
   };
   static int *ep_num[] =
   {
@@ -1635,7 +1650,8 @@ void InitElementProperties()
     &ep_eatable_num,
     &ep_sp_element_num,
     &ep_quick_gate_num,
-    &ep_over_player_num
+    &ep_over_player_num,
+    &ep_active_bomb_num
   };
   static int num_properties = sizeof(ep_num)/sizeof(int *);
 
index 0a52d8f5e96a6ef0fe5f3eb9bd570dd730ad4ca1..726e58ac7444fc30e49ccffb2b94baccb22806dc 100644 (file)
@@ -126,6 +126,7 @@ typedef unsigned char byte;
 #define EP_BIT_SP_ELEMENT      (1 << 28)
 #define EP_BIT_QUICK_GATE      (1 << 29)
 #define EP_BIT_OVER_PLAYER     (1 << 30)
+#define EP_BIT_ACTIVE_BOMB     (1 << 31)
 
 #define IS_AMOEBALIVE(e)       (Elementeigenschaften[e] & EP_BIT_AMOEBALIVE)
 #define IS_AMOEBOID(e)         (Elementeigenschaften[e] & EP_BIT_AMOEBOID)
@@ -158,6 +159,7 @@ typedef unsigned char byte;
 #define IS_SP_ELEMENT(e)       (Elementeigenschaften[e] & EP_BIT_SP_ELEMENT)
 #define IS_QUICK_GATE(e)       (Elementeigenschaften[e] & EP_BIT_QUICK_GATE)
 #define IS_OVER_PLAYER(e)      (Elementeigenschaften[e] & EP_BIT_OVER_PLAYER)
+#define IS_ACTIVE_BOMB(e)      (Elementeigenschaften[e] & EP_BIT_ACTIVE_BOMB)
 
 #define IS_PLAYER(x,y)         (ELEM_IS_PLAYER(StorePlayer[x][y]))
 
@@ -600,7 +602,7 @@ extern char         *element_info[];
 #define EL_KOKOSNUSS           25
 #define EL_LIFE                        26
 #define EL_LIFE_ASYNC          27
-#define EL_DYNAMIT             28
+#define EL_DYNAMITE_ACTIVE     28
 #define EL_BADEWANNE           29
 #define EL_ABLENK_AUS          30
 #define EL_ABLENK_EIN          31
@@ -616,7 +618,7 @@ extern char         *element_info[];
 #define EL_PFORTE2X            41
 #define EL_PFORTE3X            42
 #define EL_PFORTE4X            43
-#define EL_DYNAMIT_AUS         44
+#define EL_DYNAMITE_INACTIVE   44
 #define EL_PACMAN              45
 #define EL_UNSICHTBAR          46
 #define EL_BIRNE_AUS           47
@@ -635,7 +637,9 @@ extern char         *element_info[];
 #define EL_MAMPFER2            60
 #define EL_SIEB2_INAKTIV       61
 #define EL_INVISIBLE_STEEL     62
-#define EL_DYNABOMB            63
+
+#define EL_UNUSED_63           63
+
 #define EL_DYNABOMB_NR         64
 #define EL_DYNABOMB_SZ         65
 #define EL_DYNABOMB_XL         66
@@ -823,6 +827,10 @@ extern char                *element_info[];
 #define EL_EM_KEY_2            310
 #define EL_EM_KEY_3            311
 #define EL_EM_KEY_4            312
+#define EL_DYNABOMB_ACTIVE_1   313
+#define EL_DYNABOMB_ACTIVE_2   314
+#define EL_DYNABOMB_ACTIVE_3   315
+#define EL_DYNABOMB_ACTIVE_4   316
 
 /* "unreal" (and therefore not drawable) runtime elements */
 #define EL_BLOCKED             400
index a946e4b31dca4b7fa04982f99b15182cc6bd820a..a5224ae11bfabbbe570dd1f12c898c2a79aebf31 100644 (file)
@@ -489,7 +489,7 @@ void DrawPlayer(struct PlayerInfo *player)
       DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]);
       DrawLevelFieldThruMask(last_jx, last_jy);
     }
-    else if (last_element == EL_DYNAMIT)
+    else if (last_element == EL_DYNAMITE_ACTIVE)
       DrawDynamite(last_jx, last_jy);
     else
       DrawLevelField(last_jx, last_jy);
@@ -518,7 +518,7 @@ void DrawPlayer(struct PlayerInfo *player)
 
   if (Store[jx][jy])
     DrawLevelElement(jx, jy, Store[jx][jy]);
-  else if (element != EL_DYNAMIT && element != EL_DYNABOMB)
+  else if (!IS_ACTIVE_BOMB(element))
     DrawLevelField(jx, jy);
 
   /* draw player himself */
@@ -631,13 +631,13 @@ void DrawPlayer(struct PlayerInfo *player)
     }
   }
 
-  /* draw things in front of player (EL_DYNAMIT or EL_DYNABOMB) */
+  /* draw things in front of player (active dynamite or dynabombs) */
 
-  if (element == EL_DYNAMIT || element == EL_DYNABOMB)
+  if (IS_ACTIVE_BOMB(element))
   {
     graphic = el2gfx(element);
 
-    if (element == EL_DYNAMIT)
+    if (element == EL_DYNAMITE_ACTIVE)
     {
       if ((phase = (96 - MovDelay[jx][jy]) / 12) > 6)
        phase = 6;
@@ -2332,7 +2332,7 @@ int el2gfx(int element)
     case EL_KOKOSNUSS:         return GFX_KOKOSNUSS;
     case EL_LIFE:              return GFX_LIFE;
     case EL_LIFE_ASYNC:                return GFX_LIFE_ASYNC;
-    case EL_DYNAMIT:           return GFX_DYNAMIT;
+    case EL_DYNAMITE_ACTIVE:   return GFX_DYNAMIT;
     case EL_BADEWANNE:         return GFX_BADEWANNE;
     case EL_BADEWANNE1:                return GFX_BADEWANNE1;
     case EL_BADEWANNE2:                return GFX_BADEWANNE2;
@@ -2353,7 +2353,7 @@ int el2gfx(int element)
     case EL_PFORTE2X:          return GFX_PFORTE2X;
     case EL_PFORTE3X:          return GFX_PFORTE3X;
     case EL_PFORTE4X:          return GFX_PFORTE4X;
-    case EL_DYNAMIT_AUS:       return GFX_DYNAMIT_AUS;
+    case EL_DYNAMITE_INACTIVE: return GFX_DYNAMIT_AUS;
     case EL_PACMAN:            return GFX_PACMAN;
     case EL_PACMAN_R:          return GFX_PACMAN_R;
     case EL_PACMAN_O:          return GFX_PACMAN_O;
@@ -2383,7 +2383,10 @@ int el2gfx(int element)
     case EL_SIEB2_LEER:                return GFX_SIEB2_LEER;
     case EL_SIEB2_VOLL:                return GFX_SIEB2_VOLL;
     case EL_SIEB2_TOT:         return GFX_SIEB2_TOT;
-    case EL_DYNABOMB:          return GFX_DYNABOMB;
+    case EL_DYNABOMB_ACTIVE_1: return GFX_DYNABOMB;
+    case EL_DYNABOMB_ACTIVE_2: return GFX_DYNABOMB;
+    case EL_DYNABOMB_ACTIVE_3: return GFX_DYNABOMB;
+    case EL_DYNABOMB_ACTIVE_4: return GFX_DYNABOMB;
     case EL_DYNABOMB_NR:       return GFX_DYNABOMB_NR;
     case EL_DYNABOMB_SZ:       return GFX_DYNABOMB_SZ;
     case EL_DYNABOMB_XL:       return GFX_DYNABOMB_XL;