replaced glib function calls to g_file_get_contents()
[rocksndiamonds.git] / src / game_bd / bd_caveengine.c
index bfb7dfbc004ea74428ac2494752c4beed588a341..109bcb2da410e5e8d555a4ebc84ce3149de4cd99 100644 (file)
@@ -526,6 +526,19 @@ static inline boolean is_space_dir(const GdCave *cave, const int x, const int y,
   return (e == O_SPACE || e == O_LAVA);
 }
 
+static inline void store_dir_buffer(GdCave *cave, const int x, const int y, const GdDirection dir)
+{
+  /* raw values without range correction */
+  int raw_x = x + gd_dx[dir];
+  int raw_y = y + gd_dy[dir];
+  /* final values with range correction */
+  int new_x = getx(cave, raw_x, raw_y);
+  int new_y = gety(cave, raw_x, raw_y);
+  int new_dir = (dir > GD_MV_TWICE ? dir - GD_MV_TWICE : dir);
+
+  game_bd.game->dir_buffer[new_y][new_x] = new_dir;
+}
+
 /* store an element at the given position */
 static inline void store(GdCave *cave, const int x, const int y, const GdElement element)
 {
@@ -551,6 +564,7 @@ static inline void store_sc(GdCave *cave, const int x, const int y, const GdElem
 static inline void store_dir(GdCave *cave, const int x, const int y,
                             const GdDirection dir, const GdElement element)
 {
+  store_dir_buffer(cave, x, y, dir);
   store(cave, x + gd_dx[dir], y + gd_dy[dir], element | SCANNED);
 }
 
@@ -558,6 +572,7 @@ static inline void store_dir(GdCave *cave, const int x, const int y,
 static inline void store_dir_no_scanned(GdCave *cave, const int x, const int y,
                                        const GdDirection dir, const GdElement element)
 {
+  store_dir_buffer(cave, x, y, dir);
   store(cave, x + gd_dx[dir], y + gd_dy[dir], element);
 }
 
@@ -1085,7 +1100,7 @@ static boolean do_push(GdCave *cave, int x, int y, GdDirection player_move, bool
        }
 
        if (is_space_dir(cave, x, y, GD_MV_TWICE + player_move) &&
-           g_rand_int_range(cave->random, 0, 1000000) < prob)
+           gd_rand_int_range(cave->random, 0, 1000000) < prob)
        {
          /* if decided that he will be able to push, */
          store_dir(cave, x, y, GD_MV_TWICE + player_move, what);
@@ -1332,10 +1347,10 @@ static boolean do_fall_try_magic(GdCave *cave, int x, int y,
   {
     play_sound_of_element(cave, O_DIAMOND, x, y);    /* always play diamond sound */
 
-    if (cave->magic_wall_state==GD_MW_DORMANT)
+    if (cave->magic_wall_state == GD_MW_DORMANT)
       cave->magic_wall_state = GD_MW_ACTIVE;
 
-    if (cave->magic_wall_state==GD_MW_ACTIVE &&
+    if (cave->magic_wall_state == GD_MW_ACTIVE &&
        is_space_dir(cave, x, y, GD_MV_TWICE+fall_dir))
     {
       /* if magic wall active and place underneath, it turns element
@@ -1594,7 +1609,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
       for (x = 0; x < cave->w; x++)
       {
        /* timer for the cell > 0? */
-       if (cave->hammered_reappear[y][x]>0)
+       if (cave->hammered_reappear[y][x] > 0)
        {
          /* decrease timer */
          cave->hammered_reappear[y][x]--;
@@ -1665,7 +1680,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
          cave->player_seen_ago = 0;
          /* bd4 intermission caves have many players. so if one of them has exited,
           * do not change the flag anymore. so this if () is needed */
-         if (cave->player_state!=GD_PL_EXITED)
+         if (cave->player_state != GD_PL_EXITED)
            cave->player_state = GD_PL_LIVING;
 
          /* check for pneumatic hammer things */
@@ -1841,10 +1856,10 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
                     player_move parameter) */
                  /* only allow changing direction if the new dir is not diagonal */
                  if (cave->gravity_switch_active &&
-                     (player_move==GD_MV_LEFT ||
-                      player_move==GD_MV_RIGHT ||
-                      player_move==GD_MV_UP ||
-                      player_move==GD_MV_DOWN))
+                     (player_move == GD_MV_LEFT ||
+                      player_move == GD_MV_RIGHT ||
+                      player_move == GD_MV_UP ||
+                      player_move == GD_MV_DOWN))
                  {
                    gd_sound_play(cave, GD_S_SWITCH_GRAVITY, what, x, y);
                    cave->gravity_will_change =
@@ -1883,7 +1898,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
          cave->player_seen_ago = 0;
          /* bd4 intermission caves have many players. so if one of them has exited,
           * do not change the flag anymore. so this if () is needed */
-         if (cave->player_state!=GD_PL_EXITED)
+         if (cave->player_state != GD_PL_EXITED)
            cave->player_state = GD_PL_LIVING;
 
          if (player_fire)
@@ -1906,7 +1921,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
          }
 
          cave->player_seen_ago = 0;
-         if (cave->player_state!=GD_PL_EXITED)
+         if (cave->player_state != GD_PL_EXITED)
            cave->player_state = GD_PL_LIVING;
 
          /* if hammering time is up, becomes a normal player again. */
@@ -2245,7 +2260,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
          {
            const GdDirection *creature_move;
            boolean ccw = rotates_ccw(cave, x, y);    /* check if default is counterclockwise */
-           GdElement base;    /* base element number (which is like O_***_1) */
+           GdElement base = -1;    /* base element number (which is like O_***_1) */
            int dir, dirn, dirp;    /* direction */
 
            if (get(cave, x, y) >= O_FIREFLY_1 &&
@@ -2264,7 +2279,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
                     get(cave, x, y) <= O_ALT_BUTTER_4)
              base = O_ALT_BUTTER_1;
 
-           dir = get(cave, x, y)-base;    /* facing where */
+           dir = get(cave, x, y) - base;    /* facing where */
            creature_move = cave->creatures_backwards ? creature_chdir : creature_dir;
 
            /* now change direction if backwards */
@@ -2322,7 +2337,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
          {
            int px = cave->px[0];
            int py = cave->py[0];
-           boolean horizontal = g_rand_boolean(cave->random);
+           boolean horizontal = gd_rand_boolean(cave->random);
            boolean dont_move = FALSE;
            int i = 3;
 
@@ -2621,7 +2636,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
            /* is space over the bladder? */
            if (is_space_dir(cave, x, y, opposite[grav_compat]))
            {
-             if (get(cave, x, y)==O_BLADDER_8)
+             if (get(cave, x, y) == O_BLADDER_8)
              {
                /* if it is a bladder 8, really move up */
                move(cave, x, y, opposite[grav_compat], O_BLADDER_1);
@@ -2696,7 +2711,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
              };
              GdDirection random_dir;
 
-             random_dir = dirs[g_rand_int_range(cave->random, 0, G_N_ELEMENTS(dirs))];
+             random_dir = dirs[gd_rand_int_range(cave->random, 0, G_N_ELEMENTS(dirs))];
              if (is_space_dir(cave, x, y, random_dir))
              {
                move(cave, x, y, random_dir, O_GHOST);
@@ -2739,11 +2754,11 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
                }
 
              /* if alive, check in which dir to grow (or not) */
-             if (cave->amoeba_state==GD_AM_AWAKE)
+             if (cave->amoeba_state == GD_AM_AWAKE)
              {
-               if (g_rand_int_range(cave->random, 0, 1000000) < cave->amoeba_growth_prob)
+               if (gd_rand_int_range(cave->random, 0, 1000000) < cave->amoeba_growth_prob)
                {
-                 switch (g_rand_int_range(cave->random, 0, 4))
+                 switch (gd_rand_int_range(cave->random, 0, 4))
                  {
                    /* decided to grow, choose a random direction. */
                    case 0:    /* let this be up. numbers indifferent. */
@@ -2809,9 +2824,9 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
 
                /* if it is alive, decide if it attempts to grow */
                if (cave->amoeba_2_state == GD_AM_AWAKE)
-                 if (g_rand_int_range(cave->random, 0, 1000000) < cave->amoeba_2_growth_prob)
+                 if (gd_rand_int_range(cave->random, 0, 1000000) < cave->amoeba_2_growth_prob)
                  {
-                   switch (g_rand_int_range(cave->random, 0, 4))
+                   switch (gd_rand_int_range(cave->random, 0, 4))
                    {
                      /* decided to grow, choose a random direction. */
                      case 0:    /* let this be up. numbers indifferent. */
@@ -2842,7 +2857,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
 
        case O_ACID:
          /* choose randomly, if it spreads */
-         if (g_rand_int_range(cave->random, 0, 1000000) <= cave->acid_spread_ratio)
+         if (gd_rand_int_range(cave->random, 0, 1000000) <= cave->acid_spread_ratio)
          {
            /* the current one explodes */
            store(cave, x, y, cave->acid_turns_to);
@@ -2903,8 +2918,8 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
          if (((get(cave, x, y) == O_H_EXPANDING_WALL ||
                get(cave, x, y) == O_H_EXPANDING_STEEL_WALL) &&
               !cave->expanding_wall_changed) ||
-             ((get(cave, x, y)==O_V_EXPANDING_WALL ||
-               get(cave, x, y)==O_V_EXPANDING_STEEL_WALL) &&
+             ((get(cave, x, y) == O_V_EXPANDING_WALL ||
+               get(cave, x, y) == O_V_EXPANDING_STEEL_WALL) &&
               cave->expanding_wall_changed))
          {
            if (is_space_dir(cave, x, y, GD_MV_LEFT))
@@ -2970,12 +2985,12 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
                  (rrr & cave->slime_permeability_c64) == 0);
 #endif
          /*
-          * unpredictable: g_rand_int
+          * unpredictable: gd_rand_int
           * predictable: c64 predictable random generator.
           *    for predictable, a random number is generated,
           *    whether or not it is even possible that the stone will be able to pass.
           */
-         if (cave->slime_predictable ? ((rrr /* XXX */ & cave->slime_permeability_c64) == 0) : g_rand_int_range(cave->random, 0, 1000000) < cave->slime_permeability)
+         if (cave->slime_predictable ? ((rrr /* XXX */ & cave->slime_permeability_c64) == 0) : gd_rand_int_range(cave->random, 0, 1000000) < cave->slime_permeability)
          {
            GdDirection grav = cave->gravity;
            GdDirection oppos = opposite[cave->gravity];
@@ -3029,13 +3044,13 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
                  store_dir(cave, x, y, oppos, O_BLADDER_1);
                  play_sound_of_element(cave, O_SLIME, x, y);
                }
-               else if (get_dir(cave, x, y, grav)==O_FLYING_STONE)
+               else if (get_dir(cave, x, y, grav) == O_FLYING_STONE)
                {
                  store_dir(cave, x, y, grav, O_SPACE);
                  store_dir(cave, x, y, oppos, O_FLYING_STONE_F);
                  play_sound_of_element(cave, O_SLIME, x, y);
                }
-               else if (get_dir(cave, x, y, grav)==O_FLYING_DIAMOND)
+               else if (get_dir(cave, x, y, grav) == O_FLYING_DIAMOND)
                {
                  store_dir(cave, x, y, grav, O_SPACE);
                  store_dir(cave, x, y, oppos, O_FLYING_DIAMOND_F);
@@ -3186,7 +3201,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
              O_WAITING_STONE, O_BITER_1
            };
 
-           store(cave, x, y, ghost_explode[g_rand_int_range(cave->random, 0, G_N_ELEMENTS(ghost_explode))]);
+           store(cave, x, y, ghost_explode[gd_rand_int_range(cave->random, 0, G_N_ELEMENTS(ghost_explode))]);
          }
          break;
 
@@ -3352,7 +3367,7 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
   /* this loop finds the coordinates of the player. needed for scrolling and chasing stone.*/
   /* but we only do this, if a living player was found. if not yet, the setup
      routine coordinates are used */
-  if (cave->player_state==GD_PL_LIVING)
+  if (cave->player_state == GD_PL_LIVING)
   {
     if (cave->active_is_first_found)
     {