Initial commit.
This commit is contained in:
170
src/dk/itu/mario/level/BgLevelGenerator.java
Normal file
170
src/dk/itu/mario/level/BgLevelGenerator.java
Normal file
@@ -0,0 +1,170 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user