/******************************************************************************* * Copyright 2015 Maximilian Stark | Dakror <mail@dakror.de> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package de.dakror.vloxlands.layer; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input.Buttons; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.scenes.scene2d.Action; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Button; import com.badlogic.gdx.scenes.scene2d.utils.Align; import com.badlogic.gdx.utils.viewport.ScreenViewport; import de.dakror.vloxlands.Vloxlands; import de.dakror.vloxlands.game.Game; import de.dakror.vloxlands.game.entity.creature.Creature; import de.dakror.vloxlands.game.entity.creature.Human; import de.dakror.vloxlands.game.entity.structure.Structure; import de.dakror.vloxlands.game.world.Island; import de.dakror.vloxlands.ui.IslandInfo; import de.dakror.vloxlands.ui.IslandResources; import de.dakror.vloxlands.ui.Minimap; import de.dakror.vloxlands.ui.PinnableWindow; import de.dakror.vloxlands.ui.Revolver; import de.dakror.vloxlands.ui.RevolverSlot; import de.dakror.vloxlands.util.event.SelectionListener; import de.dakror.vloxlands.util.event.VoxelSelection; /** * @author Dakror */ public class HudLayer extends Layer implements SelectionListener { PinnableWindow selectedEntityWindow; PinnableWindow selectedStructureWindow; ShapeRenderer shapeRenderer; RevolverSlot selected; Revolver actions; int buttonDown = -1; final Vector2 dragStart = new Vector2(-1, -1); final Vector2 dragEnd = new Vector2(-1, -1); @Override public void show() { modal = true; Game.instance.addListener(this); stage = new Stage(new ScreenViewport()); shapeRenderer = new ShapeRenderer(); selectedEntityWindow = new PinnableWindow("", Vloxlands.skin); selectedEntityWindow.setPosition(Gdx.graphics.getWidth() - selectedEntityWindow.getWidth(), 0); selectedEntityWindow.setTitleAlignment(Align.left); selectedEntityWindow.setVisible(false); stage.addActor(selectedEntityWindow); selectedStructureWindow = new PinnableWindow("", Vloxlands.skin); selectedStructureWindow.setPosition(Gdx.graphics.getWidth() - selectedStructureWindow.getWidth(), 0); selectedStructureWindow.setTitleAlignment(Align.left); selectedStructureWindow.setVisible(false); stage.addActor(selectedStructureWindow); addActionsMenu(); stage.addActor(new Minimap()); stage.addActor(new IslandInfo()); stage.addActor(new IslandResources(stage)); } @Override public void dispose() { super.dispose(); Game.instance.removeListener(this); } public void addActionsMenu() { actions = new Revolver(); actions.setPosition(10, 10); RevolverSlot s = new RevolverSlot(stage, new Vector2(3, 0), "mine"); s.getTooltip().set("Mine", "Mine or dig terrain."); actions.addSlot(0, null, s); s = new RevolverSlot(stage, new Vector2(3, 0), "clear|region"); s.getTooltip().set("Clear", "Clear a selected region of natural materials."); actions.addSlot(1, "mine", s); s = new RevolverSlot(stage, new Vector2(1, 5), "build"); s.getTooltip().set("Build", "Build various building and structures."); actions.addSlot(0, null, s); s = new RevolverSlot(stage, new Vector2(1, 5), "entity:129"); s.setDisabled(true); s.getTooltip().set("Towncenter", "Functions as the central point and warehouse of an island.\nA prerequisite for settling on an island."); actions.addSlot(1, "build", s); s = new RevolverSlot(stage, new Vector2(0, 3), "wood"); s.getTooltip().set("Wood", "Buildings specialized on working with the Wood resource."); actions.addSlot(1, "build", s); s = new RevolverSlot(stage, new Vector2(0, 3), "entity:130"); s.getTooltip().set("Lumberjack", "Chops nearby trees for wooden logs using an axe."); actions.addSlot(2, "wood", s); s = new RevolverSlot(stage, new Vector2(0, 7), "entity:131"); s.getTooltip().set("Forester", "Places tree saplings to regrow the forest.\nSaplings take 5 days to fully grow."); actions.addSlot(2, "wood", s); s = new RevolverSlot(stage, new Vector2(1, 3), "entity:134"); s.getTooltip().set("Sawmill", "Cuts wooden logs into multiple wooden planks using the energy of a mill."); actions.addSlot(2, "wood", s); s = new RevolverSlot(stage, new Vector2(2, 4), "food"); s.getTooltip().set("Food", "Buildings that produce all kinds of food."); actions.addSlot(1, "build", s); s = new RevolverSlot(stage, new Vector2(1, 7), "entity:132"); s.getTooltip().set("Farm", "Plants wheat and harvests it when grown.\nWheat takes 2 days to fully grow."); actions.addSlot(2, "food", s); s = new RevolverSlot(stage, new Vector2(0, 4), "entity:33|cont"); s.getTooltip().set("Wheatfield", "A field of wheat which takes 2 days to fully grow."); actions.addSlot(2, "food", s); s = new RevolverSlot(stage, new Vector2(2, 0), "entity:133"); s.getTooltip().set("Mine", "Mines the specified ore or stone out of the ground."); actions.addSlot(1, "build", s); selected = new RevolverSlot(stage, new Vector2(5, 1), "selected"); actions.addSlot(0, null, selected); stage.addActor(actions); } @Override public void onCreatureSelection(final Creature creature, boolean lmb) { if (lmb && selectedStructureWindow.setShown(false)) { selectedStructureWindow.clearChildren(); selectedStructureWindow.clearActions(); } if (creature == null && lmb && selectedEntityWindow.setShown(false)) { selectedEntityWindow.clearChildren(); selectedEntityWindow.clearActions(); } if (lmb && creature != null) { boolean jobsWereExpanded = selectedEntityWindow.isVisible() && selectedEntityWindow.getTitle().equals(creature.getName()) && creature instanceof Human && ((Button) selectedEntityWindow.findActor("job")).isChecked(); selectedEntityWindow.setTitle(creature.getName()); selectedEntityWindow.clearChildren(); selectedEntityWindow.clearActions(); selectedEntityWindow.addActor(selectedEntityWindow.getButtonTable()); selectedEntityWindow.addAction(new Action() { @Override public boolean act(float delta) { selectedEntityWindow.setTitle(creature.getName()); if (!creature.isVisible()) { onCreatureSelection(null, true); return true; } return false; } }); creature.setUI(selectedEntityWindow, jobsWereExpanded); selected.getTooltip().setTitle(""); selected.setIcon(new Vector2(5, 1)); actions.removeGroup("selected"); creature.setActions(selected); selectedEntityWindow.pack(); selectedEntityWindow.setVisible(true); selectedEntityWindow.toFront(); } } @Override public void onVoxelSelection(VoxelSelection vs, boolean lmb) { if (lmb && selectedEntityWindow.setShown(false)) { selectedEntityWindow.clearChildren(); selectedEntityWindow.clearActions(); } if (lmb && selectedStructureWindow.setShown(false)) { selectedStructureWindow.clearChildren(); selectedStructureWindow.clearActions(); } selected.getTooltip().setTitle(""); selected.setIcon(new Vector2(5, 1)); actions.removeGroup("selected"); } @Override public void onStructureSelection(final Structure structure, boolean lmb) { if (lmb && selectedEntityWindow.setShown(false)) { selectedEntityWindow.clearChildren(); selectedEntityWindow.clearActions(); } if (structure == null && lmb && selectedStructureWindow.setShown(false)) { selectedStructureWindow.clearChildren(); selectedStructureWindow.clearActions(); } if (lmb && structure != null) { boolean tasksWereExpanded = selectedStructureWindow.isVisible() && selectedStructureWindow.getTitle().equals(structure.getName()) && ((Button) selectedStructureWindow.findActor("queue")) != null && ((Button) selectedStructureWindow.findActor("queue")).isChecked(); selectedStructureWindow.setTitle(structure.getName()); selectedStructureWindow.clearChildren(); selectedStructureWindow.clearActions(); selectedStructureWindow.addActor(selectedStructureWindow.getButtonTable()); structure.setUI(selectedStructureWindow, tasksWereExpanded); selected.getTooltip().setTitle(""); selected.setIcon(new Vector2(5, 1)); actions.removeGroup("selected"); structure.setActions(selected); selectedStructureWindow.pack(); selectedStructureWindow.setVisible(true); selectedStructureWindow.toFront(); } } @Override public void onVoxelRangeSelection(Island island, Vector3 start, Vector3 end, boolean lmb) {} @Override public void onNoSelection(boolean lmb) { if (lmb && selectedEntityWindow.setShown(false)) { selectedEntityWindow.clearChildren(); selectedEntityWindow.clearActions(); } if (lmb && selectedStructureWindow.setShown(false)) { selectedStructureWindow.clearChildren(); selectedStructureWindow.clearActions(); } } @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { if (button == Buttons.LEFT) { if (dragEnd.x > -1) { float x = Math.min(dragStart.x, dragEnd.x) / Gdx.graphics.getWidth(); float y = Math.min(dragStart.y, dragEnd.y) / Gdx.graphics.getHeight(); float width = Math.abs(dragStart.x - dragEnd.x) / Gdx.graphics.getWidth(); float height = Math.abs(dragStart.y - dragEnd.y) / Gdx.graphics.getHeight(); Game.instance.selectionBox(new Rectangle(x, y, width, height)); Game.instance.activeAction = ""; } dragStart.set(-1, -1); dragEnd.set(-1, -1); } buttonDown = -1; return false; } @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { buttonDown = button; return false; } @Override public boolean touchDragged(int screenX, int screenY, int pointer) { if (buttonDown == Buttons.LEFT) { if (dragStart.x == -1) { dragStart.set(screenX, Gdx.graphics.getHeight() - screenY); dragEnd.set(screenX, Gdx.graphics.getHeight() - screenY); } else dragEnd.set(screenX, Gdx.graphics.getHeight() - screenY); return true; } return false; } @Override public void render(float delta) { stage.act(); if (Vloxlands.instance.getActiveLayer() == this || !Vloxlands.instance.getActiveLayer().isModal()) { stage.draw(); if (dragStart.x > -1) { shapeRenderer.setProjectionMatrix(stage.getCamera().combined); shapeRenderer.begin(ShapeType.Line); shapeRenderer.identity(); shapeRenderer.setColor(Color.WHITE); shapeRenderer.rect(Math.min(dragStart.x, dragEnd.x), Math.min(dragStart.y, dragEnd.y), Math.abs(dragStart.x - dragEnd.x), Math.abs(dragStart.y - dragEnd.y)); shapeRenderer.end(); } } } }