package com.galvarez.ttw.screens; import java.util.Map.Entry; 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.Faction; import com.galvarez.ttw.model.components.Discoveries; import com.galvarez.ttw.model.components.Research; import com.galvarez.ttw.model.data.Discovery; import com.galvarez.ttw.rendering.ui.FramedMenu; import com.galvarez.ttw.screens.overworld.OverworldScreen; /** * This screen appears when player must choose his next discovery. * * @author Guillaume Alvarez */ public final class AskDiscoveryScreen extends AbstractPausedScreen<OverworldScreen> { private final FramedMenu choices; private final Discoveries empire; private final DiscoverySystem discoverySystem; private final Entity player; public AskDiscoveryScreen(ThingsThatWereGame game, World world, SpriteBatch batch, OverworldScreen gameScreen, Entity player, DiscoverySystem discoverySystem) { super(game, world, batch, gameScreen); this.player = player; this.empire = player.getComponent(Discoveries.class); this.discoverySystem = discoverySystem; choices = new FramedMenu(skin, 800, 600); } @Override protected void initMenu() { choices.clear(); if (empire.nextPossible == null || empire.nextPossible.isEmpty()) { // may be displayed from discovery menu choices.addButton("No discoveries to combine!", this::resumeGame); } else { choices.addLabel("Which faction do you choose to make new discoveries?"); for (Entry<Faction, Research> next : empire.nextPossible.entrySet()) choices.addButton(action(next.getKey()), previousString(next.getValue()), () -> newDiscovery(next.getValue()), true); choices.addLabel(" "); choices.addButton("Choose later...", this::resumeGame); } choices.addToStage(stage, -1, -1, true); } 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(); } private static String action(Faction faction) { switch (faction) { case CULTURAL: return "Cultural faction advises to meditate on "; case ECONOMIC: return "Economic faction suggest we pursue profit in "; case MILITARY: return "Military faction commands us to investigate "; default: throw new IllegalStateException("Unknown faction " + faction); } } private void newDiscovery(Research next) { discoverySystem.discoverNew(player, empire, next); choices.clear(); StringBuilder sb = new StringBuilder("We discovered " + next.target.name + "!"); for (String effect : discoverySystem.effectsStrings(empire.last.target)) sb.append("\n - " + effect); choices.addButton(sb.toString(), this::resumeGame); choices.addToStage(stage, -1, -1, true); } }