parent
							
								
									5235b969c9
								
							
						
					
					
						commit
						84ef9fb9fe
					
				@ -0,0 +1,106 @@ | 
				
			||||
package mightypork.rogue.screens.gamescreen.world; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.gamecore.control.events.input.MouseButtonEvent; | 
				
			||||
import mightypork.gamecore.control.events.input.MouseButtonListener; | 
				
			||||
import mightypork.gamecore.gui.components.InputComponent; | 
				
			||||
import mightypork.gamecore.render.Render; | 
				
			||||
import mightypork.rogue.world.Coord; | 
				
			||||
import mightypork.rogue.world.EntityPos; | 
				
			||||
import mightypork.rogue.world.World; | 
				
			||||
import mightypork.rogue.world.entity.Entity; | 
				
			||||
import mightypork.rogue.world.level.Level; | 
				
			||||
import mightypork.rogue.world.tile.Tile; | 
				
			||||
import mightypork.util.math.color.Color; | 
				
			||||
import mightypork.util.math.constraints.rect.Rect; | 
				
			||||
import mightypork.util.math.constraints.rect.mutable.RectMutable; | 
				
			||||
import mightypork.util.math.constraints.vect.Vect; | 
				
			||||
 | 
				
			||||
import org.lwjgl.opengl.GL11; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public class Minimap extends InputComponent implements MouseButtonListener { | 
				
			||||
	 | 
				
			||||
	private final World world; | 
				
			||||
	private final RectMutable bounds = Rect.makeVar(); | 
				
			||||
	private int unit = 0; | 
				
			||||
	private final Color back = Color.rgba(0, 0.2, 0.2, 0.4); | 
				
			||||
	private final Color back2 = Color.rgba(0, 0.5, 0.5, 0.5); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Minimap(World w) | 
				
			||||
	{ | 
				
			||||
		this.world = w; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	protected void renderComponent() | 
				
			||||
	{ | 
				
			||||
		 | 
				
			||||
		final Level lvl = world.getCurrentLevel(); | 
				
			||||
		unit = (int) Math.min(Math.max(2, Math.ceil(height().value() / (lvl.getHeight() + 2))), 8); | 
				
			||||
		 | 
				
			||||
		final World w = lvl.getWorld(); | 
				
			||||
		final Entity e = w.getPlayerEntity(); | 
				
			||||
		final EntityPos plCoord = e.getPosition(); | 
				
			||||
		 | 
				
			||||
		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); | 
				
			||||
		 | 
				
			||||
		Render.quad(bounds.grow(unit * 0.5), back); | 
				
			||||
		Render.quad(bounds, back2); | 
				
			||||
		 | 
				
			||||
		final Coord point = new Coord(tl.xi(), tl.yi()); | 
				
			||||
		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.data.explored) continue; | 
				
			||||
				 | 
				
			||||
				final Color clr = t.getMapColor(); | 
				
			||||
				 | 
				
			||||
				GL11.glColor4d(clr.r(), clr.g(), clr.b(), clr.a() * 0.9); | 
				
			||||
				 | 
				
			||||
				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
 | 
				
			||||
		GL11.glColor3d(1, 0, 0); | 
				
			||||
		 | 
				
			||||
		final double plx = tl.xi() + plCoord.visualX() * unit; | 
				
			||||
		final double ply = tl.yi() + plCoord.visualY() * unit; | 
				
			||||
		 | 
				
			||||
		GL11.glVertex2d(plx, ply); | 
				
			||||
		GL11.glVertex2d(plx + unit, ply); | 
				
			||||
		GL11.glVertex2d(plx + unit, ply + unit); | 
				
			||||
		GL11.glVertex2d(plx, ply + unit); | 
				
			||||
		 | 
				
			||||
		GL11.glEnd(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public void receive(MouseButtonEvent event) | 
				
			||||
	{ | 
				
			||||
		if (event.isOver(bounds) && event.isUp()) { | 
				
			||||
			final Vect relative = event.getPos().sub(bounds.origin()); | 
				
			||||
			final Coord actual = Coord.make(relative.xi() / unit, relative.yi() / unit); | 
				
			||||
			 | 
				
			||||
			if (!world.getCurrentLevel().getTile(actual).data.explored) return; // unexplored
 | 
				
			||||
			 | 
				
			||||
			world.getPlayerEntity().navigateTo(actual); | 
				
			||||
			event.consume(); | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,54 @@ | 
				
			||||
package mightypork.rogue.world.tile; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import java.io.IOException; | 
				
			||||
 | 
				
			||||
import mightypork.util.error.YouFuckedUpException; | 
				
			||||
import mightypork.util.files.ion.IonBinary; | 
				
			||||
import mightypork.util.files.ion.IonBundle; | 
				
			||||
import mightypork.util.files.ion.IonInput; | 
				
			||||
import mightypork.util.files.ion.IonOutput; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public class TileData implements IonBinary { | 
				
			||||
	 | 
				
			||||
	private static final byte BIT_EXPLORED = 1 << 0; | 
				
			||||
	private static final byte BIT_LOCKED = 1 << 1; | 
				
			||||
	 | 
				
			||||
	public boolean explored = false; | 
				
			||||
	public boolean locked = false; | 
				
			||||
	 | 
				
			||||
	public final IonBundle extra = new IonBundle(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public void load(IonInput in) throws IOException | 
				
			||||
	{ | 
				
			||||
		final byte flags = in.readByte(); | 
				
			||||
		in.readBundle(extra); | 
				
			||||
		 | 
				
			||||
		explored = (flags & BIT_EXPLORED) != 0; | 
				
			||||
		locked = (flags & BIT_LOCKED) != 0; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public void save(IonOutput out) throws IOException | 
				
			||||
	{ | 
				
			||||
		byte flags = 0; | 
				
			||||
		if (explored) flags |= BIT_EXPLORED; | 
				
			||||
		if (locked) flags |= BIT_LOCKED; | 
				
			||||
		out.writeByte(flags); | 
				
			||||
		 | 
				
			||||
		 | 
				
			||||
		out.writeBundle(extra); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public short getIonMark() | 
				
			||||
	{ | 
				
			||||
		throw new YouFuckedUpException("TileData is not to be read from ION using mark."); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,29 @@ | 
				
			||||
package mightypork.util.error; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public class YouFuckedUpException extends RuntimeException { | 
				
			||||
	 | 
				
			||||
	public YouFuckedUpException() | 
				
			||||
	{ | 
				
			||||
		super(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public YouFuckedUpException(String message, Throwable cause) | 
				
			||||
	{ | 
				
			||||
		super(message, cause); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public YouFuckedUpException(String message) | 
				
			||||
	{ | 
				
			||||
		super(message); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public YouFuckedUpException(Throwable cause) | 
				
			||||
	{ | 
				
			||||
		super(cause); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue