Files
cs8803p3/src/dk/itu/mario/scene/LevelSceneCustom.java

206 lines
5.9 KiB
Java

package dk.itu.mario.scene;
import java.awt.GraphicsConfiguration;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import dk.itu.mario.MarioInterface.GamePlay;
import dk.itu.mario.MarioInterface.LevelGenerator;
import dk.itu.mario.engine.Art;
import dk.itu.mario.engine.BgRenderer;
import dk.itu.mario.engine.DataRecorder;
import dk.itu.mario.engine.LevelRenderer;
import dk.itu.mario.engine.MarioComponent;
import dk.itu.mario.engine.sonar.FixedSoundSource;
import dk.itu.mario.engine.sprites.CoinAnim;
import dk.itu.mario.engine.sprites.FireFlower;
import dk.itu.mario.engine.sprites.Mario;
import dk.itu.mario.engine.sprites.Mushroom;
import dk.itu.mario.engine.sprites.Particle;
import dk.itu.mario.engine.sprites.Sprite;
import dk.itu.mario.engine.util.FileHandler;
import dk.itu.mario.level.BgLevelGenerator;
import dk.itu.mario.level.Level;
import dk.itu.mario.level.RandomLevel;
public class LevelSceneCustom extends LevelScene {
private boolean isCustom;
private LevelGenerator clg;
public LevelSceneCustom(GraphicsConfiguration graphicsConfiguration,
MarioComponent renderer, long seed, int levelDifficulty, int type,
boolean isCustom, LevelGenerator levelGenerator) {
super(graphicsConfiguration, renderer, seed/*, levelDifficulty, type*/);
this.isCustom = isCustom;
this.clg = levelGenerator;
}
public void init() {
try {
Level.loadBehaviors(new DataInputStream(LevelSceneCustom.class
.getResourceAsStream("/res/tiles.dat")));
} catch (IOException e) {
e.printStackTrace();
System.exit(0);
}
GamePlay gp = GamePlay.read("player.txt");
File xmlInfoFile = new File("DetailedInfo.xml");
DataRecorder dataRecorder;
if (xmlInfoFile.exists()) {
try {
dataRecorder = DataRecorder.fromXML(xmlInfoFile);
} catch (IOException ioe) {
System.out.println("Reading from DataRecorder failed due to: ");
ioe.printStackTrace(System.out);
System.out.println("Initializing blank record");
dataRecorder = DataRecorder.BLANK_RECORD;
}
} else {
dataRecorder = DataRecorder.BLANK_RECORD;;
String detailedInfo = FileHandler.readFile("DetailedInfo.txt");
System.out.println("Read detailedInfo from DetailedInfo.txt (not parsed): ");
System.out.println(detailedInfo);
}
int levelType = clg.generateLevelType(gp,dataRecorder);
currentLevel = (Level) clg.generateLevel(gp,dataRecorder);
try {
level = currentLevel.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
Art.startMusic(levelType);
paused = false;
Sprite.spriteContext = this;
sprites.clear();
layer = new LevelRenderer(level, graphicsConfiguration, 320, 240);
for (int i = 0; i < 2; i++) {
int scrollSpeed = 4 >> i;
int w = ((level.getWidth() * 16) - 320) / scrollSpeed + 320;
int h = ((level.getHeight() * 16) - 240) / scrollSpeed + 240;
Level bgLevel = BgLevelGenerator.createLevel(w / 32 + 1,
h / 32 + 1, i == 0, levelType);
bgLayer[i] = new BgRenderer(bgLevel, graphicsConfiguration, 320,
240, scrollSpeed);
}
mario = new Mario(this);
sprites.add(mario);
startTime = 1;
timeLeft = 200 * 15;
tick = 0;
if (!isCustom && recorder == null)
recorder = new DataRecorder(this, (RandomLevel) level, keys);
gameStarted = false;
}
public void tick() {
super.tick();
if (recorder != null && !gameStarted) {
recorder.startLittleRecord();
recorder.startTime();
gameStarted = true;
}
if (recorder != null)
recorder.tickRecord();
}
public void winActions() {
if (recorder != null)
recorder.fillGamePlayMetrics((RandomLevel) level);
marioComponent.win();
}
public void deathActions() {
if (Mario.lives <= 0) {// has no more lives
if (recorder != null)
recorder.fillGamePlayMetrics((RandomLevel) level);
marioComponent.lose();
} else
// mario still has lives to play :)--> have a new beginning
reset();
}
public void bump(int x, int y, boolean canBreakBricks) {
byte block = level.getBlock(x, y);
if ((Level.TILE_BEHAVIORS[block & 0xff] & Level.BIT_BUMPABLE) > 0) {
bumpInto(x, y - 1);
level.setBlock(x, y, (byte) 4);
if (((Level.TILE_BEHAVIORS[block & 0xff]) & Level.BIT_SPECIAL) > 0) {
sound.play(Art.samples[Art.SAMPLE_ITEM_SPROUT],
new FixedSoundSource(x * 16 + 8, y * 16 + 8), 1, 1, 1);
if (!Mario.large) {
addSprite(new Mushroom(this, x * 16 + 8, y * 16 + 8));
} else {
addSprite(new FireFlower(this, x * 16 + 8, y * 16 + 8));
}
if (recorder != null) {
recorder.blockPowerDestroyRecord();
}
} else {
// TODO should only record hidden coins (in boxes)
if (recorder != null) {
recorder.blockCoinDestroyRecord();
}
Mario.getCoin();
sound.play(Art.samples[Art.SAMPLE_GET_COIN],
new FixedSoundSource(x * 16 + 8, y * 16 + 8), 1, 1, 1);
addSprite(new CoinAnim(x, y));
}
}
if ((Level.TILE_BEHAVIORS[block & 0xff] & Level.BIT_BREAKABLE) > 0) {
bumpInto(x, y - 1);
if (canBreakBricks) {
if (recorder != null) {
recorder.blockEmptyDestroyRecord();
}
sound.play(Art.samples[Art.SAMPLE_BREAK_BLOCK],
new FixedSoundSource(x * 16 + 8, y * 16 + 8), 1, 1, 1);
level.setBlock(x, y, (byte) 0);
for (int xx = 0; xx < 2; xx++)
for (int yy = 0; yy < 2; yy++)
addSprite(new Particle(x * 16 + xx * 8 + 4, y * 16 + yy
* 8 + 4, (xx * 2 - 1) * 4, (yy * 2 - 1) * 4 - 8));
}
}
}
public void bumpInto(int x, int y) {
byte block = level.getBlock(x, y);
if (((Level.TILE_BEHAVIORS[block & 0xff]) & Level.BIT_PICKUPABLE) > 0) {
Mario.getCoin();
sound.play(Art.samples[Art.SAMPLE_GET_COIN], new FixedSoundSource(
x * 16 + 8, y * 16 + 8), 1, 1, 1);
level.setBlock(x, y, (byte) 0);
addSprite(new CoinAnim(x, y + 1));
// TODO no idea when this happens... maybe remove coin count
if (recorder != null)
recorder.recordCoin();
}
for (Sprite sprite : sprites) {
sprite.bumpCheck(x, y);
}
}
}