// ## 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
//
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]; }
}
// À§·Î