package stray;
import java.util.concurrent.TimeUnit;
import stray.LevelData.LevelType;
import stray.conversation.Conversations;
import stray.transition.FadeIn;
import stray.transition.FadeOut;
import stray.ui.Button;
import stray.ui.BackButton;
import stray.util.AssetMap;
import stray.util.Utils;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
public class LevelSelectScreen extends Updateable {
public LevelSelectScreen(Main m) {
super(m);
container.elements.add(new BackButton(Settings.DEFAULT_WIDTH - 37,
Gdx.graphics.getHeight() - 37) {
@Override
public boolean onLeftClick() {
goToMenu();
return true;
}
});
container.elements.add(new Button(Settings.DEFAULT_WIDTH / 2 - 80, 64, -1, -1,
"menu.levelselect.enter") {
@Override
public boolean onLeftClick() {
if (getCurrent() >= 0 && getCurrent() < Levels.instance().levels.size()) goToLevel(getCurrent());
return true;
}
@Override
public void render(Main main) {
main.batch.setColor(Color.GRAY);
main.fillRect(x - 8, y - 8, width + 16, height + 16);
main.batch.setColor(Color.WHITE);
super.render(main);
}
@Override
public boolean visible() {
return (getCurrent() >= 0 && getCurrent() < Levels.instance().levels.size());
}
});
}
float offset = 0;
float velocity = 0;
float wanted = 0;
private final int DISTANCE = 512;
@Override
public void render(float delta) {
main.batch.begin();
main.batch.draw(main.manager.get(AssetMap.get("levelselectbg"), Texture.class), 0, 0,
Settings.DEFAULT_WIDTH, Gdx.graphics.getHeight());
main.batch.setColor(Color.CYAN);
main.fillRect(0, Gdx.graphics.getHeight() / 2 - 8, Settings.DEFAULT_WIDTH, 16);
main.batch.setColor(Color.WHITE);
main.font.setColor(Color.BLACK);
for (int i = 0; i < Levels.instance().levels.size(); i++) {
if (i < wanted - 3 || i > wanted + 3) continue;
main.batch.draw(main.manager.get(AssetMap.get("levelselectdot"
+ Levels.instance().levels.get(i).leveltype.image), Texture.class),
(Settings.DEFAULT_WIDTH / 2 - 24) + ((i - offset) * DISTANCE), Gdx.graphics
.getHeight() / 2 - 24, 48, 48);
if (Levels.instance().levels.get(i) != null) {
main.font.setScale(1.5f);
main.drawCentered(Levels.getLevelName(i), (Settings.DEFAULT_WIDTH / 2)
+ ((i - offset) * DISTANCE), Gdx.graphics.getHeight() / 2 + 64);
if (getCurrent() == i) {
long millis = main.progress.getLong(Levels.instance().levels.get(i).path
+ "-besttime", -1);
long lastms = main.progress.getLong(Levels.instance().levels.get(i).path
+ "-latesttime", -1);
main.font.setScale(1);
main.drawCentered(Translator.getMsg("menu.bestleveltime") + ": "
+ (millis == -1 ? "--:--:--.---" : Utils.formatMs(millis)),
Settings.DEFAULT_WIDTH / 2, Gdx.graphics.getHeight() / 2 - 115);
main.drawCentered(Translator.getMsg("menu.latestleveltime") + ": "
+ (lastms == -1 ? "--:--:--.---" : Utils.formatMs(lastms)),
Settings.DEFAULT_WIDTH / 2, Gdx.graphics.getHeight() / 2 - 130);
// main.drawCentered("Level ", Settings.DEFAULT_WIDTH / 2,
// Gdx.graphics.getHeight() / 2 - 145);
}
}
}
main.font.setScale(1);
main.batch.setColor(getCurrent() == -1 ? Color.GRAY : (getCurrent() % 2 == 0 ? Main
.getRainbow(1) : Main.getRainbow(-1)));
main.batch.draw(main.manager.get(AssetMap.get("levelselected"), Texture.class),
(Settings.DEFAULT_WIDTH / 2 - 32), Gdx.graphics.getHeight() / 2 - 96, 64, 128);
main.batch.setColor(Color.WHITE);
container.render(main);
main.batch.end();
if (Math.abs(wanted - offset) > 0.0001f) {
velocity = (float) ((DISTANCE / 100f) * ((wanted - offset)));
offset += velocity * Gdx.graphics.getDeltaTime();
} else {
offset = wanted;
velocity = 0;
}
}
public boolean moveNext() {
if ((int) wanted + 1 < Levels.instance().levels.size()
&& wanted < main.progress.getInteger("rightmostlevel", 0)) {
wanted++;
return true;
}
return false;
}
public boolean movePrev() {
if ((int) wanted > 0) {
wanted--;
return true;
}
return false;
}
public void goToLevel(int level) {
Main.BACKSTORY.prepare(Levels.instance().levels.get(level).path,
Gdx.files.internal("levels/" + Levels.instance().levels.get(level).path + ".xml"),
Levels.instance().levels.get(level).leveltype);
if (Levels.instance().levels.get(level).cutscene != null) {
Main.CUTSCENE.prepare(Conversations.instance().convs.get(Levels.instance().levels
.get(level).cutscene), new FadeIn(), new FadeOut(), (Main.BACKSTORY));
main.transition(new FadeIn(), null, Main.CUTSCENE);
} else {
main.transition(new FadeIn(), new FadeOut(), Main.BACKSTORY);
}
}
private void goToMenu() {
main.setScreen(Main.MAINMENU);
}
public int getCurrent() {
if ((offset >= wanted - (32f / DISTANCE) && offset <= wanted + (32f / DISTANCE))) {
return (int) wanted;
}
return -1;
}
@Override
public void tickUpdate() {
}
@Override
public void renderDebug(int starting) {
main.font.draw(main.batch, "wanted: " + wanted, 5, Main.convertY(starting));
main.font.draw(main.batch, "offset: " + offset, 5, Main.convertY(starting + 15));
main.font.draw(main.batch, "velocity: " + velocity, 5, Main.convertY(starting + 30));
main.font
.draw(main.batch, "getCurrent(): " + getCurrent(), 5, Main.convertY(starting + 45));
}
@Override
public void resize(int width, int height) {
}
@Override
public void show() {
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
@Override
public void renderUpdate() {
if (Gdx.input.isKeyJustPressed(Keys.RIGHT)) {
moveNext();
} else if (Gdx.input.isKeyJustPressed(Keys.LEFT)) {
movePrev();
}
if (Gdx.input.isKeyJustPressed(Keys.ESCAPE)) {
goToMenu();
} else if (Gdx.input.isKeyJustPressed(Keys.SPACE) || Gdx.input.isKeyJustPressed(Keys.ENTER)) {
if (getCurrent() >= 0 && getCurrent() < Levels.instance().levels.size()) {
goToLevel(getCurrent());
}
}
}
}