mirror of
https://github.com/yawaflua/Informatis.git
synced 2025-12-09 19:49:27 +02:00
trooping done
This commit is contained in:
@@ -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");
|
||||
})
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
|
||||
98
src/informatis/ui/TroopingManager.java
Normal file
98
src/informatis/ui/TroopingManager.java
Normal 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));
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package informatis.ui;
|
||||
package informatis.ui.components;
|
||||
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
@@ -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;
|
||||
@@ -1,4 +1,4 @@
|
||||
package informatis.ui;
|
||||
package informatis.ui.components;
|
||||
|
||||
import informatis.SUtils;
|
||||
import arc.*;
|
||||
@@ -1,4 +1,4 @@
|
||||
package informatis.ui;
|
||||
package informatis.ui.components;
|
||||
|
||||
import arc.Core;
|
||||
import arc.graphics.g2d.TextureRegion;
|
||||
@@ -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));
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
Reference in New Issue
Block a user