package com.galvarez.ttw.screens;
import static java.lang.Math.max;
import static java.lang.String.format;
import com.artemis.Entity;
import com.artemis.World;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.galvarez.ttw.ThingsThatWereGame;
import com.galvarez.ttw.model.DiscoverySystem;
import com.galvarez.ttw.model.components.Discoveries;
import com.galvarez.ttw.model.components.InfluenceSource;
import com.galvarez.ttw.model.components.Research;
import com.galvarez.ttw.model.data.Discovery;
import com.galvarez.ttw.model.map.Terrain;
import com.galvarez.ttw.rendering.ui.FramedMenu;
import com.galvarez.ttw.screens.overworld.OverworldScreen;
/**
* This screen appears when user tries to pause or escape from the main game
* screen.
*
* @author Guillaume Alvarez
*/
public final class DiscoveryMenuScreen extends AbstractPausedScreen<OverworldScreen> {
private final FramedMenu topMenu, lastDiscovery, terrains, discoveryChoices;
private final Discoveries empire;
private final InfluenceSource source;
private final DiscoverySystem discoverySystem;
public DiscoveryMenuScreen(ThingsThatWereGame game, World world, SpriteBatch batch, OverworldScreen gameScreen,
Entity empire, DiscoverySystem discoverySystem) {
super(game, world, batch, gameScreen);
this.empire = empire.getComponent(Discoveries.class);
this.source = empire.getComponent(InfluenceSource.class);
this.discoverySystem = discoverySystem;
topMenu = new FramedMenu(skin, 800, 600);
lastDiscovery = new FramedMenu(skin, 800, 600);
terrains = new FramedMenu(skin, 800, 600);
discoveryChoices = new FramedMenu(skin, 800, 600);
}
@Override
protected void initMenu() {
topMenu.clear();
topMenu.addButton("Resume game", this::resumeGame);
topMenu.addToStage(stage, 30, stage.getHeight() - 30, false);
lastDiscovery.clear();
if (empire.last == null) {
lastDiscovery.addLabel("- No last discovery -");
} else {
lastDiscovery.addLabel("- Last discovery (effect doubled): " + empire.last.target.name + " -");
lastDiscovery.addLabel("Discovered from " + previousString(empire.last));
lastDiscovery.addLabel("Effects:");
for (String effect : discoverySystem.effectsStrings(empire.last.target))
lastDiscovery.addLabel(" - " + effect);
}
lastDiscovery.addToStage(stage, 30, topMenu.getY() - 30, false);
terrains.clear();
terrains.addLabel("- Terrains influence costs -");
for (Terrain t : Terrain.values()) {
Integer mod = source.modifiers.terrainBonus.get(t);
int cost = max(1, mod != null ? t.moveCost() - mod : t.moveCost());
terrains.addLabel(format("%s: %d (%s)", t.getDesc(), cost, mod != null && mod != 0 ? -mod : "no modifier"));
}
terrains.addToStage(stage, 30, lastDiscovery.getY() - 30, false);
discoveryChoices.clear();
discoveryChoices.addButton("Next discovery?", gameScreen::askDiscovery);
discoveryChoices.addLabel(" ");
discoveryChoices.addToStage(stage, 30, terrains.getY() - 30, false);
}
private static String previousString(Research next) {
if (next.previous.isEmpty())
return "our environment";
StringBuilder sb = new StringBuilder();
for (Discovery previous : next.previous)
sb.append(previous.name).append(", ");
sb.setLength(sb.length() - 2);
return sb.toString();
}
}