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/world/gui/Minimap.java

109 lines
3.0 KiB

package mightypork.rogue.world.gui;
import mightypork.gamecore.core.App;
import mightypork.gamecore.gui.components.InputComponent;
import mightypork.gamecore.input.events.MouseButtonEvent;
import mightypork.gamecore.input.events.MouseButtonHandler;
import mightypork.rogue.Const;
import mightypork.rogue.world.PlayerFacade;
import mightypork.rogue.world.WorldProvider;
import mightypork.rogue.world.level.Level;
import mightypork.rogue.world.tile.Tile;
import mightypork.utils.math.algo.Coord;
import mightypork.utils.math.color.Color;
import mightypork.utils.math.color.pal.RGB;
import mightypork.utils.math.constraints.num.Num;
import mightypork.utils.math.constraints.rect.Rect;
import mightypork.utils.math.constraints.rect.var.RectVar;
import mightypork.utils.math.constraints.vect.Vect;
import org.lwjgl.opengl.GL11;
public class Minimap extends InputComponent implements MouseButtonHandler {
private final RectVar bounds = Rect.makeVar();
private int unit = 0;
private final Num translucency = Num.make(0.8);
private final Color playerColor = RGB.RED;
@Override
protected void renderComponent()
{
Color.pushAlpha(translucency);
final Level lvl = WorldProvider.get().getCurrentLevel();
unit = (int) Math.min(Math.max(2, Math.ceil((height().value() / 2) / (lvl.getHeight() + 2))), 10);
final Vect plCoord = WorldProvider.get().getPlayer().getVisualPos();
final int lw = lvl.getWidth();
final int lh = lvl.getHeight();
final Vect tl = topRight().sub(unit * lw, 0);
bounds.setTo(tl, unit * lw, unit * lh);
final Coord point = new Coord(tl.xi(), tl.yi());
// FIXME do not use LWJGL directly
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glBegin(GL11.GL_QUADS);
for (final Coord pos = Coord.zero(); pos.y < lh; pos.y++, point.y += unit) {
for (pos.x = 0, point.x = tl.xi(); pos.x < lw; pos.x++, point.x += unit) {
final Tile t = lvl.getTile(pos);
if (t.isNull() || (!t.isExplored() && Const.RENDER_UFOG)) continue;
final Color clr = t.getMapColor();
App.gfx().setColor(clr);
GL11.glVertex2i(point.x, point.y);
GL11.glVertex2i(point.x + unit, point.y);
GL11.glVertex2i(point.x + unit, point.y + unit);
GL11.glVertex2i(point.x, point.y + unit);
}
}
// player
App.gfx().setColor(playerColor);
final double plx = tl.xi() + plCoord.x() * unit;
final double ply = tl.yi() + plCoord.y() * unit;
GL11.glVertex2d(plx, ply);
GL11.glVertex2d(plx + unit, ply);
GL11.glVertex2d(plx + unit, ply + unit);
GL11.glVertex2d(plx, ply + unit);
GL11.glEnd();
Color.popAlpha();
}
@Override
public void receive(MouseButtonEvent event)
{
if (event.isOver(bounds) && event.getButton() == 1) {
if (event.isUp()) {
final Vect relative = event.getPos().sub(bounds.origin());
final Coord actual = Coord.make(relative.xi() / unit, relative.yi() / unit);
final PlayerFacade player = WorldProvider.get().getPlayer();
if (player.getLevel().getTile(actual).isExplored()) {
player.navigateTo(actual);
}
}
event.consume();
}
}
}