Initial implementation of Anuken/Mindustry-Suggestions/issues/327
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
const log = function(context, obj){
|
const log = function(context, obj){
|
||||||
Vars.mods.getScripts().log(context, String(obj))
|
Vars.mods.getScripts().log(context, String(obj))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
//Generated class. Do not modify.
|
//Generated class. Do not modify.
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
const log = function(context, obj){
|
const log = function(context, obj){
|
||||||
Vars.mods.getScripts().log(context, String(obj))
|
Vars.mods.getScripts().log(context, String(obj))
|
||||||
}
|
}
|
||||||
@@ -8,6 +10,10 @@ const onEvent = function(event, handler){
|
|||||||
Vars.mods.getScripts().onEvent(event, handler)
|
Vars.mods.getScripts().onEvent(event, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const readString = path => Vars.mods.getScripts().readString(path)
|
||||||
|
|
||||||
|
const readBytes = path => Vars.mods.getScripts().readBytes(path)
|
||||||
|
|
||||||
var scriptName = "base.js"
|
var scriptName = "base.js"
|
||||||
var modName = "none"
|
var modName = "none"
|
||||||
|
|
||||||
@@ -24,73 +30,12 @@ const extend = function(classType, params){
|
|||||||
const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer}))
|
const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer}))
|
||||||
Call = Packages.mindustry.gen.Call
|
Call = Packages.mindustry.gen.Call
|
||||||
|
|
||||||
importPackage(Packages.mindustry.world.blocks.power)
|
|
||||||
importPackage(Packages.mindustry.game)
|
|
||||||
importPackage(Packages.arc.scene)
|
|
||||||
importPackage(Packages.mindustry.maps.filters)
|
|
||||||
importPackage(Packages.mindustry.gen)
|
|
||||||
importPackage(Packages.arc.struct)
|
|
||||||
importPackage(Packages.mindustry.world.meta)
|
|
||||||
importPackage(Packages.arc.func)
|
|
||||||
importPackage(Packages.arc.math)
|
|
||||||
importPackage(Packages.mindustry.type)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.environment)
|
|
||||||
importPackage(Packages.arc.scene.actions)
|
|
||||||
importPackage(Packages.arc.math.geom)
|
|
||||||
importPackage(Packages.mindustry.world.consumers)
|
|
||||||
importPackage(Packages.mindustry.graphics)
|
|
||||||
importPackage(Packages.arc.graphics)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.units)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.distribution)
|
|
||||||
importPackage(Packages.mindustry.world.blocks)
|
|
||||||
importPackage(Packages.mindustry.ui)
|
|
||||||
importPackage(Packages.mindustry.core)
|
|
||||||
importPackage(Packages.arc.scene.ui)
|
|
||||||
importPackage(Packages.arc.scene.ui.layout)
|
|
||||||
importPackage(Packages.mindustry.entities.comp)
|
|
||||||
importPackage(Packages.mindustry.ui.fragments)
|
|
||||||
importPackage(Packages.mindustry.entities)
|
|
||||||
importPackage(Packages.mindustry.ai.formations)
|
|
||||||
importPackage(Packages.arc.scene.utils)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.campaign)
|
|
||||||
importPackage(Packages.mindustry.content)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.storage)
|
|
||||||
importPackage(Packages.mindustry.world.meta.values)
|
|
||||||
importPackage(Packages.mindustry.world)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.experimental)
|
|
||||||
importPackage(Packages.arc.scene.event)
|
|
||||||
importPackage(Packages.mindustry.graphics.g3d)
|
|
||||||
importPackage(Packages.mindustry.ui.dialogs)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.defense)
|
|
||||||
importPackage(Packages.mindustry.maps)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.legacy)
|
|
||||||
importPackage(Packages.mindustry.ctype)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.defense.turrets)
|
|
||||||
importPackage(Packages.mindustry.world.draw)
|
|
||||||
importPackage(Packages.mindustry.editor)
|
|
||||||
importPackage(Packages.mindustry.entities.bullet)
|
|
||||||
importPackage(Packages.mindustry.logic)
|
|
||||||
importPackage(Packages.arc.scene.style)
|
|
||||||
importPackage(Packages.mindustry.audio)
|
|
||||||
importPackage(Packages.mindustry.entities.units)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.production)
|
|
||||||
importPackage(Packages.mindustry.ai.formations.patterns)
|
|
||||||
importPackage(Packages.mindustry.input)
|
|
||||||
importPackage(Packages.arc.util)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.sandbox)
|
|
||||||
importPackage(Packages.mindustry.ai)
|
|
||||||
importPackage(Packages.mindustry.async)
|
|
||||||
importPackage(Packages.mindustry.world.blocks.liquid)
|
|
||||||
importPackage(Packages.arc)
|
|
||||||
importPackage(Packages.mindustry.ai.types)
|
|
||||||
importPackage(Packages.mindustry.world.modules)
|
|
||||||
importPackage(Packages.arc.graphics.g2d)
|
importPackage(Packages.arc.graphics.g2d)
|
||||||
importPackage(Packages.mindustry.ui.layout)
|
importPackage(Packages.mindustry.gen)
|
||||||
importPackage(Packages.mindustry.maps.generators)
|
importPackage(Packages.arc.math)
|
||||||
importPackage(Packages.mindustry.world.blocks.payloads)
|
importPackage(Packages.arc.graphics)
|
||||||
importPackage(Packages.mindustry.world.producers)
|
importPackage(Packages.arc.util)
|
||||||
importPackage(Packages.mindustry)
|
importPackage(Packages.arc)
|
||||||
importPackage(Packages.mindustry.maps.planet)
|
|
||||||
const PlayerIpUnbanEvent = Packages.mindustry.game.EventType.PlayerIpUnbanEvent
|
const PlayerIpUnbanEvent = Packages.mindustry.game.EventType.PlayerIpUnbanEvent
|
||||||
const PlayerIpBanEvent = Packages.mindustry.game.EventType.PlayerIpBanEvent
|
const PlayerIpBanEvent = Packages.mindustry.game.EventType.PlayerIpBanEvent
|
||||||
const PlayerUnbanEvent = Packages.mindustry.game.EventType.PlayerUnbanEvent
|
const PlayerUnbanEvent = Packages.mindustry.game.EventType.PlayerUnbanEvent
|
||||||
@@ -120,12 +65,14 @@ const ZoneRequireCompleteEvent = Packages.mindustry.game.EventType.ZoneRequireCo
|
|||||||
const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent
|
const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent
|
||||||
const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent
|
const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent
|
||||||
const LaunchItemEvent = Packages.mindustry.game.EventType.LaunchItemEvent
|
const LaunchItemEvent = Packages.mindustry.game.EventType.LaunchItemEvent
|
||||||
|
const SectorLoseEvent = Packages.mindustry.game.EventType.SectorLoseEvent
|
||||||
const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent
|
const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent
|
||||||
const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent
|
const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent
|
||||||
const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent
|
const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent
|
||||||
const CoreItemDeliverEvent = Packages.mindustry.game.EventType.CoreItemDeliverEvent
|
const CoreItemDeliverEvent = Packages.mindustry.game.EventType.CoreItemDeliverEvent
|
||||||
const TurretAmmoDeliverEvent = Packages.mindustry.game.EventType.TurretAmmoDeliverEvent
|
const TurretAmmoDeliverEvent = Packages.mindustry.game.EventType.TurretAmmoDeliverEvent
|
||||||
const LineConfirmEvent = Packages.mindustry.game.EventType.LineConfirmEvent
|
const LineConfirmEvent = Packages.mindustry.game.EventType.LineConfirmEvent
|
||||||
|
const TurnEvent = Packages.mindustry.game.EventType.TurnEvent
|
||||||
const WaveEvent = Packages.mindustry.game.EventType.WaveEvent
|
const WaveEvent = Packages.mindustry.game.EventType.WaveEvent
|
||||||
const ResetEvent = Packages.mindustry.game.EventType.ResetEvent
|
const ResetEvent = Packages.mindustry.game.EventType.ResetEvent
|
||||||
const PlayEvent = Packages.mindustry.game.EventType.PlayEvent
|
const PlayEvent = Packages.mindustry.game.EventType.PlayEvent
|
||||||
|
|||||||
@@ -1280,7 +1280,7 @@ public class Blocks implements ContentList{
|
|||||||
//region storage
|
//region storage
|
||||||
|
|
||||||
coreShard = new CoreBlock("core-shard"){{
|
coreShard = new CoreBlock("core-shard"){{
|
||||||
requirements(Category.effect, BuildVisibility.hidden, with(Items.copper, 1000, Items.lead, 1000));
|
requirements(Category.effect, BuildVisibility.hidden, with(Items.copper, 2000, Items.lead, 1000));
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
|
|
||||||
unitType = UnitTypes.alpha;
|
unitType = UnitTypes.alpha;
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ public class Fx{
|
|||||||
Fill.square(x, y, 1f * size, 45f);
|
Fill.square(x, y, 1f * size, 45f);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
itemTransfer = new Effect(30f, e -> {
|
itemTransfer = new Effect(10f, e -> {
|
||||||
if(!(e.data instanceof Position)) return;
|
if(!(e.data instanceof Position)) return;
|
||||||
Position to = e.data();
|
Position to = e.data();
|
||||||
Tmp.v1.set(e.x, e.y).interpolate(Tmp.v2.set(to), e.fin(), Interp.pow3)
|
Tmp.v1.set(e.x, e.y).interpolate(Tmp.v2.set(to), e.fin(), Interp.pow3)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public class SectorPresets implements ContentList{
|
|||||||
conditionWave = 5;
|
conditionWave = 5;
|
||||||
launchPeriod = 5;
|
launchPeriod = 5;
|
||||||
rules = r -> {
|
rules = r -> {
|
||||||
r.winWave = 30;
|
r.winWave = 20;
|
||||||
};
|
};
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|||||||
@@ -15,11 +15,16 @@ public class FileTree implements FileHandleResolver{
|
|||||||
|
|
||||||
/** Gets an asset file.*/
|
/** Gets an asset file.*/
|
||||||
public Fi get(String path){
|
public Fi get(String path){
|
||||||
|
return get(path, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gets an asset file.*/
|
||||||
|
public Fi get(String path, boolean safe){
|
||||||
if(files.containsKey(path)){
|
if(files.containsKey(path)){
|
||||||
return files.get(path);
|
return files.get(path);
|
||||||
}else if(files.containsKey("/" + path)){
|
}else if(files.containsKey("/" + path)){
|
||||||
return files.get("/" + path);
|
return files.get("/" + path);
|
||||||
}else if(Core.files == null){ //headless
|
}else if(Core.files == null && !safe){ //headless
|
||||||
return Fi.get(path);
|
return Fi.get(path);
|
||||||
}else{
|
}else{
|
||||||
return Core.files.internal(path);
|
return Core.files.internal(path);
|
||||||
|
|||||||
138
core/src/mindustry/editor/WaveGraph.java
Normal file
138
core/src/mindustry/editor/WaveGraph.java
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
package mindustry.editor;
|
||||||
|
|
||||||
|
import arc.graphics.*;
|
||||||
|
import arc.graphics.g2d.*;
|
||||||
|
import arc.math.*;
|
||||||
|
import arc.scene.ui.layout.*;
|
||||||
|
import arc.struct.*;
|
||||||
|
import arc.util.*;
|
||||||
|
import arc.util.pooling.*;
|
||||||
|
import mindustry.*;
|
||||||
|
import mindustry.game.*;
|
||||||
|
import mindustry.gen.*;
|
||||||
|
import mindustry.type.*;
|
||||||
|
import mindustry.ui.*;
|
||||||
|
|
||||||
|
public class WaveGraph extends Table{
|
||||||
|
public Seq<SpawnGroup> groups = new Seq<>();
|
||||||
|
public int from, to = 20;
|
||||||
|
|
||||||
|
private int[][] values;
|
||||||
|
private OrderedSet<UnitType> used = new OrderedSet<>();
|
||||||
|
private int max;
|
||||||
|
private Table colors;
|
||||||
|
private ObjectSet<UnitType> hidden = new ObjectSet<>();
|
||||||
|
|
||||||
|
public WaveGraph(){
|
||||||
|
background(Tex.pane);
|
||||||
|
|
||||||
|
rect((x, y, width, height) -> {
|
||||||
|
Lines.stroke(Scl.scl(3f));
|
||||||
|
Lines.precise(true);
|
||||||
|
|
||||||
|
float offsetX = Scl.scl(30f), offsetY = Scl.scl(20f);
|
||||||
|
|
||||||
|
float graphX = x + offsetX, graphY = y + offsetY, graphW = width - offsetX, graphH = height - offsetY;
|
||||||
|
float spacing = graphW / (values.length - 1);
|
||||||
|
|
||||||
|
for(UnitType type : used){
|
||||||
|
Draw.color(color(type));
|
||||||
|
Draw.alpha(parentAlpha);
|
||||||
|
Lines.beginLine();
|
||||||
|
for(int i = 0; i < values.length; i++){
|
||||||
|
int val = values[i][type.id];
|
||||||
|
|
||||||
|
float cx = graphX + i*spacing, cy = 2f + graphY + val * (graphH - 4f) / max;
|
||||||
|
Lines.linePoint(cx, cy);
|
||||||
|
}
|
||||||
|
Lines.endLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
GlyphLayout lay = Pools.obtain(GlyphLayout.class, GlyphLayout::new);
|
||||||
|
BitmapFont font = Fonts.outline;
|
||||||
|
|
||||||
|
lay.setText(font, "1");
|
||||||
|
|
||||||
|
//how many numbers can fit here
|
||||||
|
float totalMarks = (height - offsetY - getMarginBottom() *2f - 1f) / (lay.height * 2);
|
||||||
|
|
||||||
|
int markSpace = Math.max(1, Mathf.ceil(max / totalMarks));
|
||||||
|
|
||||||
|
Draw.color(Color.lightGray);
|
||||||
|
for(int i = 0; i < max; i += markSpace){
|
||||||
|
float cy = 2f + y + i * (height - 4f) / max + offsetY, cx = x + offsetX;
|
||||||
|
//Lines.line(cx, cy, cx + len, cy);
|
||||||
|
|
||||||
|
lay.setText(font, "" + i);
|
||||||
|
|
||||||
|
font.draw("" + i, cx, cy + lay.height/2f - Scl.scl(3f), Align.right);
|
||||||
|
}
|
||||||
|
|
||||||
|
float len = 4f;
|
||||||
|
|
||||||
|
for(int i = 0; i < values.length; i++){
|
||||||
|
float cy = y, cx = x + graphW / (values.length - 1) * i + offsetX;
|
||||||
|
|
||||||
|
Lines.line(cx, cy, cx, cy + len);
|
||||||
|
}
|
||||||
|
|
||||||
|
Pools.free(lay);
|
||||||
|
|
||||||
|
Lines.precise(false);
|
||||||
|
Draw.reset();
|
||||||
|
}).pad(4).padBottom(10).grow();
|
||||||
|
|
||||||
|
row();
|
||||||
|
|
||||||
|
table(t -> colors = t).growX();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rebuild(){
|
||||||
|
values = new int[to - from + 1][Vars.content.units().size];
|
||||||
|
used.clear();
|
||||||
|
max = 1;
|
||||||
|
|
||||||
|
for(int i = from; i <= to; i++){
|
||||||
|
int index = i - from;
|
||||||
|
|
||||||
|
for(SpawnGroup spawn : groups){
|
||||||
|
int spawned = spawn.getUnitsSpawned(i);
|
||||||
|
values[index][spawn.type.id] += spawned;
|
||||||
|
if(spawned > 0){
|
||||||
|
used.add(spawn.type);
|
||||||
|
}
|
||||||
|
max = Math.max(max, values[index][spawn.type.id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectSet<UnitType> usedCopy = new ObjectSet<>(used);
|
||||||
|
|
||||||
|
colors.clear();
|
||||||
|
colors.left();
|
||||||
|
for(UnitType type : used){
|
||||||
|
colors.button(b -> {
|
||||||
|
Color tcolor = color(type).cpy();
|
||||||
|
b.image().size(32f).update(i -> i.setColor(b.isChecked() ? Tmp.c1.set(tcolor).mul(0.5f) : tcolor)).get().act(1);
|
||||||
|
b.image(type.icon(Cicon.medium)).padRight(20).update(i -> i.setColor(b.isChecked() ? Color.gray : Color.white)).get().act(1);
|
||||||
|
b.margin(0f);
|
||||||
|
}, Styles.fullTogglet, () -> {
|
||||||
|
if(!hidden.add(type)){
|
||||||
|
hidden.remove(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
used.clear();
|
||||||
|
used.addAll(usedCopy);
|
||||||
|
for(UnitType o : hidden) used.remove(o);
|
||||||
|
}).update(b -> b.setChecked(hidden.contains(type)));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(UnitType type : hidden){
|
||||||
|
used.remove(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Color color(UnitType type){
|
||||||
|
return Tmp.c1.fromHsv(type.id / (float)Vars.content.units().size * 360f, 0.7f, 1f);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,37 +1,35 @@
|
|||||||
package mindustry.editor;
|
package mindustry.editor;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.struct.*;
|
|
||||||
import arc.graphics.*;
|
|
||||||
import arc.input.*;
|
import arc.input.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.scene.event.*;
|
import arc.scene.event.*;
|
||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
import arc.scene.ui.TextField.*;
|
import arc.scene.ui.TextField.*;
|
||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.*;
|
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.ctype.ContentType;
|
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.io.*;
|
import mindustry.io.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.ui.Cicon;
|
import mindustry.ui.*;
|
||||||
import mindustry.ui.dialogs.*;
|
import mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
import static mindustry.game.SpawnGroup.never;
|
import static mindustry.game.SpawnGroup.*;
|
||||||
|
|
||||||
public class WaveInfoDialog extends BaseDialog{
|
public class WaveInfoDialog extends BaseDialog{
|
||||||
private static final int displayed = 20;
|
private static final int displayed = 20;
|
||||||
private Seq<SpawnGroup> groups = new Seq<>();
|
private Seq<SpawnGroup> groups = new Seq<>();
|
||||||
|
|
||||||
private Table table, preview;
|
private Table table;
|
||||||
private int start = 0;
|
private int start = 0;
|
||||||
private UnitType lastType = UnitTypes.dagger;
|
private UnitType lastType = UnitTypes.dagger;
|
||||||
private float updateTimer, updatePeriod = 1f;
|
private float updateTimer, updatePeriod = 1f;
|
||||||
|
private WaveGraph graph = new WaveGraph();
|
||||||
|
|
||||||
public WaveInfoDialog(MapEditor editor){
|
public WaveInfoDialog(MapEditor editor){
|
||||||
super("$waves.title");
|
super("$waves.title");
|
||||||
@@ -47,7 +45,31 @@ public class WaveInfoDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onResize(this::setup);
|
||||||
addCloseButton();
|
addCloseButton();
|
||||||
|
buttons.button("<<", () -> {
|
||||||
|
}).update(t -> {
|
||||||
|
if(t.getClickListener().isPressed()){
|
||||||
|
updateTimer += Time.delta;
|
||||||
|
if(updateTimer >= updatePeriod){
|
||||||
|
start = Math.max(start - 1, 0);
|
||||||
|
updateTimer = 0f;
|
||||||
|
updateWaves();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
buttons.button(">>", () -> {
|
||||||
|
}).update(t -> {
|
||||||
|
if(t.getClickListener().isPressed()){
|
||||||
|
updateTimer += Time.delta;
|
||||||
|
if(updateTimer >= updatePeriod){
|
||||||
|
start++;
|
||||||
|
updateTimer = 0f;
|
||||||
|
updateWaves();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
buttons.button("$waves.edit", () -> {
|
buttons.button("$waves.edit", () -> {
|
||||||
BaseDialog dialog = new BaseDialog("$waves.edit");
|
BaseDialog dialog = new BaseDialog("$waves.edit");
|
||||||
dialog.addCloseButton();
|
dialog.addCloseButton();
|
||||||
@@ -98,35 +120,7 @@ public class WaveInfoDialog extends BaseDialog{
|
|||||||
setAlignment(Align.center, Align.center);
|
setAlignment(Align.center, Align.center);
|
||||||
}}).width(390f).growY();
|
}}).width(390f).growY();
|
||||||
|
|
||||||
cont.table(Tex.clear, m -> {
|
cont.add(graph).grow();
|
||||||
m.add("$waves.preview").color(Color.lightGray).wrap().growX().center().get().setAlignment(Align.center, Align.center);
|
|
||||||
m.row();
|
|
||||||
m.button("-", () -> {
|
|
||||||
}).update(t -> {
|
|
||||||
if(t.getClickListener().isPressed()){
|
|
||||||
updateTimer += Time.delta;
|
|
||||||
if(updateTimer >= updatePeriod){
|
|
||||||
start = Math.max(start - 1, 0);
|
|
||||||
updateTimer = 0f;
|
|
||||||
updateWaves();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).growX().height(70f);
|
|
||||||
m.row();
|
|
||||||
m.pane(t -> preview = t).grow().get().setScrollingDisabled(true, true);
|
|
||||||
m.row();
|
|
||||||
m.button("+", () -> {
|
|
||||||
}).update(t -> {
|
|
||||||
if(t.getClickListener().isPressed()){
|
|
||||||
updateTimer += Time.delta;
|
|
||||||
if(updateTimer >= updatePeriod){
|
|
||||||
start++;
|
|
||||||
updateTimer = 0f;
|
|
||||||
updateWaves();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).growX().height(70f);
|
|
||||||
}).growY().width(180f).growY();
|
|
||||||
|
|
||||||
buildGroups();
|
buildGroups();
|
||||||
}
|
}
|
||||||
@@ -137,6 +131,7 @@ public class WaveInfoDialog extends BaseDialog{
|
|||||||
table.margin(10f);
|
table.margin(10f);
|
||||||
|
|
||||||
if(groups != null){
|
if(groups != null){
|
||||||
|
|
||||||
for(SpawnGroup group : groups){
|
for(SpawnGroup group : groups){
|
||||||
table.table(Tex.button, t -> {
|
table.table(Tex.button, t -> {
|
||||||
t.margin(0).defaults().pad(3).padLeft(5f).growX().left();
|
t.margin(0).defaults().pad(3).padLeft(5f).growX().left();
|
||||||
@@ -225,6 +220,7 @@ public class WaveInfoDialog extends BaseDialog{
|
|||||||
updateWaves();
|
updateWaves();
|
||||||
}).growX().pad(-6f).padTop(5);
|
}).growX().pad(-6f).padTop(5);
|
||||||
}).width(340f).pad(16);
|
}).width(340f).pad(16);
|
||||||
|
|
||||||
table.row();
|
table.row();
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
@@ -243,7 +239,7 @@ public class WaveInfoDialog extends BaseDialog{
|
|||||||
if(type.isHidden()) continue;
|
if(type.isHidden()) continue;
|
||||||
p.button(t -> {
|
p.button(t -> {
|
||||||
t.left();
|
t.left();
|
||||||
t.image(type.icon(mindustry.ui.Cicon.medium)).size(40f).padRight(2f);
|
t.image(type.icon(Cicon.medium)).size(40f).padRight(2f);
|
||||||
t.add(type.localizedName);
|
t.add(type.localizedName);
|
||||||
}, () -> {
|
}, () -> {
|
||||||
lastType = type;
|
lastType = type;
|
||||||
@@ -258,36 +254,9 @@ public class WaveInfoDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updateWaves(){
|
void updateWaves(){
|
||||||
preview.clear();
|
graph.groups = groups;
|
||||||
preview.top();
|
graph.from = start;
|
||||||
|
graph.to = start + displayed;
|
||||||
for(int i = start; i < displayed + start; i++){
|
graph.rebuild();
|
||||||
int wave = i;
|
|
||||||
preview.table(Tex.underline, table -> {
|
|
||||||
table.add((wave + 1) + "").color(Pal.accent).center().colspan(2).get().setAlignment(Align.center, Align.center);
|
|
||||||
table.row();
|
|
||||||
|
|
||||||
int[] spawned = new int[Vars.content.getBy(ContentType.unit).size];
|
|
||||||
|
|
||||||
for(SpawnGroup spawn : groups){
|
|
||||||
spawned[spawn.type.id] += spawn.getUnitsSpawned(wave);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int j = 0; j < spawned.length; j++){
|
|
||||||
if(spawned[j] > 0){
|
|
||||||
UnitType type = content.getByID(ContentType.unit, j);
|
|
||||||
table.image(type.icon(Cicon.medium)).size(8f * 4f).padRight(4);
|
|
||||||
table.add(spawned[j] + "x").color(Color.lightGray).padRight(6);
|
|
||||||
table.row();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(table.getChildren().size == 1){
|
|
||||||
table.add("$none").color(Pal.remove);
|
|
||||||
}
|
|
||||||
}).width(110f).pad(2f);
|
|
||||||
|
|
||||||
preview.row();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -195,13 +195,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
Core.app.post(() -> Events.fire(new DepositEvent(tile, player, item, accepted)));
|
Core.app.post(() -> Events.fire(new DepositEvent(tile, player, item, accepted)));
|
||||||
|
|
||||||
tile.getStackOffset(item, stackTrns);
|
tile.getStackOffset(item, stackTrns);
|
||||||
|
tile.handleStack(item, accepted, player.unit());
|
||||||
|
|
||||||
createItemTransfer(
|
createItemTransfer(
|
||||||
item,
|
item,
|
||||||
amount,
|
amount,
|
||||||
player.x + Angles.trnsx(player.unit().rotation + 180f, backTrns), player.y + Angles.trnsy(player.unit().rotation + 180f, backTrns),
|
player.x + Angles.trnsx(player.unit().rotation + 180f, backTrns), player.y + Angles.trnsy(player.unit().rotation + 180f, backTrns),
|
||||||
new Vec2(tile.x + stackTrns.x, tile.y + stackTrns.y),
|
new Vec2(tile.x + stackTrns.x, tile.y + stackTrns.y),
|
||||||
() -> tile.handleStack(item, accepted, player.unit())
|
() -> {}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -81,11 +81,11 @@ public class Scripts implements Disposable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String readString(String path){
|
public String readString(String path){
|
||||||
return Vars.tree.get(path).readString();
|
return Vars.tree.get(path, true).readString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] readBytes(String path){
|
public byte[] readBytes(String path){
|
||||||
return Vars.tree.get(path).readBytes();
|
return Vars.tree.get(path, true).readBytes();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run(LoadedMod mod, Fi file){
|
public void run(LoadedMod mod, Fi file){
|
||||||
@@ -126,7 +126,7 @@ public class Scripts implements Disposable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ModuleSource loadSource(String moduleId, Scriptable paths, Object validator) throws IOException, URISyntaxException{
|
public ModuleSource loadSource(String moduleId, Scriptable paths, Object validator) throws URISyntaxException{
|
||||||
if(currentMod == null) return null;
|
if(currentMod == null) return null;
|
||||||
return loadSource(moduleId, currentMod.root.child("scripts"), validator);
|
return loadSource(moduleId, currentMod.root.child("scripts"), validator);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import static mindustry.gen.Tex.*;
|
|||||||
public class Styles{
|
public class Styles{
|
||||||
public static Drawable black, black9, black8, black6, black3, black5, none, flatDown, flatOver;
|
public static Drawable black, black9, black8, black6, black3, black5, none, flatDown, flatOver;
|
||||||
public static ButtonStyle defaultb, waveb;
|
public static ButtonStyle defaultb, waveb;
|
||||||
public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet, transt;
|
public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet, transt, fullTogglet;
|
||||||
public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali;
|
public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali;
|
||||||
public static ScrollPaneStyle defaultPane, horizontalPane, smallPane;
|
public static ScrollPaneStyle defaultPane, horizontalPane, smallPane;
|
||||||
public static KeybindDialogStyle defaultKeybindDialog;
|
public static KeybindDialogStyle defaultKeybindDialog;
|
||||||
@@ -149,7 +149,16 @@ public class Styles{
|
|||||||
disabled = buttonDisabled;
|
disabled = buttonDisabled;
|
||||||
disabledFontColor = Color.gray;
|
disabledFontColor = Color.gray;
|
||||||
}};
|
}};
|
||||||
|
fullTogglet = new TextButtonStyle(){{
|
||||||
|
font = Fonts.def;
|
||||||
|
fontColor = Color.white;
|
||||||
|
checked = flatOver;
|
||||||
|
down = flatOver;
|
||||||
|
up = black;
|
||||||
|
over = flatOver;
|
||||||
|
disabled = black;
|
||||||
|
disabledFontColor = Color.gray;
|
||||||
|
}};
|
||||||
defaulti = new ImageButtonStyle(){{
|
defaulti = new ImageButtonStyle(){{
|
||||||
down = buttonDown;
|
down = buttonDown;
|
||||||
up = button;
|
up = button;
|
||||||
|
|||||||
Reference in New Issue
Block a user