rnd-20050314-1-src
[rocksndiamonds.git] / src / game_em / synchro_1.c
index 0ff540e35a87640410ca97d52a0531de0271f5d8..c5b2c456b4910ed38eae9452f42b29d4f17d1edb 100644 (file)
 #include "display.h"
 
 
-static void player(struct PLAYER *);
-static int test(struct PLAYER *);
-static void die(struct PLAYER *);
+static void check_player(struct PLAYER *);
+static void kill_player(struct PLAYER *);
+static boolean player_digfield(struct PLAYER *, int, int);
+static boolean player_killed(struct PLAYER *);
 
 void synchro_1(void)
 {
  /* must test for death and actually kill separately */
-  char ply1_kill = test(&ply1);
-  char ply2_kill = test(&ply2);
+  boolean ply1_kill = player_killed(&ply1);
+  boolean ply2_kill = player_killed(&ply2);
 
   if (ply1.alive && ply1_kill)
-    die(&ply1);
+    kill_player(&ply1);
   if (ply2.alive && ply2_kill)
-    die(&ply2);
+    kill_player(&ply2);
 
 #if 0
   ply1.alive = 1; /* debugging */
@@ -39,13 +40,13 @@ void synchro_1(void)
 
   if (Random & 256)
   {
-    if (ply1.alive) player(&ply1);
-    if (ply2.alive) player(&ply2);
+    if (ply1.alive) check_player(&ply1);
+    if (ply2.alive) check_player(&ply2);
   }
   else
   {
-    if (ply2.alive) player(&ply2);
-    if (ply1.alive) player(&ply1);
+    if (ply2.alive) check_player(&ply2);
+    if (ply1.alive) check_player(&ply1);
   }
 
   if (ply1.alive)
@@ -79,16 +80,21 @@ void synchro_1(void)
   }
 }
 
-static int test(struct PLAYER *ply)
+static boolean player_killed(struct PLAYER *ply)
 {
   register unsigned int x = ply->x;
   register unsigned int y = ply->y;
 
   if (!ply->alive)
-    return 0;
-
-  if (lev.time == 0)
-    return(1);
+    return FALSE;
+
+#if 1
+  if (lev.killed_out_of_time && setup.time_limit)
+    return TRUE;
+#else
+  if (lev.time_initial > 0 && lev.time == 0 && setup.time_limit)
+    return TRUE;
+#endif
 
   switch(Cave[y-1][x])
   {
@@ -108,7 +114,7 @@ static int test(struct PLAYER *ply)
     case Xtank_goe:
     case Xtank_gos:
     case Xtank_gow:
-      return(1);
+      return TRUE;
   }
 
   switch(Cave[y][x+1])
@@ -129,7 +135,7 @@ static int test(struct PLAYER *ply)
     case Xtank_goe:
     case Xtank_gos:
     case Xtank_gow:
-      return(1);
+      return TRUE;
   }
 
   switch(Cave[y+1][x])
@@ -150,7 +156,7 @@ static int test(struct PLAYER *ply)
     case Xtank_goe:
     case Xtank_gos:
     case Xtank_gow:
-      return(1);
+      return TRUE;
   }
 
   switch(Cave[y][x-1])
@@ -171,7 +177,7 @@ static int test(struct PLAYER *ply)
     case Xtank_goe:
     case Xtank_gos:
     case Xtank_gow:
-      return(1);
+      return TRUE;
   }
 
   switch(Cave[y][x])
@@ -184,13 +190,23 @@ static int test(struct PLAYER *ply)
     case Xdynamite_2:
     case Xdynamite_3:
     case Xdynamite_4:
-      return(0);
+#if 1
+    case Xfake_acid_1:
+    case Xfake_acid_2:
+    case Xfake_acid_3:
+    case Xfake_acid_4:
+    case Xfake_acid_5:
+    case Xfake_acid_6:
+    case Xfake_acid_7:
+    case Xfake_acid_8:
+#endif
+      return FALSE;
   }
 
-  return(1);
+  return TRUE;
 }
 
-static void die(struct PLAYER *ply)
+static void kill_player(struct PLAYER *ply)
 {
   register unsigned int x = ply->x;
   register unsigned int y = ply->y;
@@ -208,6 +224,9 @@ static void die(struct PLAYER *ply)
     case Xbug_gos:
     case Xbug_gow:
       Cave[y-1][x] = Xboom_bug;
+#if 0
+      play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
       break;
 
     case Xtank_n:
@@ -219,6 +238,9 @@ static void die(struct PLAYER *ply)
     case Xtank_gos:
     case Xtank_gow:
       Cave[y-1][x] = Xboom_bomb;
+#if 0
+      play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
       break;
   }
 
@@ -233,6 +255,9 @@ static void die(struct PLAYER *ply)
     case Xbug_gos:
     case Xbug_gow:
       Cave[y][x+1] = Xboom_bug;
+#if 0
+      play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
       break;
 
     case Xtank_n:
@@ -244,6 +269,9 @@ static void die(struct PLAYER *ply)
     case Xtank_gos:
     case Xtank_gow:
       Cave[y][x+1] = Xboom_bomb;
+#if 0
+      play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
       break;
   }
 
@@ -258,6 +286,9 @@ static void die(struct PLAYER *ply)
     case Xbug_gos:
     case Xbug_gow:
       Cave[y+1][x] = Xboom_bug;
+#if 0
+      play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
       break;
 
     case Xtank_n:
@@ -269,6 +300,9 @@ static void die(struct PLAYER *ply)
     case Xtank_gos:
     case Xtank_gow:
       Cave[y+1][x] = Xboom_bomb;
+#if 0
+      play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
       break;
   }
 
@@ -283,6 +317,9 @@ static void die(struct PLAYER *ply)
     case Xbug_gos:
     case Xbug_gow:
       Cave[y][x-1] = Xboom_bug;
+#if 0
+      play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
       break;
 
     case Xtank_n:
@@ -294,6 +331,9 @@ static void die(struct PLAYER *ply)
     case Xtank_gos:
     case Xtank_gow:
       Cave[y][x-1] = Xboom_bomb;
+#if 0
+      play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
       break;
   }
 
@@ -302,98 +342,145 @@ static void die(struct PLAYER *ply)
     case Xexit_1:
     case Xexit_2:
     case Xexit_3:
-      play_sound(x, y, SAMPLE_exit);
+      play_element_sound(x, y, SAMPLE_exit_leave, Xexit_1);
       break;
 
     default:
-      play_sound(x, y, SAMPLE_die);
+      play_element_sound(x, y, SAMPLE_die, Zplayer);
       break;
   }
 
-  Cave[y][x] = Xboom_1;
-  Boom[y][x] = Xblank;
+  switch(Cave[y][x])
+  {
+#if 1
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      break;
+#endif
+
+    default:
+      Cave[y][x] = Xboom_1;
+      Boom[y][x] = Xblank;
+      break;
+  }
 }
 
-static void player(struct PLAYER *ply)
+static void check_player(struct PLAYER *ply)
 {
-  register unsigned int x = ply->x;
-  register unsigned int y = ply->y;
-  unsigned int anim = 0;       /* initialized to make compilers happy */
+  unsigned int oldx = ply->x;
+  unsigned int oldy = ply->y;
+  register unsigned int x = oldx;
+  register unsigned int y = oldy;
+  unsigned int anim = 0;
   int dx = 0, dy = 0;
 
+#if 0
+  printf("::: up == %d, down == %d, left == %d, right == %d, fire == %d [spin == %d, stick == %d]\n",
+        ply->joy_n, ply->joy_s, ply->joy_w, ply->joy_e, ply->joy_fire,
+        ply->joy_spin, ply->joy_stick);
+#endif
+
+#if 1
+  if (ply->joy_w)              /* west */
+  {
+    x--;
+    dx = -1;
+    anim = 3;
+  }
+  else if (ply->joy_e)         /* east */
+  {
+    x++;
+    dx = 1;
+    anim = 1;
+  }
+
+  if (ply->joy_n)              /* north */
+  {
+    y--;
+    dy = -1;
+    anim = 0;
+  }
+  else if (ply->joy_s)         /* south */
+  {
+    y++;
+    dy = 1;
+    anim = 2;
+  }
+
+#else
+
   if ((ply->joy_spin = !ply->joy_spin))
   {
-    if (ply->joy_n)
+    if (ply->joy_n)            /* north */
     {
       y--;
       dy = -1;
       anim = 0;
-      /* north */
     }
-    else if (ply->joy_e)
+    else if (ply->joy_e)       /* east */
     {
       x++;
       dx = 1;
       anim = 1;
-      /* east */
     }
-    else if (ply->joy_s)
+    else if (ply->joy_s)       /* south */
     {
       y++;
       dy = 1;
       anim = 2;
-      /* south */
     }
-    else if (ply->joy_w)
+    else if (ply->joy_w)       /* west */
     {
       x--;
       dx = -1;
       anim = 3;
-      /* west */
     }
   }
   else
   {
-    if (ply->joy_w)
+    if (ply->joy_w)            /* west */
     {
       x--;
       dx = -1;
       anim = 3;
-      /* west */
     }
-    else if (ply->joy_s)
+    else if (ply->joy_s)       /* south */
     {
       y++;
       dy = 1;
       anim = 2;
-      /* south */
     }
-    else if (ply->joy_e)
+    else if (ply->joy_e)       /* east */
     {
       x++;
       dx = 1;
       anim = 1;
-      /* east */
     }
-    else if (ply->joy_n)
+    else if (ply->joy_n)       /* north */
     {
       y--;
       dy = -1;
       anim = 0;
-      /* north */
     }
   }
+#endif
 
   if (dx == 0 && dy == 0)
   {
     ply->joy_stick = 0;
 
-    if (ply->joy_fire)
+    if (ply->joy_drop)
     {
       if (++ply->dynamite_cnt == 5 && ply->dynamite)
       {
        Cave[y][x] = Xdynamite_1;
-       play_sound(x, y, SAMPLE_dynamite);
+       play_element_sound(x, y, SAMPLE_dynamite, Xdynamite_1);
        ply->dynamite--;
       }
     }
@@ -402,7 +489,7 @@ static void player(struct PLAYER *ply)
       ply->dynamite_cnt = 0;
     }
 
-    Random += 7; /* bit more random if we dont move */
+    Random += 7;       /* be a bit more random if the player doesn't move */
 
     return;
   }
@@ -410,8 +497,53 @@ static void player(struct PLAYER *ply)
   ply->joy_stick = 1;
   ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
   ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
+  ply->joy_spin = !ply->joy_spin;
 
-  if (ply->joy_fire == 0)
+  if (ply->joy_snap == 0)              /* player wants to move */
+  {
+    boolean moved = FALSE;
+
+    if (ply->last_move_dir & MV_HORIZONTAL)
+    {
+      if (!(moved = player_digfield(ply, 0, dy)))
+       moved = player_digfield(ply, dx, 0);
+    }
+    else
+    {
+      if (!(moved = player_digfield(ply, dx, 0)))
+       moved = player_digfield(ply, 0, dy);
+    }
+
+    if (moved)
+    {
+      if (oldx != ply->x)
+       ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
+      else if (oldy != ply->y)
+       ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
+    }
+  }
+  else                                 /* player wants to snap */
+  {
+    player_digfield(ply, dx, dy);
+  }
+}
+
+static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
+{
+  int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
+  unsigned int oldx = ply->x;
+  unsigned int oldy = ply->y;
+  register unsigned int x = oldx + dx;
+  register unsigned int y = oldy + dy;
+  boolean result = TRUE;
+
+  if (!dx && !dy)                      /* no direction specified */
+    return FALSE;
+
+  if (dx && dy && ply->joy_snap)       /* more than one direction specified */
+    return FALSE;
+
+  if (ply->joy_snap == 0)              /* player wants to move */
   {
     int element = Cave[y][x];
 
@@ -423,12 +555,38 @@ static void player(struct PLAYER *ply)
       case Yacid_splash_wB:
        Cave[y][x] = Zplayer;
        Next[y][x] = Zplayer;
-       play_sound(x, y, SAMPLE_blank);
+#if 1
+      case Xfake_acid_1:
+      case Xfake_acid_2:
+      case Xfake_acid_3:
+      case Xfake_acid_4:
+      case Xfake_acid_5:
+      case Xfake_acid_6:
+      case Xfake_acid_7:
+      case Xfake_acid_8:
+#endif
+       play_element_sound(x, y, SAMPLE_blank, Xblank);
        ply->anim = SPR_walk + anim;
        ply->x = x;
        ply->y = y;
        break;
 
+#if 1
+      case Xacid_1:
+      case Xacid_2:
+      case Xacid_3:
+      case Xacid_4:
+      case Xacid_5:
+      case Xacid_6:
+      case Xacid_7:
+      case Xacid_8:
+#endif
+       if (Cave[y-1][x+1] == Xblank)
+         Cave[y-1][x+1] = Yacid_splash_eB;
+       if (Cave[y-1][x-1] == Xblank)
+         Cave[y-1][x-1] = Yacid_splash_wB;
+       play_element_sound(x, y, SAMPLE_acid, Xacid_1);
+
       case Xboom_android:
       case Xboom_1:
       case Xbug_n:
@@ -447,6 +605,7 @@ static void player(struct PLAYER *ply)
       case Xtank_goe:
       case Xtank_gos:
       case Xtank_gow:
+#if 0
       case Xacid_1:
       case Xacid_2:
       case Xacid_3:
@@ -455,6 +614,7 @@ static void player(struct PLAYER *ply)
       case Xacid_6:
       case Xacid_7:
       case Xacid_8:
+#endif
        ply->anim = SPR_walk + anim;
        ply->x = x;
        ply->y = y;
@@ -517,39 +677,46 @@ static void player(struct PLAYER *ply)
 
       case Xkey_1:
        ply->keys |= 0x01;
+       Cave[y][x] = Ykey_1_eat;
        goto key_walk;
 
       case Xkey_2:
        ply->keys |= 0x02;
+       Cave[y][x] = Ykey_2_eat;
        goto key_walk;
 
       case Xkey_3:
        ply->keys |= 0x04;
+       Cave[y][x] = Ykey_3_eat;
        goto key_walk;
 
       case Xkey_4:
        ply->keys |= 0x08;
+       Cave[y][x] = Ykey_4_eat;
        goto key_walk;
 
       case Xkey_5:
        ply->keys |= 0x10;
+       Cave[y][x] = Ykey_5_eat;
        goto key_walk;
 
       case Xkey_6:
        ply->keys |= 0x20;
+       Cave[y][x] = Ykey_6_eat;
        goto key_walk;
 
       case Xkey_7:
        ply->keys |= 0x40;
+       Cave[y][x] = Ykey_7_eat;
        goto key_walk;
 
       case Xkey_8:
        ply->keys |= 0x80;
+       Cave[y][x] = Ykey_8_eat;
        goto key_walk;
 
       key_walk:
 
-       Cave[y][x] = Yball_eat;
        Next[y][x] = Zplayer;
        play_element_sound(x, y, SAMPLE_collect, element);
        lev.score += lev.key_score;
@@ -559,7 +726,7 @@ static void player(struct PLAYER *ply)
        break;
 
       case Xlenses:
-       Cave[y][x] = Yball_eat;
+       Cave[y][x] = Ylenses_eat;
        Next[y][x] = Zplayer;
        play_element_sound(x, y, SAMPLE_collect, element);
        lev.score += lev.lenses_score;
@@ -570,7 +737,7 @@ static void player(struct PLAYER *ply)
        break;
 
       case Xmagnify:
-       Cave[y][x] = Yball_eat;
+       Cave[y][x] = Ymagnify_eat;
        Next[y][x] = Zplayer;
        play_element_sound(x, y, SAMPLE_collect, element);
        lev.score += lev.magnify_score;
@@ -598,7 +765,7 @@ static void player(struct PLAYER *ply)
              Cave[y-1][x+dx+1] = Yacid_splash_eB;
            if (Cave[y-1][x+dx-1] == Xblank)
              Cave[y-1][x+dx-1] = Yacid_splash_wB;
-           play_sound(x, y, SAMPLE_acid);
+           play_element_sound(x, y, SAMPLE_acid, Xacid_1);
            goto stone_walk;
 
           case Xblank:
@@ -636,7 +803,7 @@ static void player(struct PLAYER *ply)
              Cave[y-1][x+dx+1] = Yacid_splash_eB;
            if (Cave[y-1][x+dx-1] == Xblank)
              Cave[y-1][x+dx-1] = Yacid_splash_wB;
-           play_sound(x, y, SAMPLE_acid);
+           play_element_sound(x, y, SAMPLE_acid, Xacid_1);
            goto bomb_walk;
 
          case Xblank:
@@ -674,7 +841,7 @@ static void player(struct PLAYER *ply)
              Cave[y-1][x+dx+1] = Yacid_splash_eB;
            if (Cave[y-1][x+dx-1] == Xblank)
              Cave[y-1][x+dx-1] = Yacid_splash_wB;
-           play_sound(x, y, SAMPLE_acid);
+           play_element_sound(x, y, SAMPLE_acid, Xacid_1);
            goto nut_walk;
 
           case Xblank:
@@ -706,7 +873,7 @@ static void player(struct PLAYER *ply)
            Cave[y][x+dx] = dx > 0 ? Yspring_kill_e : Yspring_kill_w;
            Next[y][x] = Zplayer;
            Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
-           play_sound(x, y, SAMPLE_slurp);
+           play_element_sound(x, y, SAMPLE_slurp, Xalien);
            lev.score += lev.slurp_score;
            ply->x = x;
            break;
@@ -723,7 +890,7 @@ static void player(struct PLAYER *ply)
              Cave[y-1][x+dx+1] = Yacid_splash_eB;
            if (Cave[y-1][x+dx-1] == Xblank)
              Cave[y-1][x+dx-1] = Yacid_splash_wB;
-           play_sound(x, y, SAMPLE_acid);
+           play_element_sound(x, y, SAMPLE_acid, Xacid_1);
            goto spring_walk;
 
           case Xblank:
@@ -771,7 +938,7 @@ static void player(struct PLAYER *ply)
              Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
            if (Cave[y+dy-1][x+dx-1] == Xblank)
              Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
-           play_sound(x, y, SAMPLE_acid);
+           play_element_sound(x, y, SAMPLE_acid, Xacid_1);
            goto balloon_walk;
 
           case Xblank:
@@ -816,7 +983,7 @@ static void player(struct PLAYER *ply)
              Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
            if (Cave[y+dy-1][x+dx-1] == Xblank)
              Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
-           play_sound(x, y, SAMPLE_acid);
+           play_element_sound(x, y, SAMPLE_acid, Xacid_1);
            goto android_walk;
 
           case Xblank:
@@ -962,16 +1129,27 @@ static void player(struct PLAYER *ply)
       case Xexit_1:
       case Xexit_2:
       case Xexit_3:
-       play_sound(x, y, SAMPLE_exit);
-       if (--lev.home == 0)
+       play_element_sound(x, y, SAMPLE_exit_leave, Xexit_1);
+
+       lev.home--;
+
+#if 0
+       /* !!! CHECK SCORE CALCULATION !!! */
+       if (lev.home == 0 && lev.time_initial > 0)      /* game won */
          lev.score += lev.time * lev.exit_score / 100;
+#endif
+
        ply->anim = SPR_walk + anim;
        ply->x = x;
        ply->y = y;
+
        break;
     }
+
+    if (ply->x == oldx && ply->y == oldy)      /* no movement */
+      result = FALSE;
   }
-  else
+  else                                 /* player wants to snap */
   {
     int element = Cave[y][x];
 
@@ -980,8 +1158,14 @@ static void player(struct PLAYER *ply)
       /* fire is pressed */
 
       case Xgrass:
+       Cave[y][x] = Ygrass_eat;
+       Next[y][x] = Xblank;
+       play_element_sound(x, y, SAMPLE_dirt, element);
+       ply->anim = SPR_spray + anim;
+       break;
+
       case Xdirt:
-       Cave[y][x] = Yball_eat;
+       Cave[y][x] = Ydirt_eat;
        Next[y][x] = Xblank;
        play_element_sound(x, y, SAMPLE_dirt, element);
        ply->anim = SPR_spray + anim;
@@ -1018,38 +1202,45 @@ static void player(struct PLAYER *ply)
 
       case Xkey_1:
        ply->keys |= 0x01;
+       Cave[y][x] = Ykey_1_eat;
        goto key_shoot;
 
       case Xkey_2:
        ply->keys |= 0x02;
+       Cave[y][x] = Ykey_2_eat;
        goto key_shoot;
 
       case Xkey_3:
        ply->keys |= 0x04;
+       Cave[y][x] = Ykey_3_eat;
        goto key_shoot;
 
       case Xkey_4:
        ply->keys |= 0x08;
+       Cave[y][x] = Ykey_4_eat;
        goto key_shoot;
 
       case Xkey_5:
        ply->keys |= 0x10;
+       Cave[y][x] = Ykey_5_eat;
        goto key_shoot;
 
       case Xkey_6:
        ply->keys |= 0x20;
+       Cave[y][x] = Ykey_6_eat;
        goto key_shoot;
 
       case Xkey_7:
        ply->keys |= 0x40;
+       Cave[y][x] = Ykey_7_eat;
        goto key_shoot;
 
       case Xkey_8:
        ply->keys |= 0x80;
+       Cave[y][x] = Ykey_8_eat;
        goto key_shoot;
 
       key_shoot:
-       Cave[y][x] = Yball_eat;
        Next[y][x] = Xblank;
        play_element_sound(x, y, SAMPLE_collect, element);
        lev.score += lev.key_score;
@@ -1057,7 +1248,7 @@ static void player(struct PLAYER *ply)
        break;
 
       case Xlenses:
-       Cave[y][x] = Yball_eat;
+       Cave[y][x] = Ylenses_eat;
        Next[y][x] = Xblank;
        play_element_sound(x, y, SAMPLE_collect, element);
        lev.score += lev.lenses_score;
@@ -1066,13 +1257,18 @@ static void player(struct PLAYER *ply)
        break;
 
       case Xmagnify:
-       Cave[y][x] = Yball_eat;
+       Cave[y][x] = Ymagnify_eat;
        Next[y][x] = Xblank;
        play_element_sound(x, y, SAMPLE_collect, element);
        lev.score += lev.magnify_score;
        lev.magnify_cnt = lev.magnify_time;
        ply->anim = SPR_walk + anim;
        break;
+
+      default:
+       result = FALSE;
     }
   }
+
+  return result;
 }