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.draws.OverDraws;
import informatis.ui.SidebarSwitcher;
import informatis.ui.TroopingManager;
import informatis.ui.dialogs.DialogManager;
import informatis.ui.dialogs.ResourcePreviewDialog;
import informatis.ui.fragments.FragmentManager;
@@ -37,15 +38,27 @@ public class Informatis extends Mod {
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 -> {
Setting.init();
WindowManager.init();
DialogManager.init();
TroopingManager.init();
new SidebarSwitcher(
WindowManager.body,
DialogManager.body,
TroopingManager.body,
new Table(Tex.buttonEdge4, t -> {
t.label(() -> "it's just label lmao");
})

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,24 +1,20 @@
package informatis.ui.dialogs;
import arc.func.Cons;
import arc.graphics.Color;
import arc.graphics.g2d.Font;
import arc.input.KeyCode;
import arc.scene.Element;
import arc.scene.style.Drawable;
import arc.scene.style.TextureRegionDrawable;
import arc.func.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.input.*;
import arc.scene.event.ClickListener;
import arc.scene.event.InputEvent;
import arc.scene.event.InputListener;
import arc.scene.style.*;
import arc.scene.ui.*;
import arc.scene.ui.layout.*;
import arc.scene.utils.Elem;
import arc.struct.ObjectMap;
import arc.struct.Seq;
import arc.util.Align;
import arc.util.Log;
import arc.util.Scaling;
import mindustry.gen.Icon;
import mindustry.gen.Tex;
import mindustry.graphics.Pal;
import mindustry.ui.Styles;
import arc.struct.*;
import arc.util.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.ui.*;
import mindustry.ui.dialogs.*;
import java.lang.reflect.Field;
@@ -36,7 +32,7 @@ public class ResourcePreviewDialog extends BaseDialog {
cont.table(t -> {
t.top().center();
t.table(Tex.underline, tabTable -> {
String[] tabs = {"Textures", "Styles"};
String[] tabs = {"Textures", "Styles", "Colors"};
for(int i = 0; i < tabs.length; i++) {
int j = i;
TextButton button = new TextButton(tabs[j], Styles.flatToggleMenut);
@@ -61,8 +57,12 @@ public class ResourcePreviewDialog extends BaseDialog {
resource.add(rebuildResourceList()).grow();
}
float scrollY;
float scrollY, scrollY2;
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() {
return new Table(pane -> {
Cons[] builders = {
@@ -91,7 +91,76 @@ public class ResourcePreviewDialog extends BaseDialog {
},
(Cons<Table>) ppane -> {
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 -> {
@@ -107,6 +176,50 @@ public class ResourcePreviewDialog extends BaseDialog {
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) {
Cons<Class<?>> build = 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 informatis.SUtils;
import informatis.ui.components.OverScrollPane;
import informatis.ui.components.SBar;
import mindustry.game.*;
import informatis.ui.*;
import arc.graphics.*;
import arc.math.*;
import arc.math.geom.*;

View File

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

View File

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

View File

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

View File

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

View File

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