/* third part of synchro.
 *
 * handle global elements.
 *
 * this should be spread over the frames for reduced cpu load.
 */

#include "main_em.h"


void synchro_3(void)
{
  int x;
  int y;
  int count;
  unsigned long random;

  /* update variables */

  if (lev.score > 9999)
    lev.score = 9999;

#if 0
#if 1
  if (lev.time_initial == 0)
    lev.time++;
  else if (lev.time > 0)
    lev.time--;
#else
  if (lev.time)
    lev.time--;
#endif
#endif

  if (lev.android_move_cnt-- == 0)
    lev.android_move_cnt = lev.android_move_time;
  if (lev.android_clone_cnt-- == 0)
    lev.android_clone_cnt = lev.android_clone_time;
  if (lev.ball_state)
    if (lev.ball_cnt-- == 0)
      lev.ball_cnt = lev.ball_time;
  if (lev.lenses_cnt)
    lev.lenses_cnt--;
  if (lev.magnify_cnt)
    lev.magnify_cnt--;
  if (lev.wheel_cnt)
    lev.wheel_cnt--;
  if (lev.wind_cnt)
    lev.wind_cnt--;
  if (lev.wonderwall_time && lev.wonderwall_state)
    lev.wonderwall_time--;

#if 0
  if (lev.time_initial > 0 &&
      lev.time > 0 && lev.time <= 50 && lev.time % 5 == 0 && setup.time_limit)
    play_sound(-1, -1, SAMPLE_time);
#endif

  if (lev.wheel_cnt)
    play_element_sound(lev.wheel_x, lev.wheel_y, SAMPLE_wheel, Xwheel);

  /* grow amoeba */

  random = RandomEM;

  for (count = lev.amoeba_time; count--;)
  {
    x = (random >> 10) % (WIDTH - 2);
    y = (random >> 20) % (HEIGHT - 2);
    switch (Cave[y][x])
    {
      case Xblank:
      case Yacid_splash_eB:
      case Yacid_splash_wB:
      case Xgrass:
      case Xdirt:
      case Xsand:
      case Xplant:
      case Yplant:
	if (tab_amoeba[Cave[y-1][x]] ||
	    tab_amoeba[Cave[y][x+1]] ||
	    tab_amoeba[Cave[y+1][x]] ||
	    tab_amoeba[Cave[y][x-1]])
	  Cave[y][x] = Xdrip_eat;
    }

    random = random * 129 + 1;
  }

  RandomEM = random;

  /* handle explosions */

  for (y = 1; y < HEIGHT - 1; y++)
    for (x = 1; x < WIDTH - 1; x++)
    {
      switch (Cave[y][x])
      {
        case Znormal:
	  Cave[y][x] = Xboom_1;
	  Cave[y-1][x] = tab_explode_normal[Cave[y-1][x]];
	  Cave[y][x-1] = tab_explode_normal[Cave[y][x-1]];
	  Cave[y][x+1] = tab_explode_normal[Cave[y][x+1]];
	  Cave[y+1][x] = tab_explode_normal[Cave[y+1][x]];
	  Cave[y-1][x-1] = tab_explode_normal[Cave[y-1][x-1]];
	  Cave[y-1][x+1] = tab_explode_normal[Cave[y-1][x+1]];
	  Cave[y+1][x-1] = tab_explode_normal[Cave[y+1][x-1]];
	  Cave[y+1][x+1] = tab_explode_normal[Cave[y+1][x+1]];
	  break;

        case Zdynamite:
	  Cave[y][x] = Xboom_1;
	  Cave[y-1][x] = tab_explode_dynamite[Cave[y-1][x]];
	  Cave[y][x-1] = tab_explode_dynamite[Cave[y][x-1]];
	  Cave[y][x+1] = tab_explode_dynamite[Cave[y][x+1]];
	  Cave[y+1][x] = tab_explode_dynamite[Cave[y+1][x]];
	  Cave[y-1][x-1] = tab_explode_dynamite[Cave[y-1][x-1]];
	  Cave[y-1][x+1] = tab_explode_dynamite[Cave[y-1][x+1]];
	  Cave[y+1][x-1] = tab_explode_dynamite[Cave[y+1][x-1]];
	  Cave[y+1][x+1] = tab_explode_dynamite[Cave[y+1][x+1]];
	  break;
      }
    }

  /* triple buffering */

  for (y = 0; y < HEIGHT; y++)
    for (x = 0; x < WIDTH; x++)
      Next[y][x] = Cave[y][x];
}
