trooping done

This commit is contained in:
sharlottes
2022-11-28 20:50:07 +09:00
parent d82f2e4754
commit e2e7d5053a
15 changed files with 289 additions and 54 deletions

View File

@@ -7,6 +7,7 @@ import informatis.core.OverDrawer;
import informatis.core.Setting; import informatis.core.Setting;
import informatis.draws.OverDraws; import informatis.draws.OverDraws;
import informatis.ui.SidebarSwitcher; import informatis.ui.SidebarSwitcher;
import informatis.ui.TroopingManager;
import informatis.ui.dialogs.DialogManager; import informatis.ui.dialogs.DialogManager;
import informatis.ui.dialogs.ResourcePreviewDialog; import informatis.ui.dialogs.ResourcePreviewDialog;
import informatis.ui.fragments.FragmentManager; import informatis.ui.fragments.FragmentManager;
@@ -37,15 +38,27 @@ public class Informatis extends Mod {
UnitWindow.currentWindow.locked = !UnitWindow.currentWindow.locked; UnitWindow.currentWindow.locked = !UnitWindow.currentWindow.locked;
} }
} }
int i = 0;
for(KeyCode numCode : KeyCode.numbers) {
if(input.keyTap(numCode)) {
if(input.keyDown(KeyCode.altLeft)) TroopingManager.applyTrooping(i);
else if(input.keyDown(KeyCode.capsLock)) TroopingManager.updateTrooping(i);
else TroopingManager.selectTrooping(i);
break;
}
i++;
}
}); });
Events.on(ClientLoadEvent.class, e -> { Events.on(ClientLoadEvent.class, e -> {
Setting.init(); Setting.init();
WindowManager.init(); WindowManager.init();
DialogManager.init(); DialogManager.init();
TroopingManager.init();
new SidebarSwitcher( new SidebarSwitcher(
WindowManager.body, WindowManager.body,
DialogManager.body, DialogManager.body,
TroopingManager.body,
new Table(Tex.buttonEdge4, t -> { new Table(Tex.buttonEdge4, t -> {
t.label(() -> "it's just label lmao"); t.label(() -> "it's just label lmao");
}) })

View File

@@ -1,6 +1,6 @@
package informatis.draws; package informatis.draws;
import informatis.ui.FreeBar; import informatis.ui.components.FreeBar;
import mindustry.gen.Unit; import mindustry.gen.Unit;
public class UnitBarDraw extends OverDraw { public class UnitBarDraw extends OverDraw {

View File

@@ -1,6 +1,7 @@
package informatis.ui; package informatis.ui;
import arc.*; import arc.*;
import arc.graphics.g2d.Lines;
import arc.math.*; import arc.math.*;
import arc.scene.*; import arc.scene.*;
import arc.scene.actions.*; import arc.scene.actions.*;
@@ -10,7 +11,9 @@ import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.ui.*; import mindustry.graphics.Pal;
import javax.sound.sampled.Line;
public class SidebarSwitcher { public class SidebarSwitcher {
int showIndex = 0; int showIndex = 0;
@@ -48,15 +51,22 @@ public class SidebarSwitcher {
public void init() { public void init() {
Vars.ui.hudGroup.fill(t -> { Vars.ui.hudGroup.fill(t -> {
t.name = "informatis sidebar"; t.name = "informatis sidebar";
t.center().left(); t.left();
t.table(body -> { t.table(body -> {
ImageButton button = new ImageButton(); ImageButton button = new ImageButton() {
@Override
public void draw() {
super.draw();
Lines.stroke(5, Pal.gray);
Lines.line(this.x, this.y + this.height, this.x + this.width, this.y + this.height);
}
};
button.clicked(() -> { button.clicked(() -> {
SnapshotSeq<Element> children = ((Group) body.getChildren().first()).getChildren(); SnapshotSeq<Element> children = ((Stack) body.getChildren().first()).getChildren();
Element currentSidebar = children.get(showIndex); Element currentSidebar = ((Table) children.get(showIndex)).getChildren().first();
showIndex = (showIndex + 1) % children.size; showIndex = (showIndex + 1) % children.size;
Element nextSidebar = children.get(showIndex); Element nextSidebar = ((Table) children.get(showIndex)).getChildren().first();
actShowMoveX(currentSidebar, 0, -currentSidebar.getWidth()); actShowMoveX(currentSidebar, 0, -currentSidebar.getWidth());
actShowMoveX(nextSidebar, -nextSidebar.getWidth(),0); actShowMoveX(nextSidebar, -nextSidebar.getWidth(),0);
@@ -69,18 +79,22 @@ public class SidebarSwitcher {
style.up = Tex.buttonEdge4; style.up = Tex.buttonEdge4;
style.imageUp = Icon.right; style.imageUp = Icon.right;
button.setStyle(style); button.setStyle(style);
button.setWidth(sidebars[0].getWidth()); actResizeWidth(button, sidebars[showIndex].getWidth());
body.top().left() Stack sidebarTables = new Stack();
.defaults().growY();
body.table(sides -> {
sides.top().left().defaults().growY();
for(int i = 0; i < sidebars.length; i++) { for(int i = 0; i < sidebars.length; i++) {
Element elem = sidebars[i]; int j = i;
if(elem instanceof Table table) table.setBackground(Tex.buttonEdge3); sidebarTables.add(new Table(table -> {
sides.add(elem).visible(i == 0); Element elem = sidebars[j];
if (elem instanceof Table elemTable) elemTable.setBackground(Tex.buttonEdge3);
table.left();
table.add(elem).growY();
elem.visible = j == 0;
}));
} }
}).row(); body.top().left();
body.add(sidebarTables).grow().row();
body.add(button).growX(); body.add(button).growX();
}); });
}); });

View File

@@ -0,0 +1,98 @@
package informatis.ui;
import arc.graphics.Color;
import arc.scene.ui.Image;
import arc.scene.ui.Label;
import arc.scene.ui.layout.Stack;
import arc.scene.ui.layout.Table;
import arc.struct.IntSeq;
import arc.struct.ObjectIntMap;
import arc.struct.Seq;
import arc.util.Log;
import arc.util.Scaling;
import mindustry.Vars;
import mindustry.gen.Groups;
import mindustry.gen.Healthc;
import mindustry.gen.Icon;
import mindustry.gen.Unit;
import mindustry.graphics.Pal;
import mindustry.input.InputHandler;
import mindustry.type.UnitType;
import mindustry.ui.Styles;
public class TroopingManager {
public static Table body;
static Seq<IntSeq> troops = new Seq<>(10);
public static void init() {
for (int i = 0; i < 10; i++) troops.add(new IntSeq());
body = new Table(t -> {
t.defaults().growX();
t.table(header -> {
header.center().defaults().pad(10).growX();
header.button("all", Styles.defaultt, () -> {
Vars.control.input.selectedUnits.clear();
Vars.control.input.selectedUnits.addAll(Vars.player.team().data().units);
}).wrapLabel(false);
header.button(Icon.cancel, Styles.defaulti, () -> Vars.control.input.selectedUnits.clear());
}).row();
t.image().height(5f).color(Pal.gray).pad(10, 0, 10, 0).row();
t.table(list -> {
for(int i = 1; i <= troops.size; i++) {
int j = i % troops.size;
IntSeq troop = troops.get(j);
Table troopTab = new Table(tab -> {
tab.left();
tab.add(String.valueOf(j)).fontScale(0.75f).width(15).padRight(30);
tab.image(() -> {
if(troop.isEmpty()) return Icon.cancel.getRegion();
Unit unit = Groups.unit.getByID(troop.peek());
if(unit == null) return Icon.cancel.getRegion();
return unit.type.fullIcon;
}).size(10).padRight(10);
tab.label(() -> {
int amount = 0;
for(int id : troop.toArray()) {
Unit unit = Groups.unit.getByID(id);
if(unit != null && !unit.dead()) amount++;
}
return String.valueOf(amount);
}).minWidth(30).fontScale(0.5f);
tab.table(icons -> {
icons.image(Icon.cancelSmall).size(10).color(Pal.health).padLeft(10).grow().get().clicked(troop::clear);
icons.image(Icon.upSmall).size(10).color(Pal.heal).padLeft(10).grow().get().clicked(() -> updateTrooping(j));
icons.image(Icon.addSmall).size(10).color(Pal.gray).padLeft(10).grow().get().clicked(() -> applyTrooping(j));
}).padLeft(10).grow();
});
troopTab.clicked(() -> selectTrooping(j));
list.add(troopTab).pad(10).grow().row();
list.image().height(2f).color(Pal.gray).grow().row();
}
});
});
}
public static void applyTrooping(int index) {
IntSeq seq = troops.get(index);
Vars.control.input.selectedUnits.each(unit -> seq.add(unit.id));
}
public static void selectTrooping(int index) {
Vars.control.input.commandMode = true;
Vars.control.input.selectedUnits.clear();
for(int id : troops.get(index).toArray()) {
Unit unit = Groups.unit.getByID(id);
if(unit != null) Vars.control.input.selectedUnits.add(unit);
}
}
public static void updateTrooping(int index) {
IntSeq seq = troops.get(index);
seq.clear();
Vars.control.input.selectedUnits.each(unit -> seq.add(unit.id));
}
}

View File

@@ -1,4 +1,4 @@
package informatis.ui; package informatis.ui.components;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;

View File

@@ -1,12 +1,10 @@
package informatis.ui; package informatis.ui.components;
import arc.math.geom.Vec2; import arc.math.geom.Vec2;
import arc.scene.Element; import arc.scene.Element;
import arc.scene.ui.ScrollPane; import arc.scene.ui.ScrollPane;
import arc.util.Log;
import static arc.Core.input; import static arc.Core.input;
import static arc.Core.scene;
public class OverScrollPane extends ScrollPane { public class OverScrollPane extends ScrollPane {
Vec2 scrollPos; Vec2 scrollPos;

View File

@@ -1,4 +1,4 @@
package informatis.ui; package informatis.ui.components;
import informatis.SUtils; import informatis.SUtils;
import arc.*; import arc.*;

View File

@@ -1,4 +1,4 @@
package informatis.ui; package informatis.ui.components;
import arc.Core; import arc.Core;
import arc.graphics.g2d.TextureRegion; import arc.graphics.g2d.TextureRegion;

View File

@@ -1,24 +1,20 @@
package informatis.ui.dialogs; package informatis.ui.dialogs;
import arc.func.Cons; import arc.func.*;
import arc.graphics.Color; import arc.graphics.*;
import arc.graphics.g2d.Font; import arc.graphics.g2d.*;
import arc.input.KeyCode; import arc.input.*;
import arc.scene.Element; import arc.scene.event.ClickListener;
import arc.scene.style.Drawable; import arc.scene.event.InputEvent;
import arc.scene.style.TextureRegionDrawable; import arc.scene.event.InputListener;
import arc.scene.style.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.scene.utils.Elem; import arc.struct.*;
import arc.struct.ObjectMap; import arc.util.*;
import arc.struct.Seq; import mindustry.gen.*;
import arc.util.Align; import mindustry.graphics.*;
import arc.util.Log; import mindustry.ui.*;
import arc.util.Scaling;
import mindustry.gen.Icon;
import mindustry.gen.Tex;
import mindustry.graphics.Pal;
import mindustry.ui.Styles;
import mindustry.ui.dialogs.*; import mindustry.ui.dialogs.*;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@@ -36,7 +32,7 @@ public class ResourcePreviewDialog extends BaseDialog {
cont.table(t -> { cont.table(t -> {
t.top().center(); t.top().center();
t.table(Tex.underline, tabTable -> { t.table(Tex.underline, tabTable -> {
String[] tabs = {"Textures", "Styles"}; String[] tabs = {"Textures", "Styles", "Colors"};
for(int i = 0; i < tabs.length; i++) { for(int i = 0; i < tabs.length; i++) {
int j = i; int j = i;
TextButton button = new TextButton(tabs[j], Styles.flatToggleMenut); TextButton button = new TextButton(tabs[j], Styles.flatToggleMenut);
@@ -61,8 +57,12 @@ public class ResourcePreviewDialog extends BaseDialog {
resource.add(rebuildResourceList()).grow(); resource.add(rebuildResourceList()).grow();
} }
float scrollY; float scrollY, scrollY2;
String search = ""; String search = "";
String colorInput1 = "ffffffff", colorInput2 = "ffffffff";
float colorMixProg = 0;
int colorMixSelectIndex = 0;
Color color1 = Color.white, color2 = Color.white, mixedColor = Color.white;
Table rebuildResourceList() { Table rebuildResourceList() {
return new Table(pane -> { return new Table(pane -> {
Cons[] builders = { Cons[] builders = {
@@ -91,7 +91,76 @@ public class ResourcePreviewDialog extends BaseDialog {
}, },
(Cons<Table>) ppane -> { (Cons<Table>) ppane -> {
buildTitle(ppane, "Styles Resources").row(); buildTitle(ppane, "Styles Resources").row();
ppane.pane(this::buildStyleResources).scrollX(true).grow().fill(); ppane.pane(this::buildStyleResources).grow().fill();
},
(Cons<Table>) ppane -> {
ppane.table(options -> {
options.top().center().defaults().pad(20);
options.add("Mix");
options.add(new Image() {
@Override
public void draw() {
super.draw();
int size = 8;
Draw.color(colorMixSelectIndex == 0 ? Pal.accent : Pal.gray);
Draw.alpha(parentAlpha);
Lines.stroke(Scl.scl(3f));
Lines.rect(x - size / 2f, y - size / 2f, width + size, height + size);
Draw.reset();
}
}).size(30).color(color1).pad(10).get().clicked(() -> colorMixSelectIndex = 0);
options.field(colorInput1, field -> {
colorInput1 = field;
color1 = Color.valueOf(field.matches("^#?[a-fA-F0-9]{6,8}$") ? field : "ffffff");
}).get().keyDown(KeyCode.enter, this::refreshResourceTable);
options.slider(0, 100, 1, colorMixProg, prog -> {
colorMixProg = prog;
mixedColor = color1.cpy().lerp(color2, prog / 100);
}).get().addListener(new ClickListener(){
@Override
public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button) {
refreshResourceTable();
super.touchUp(event, x, y, pointer, button);
}
});
options.add(new Image() {
@Override
public void draw() {
super.draw();
int size = 8;
Draw.color(colorMixSelectIndex == 1 ? Pal.accent : Pal.gray);
Draw.alpha(parentAlpha);
Lines.stroke(Scl.scl(3f));
Lines.rect(x - size / 2f, y - size / 2f, width + size, height + size);
Draw.reset();
}
}).size(30).color(color2).pad(10).get().clicked(() -> colorMixSelectIndex = 1);
options.field(colorInput2, field -> {
colorInput2 = field;
color2 = Color.valueOf(field.matches("^#?[a-fA-F0-9]{6,8}$") ? field : "ffffff");
}).get().keyDown(KeyCode.enter, this::refreshResourceTable);
options.row();
options.add("---->");
options.add(new Image(){
@Override
public void draw() {
this.setColor(mixedColor);
super.draw();
}
}).size(30).pad(10);
options.label(() -> mixedColor.toString());
options.button(Icon.refresh, this::refreshResourceTable);
}).growX().row();
buildTitle(ppane, "Color Resources").row();
ScrollPane contentPane = new ScrollPane(new Table(this::buildColorResources));
contentPane.scrolled(y -> scrollY2 = contentPane.getScrollY());
contentPane.layout();
contentPane.setScrollY(scrollY2);
ppane.add(contentPane).grow().fill();
} }
}; };
pane.table(ppane -> { pane.table(ppane -> {
@@ -107,6 +176,50 @@ public class ResourcePreviewDialog extends BaseDialog {
return table; return table;
} }
void applyColors(Table table, Class<?> target) {
buildTitle(table, target.getName()).row();
table.table(t -> {
t.top().left();
Field[] palFields = target.getDeclaredFields();
int row = 0;
for(Field palField : palFields) {
if(!palField.getType().equals(Color.class)) continue;
try {
Object obj = palField.get(null);
if(!(obj instanceof Color color)) continue;
t.table(colorCell -> {
colorCell.left();
colorCell.image().size(30).color(color).tooltip("#" + color.toString());
colorCell.add(palField.getName()).padLeft(10);
}).maxWidth(300).growX().pad(20).get().clicked(() -> {
if(colorMixSelectIndex == 0) {
colorInput1 = color.toString();
color1 = color;
} else {
colorInput2 = color.toString();
color2 = color;
}
mixedColor = color1.cpy().lerp(color2, colorMixProg / 100);
refreshResourceTable();
});
if(++row % 8 == 0) t.row();
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}).grow().padLeft(50);
}
Table buildColorResources(Table table) {
table.top().left();
applyColors(table, Pal.class);
table.row();
applyColors(table, Color.class);
return table;
}
Table buildStyleResources(Table table) { Table buildStyleResources(Table table) {
Cons<Class<?>> build = classz -> { Cons<Class<?>> build = classz -> {
Seq<Field> allStyles = Seq.with(Styles.class.getFields()).filter(field -> field.getType().equals(classz)); Seq<Field> allStyles = Seq.with(Styles.class.getFields()).filter(field -> field.getType().equals(classz));

View File

@@ -2,8 +2,9 @@ package informatis.ui.windows;
import arc.*; import arc.*;
import informatis.SUtils; import informatis.SUtils;
import informatis.ui.components.OverScrollPane;
import informatis.ui.components.SBar;
import mindustry.game.*; import mindustry.game.*;
import informatis.ui.*;
import arc.graphics.*; import arc.graphics.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;

View File

@@ -6,10 +6,10 @@ import arc.math.geom.*;
import arc.scene.*; import arc.scene.*;
import arc.scene.style.*; import arc.scene.style.*;
import arc.struct.*; import arc.struct.*;
import informatis.ui.components.OverScrollPane;
import mindustry.editor.*; import mindustry.editor.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import informatis.ui.*;
import arc.*; import arc.*;
import arc.func.*; import arc.func.*;
import arc.graphics.*; import arc.graphics.*;

View File

@@ -1,6 +1,5 @@
package informatis.ui.windows; package informatis.ui.windows;
import informatis.ui.*;
import arc.*; import arc.*;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
@@ -10,6 +9,7 @@ import arc.scene.ui.layout.*;
import arc.scene.utils.*; import arc.scene.utils.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import informatis.ui.components.OverScrollPane;
import mindustry.game.EventType; import mindustry.game.EventType;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;

View File

@@ -2,14 +2,13 @@ package informatis.ui.windows;
import arc.Events; import arc.Events;
import arc.scene.Element; import arc.scene.Element;
import arc.struct.ObjectMap;
import arc.struct.Seq; import arc.struct.Seq;
import informatis.ui.*;
import informatis.draws.*; import informatis.draws.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.util.*; import arc.util.*;
import informatis.ui.components.OverScrollPane;
import mindustry.game.EventType; import mindustry.game.EventType;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;

View File

@@ -4,7 +4,6 @@ import arc.*;
import arc.math.*; import arc.math.*;
import arc.scene.*; import arc.scene.*;
import arc.scene.style.*; import arc.scene.style.*;
import informatis.ui.*;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.scene.ui.*; import arc.scene.ui.*;
@@ -12,6 +11,7 @@ import arc.scene.ui.layout.*;
import arc.struct.Bits; import arc.struct.Bits;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import informatis.ui.components.SBar;
import mindustry.*; import mindustry.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.ctype.*; import mindustry.ctype.*;
@@ -24,7 +24,6 @@ import mindustry.graphics.*;
import mindustry.logic.*; import mindustry.logic.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.world.Block;
import mindustry.world.blocks.*; import mindustry.world.blocks.*;
import mindustry.world.blocks.defense.*; import mindustry.world.blocks.defense.*;
import mindustry.world.blocks.defense.turrets.*; import mindustry.world.blocks.defense.turrets.*;
@@ -43,8 +42,8 @@ import java.util.Objects;
import static arc.Core.bundle; import static arc.Core.bundle;
import static informatis.SVars.*; import static informatis.SVars.*;
import static informatis.SUtils.*; import static informatis.SUtils.*;
import static informatis.ui.SIcons.*; import static informatis.ui.components.SIcons.*;
import static informatis.ui.SIcons.liquid; import static informatis.ui.components.SIcons.liquid;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class UnitWindow extends Window { public class UnitWindow extends Window {

View File

@@ -1,8 +1,8 @@
package informatis.ui.windows; package informatis.ui.windows;
import informatis.ui.components.OverScrollPane;
import mindustry.*; import mindustry.*;
import mindustry.type.*; import mindustry.type.*;
import informatis.ui.*;
import arc.*; import arc.*;
import arc.graphics.*; import arc.graphics.*;
import arc.math.*; import arc.math.*;