171 lines
3.9 KiB
Java
171 lines
3.9 KiB
Java
package dk.itu.mario.level;
|
|
|
|
import java.util.Random;
|
|
|
|
import dk.itu.mario.MarioInterface.LevelInterface;
|
|
|
|
public class BgLevelGenerator {
|
|
private static Random levelSeedRandom = new Random();
|
|
|
|
public static Level createLevel(int width, int height, boolean distant,
|
|
int type) {
|
|
BgLevelGenerator levelGenerator = new BgLevelGenerator(width, height,
|
|
distant, type);
|
|
return levelGenerator.createLevel(levelSeedRandom.nextLong());
|
|
}
|
|
|
|
private int width;
|
|
private int height;
|
|
private boolean distant;
|
|
private int type;
|
|
|
|
private BgLevelGenerator(int width, int height, boolean distant, int type) {
|
|
this.width = width;
|
|
this.height = height;
|
|
this.distant = distant;
|
|
this.type = type;
|
|
}
|
|
|
|
private Level createLevel(long seed) {
|
|
Level level = new Level(width, height);
|
|
Random random = new Random(seed);
|
|
|
|
switch (type) {
|
|
case LevelInterface.TYPE_OVERGROUND: {
|
|
|
|
int range = distant ? 4 : 6;
|
|
int offs = distant ? 2 : 1;
|
|
int oh = random.nextInt(range) + offs;
|
|
int h = random.nextInt(range) + offs;
|
|
for (int x = 0; x < width; x++) {
|
|
oh = h;
|
|
while (oh == h) {
|
|
h = random.nextInt(range) + offs;
|
|
}
|
|
for (int y = 0; y < height; y++) {
|
|
int h0 = (oh < h) ? oh : h;
|
|
int h1 = (oh < h) ? h : oh;
|
|
if (y < h0) {
|
|
if (distant) {
|
|
int s = 2;
|
|
if (y < 2)
|
|
s = y;
|
|
level.setBlock(x, y, (byte) (4 + s * 8));
|
|
} else {
|
|
level.setBlock(x, y, (byte) 5);
|
|
}
|
|
} else if (y == h0) {
|
|
int s = h0 == h ? 0 : 1;
|
|
s += distant ? 2 : 0;
|
|
level.setBlock(x, y, (byte) s);
|
|
} else if (y == h1) {
|
|
int s = h0 == h ? 0 : 1;
|
|
s += distant ? 2 : 0;
|
|
level.setBlock(x, y, (byte) (s + 16));
|
|
} else {
|
|
int s = y > h1 ? 1 : 0;
|
|
if (h0 == oh)
|
|
s = 1 - s;
|
|
s += distant ? 2 : 0;
|
|
level.setBlock(x, y, (byte) (s + 8));
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case LevelInterface.TYPE_UNDERGROUND: {
|
|
if (distant) {
|
|
int tt = 0;
|
|
for (int x = 0; x < width; x++) {
|
|
if (random.nextDouble() < 0.75)
|
|
tt = 1 - tt;
|
|
for (int y = 0; y < height; y++) {
|
|
int t = tt;
|
|
int yy = y - 2;
|
|
if (yy < 0 || yy > 4) {
|
|
yy = 2;
|
|
t = 0;
|
|
}
|
|
level.setBlock(x, y, (byte) (4 + t + (3 + yy) * 8));
|
|
}
|
|
}
|
|
} else {
|
|
for (int x = 0; x < width; x++) {
|
|
for (int y = 0; y < height; y++) {
|
|
int t = x % 2;
|
|
int yy = y - 1;
|
|
if (yy < 0 || yy > 7) {
|
|
yy = 7;
|
|
t = 0;
|
|
}
|
|
if (t == 0 && yy > 1 && yy < 5) {
|
|
t = -1;
|
|
yy = 0;
|
|
}
|
|
level.setBlock(x, y, (byte) (6 + t + (yy) * 8));
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case LevelInterface.TYPE_CASTLE: {
|
|
if (distant) {
|
|
for (int x = 0; x < width; x++) {
|
|
for (int y = 0; y < height; y++) {
|
|
int t = x % 2;
|
|
int yy = y - 1;
|
|
if (yy > 2 && yy < 5) {
|
|
yy = 2;
|
|
} else if (yy >= 5) {
|
|
yy -= 2;
|
|
}
|
|
if (yy < 0) {
|
|
t = 0;
|
|
yy = 5;
|
|
} else if (yy > 4) {
|
|
t = 1;
|
|
yy = 5;
|
|
} else if (t < 1 && yy == 3) {
|
|
t = 0;
|
|
yy = 3;
|
|
} else if (t < 1 && yy > 0 && yy < 3) {
|
|
t = 0;
|
|
yy = 2;
|
|
}
|
|
level.setBlock(x, y, (byte) (1 + t + (yy + 4) * 8));
|
|
}
|
|
}
|
|
} else {
|
|
for (int x = 0; x < width; x++) {
|
|
for (int y = 0; y < height; y++) {
|
|
int t = x % 3;
|
|
int yy = y - 1;
|
|
if (yy > 2 && yy < 5) {
|
|
yy = 2;
|
|
} else if (yy >= 5) {
|
|
yy -= 2;
|
|
}
|
|
if (yy < 0) {
|
|
t = 1;
|
|
yy = 5;
|
|
} else if (yy > 4) {
|
|
t = 2;
|
|
yy = 5;
|
|
} else if (t < 2 && yy == 4) {
|
|
t = 2;
|
|
yy = 4;
|
|
} else if (t < 2 && yy > 0 && yy < 4) {
|
|
t = 4;
|
|
yy = -3;
|
|
}
|
|
level.setBlock(x, y, (byte) (1 + t + (yy + 3) * 8));
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return level;
|
|
}
|
|
}
|