SubKorea > CYBER JAVA GAME > º®µ¹±ú±â2 (Javanoid v1.45) > ¼Ò½º #4

// ## JAVANOID LEVEL CLASS ##################################
// The aim of this class is to define the map level and to give fast
// access to a particular block with its (x,y) coordinates. It's both a
// level builder and a level map

final class jnlevel {

 // default attributes
 final static int nbRow = 8;
 final static int nbCol = 10;

 final static int nbLevel  = 20;
 
 final static int colWidth  = 32;
 final static int rowHeight = 20;

 // level names
 final static String names[] =
  {"CLASSIC LEVEL N?", "GHOST LEVEL", "COFFEE CUP LEVEL", "BEE LEVEL",
   "CLASSIC LEVEL N?", "BUBBLE BOBBLE LEVEL", "SUPER SPRINT LEVEL", "ARKANOID LEVEL",
   "CLASSIC LEVEL N?", "PACMAN LEVEL", "R-TYPE LEVEL", "ASTEROIDS LEVEL",
   "CLASSIC LEVEL N?", "CHUCK YEAGER LEVEL", "COMMANDO LEVEL", "UMBRELLA LEVEL",
   "CLASSIC LEVEL N?", "TIE-FIGHTER LEVEL", "CENTIPEDE LEVEL", "BLACK BOX LEVEL"};
 
 // level definitions
  final static String blockLevel[][] = {
 
   // Level 01 : Classic 1
  {"FFFFFFFFFF", "FFFFFFFFFF", "AAAAAAAAAA", "6666666666",
   "3333333333", "2222222222", "0000000000", "FFFFFFFFFF"},
   // Level 02 : Ghost
  {"FF77777FFF", "F7777777FF", "F7227227FF", "F7297297FF",
   "F7297297FF", "F7777777FF", "F7A7A7A7FF", "FAFAFAFAFF"},
   // Level 03 : Coffee cup (!)
  {"FAA9A9AFFF", "FFA9AAFFFF", "FFFA9FFFFF", "F444444FFF",
   "F45556444F", "F455564F4F", "F4666644FF", "FF4444FFFF"},
   // Level 04 : Bee
  {"F555FFFFFB", "44445FFFBF", "444445F99F", "F244445909",
   "9292929999", "929292999F", "F2A2A2AFFF", "FFAFAFFAFF"},
    // Level 05 : Classic 2 (squares)
  {"FFFFFFFFFF", "FAAAFFAAAF", "F012FF678F", "F120FF786F",
   "F201FF867F", "F012FF678F", "F120FF786F", "FAAAFFAAAF"},
   // Level 06 : Bubble Bobble
  {"FF1F1F1F1F", "F1B1B1B1FF", "1B3333553F", "F13333593F",
   "1B3333333F", "F13333399F", "1B3333333F", "F1AAAAAAAF"},
   // Level 07 : Super Sprint
  {"FF000000FF", "F99000099F", "F99044099F", "FF045540FF",
   "FF000000FF", "F990AA099F", "F9A2222A9F", "F9A2222A9F"},
  // Level 08 : Arkanoid
  {"FFFFFFFFFF", "FFFFFFA9FF", "FFFFFF99FF", "FFFFFFFFFF",
   "FB1AAAAB1F", "B104444100", "100AAAA100", "F00999900F"},
  // Level 09 : Classic 3 (gold lines)
  {"FFFFFFFFFF", "F01234567F", "FBBBBBBBBF", "FFFFFFFFFF",
   "F01234567F", "FBBBBBBBBF", "FFFFFFFFFF", "AAAAAAAAAA"},
   // Level 10 : Pacman
  {"FFFBBBBBFF", "FFB19911BF", "FB119911FF", "FB11111FFF",
   "FB11111FFF", "FB111111FF", "FFB11111BF", "FFFBBBBBFF"},
  // Level 12 : R-Type
  {"FFFF555FFF", "FAAA66655F", "ABBA666665", "AAAA666665",
   "ABBBB66665", "AAAAAA666F", "F9AAA9AFFF", "9F9FF999BF"},
  // Level 12 : Asteroids
  {"F3FFA9FF3F", "FAFFA9FFAF", "FFFAA99FFF", "FFFAA99FFF",
   "FFAA1199FF", "FFA1BB19FF", "FFFA119FFF", "FFFFA9FFFF"},
   // Level 13 : Classic 4 (staggered rows)
   {"8F7F6F4F3F", "AFAFAFAFAF", "F8F7F6F4F3", "FAFAFAFAFA",
   "0F8F7F6F4F", "BFBFBFBFBF", "F0F8F7F6F4", "FBFBFBFBFB"},
  // Level 14 : Chuck Yeager
  {"FFFFAAFFFF", "FFF995AFFF", "FF9A55AFFF", "FFFA99AFFF",
   "ABAA99AABA", "FAAA99AAAF", "FFFFAAF9FF", "FFFFF99FFF"},
  // Level 15 : Commando
  {"FFFF33FFFF", "FFF3333F9F", "FFFB33B9FF", "FF33BB33FF",
   "FFB3333BFF", "FFF3333FFF", "FFFBB33FFF", "FFFFFBBFFF"},
  // Level 16 : Umbrella
  {"FFF0236FFF", "F00223366F", "0002233666", "0002233666",
   "FFFFAAFFFF", "FFFFAAFFFF", "FFBFBBFFFF", "FFFBBFFFFF"},
  // Level 17 : Classic 5 (labyrinth)
  {"BBBBBBBBBB", "B1FB1FF1FB", "B2FB2FF2FB", "B3FB3FB3FB",
   "B4FB4FB4FB", "B5FF5FB5FB", "B6FF6FB6FB", "BBBBBBBFFB"},
  // Level 18 : Tie-fighter
  {"FFBFFFFBFF", "FBFFAAFFBF", "FBFA99AFBF", "FBAA99AABF",
   "FBAA99AABF", "FBFA99AFBF", "FBFFAAFFBF", "FFBFFFFBFF",},
  // Level 19 : Centipede
  {"F22F22FFFF", "233244222F", "233B44B552", "F2BF22B552",
   "FFFFBBF22F", "FFFB772662", "FFFB772662", "FFFFBBFBBF",},
  // Level 20 : Black box
  {"B2B2B2B2BB", "299999999B", "B92B2B2B92", "29B999929B",
   "B929999B92", "29B2B2B29B", "B999999992", "2B2B2B2B2B",}
  };

 // how many blocks still here ??
 protected int blocksLeft;

 // the current level & its map
 protected int number;
 protected jnblock blockMap[][] = new jnblock[nbCol][nbRow];
 
 jnimageserver imageSrv;
 jnsoundserver soundSrv;
 jngame game;
 jnstatus status;
  
 // constructor
 public jnlevel (jnimageserver is, jnsoundserver ss, jngame g, jnstatus s) {
  imageSrv = is; soundSrv = ss;
  game = g; status = s;
  number = 0;
  clear(); compute();
  }                   // À§·Î

 // next level method (clear the old one & compute)
 public void next() { clear(); number++; status.addLevel(); compute(); }

 // Level clear & compute
 void clear() {
   game.clearBackground();
   for (int y=0;y<nbRow;y++)
     { for (int x=0;x<nbCol;x++) { blockMap[x][y] = null; } }
 
  }                   // À§·Î

 void compute() {
  char ch;
  char blockRow[] = new char[nbCol];
  blocksLeft = 0;
  number = number % nbLevel;
 
  for (int r=0;r<nbRow;r++) {
    blockRow = blockLevel[number][r].toCharArray();

    for (int c=0;c<nbCol;c++) {
      ch = blockRow[c];
 
      switch(ch) {
       case 'F': blockMap[c][r] = null;
        break;

       case 'B': blockMap[c][r] = new jnblock(imageSrv, soundSrv, game, 11, c, r);
        break;

       case 'A': blockMap[c][r] = new jnblock(imageSrv, soundSrv, game, 10, c, r);
        blocksLeft++; break;

       default : blockMap[c][r] = new jnblock(imageSrv, soundSrv, game, ch - '0', c, r);
        blocksLeft++; break;
       }
 
     }
   }
  }                   // À§·Î

 // Collision detection & effects for blocks
 public jnblock block(int x, int y) {
  int c = x / colWidth; int r = y / rowHeight;

  if ((c<nbCol) && (r<nbRow)) return blockMap[c][r];
  else return null;
 
  }                   // À§·Î

 public boolean hitBlock(int x, int y, boolean kill) {
  int c = x / colWidth; int r = y / rowHeight;

  boolean found = ((c<nbCol) && (r<nbRow) && (blockMap[c][r]!=null));
  if (found) {
    if (kill) {

      if (blockMap[c][r].kill()) {
        status.addScore();
        blocksLeft--;
        if (Math.random()<0.3) game.throwPill(x, y);
      }
      blockMap[c][r] = null;
    }

    else if (blockMap[c][r].hit()) {
      status.addScore();
      blocksLeft--;
      blockMap[c][r] = null;
      if (Math.random()<0.3) game.throwPill(x, y);
    }
 
   }
   return ((found) && (!kill));
 
  }                   // À§·Î

 // Requests methods (level number & name, empty or not)
 public boolean isEmpty() { return (blocksLeft == 0); }

 public int getNumber() { return number; }

 public String getName() { return names[number]; }
 
 }                   // À§·Î