package com.galvarez.ttw.screens; import static java.lang.Math.min; import static java.lang.String.join; import java.util.HashMap; import java.util.Map; 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.EffectsSystem; import com.galvarez.ttw.model.PoliciesSystem; import com.galvarez.ttw.model.RevoltSystem; import com.galvarez.ttw.model.components.ArmyCommand; import com.galvarez.ttw.model.components.InfluenceSource; import com.galvarez.ttw.model.components.Policies; import com.galvarez.ttw.model.data.Discovery; import com.galvarez.ttw.model.data.Policy; 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 PoliciesMenuScreen extends AbstractPausedScreen<OverworldScreen> { private final FramedMenu topMenu, stabilityMenu, policiesMenu; private final Policies policies; private final PoliciesSystem policiesSystem; private final Entity empire; private final EffectsSystem effects; private final RevoltSystem revolts; public PoliciesMenuScreen(ThingsThatWereGame game, World world, SpriteBatch batch, OverworldScreen gameScreen, Entity empire, PoliciesSystem policiesSystem, EffectsSystem effects, RevoltSystem revolts) { super(game, world, batch, gameScreen); this.empire = empire; this.effects = effects; this.revolts = revolts; this.policies = empire.getComponent(Policies.class); this.policiesSystem = policiesSystem; topMenu = new FramedMenu(skin, 800, 600); stabilityMenu = new FramedMenu(skin, 800, 600); policiesMenu = new FramedMenu(skin, 800, 600); } public final class Item { public final Discovery discovery; public Item(Discovery discovery) { this.discovery = discovery; } @Override public String toString() { return discovery.name + " (" + (discovery.effects.isEmpty() ? "no effect" : join(", ", effects.toString(discovery.effects)))// + ")"; } } public final Item NONE = new Item(new Discovery("NONE")); @Override protected void initMenu() { topMenu.clear(); topMenu.addButton("Resume game", this::resumeGame); topMenu.addToStage(stage, 30, stage.getHeight() - 30, false); stabilityMenu.clear(); InfluenceSource source = empire.getComponent(InfluenceSource.class); ArmyCommand army = empire.getComponent(ArmyCommand.class); stabilityMenu.addTable( // new Object[] { "Empire stability is", stabilityText(policies) }, // new Object[] { " + military power ", militaryText(army) }, // new Object[] { " - source extension ", extensionText(source) }, // new Object[] { "=> current instability risk is ", revolts.getInstability(empire) }); stabilityMenu.addToStage(stage, 30, topMenu.getY() - 30, false); policiesMenu.clear(); for (Policy choice : Policy.values()) { policiesMenu.addLabel(choice.msg); Map<Discovery, Item> items = new HashMap<Discovery, Item>(); for (Discovery d : policiesSystem.getAvailablePolicies(empire, choice)) items.put(d, new Item(d)); if (items.isEmpty()) { policiesMenu.addLabel(" No policy available"); } else { Item selected = NONE; if (policies.policies.containsKey(choice)) { selected = items.get(policies.policies.get(choice)); } else { items.put(NONE.discovery, NONE); selected = NONE; } policiesMenu.addSelectBox(" ", selected, items.values().toArray(new Item[items.size()]), i -> { policiesSystem.applyPolicy(empire, choice, i != NONE ? i.discovery : null); initMenu(); }); } } policiesMenu.addToStage(stage, 30, stabilityMenu.getY() - 30, false); } private static String militaryText(ArmyCommand army) { int power = army.militaryPower; if (power >= 0) return "" + power; else return power + " (count only if positive)"; } private static String extensionText(InfluenceSource source) { return source.influencedTiles.size() + " (influenced tiles)"; } private static String stabilityText(Policies policies) { final int max = policies.stabilityMax; final int stability = policies.stability; StringBuilder sb = new StringBuilder(); sb.append(stability); if (stability < max) { sb.append(" (+").append(min(policies.stabilityGrowth, max - stability)).append(" per turn)"); } else if (stability > max) { sb.append(" (-1 per turn until ").append(max).append(')'); } return sb.toString(); } }