Rogue: Savage Rats, a retro-themed dungeon crawler
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
rogue-savage-rats/src/mightypork/rogue/screens/game/LayerGameUi.java

164 lines
4.0 KiB

package mightypork.rogue.screens.game;
import mightypork.gamecore.gui.components.painters.TextPainter;
import mightypork.gamecore.gui.screens.ScreenLayer;
import mightypork.gamecore.resources.Res;
import mightypork.rogue.world.World;
import mightypork.rogue.world.WorldProvider;
import mightypork.rogue.world.gui.Minimap;
import mightypork.rogue.world.gui.WorldConsoleRenderer;
import mightypork.utils.math.AlignX;
import mightypork.utils.math.color.pal.RGB;
import mightypork.utils.math.constraints.num.Num;
import mightypork.utils.math.constraints.rect.Rect;
import mightypork.utils.string.StringProvider;
public class LayerGameUi extends ScreenLayer {
private final Num playerHealthTotal = new Num() {
@Override
public double value()
{
return WorldProvider.get().getPlayer().getHealthMax() / 2D;
}
};
private final Num playerHealthActive = new Num() {
@Override
public double value()
{
return WorldProvider.get().getPlayer().getHealth() / 2D;
}
};
protected Minimap miniMap;
private final ScreenGame gameScreen;
public LayerGameUi(ScreenGame screen) {
super(screen);
this.gameScreen = screen;
buildNav();
buildDisplays();
buildMinimap();
buildConsole();
}
private void buildConsole()
{
final Num rh = root.height();
final Num rw = root.width();
final Rect consoleRect = root.shrink(rw.perc(2), Num.ZERO, rh.perc(6), rh.perc(16));
final Num perRow = consoleRect.height().div(20).max(12).min(32);
final WorldConsoleRenderer wcr = new WorldConsoleRenderer(perRow);
wcr.setRect(consoleRect);
root.add(wcr);
}
private void buildMinimap()
{
miniMap = new Minimap();
miniMap.setRect(root.shrink(root.width().perc(5), root.height().perc(15)));
root.add(miniMap);
}
private void buildDisplays()
{
final Num h = root.height();
//@formatter:off
final HeartBar hearts = new HeartBar(
playerHealthTotal,
playerHealthActive,
Res.getTxQuad("hud.heart.on"),
Res.getTxQuad("hud.heart.half"),
Res.getTxQuad("hud.heart.off"),
AlignX.LEFT);
//@formatter:on
final Rect hearts_box = root.shrink(h.perc(3)).topEdge().growDown(h.perc(6));
hearts.setRect(hearts_box);
root.add(hearts);
final TextPainter levelText = new TextPainter(Res.getFont("tiny"), AlignX.RIGHT, RGB.WHITE, new StringProvider() {
@Override
public String getString()
{
final World w = WorldProvider.get().getWorld();
return (w.isPaused() ? "[P] " : "") + "Floor " + (1 + w.getPlayer().getLevelNumber());
}
});
levelText.setRect(hearts_box.moveY(hearts_box.height().mul(1 / 7D)));
root.add(levelText);
}
private void buildNav()
{
final IngameNav nav = new IngameNav();
nav.setRect(root.bottomEdge().growUp(root.height().perc(12)));
root.add(nav);
NavButton btn;
nav.addRight(btn = new NavButton(Res.getTxQuad("nav.button.fg.inventory")));
btn.setAction(gameScreen.actionToggleInv);
nav.addRight(btn = new NavButton(Res.getTxQuad("nav.button.fg.eat")));
btn.setAction(gameScreen.actionEat);
nav.addRight(btn = new NavButton(Res.getTxQuad("nav.button.fg.pause")));
btn.setAction(gameScreen.actionTogglePause);
// TODO actions
//nav.addLeft(new NavButton(Res.txq("nav.button.fg.options")));
//nav.addLeft(new NavButton(Res.txq("nav.button.fg.help")));
nav.addLeft(btn = new NavButton(Res.getTxQuad("nav.button.fg.menu")));
btn.setAction(gameScreen.actionMenu);
nav.addLeft(btn = new NavButton(Res.getTxQuad("nav.button.fg.save")));
btn.setAction(gameScreen.actionSave);
nav.addLeft(btn = new NavButton(Res.getTxQuad("nav.button.fg.load")));
btn.setAction(gameScreen.actionLoad);
nav.addLeft(btn = new NavButton(Res.getTxQuad("nav.button.fg.map")));
btn.setAction(gameScreen.actionToggleMinimap);
nav.addLeft(btn = new NavButton(Res.getTxQuad("nav.button.fg.magnify")));
btn.setAction(gameScreen.actionToggleZoom);
}
@Override
public int getZIndex()
{
return 101;
}
@Override
public int getEventPriority()
{
return 400;
}
}