package mindustry.editor; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.scene.ui.*; 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.graphics.*; import mindustry.type.*; import mindustry.ui.*; public class WaveGraph extends Table{ public Seq groups = new Seq<>(); public int from, to = 20; private Mode mode = Mode.counts; private int[][] values; private OrderedSet used = new OrderedSet<>(); private int max, maxTotal; private float maxHealth; private Table colors; private ObjectSet hidden = new ObjectSet<>(); public WaveGraph(){ background(Tex.pane); rect((x, y, width, height) -> { Lines.stroke(Scl.scl(3f)); Lines.precise(true); GlyphLayout lay = Pools.obtain(GlyphLayout.class, GlyphLayout::new); BitmapFont font = Fonts.outline; lay.setText(font, "1"); float fh = lay.height; float offsetX = Scl.scl(30f), offsetY = Scl.scl(22f) + fh + Scl.scl(5f); float graphX = x + offsetX, graphY = y + offsetY, graphW = width - offsetX, graphH = height - offsetY; float spacing = graphW / (values.length - 1); if(mode == Mode.counts){ for(UnitType type : used.orderedItems()){ 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(); } }else if(mode == Mode.totals){ Lines.beginLine(); Draw.color(Pal.accent); for(int i = 0; i < values.length; i++){ int sum = 0; for(UnitType type : used.orderedItems()){ sum += values[i][type.id]; } float cx = graphX + i*spacing, cy = 2f + graphY + sum * (graphH - 4f) / maxTotal; Lines.linePoint(cx, cy); } Lines.endLine(); }else if(mode == Mode.health){ Lines.beginLine(); Draw.color(Pal.health); for(int i = 0; i < values.length; i++){ float sum = 0; for(UnitType type : used.orderedItems()){ sum += type.health * values[i][type.id]; } float cx = graphX + i*spacing, cy = 2f + graphY + sum * (graphH - 4f) / maxHealth; Lines.linePoint(cx, cy); } Lines.endLine(); } //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 = Scl.scl(4f); font.setColor(Color.lightGray); for(int i = 0; i < values.length; i++){ float cy = y + fh, cx = x + graphW / (values.length - 1) * i + offsetX; Lines.line(cx, cy, cx, cy + len); if(i == values.length/2){ font.draw("" + (i + from), cx, cy - 2f, Align.center); } } font.setColor(Color.white); Pools.free(lay); Lines.precise(false); Draw.reset(); }).pad(4).padBottom(10).grow(); row(); table(t -> colors = t).growX(); row(); table(t -> { t.left(); ButtonGroup