Gridmode and eyedropper select (#372)
* Gridmode Adds keybindings to category and block selection * bugfixes and comments * more keybind * Update PlacementFragment.java * Update PlacementFragment.java * eyedropper crashfix * formatted with default.xml
This commit is contained in:
@@ -283,9 +283,9 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
|
|||||||
@Override
|
@Override
|
||||||
public void drawShadow(float offsetX, float offsetY){
|
public void drawShadow(float offsetX, float offsetY){
|
||||||
float x = snappedX(), y = snappedY();
|
float x = snappedX(), y = snappedY();
|
||||||
float scl = mech.flying ? 1f : boostHeat/2f;
|
float scl = mech.flying ? 1f : boostHeat / 2f;
|
||||||
|
|
||||||
Draw.rect(mech.iconRegion, x + offsetX*scl, y + offsetY*scl, rotation - 90);
|
Draw.rect(mech.iconRegion, x + offsetX * scl, y + offsetY * scl, rotation - 90);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -365,7 +365,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
|
|||||||
public void drawStats(){
|
public void drawStats(){
|
||||||
float x = snappedX(), y = snappedY();
|
float x = snappedX(), y = snappedY();
|
||||||
|
|
||||||
Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Timers.time(), healthf()*5f, 1f - healthf()));
|
Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Timers.time(), healthf() * 5f, 1f - healthf()));
|
||||||
Draw.alpha(hitTime / hitDuration);
|
Draw.alpha(hitTime / hitDuration);
|
||||||
Draw.rect(getPowerCellRegion(), x + Angles.trnsx(rotation, mech.cellTrnsY, 0f), y + Angles.trnsy(rotation, mech.cellTrnsY, 0f), rotation - 90);
|
Draw.rect(getPowerCellRegion(), x + Angles.trnsx(rotation, mech.cellTrnsY, 0f), y + Angles.trnsy(rotation, mech.cellTrnsY, 0f), rotation - 90);
|
||||||
Draw.color();
|
Draw.color();
|
||||||
@@ -422,7 +422,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
|
|||||||
Core.font.setUseIntegerPositions(ints);
|
Core.font.setUseIntegerPositions(ints);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Draw all current build requests. Does not draw the beam effect, only the positions.*/
|
/** Draw all current build requests. Does not draw the beam effect, only the positions. */
|
||||||
public void drawBuildRequests(){
|
public void drawBuildRequests(){
|
||||||
for(BuildRequest request : getPlaceQueue()){
|
for(BuildRequest request : getPlaceQueue()){
|
||||||
if(getCurrentRequest() == request) continue;
|
if(getCurrentRequest() == request) continue;
|
||||||
@@ -601,9 +601,10 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
|
|||||||
|
|
||||||
float xa = Inputs.getAxis(section, "move_x");
|
float xa = Inputs.getAxis(section, "move_x");
|
||||||
float ya = Inputs.getAxis(section, "move_y");
|
float ya = Inputs.getAxis(section, "move_y");
|
||||||
|
if(!Inputs.keyDown("gridMode")){
|
||||||
movement.y += ya * speed;
|
movement.y += ya * speed;
|
||||||
movement.x += xa * speed;
|
movement.x += xa * speed;
|
||||||
|
}
|
||||||
|
|
||||||
Vector2 vec = Graphics.world(control.input(playerIndex).getMouseX(), control.input(playerIndex).getMouseY());
|
Vector2 vec = Graphics.world(control.input(playerIndex).getMouseX(), control.input(playerIndex).getMouseY());
|
||||||
pointerX = vec.x;
|
pointerX = vec.x;
|
||||||
@@ -695,8 +696,8 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
|
|||||||
getHitbox(rect);
|
getHitbox(rect);
|
||||||
rect.x -= expansion;
|
rect.x -= expansion;
|
||||||
rect.y -= expansion;
|
rect.y -= expansion;
|
||||||
rect.width += expansion*2f;
|
rect.width += expansion * 2f;
|
||||||
rect.height += expansion*2f;
|
rect.height += expansion * 2f;
|
||||||
|
|
||||||
isBoosting = EntityQuery.collisions().overlapsTile(rect) || distanceTo(targetX, targetY) > 85f;
|
isBoosting = EntityQuery.collisions().overlapsTile(rect) || distanceTo(targetX, targetY) > 85f;
|
||||||
|
|
||||||
@@ -733,7 +734,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
|
|||||||
if(target != null && distanceTo(target) > getWeapon().getAmmo().getRange()){
|
if(target != null && distanceTo(target) > getWeapon().getAmmo().getRange()){
|
||||||
target = null;
|
target = null;
|
||||||
}else if(target != null){
|
}else if(target != null){
|
||||||
target = ((Tile)target).entity;
|
target = ((Tile) target).entity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -773,7 +774,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
|
|||||||
|
|
||||||
//region utility methods
|
//region utility methods
|
||||||
|
|
||||||
/** Resets all values of the player.*/
|
/** Resets all values of the player. */
|
||||||
public void reset(){
|
public void reset(){
|
||||||
resetNoAdd();
|
resetNoAdd();
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ public class DefaultKeybinds{
|
|||||||
"rotate", new Axis(Input.SCROLL),
|
"rotate", new Axis(Input.SCROLL),
|
||||||
"dash", Input.SHIFT_LEFT,
|
"dash", Input.SHIFT_LEFT,
|
||||||
"drop_unit", Input.SHIFT_LEFT,
|
"drop_unit", Input.SHIFT_LEFT,
|
||||||
|
"gridMode", Input.ALT_LEFT,
|
||||||
|
"gridModeShift", Input.SHIFT_LEFT,
|
||||||
new Category("view"),
|
new Category("view"),
|
||||||
"zoom_hold", Input.CONTROL_LEFT,
|
"zoom_hold", Input.CONTROL_LEFT,
|
||||||
"zoom", new Axis(Input.SCROLL),
|
"zoom", new Axis(Input.SCROLL),
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ public class HudFragment extends Fragment{
|
|||||||
}
|
}
|
||||||
|
|
||||||
cont.update(() -> {
|
cont.update(() -> {
|
||||||
if(Inputs.keyTap("toggle_menus") && !ui.chatfrag.chatOpen()){
|
if(!Inputs.keyDown("gridMode") && Inputs.keyTap("toggle_menus") && !ui.chatfrag.chatOpen()){
|
||||||
toggleMenus();
|
toggleMenus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -139,7 +139,7 @@ public class HudFragment extends Fragment{
|
|||||||
if(Net.hasClient()){
|
if(Net.hasClient()){
|
||||||
t.label(() -> ping.get(Net.getPing())).visible(Net::client).colspan(2);
|
t.label(() -> ping.get(Net.getPing())).visible(Net::client).colspan(2);
|
||||||
}
|
}
|
||||||
}).size(-1).visible(() -> Settings.getBool("fps")).update(t -> t.setTranslation(0, (!waves.isVisible() ? wavetable.getHeight() : Math.min(wavetable.getTranslation().y, wavetable.getHeight())) )).get();
|
}).size(-1).visible(() -> Settings.getBool("fps")).update(t -> t.setTranslation(0, (!waves.isVisible() ? wavetable.getHeight() : Math.min(wavetable.getTranslation().y, wavetable.getHeight())))).get();
|
||||||
|
|
||||||
//make wave box appear below rest of menu
|
//make wave box appear below rest of menu
|
||||||
if(mobile){
|
if(mobile){
|
||||||
@@ -218,7 +218,7 @@ public class HudFragment extends Fragment{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
table.margin(12);
|
table.margin(12);
|
||||||
table.addImage("icon-check").size(16*2).pad(3);
|
table.addImage("icon-check").size(16 * 2).pad(3);
|
||||||
table.add(text).wrap().width(280f).get().setAlignment(Align.center, Align.center);
|
table.add(text).wrap().width(280f).get().setAlignment(Align.center, Align.center);
|
||||||
table.pack();
|
table.pack();
|
||||||
|
|
||||||
@@ -231,7 +231,7 @@ public class HudFragment extends Fragment{
|
|||||||
Actions.run(() -> container.actions(Actions.translateBy(0, table.getPrefHeight(), 1f, Interpolation.fade), Actions.removeActor())));
|
Actions.run(() -> container.actions(Actions.translateBy(0, table.getPrefHeight(), 1f, Interpolation.fade), Actions.removeActor())));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Show unlock notification for a new recipe.*/
|
/** Show unlock notification for a new recipe. */
|
||||||
public void showUnlock(Recipe recipe){
|
public void showUnlock(Recipe recipe){
|
||||||
|
|
||||||
//if there's currently no unlock notification...
|
//if there's currently no unlock notification...
|
||||||
@@ -378,7 +378,7 @@ public class HudFragment extends Fragment{
|
|||||||
enemiesf.get(state.enemies())) :
|
enemiesf.get(state.enemies())) :
|
||||||
wavef.get(state.wave) + "\n" +
|
wavef.get(state.wave) + "\n" +
|
||||||
(!state.mode.disableWaveTimer ?
|
(!state.mode.disableWaveTimer ?
|
||||||
Bundles.format("text.wave.waiting", (int)(state.wavetime/60)) :
|
Bundles.format("text.wave.waiting", (int) (state.wavetime / 60)) :
|
||||||
Bundles.get("text.waiting"))) :
|
Bundles.get("text.waiting"))) :
|
||||||
Bundles.format("text.mission.display", world.getSector().currentMission().displayString())).growX().pad(8f);
|
Bundles.format("text.mission.display", world.getSector().currentMission().displayString())).growX().pad(8f);
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry.ui.fragments;
|
|||||||
import com.badlogic.gdx.graphics.Color;
|
import com.badlogic.gdx.graphics.Color;
|
||||||
import com.badlogic.gdx.math.Interpolation;
|
import com.badlogic.gdx.math.Interpolation;
|
||||||
import com.badlogic.gdx.math.Vector2;
|
import com.badlogic.gdx.math.Vector2;
|
||||||
|
import com.badlogic.gdx.utils.Array;
|
||||||
import io.anuke.mindustry.core.GameState.State;
|
import io.anuke.mindustry.core.GameState.State;
|
||||||
import io.anuke.mindustry.entities.TileEntity;
|
import io.anuke.mindustry.entities.TileEntity;
|
||||||
import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent;
|
import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent;
|
||||||
@@ -17,6 +18,8 @@ import io.anuke.mindustry.world.Tile;
|
|||||||
import io.anuke.mindustry.world.blocks.OreBlock;
|
import io.anuke.mindustry.world.blocks.OreBlock;
|
||||||
import io.anuke.ucore.core.Events;
|
import io.anuke.ucore.core.Events;
|
||||||
import io.anuke.ucore.core.Graphics;
|
import io.anuke.ucore.core.Graphics;
|
||||||
|
import io.anuke.ucore.core.Inputs;
|
||||||
|
import io.anuke.ucore.input.Input;
|
||||||
import io.anuke.ucore.scene.Group;
|
import io.anuke.ucore.scene.Group;
|
||||||
import io.anuke.ucore.scene.actions.Actions;
|
import io.anuke.ucore.scene.actions.Actions;
|
||||||
import io.anuke.ucore.scene.event.Touchable;
|
import io.anuke.ucore.scene.event.Touchable;
|
||||||
@@ -38,6 +41,18 @@ public class PlacementFragment extends Fragment{
|
|||||||
boolean shown = true;
|
boolean shown = true;
|
||||||
boolean lastGround;
|
boolean lastGround;
|
||||||
|
|
||||||
|
final Input[] inputGrid = {
|
||||||
|
Input.NUM_1, Input.NUM_2, Input.NUM_3, Input.NUM_4,
|
||||||
|
Input.Q, Input.W, Input.E, Input.R,
|
||||||
|
Input.A, Input.S, Input.D, Input.F,
|
||||||
|
Input.Z, Input.X, Input.C, Input.V
|
||||||
|
}, inputCatGrid = {
|
||||||
|
Input.NUM_1, Input.NUM_2,
|
||||||
|
Input.Q, Input.W,
|
||||||
|
Input.A, Input.S,
|
||||||
|
Input.Z, Input.X, Input.C, Input.V
|
||||||
|
};
|
||||||
|
|
||||||
public PlacementFragment(){
|
public PlacementFragment(){
|
||||||
Events.on(WorldLoadGraphicsEvent.class, event -> {
|
Events.on(WorldLoadGraphicsEvent.class, event -> {
|
||||||
currentCategory = Category.turret;
|
currentCategory = Category.turret;
|
||||||
@@ -47,6 +62,40 @@ public class PlacementFragment extends Fragment{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean gridUpdate(InputHandler input){
|
||||||
|
if(!Inputs.keyDown("gridMode")) return false;
|
||||||
|
if(Inputs.keyDown("gridModeShift")){ // Select Category
|
||||||
|
int i = 0;
|
||||||
|
for(Input key : inputCatGrid){
|
||||||
|
if(Inputs.keyDown(key)){
|
||||||
|
input.recipe = Recipe.getByCategory(Category.values()[i]).first();
|
||||||
|
currentCategory = input.recipe.category;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}else if(Inputs.keyDown("select")){ // Mouse eyedropper select
|
||||||
|
Tile tile = world.tileWorld(Graphics.mouseWorld().x, Graphics.mouseWorld().y).target();
|
||||||
|
if(tile.block() != null){
|
||||||
|
Recipe tryRecipe = Recipe.getByResult(tile.block());
|
||||||
|
if((tryRecipe != null) && control.unlocks.isUnlocked(tryRecipe)){
|
||||||
|
input.recipe = tryRecipe;
|
||||||
|
currentCategory = input.recipe.category;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{ // Select block
|
||||||
|
int i = 0;
|
||||||
|
Array<Recipe> recipes = Recipe.getByCategory(currentCategory);
|
||||||
|
for(Input key : inputGrid){
|
||||||
|
if(Inputs.keyDown(key))
|
||||||
|
input.recipe = (i < recipes.size && control.unlocks.isUnlocked(recipes.get(i))) ? recipes.get(i) : null;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(Group parent){
|
public void build(Group parent){
|
||||||
parent.fill(full -> {
|
parent.fill(full -> {
|
||||||
@@ -74,7 +123,7 @@ public class PlacementFragment extends Fragment{
|
|||||||
|
|
||||||
boolean[] unlocked = {false};
|
boolean[] unlocked = {false};
|
||||||
|
|
||||||
ImageButton button = blockTable.addImageButton("icon-locked", "select", 8*4, () -> {
|
ImageButton button = blockTable.addImageButton("icon-locked", "select", 8 * 4, () -> {
|
||||||
if(control.unlocks.isUnlocked(recipe)){
|
if(control.unlocks.isUnlocked(recipe)){
|
||||||
input.recipe = input.recipe == recipe ? null : recipe;
|
input.recipe = input.recipe == recipe ? null : recipe;
|
||||||
}
|
}
|
||||||
@@ -111,8 +160,8 @@ public class PlacementFragment extends Fragment{
|
|||||||
frame.table("button-edge-2", top -> {
|
frame.table("button-edge-2", top -> {
|
||||||
topTable = top;
|
topTable = top;
|
||||||
top.add(new Table()).growX().update(topTable -> {
|
top.add(new Table()).growX().update(topTable -> {
|
||||||
if((tileDisplayBlock() == null && lastDisplay == getSelected() && !lastGround) ||
|
if((tileDisplayBlock() == null && lastDisplay == getSelected() && !lastGround) || (tileDisplayBlock() != null && lastDisplay == tileDisplayBlock() && lastGround))
|
||||||
(tileDisplayBlock() != null && lastDisplay == tileDisplayBlock() && lastGround)) return;
|
return;
|
||||||
|
|
||||||
topTable.clear();
|
topTable.clear();
|
||||||
topTable.top().left().margin(5);
|
topTable.top().left().margin(5);
|
||||||
@@ -123,7 +172,7 @@ public class PlacementFragment extends Fragment{
|
|||||||
if(lastDisplay != null){ //show selected recipe
|
if(lastDisplay != null){ //show selected recipe
|
||||||
topTable.table(header -> {
|
topTable.table(header -> {
|
||||||
header.left();
|
header.left();
|
||||||
header.add(new ImageStack(lastDisplay.getCompactIcon())).size(8*4);
|
header.add(new ImageStack(lastDisplay.getCompactIcon())).size(8 * 4);
|
||||||
header.labelWrap(() ->
|
header.labelWrap(() ->
|
||||||
!control.unlocks.isUnlocked(Recipe.getByResult(lastDisplay)) ? Bundles.get("text.blocks.unknown") : lastDisplay.formalName)
|
!control.unlocks.isUnlocked(Recipe.getByResult(lastDisplay)) ? Bundles.get("text.blocks.unknown") : lastDisplay.formalName)
|
||||||
.left().width(190f).padLeft(5);
|
.left().width(190f).padLeft(5);
|
||||||
@@ -141,7 +190,7 @@ public class PlacementFragment extends Fragment{
|
|||||||
for(ItemStack stack : Recipe.getByResult(lastDisplay).requirements){
|
for(ItemStack stack : Recipe.getByResult(lastDisplay).requirements){
|
||||||
req.table(line -> {
|
req.table(line -> {
|
||||||
line.left();
|
line.left();
|
||||||
line.addImage(stack.item.region).size(8*2);
|
line.addImage(stack.item.region).size(8 * 2);
|
||||||
line.add(stack.item.localizedName()).color(Color.LIGHT_GRAY).padLeft(2).left();
|
line.add(stack.item.localizedName()).color(Color.LIGHT_GRAY).padLeft(2).left();
|
||||||
line.labelWrap(() -> {
|
line.labelWrap(() -> {
|
||||||
TileEntity core = players[0].getClosestCore();
|
TileEntity core = players[0].getClosestCore();
|
||||||
@@ -159,13 +208,13 @@ public class PlacementFragment extends Fragment{
|
|||||||
|
|
||||||
}else if(tileDisplayBlock() != null){ //show selected tile
|
}else if(tileDisplayBlock() != null){ //show selected tile
|
||||||
lastDisplay = tileDisplayBlock();
|
lastDisplay = tileDisplayBlock();
|
||||||
topTable.add(new ImageStack(lastDisplay.getDisplayIcon(hoverTile))).size(8*4);
|
topTable.add(new ImageStack(lastDisplay.getDisplayIcon(hoverTile))).size(8 * 4);
|
||||||
topTable.labelWrap(lastDisplay.getDisplayName(hoverTile)).left().width(190f).padLeft(5);
|
topTable.labelWrap(lastDisplay.getDisplayName(hoverTile)).left().width(190f).padLeft(5);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}).colspan(3).fillX().visible(() -> getSelected() != null || tileDisplayBlock() != null).touchable(Touchable.enabled);
|
}).colspan(3).fillX().visible(() -> getSelected() != null || tileDisplayBlock() != null).touchable(Touchable.enabled);
|
||||||
frame.row();
|
frame.row();
|
||||||
frame.addImage("blank").color(Palette.accent).colspan(3).height(3*2).growX();
|
frame.addImage("blank").color(Palette.accent).colspan(3).height(3 * 2).growX();
|
||||||
frame.row();
|
frame.row();
|
||||||
frame.table("pane-2", blocksSelect -> {
|
frame.table("pane-2", blocksSelect -> {
|
||||||
blocksSelect.margin(4).marginTop(0);
|
blocksSelect.margin(4).marginTop(0);
|
||||||
@@ -181,21 +230,24 @@ public class PlacementFragment extends Fragment{
|
|||||||
for(Category cat : Category.values()){
|
for(Category cat : Category.values()){
|
||||||
if(Recipe.getByCategory(cat).isEmpty()) continue;
|
if(Recipe.getByCategory(cat).isEmpty()) continue;
|
||||||
|
|
||||||
categories.addImageButton("icon-" + cat.name(), "clear-toggle", 16*2, () -> {
|
categories.addImageButton("icon-" + cat.name(), "clear-toggle", 16 * 2, () -> {
|
||||||
currentCategory = cat;
|
currentCategory = cat;
|
||||||
rebuildCategory.run();
|
rebuildCategory.run();
|
||||||
}).group(group).update(i -> i.setChecked(currentCategory == cat));
|
}).group(group).update(i -> i.setChecked(currentCategory == cat));
|
||||||
|
|
||||||
if(cat.ordinal() %2 == 1) categories.row();
|
if(cat.ordinal() % 2 == 1) categories.row();
|
||||||
}
|
}
|
||||||
}).touchable(Touchable.enabled);
|
}).touchable(Touchable.enabled);
|
||||||
|
|
||||||
rebuildCategory.run();
|
rebuildCategory.run();
|
||||||
|
frame.update(() -> {
|
||||||
|
if(gridUpdate(input)) rebuildCategory.run();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Returns the currently displayed block in the top box.*/
|
/** Returns the currently displayed block in the top box. */
|
||||||
Block getSelected(){
|
Block getSelected(){
|
||||||
Block toDisplay = null;
|
Block toDisplay = null;
|
||||||
|
|
||||||
@@ -226,12 +278,12 @@ public class PlacementFragment extends Fragment{
|
|||||||
return toDisplay;
|
return toDisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Returns the block currently being hovered over in the world.*/
|
/** Returns the block currently being hovered over in the world. */
|
||||||
Block tileDisplayBlock(){
|
Block tileDisplayBlock(){
|
||||||
return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.floor() instanceof OreBlock ? hoverTile.floor() : null;
|
return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.floor() instanceof OreBlock ? hoverTile.floor() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Show or hide the placement menu.*/
|
/** Show or hide the placement menu. */
|
||||||
void toggle(float t, Interpolation ip){
|
void toggle(float t, Interpolation ip){
|
||||||
toggler.clearActions();
|
toggler.clearActions();
|
||||||
if(shown){
|
if(shown){
|
||||||
|
|||||||
Reference in New Issue
Block a user