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:
indielm
2018-12-11 17:24:05 -05:00
committed by Anuken
parent eab90cac05
commit 8b3b72243f
4 changed files with 166 additions and 111 deletions
@@ -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){