WIP low-tier leg unit

This commit is contained in:
Anuken
2022-02-25 22:23:50 -05:00
parent 7245364a55
commit 7650226f25
20 changed files with 91 additions and 202 deletions

View File

@@ -1234,18 +1234,6 @@ public class Fx{
Lines.circle(e.x, e.y, e.fin() * 50f);
}),
nuclearShockwave = new Effect(10f, 200f, e -> {
color(Color.white, Color.lightGray, e.fin());
stroke(e.fout() * 3f + 0.2f);
Lines.circle(e.x, e.y, e.fin() * 140f);
}),
impactShockwave = new Effect(13f, 300f, e -> {
color(Pal.lighterOrange, Color.lightGray, e.fin());
stroke(e.fout() * 4f + 0.2f);
Lines.circle(e.x, e.y, e.fin() * 200f);
}),
spawnShockwave = new Effect(20f, 400f, e -> {
color(Color.white, Color.lightGray, e.fin());
stroke(e.fout() * 3f + 0.5f);
@@ -1393,27 +1381,6 @@ public class Fx{
});
}),
blockExplosion = new Effect(30, e -> {
e.scaled(7, i -> {
stroke(3.1f * i.fout());
Lines.circle(e.x, e.y, 3f + i.fin() * 14f);
});
color(Color.gray);
randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> {
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout());
});
color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin());
stroke(1.7f * e.fout());
randLenVectors(e.id + 1, 9, 1f + 23f * e.finpow(), (x, y) -> {
lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f);
});
}),
blockExplosionSmoke = new Effect(30, e -> {
color(Color.gray);
@@ -1872,47 +1839,6 @@ public class Fx{
});
}),
nuclearsmoke = new Effect(40, e -> {
randLenVectors(e.id, 4, e.fin() * 13f, (x, y) -> {
float size = e.fslope() * 4f;
color(Color.lightGray, Color.gray, e.fin());
Fill.circle(e.x + x, e.y + y, size/2f);
});
}),
cloudsmoke = new Effect(70, e -> {
randLenVectors(e.id, 12, 15f + e.fin() * 45f, (x, y) -> {
float size = e.fslope() * 2f;
color(Color.gray);
alpha(e.fslope());
Fill.circle(e.x + x, e.y + y, size);
});
}),
nuclearcloud = new Effect(90, 200f, e -> {
randLenVectors(e.id, 10, e.finpow() * 90f, (x, y) -> {
float size = e.fout() * 14f;
color(Color.lime, Color.gray, e.fin());
Fill.circle(e.x + x, e.y + y, size/2f);
});
}),
impactsmoke = new Effect(60, e -> {
randLenVectors(e.id, 7, e.fin() * 20f, (x, y) -> {
float size = e.fslope() * 4f;
color(Color.lightGray, Color.gray, e.fin());
Fill.circle(e.x + x, e.y + y, size/2f);
});
}),
impactcloud = new Effect(140, 400f, e -> {
randLenVectors(e.id, 20, e.finpow() * 160f, (x, y) -> {
float size = e.fout() * 15f;
color(Pal.lighterOrange, Color.lightGray, e.fin());
Fill.circle(e.x + x, e.y + y, size/2f);
});
}),
redgeneratespark = new Effect(90, e -> {
color(Pal.redSpark);
alpha(e.fslope());
@@ -1935,17 +1861,6 @@ public class Fx{
}
}).layer(Layer.bullet - 1f),
crucibleSmoke = new Effect(100, e -> {
color(Pal.redLight);
alpha(e.fslope() * 0.8f);
rand.setSeed(e.id);
for(int i = 0; i < 5; i++){
v.trns(rand.random(360f), rand.random(e.finpow() * 14f)).add(e.x, e.y);
Fill.circle(v.x, v.y, rand.random(1.4f, 2.8f));
}
}).layer(Layer.bullet - 1f),
generatespark = new Effect(18, e -> {
randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> {
color(Pal.orangeSpark, Color.gray, e.fin());
@@ -2003,13 +1918,6 @@ public class Fx{
});
}),
pulverizeRedder = new Effect(40, e -> {
randLenVectors(e.id, 5, 3f + e.fin() * 9f, (x, y) -> {
color(Pal.redderDust, Pal.stoneGray, e.fin());
Fill.square(e.x + x, e.y + y, e.fout() * 2.5f + 0.5f, 45);
});
}),
pulverizeSmall = new Effect(30, e -> {
randLenVectors(e.id, 3, e.fin() * 5f, (x, y) -> {
color(Pal.stoneGray);
@@ -2096,24 +2004,6 @@ public class Fx{
Lines.square(e.x, e.y, tilesize + e.fout() * 2f);
}),
purify = new Effect(10, e -> {
color(Color.royal, Color.gray, e.fin());
stroke(2f);
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
}),
purifyoil = new Effect(10, e -> {
color(Color.black, Color.gray, e.fin());
stroke(2f);
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
}),
purifystone = new Effect(10, e -> {
color(Color.orange, Color.gray, e.fin());
stroke(2f);
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
}),
generate = new Effect(11, e -> {
color(Color.orange, Color.yellow, e.fin());
stroke(1f);
@@ -2184,13 +2074,6 @@ public class Fx{
});
}),
smelt = new Effect(20, e -> {
color(Color.white, e.color, e.fin());
randLenVectors(e.id, 6, 2f + e.fin() * 5f, (x, y) -> {
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
});
}),
teleportActivate = new Effect(50, e -> {
color(e.color);

View File

@@ -36,7 +36,8 @@ public class UnitTypes{
public static @EntityDef(value = {Unitc.class, Mechc.class}, legacy = true) UnitType nova, pulsar, quasar;
//legs
public static @EntityDef({Unitc.class, Legsc.class}) UnitType corvus, atrax, bulwark, krepost;
public static @EntityDef({Unitc.class, Legsc.class}) UnitType corvus, atrax,
latum, bulwark, krepost;
//legs, legacy
public static @EntityDef(value = {Unitc.class, Legsc.class}, legacy = true) UnitType spiroct, arkyid, toxopid;
@@ -641,7 +642,7 @@ public class UnitTypes{
visualElevation = 0.2f;
groundLayer = Layer.legUnit - 1f;
weapons.add(new Weapon("eruption"){{
weapons.add(new Weapon("atrax-weapon"){{
top = false;
shootY = 3f;
reload = 9f;
@@ -2499,6 +2500,7 @@ public class UnitTypes{
spread = 3.5f;
}};
//TODO make this look nice
bullet = new RailBulletType(){{
length = 140f;
damage = 40f;
@@ -2771,6 +2773,52 @@ public class UnitTypes{
//endregion
//region erekir - mech
latum = new ErekirUnitType("latum"){{
speed = 0.7f;
drag = 0.1f;
hitSize = 14f;
rotateSpeed = 3f;
health = 700;
legCount = 4;
legLength = 14f;
lockLegBase = true;
legContinuousMove = true;
legExtension = -3f;
legBaseOffset = 5f;
maxStretch = 1.1f;
maxCompress = 0.2f;
legLengthScl = 0.95f;
legTrns = 0.7f;
legMoveSpace = 1f;
hovering = true;
armor = 5f;
visualElevation = 0.2f;
groundLayer = Layer.legUnit - 1f;
if(false)
weapons.add(new Weapon("eruption"){{
top = false;
shootY = 3f;
reload = 9f;
ejectEffect = Fx.none;
recoil = 1f;
x = 7f;
shootSound = Sounds.flame;
bullet = new LiquidBulletType(Liquids.slag){{
damage = 13;
speed = 2.5f;
drag = 0.009f;
shootEffect = Fx.shootSmall;
lifetime = 57f;
collidesAir = false;
}};
}});
}};
bulwark = new ErekirUnitType("bulwark"){{
drag = 0.1f;
speed = 0.6f;

View File

@@ -147,8 +147,8 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{
Leg l = legs[i];
//TODO is limiting twice necessary?
l.joint.sub(baseOffset).limit(type.maxStretch * legLength/2f).add(baseOffset);
l.base.sub(baseOffset).limit(type.maxStretch * legLength).add(baseOffset);
l.joint.sub(baseOffset).clampLength(type.maxCompress * legLength/2f, type.maxStretch * legLength/2f).add(baseOffset);
l.base.sub(baseOffset).clampLength(type.maxCompress * legLength, type.maxStretch * legLength).add(baseOffset);
float stageF = (totalLength + i*type.legPairOffset) / moveSpace;
int stage = (int)stageF;
@@ -212,8 +212,8 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{
l.joint.lerpDelta(jointDest, moveSpeed / 4f);
//limit again after updating
l.joint.sub(baseOffset).limit(type.maxStretch * legLength/2f).add(baseOffset);
l.base.sub(baseOffset).limit(type.maxStretch * legLength).add(baseOffset);
l.joint.sub(baseOffset).clampLength(type.maxCompress * legLength/2f, type.maxStretch * legLength/2f).add(baseOffset);
l.base.sub(baseOffset).clampLength(type.maxCompress * legLength, type.maxStretch * legLength).add(baseOffset);
}
//when at least 1 leg is touching land, it can't drown

View File

@@ -121,7 +121,7 @@ public class UnitType extends UnlockableContent{
public boolean outlines = true;
public int legCount = 4, legGroupSize = 2;
public float legLength = 10f, legSpeed = 0.1f, legTrns = 1f, legBaseOffset = 0f, legMoveSpace = 1f, legExtension = 0, legPairOffset = 0, legLengthScl = 1f, kinematicScl = 1f, maxStretch = 1.75f;
public float legLength = 10f, legSpeed = 0.1f, legTrns = 1f, legBaseOffset = 0f, legMoveSpace = 1f, legExtension = 0, legPairOffset = 0, legLengthScl = 1f, kinematicScl = 1f, maxStretch = 1.75f, maxCompress = 0f;
public float legSplashDamage = 0f, legSplashRange = 5;
public float legStraightLength = 1f;
/** If true, legs are locked to the base of the unit instead of being on an implicit rotating "mount". */

View File

@@ -18,7 +18,6 @@ import arc.scene.ui.TreeElement.*;
import mindustry.annotations.Annotations.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.ui.dialogs.*;
import static mindustry.gen.Tex.*;
@@ -26,11 +25,12 @@ import static mindustry.gen.Tex.*;
public class Styles{
//TODO all these names are inconsistent and not descriptive
public static Drawable black, black9, black8, black6, black3, black5, none, flatDown, flatOver, accentDrawable;
public static ButtonStyle defaultb, waveb, modsb, underlineb;
public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, nonet, infot, clearPartialt, clearTogglet, logicTogglet, clearToggleMenut, togglet, transt, fullTogglet, squareTogglet, logict;
public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, logici, geni, colori, accenti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali;
public static ButtonStyle defaultb, underlineb;
public static TextButtonStyle defaultt, nodet, cleart, nonet, clearPartialt, clearTogglet, logicTogglet, clearToggleMenut, togglet, transt, fullTogglet, squareTogglet, logict;
public static ImageButtonStyle defaulti, nodei, emptyi, emptytogglei, selecti, logici, geni, colori, accenti, cleari, clearFulli, clearPartiali, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali;
public static ScrollPaneStyle defaultPane, horizontalPane, smallPane, nonePane;
public static KeybindDialog.KeybindDialogStyle defaultKeybindDialog;
public static SliderStyle defaultSlider;
public static LabelStyle defaultLabel, outlineLabel, techLabel;
public static TextFieldStyle defaultField, nodeField, areaField, nodeArea;
@@ -59,24 +59,12 @@ public class Styles{
disabled = buttonDisabled;
}};
modsb = new ButtonStyle(){{
down = flatOver;
up = underline;
over = underline2;
}};
underlineb = new ButtonStyle(){{
down = flatOver;
up = sideline;
over = sidelineOver;
checked = flatOver;
}};
waveb = new ButtonStyle(){{
up = wavepane;
over = wavepane; //TODO wrong
disabled = wavepane;
}};
defaultt = new TextButtonStyle(){{
over = buttonOver;
@@ -87,15 +75,6 @@ public class Styles{
down = buttonDown;
up = button;
}};
squaret = new TextButtonStyle(){{
font = Fonts.def;
fontColor = Color.white;
disabledFontColor = Color.gray;
over = buttonSquareOver;
disabled = buttonDisabled;
down = buttonSquareDown;
up = buttonSquare;
}};
nodet = new TextButtonStyle(){{
disabled = button;
font = Fonts.def;
@@ -127,16 +106,6 @@ public class Styles{
down = flatOver;
up = underlineWhite;
}};
discordt = new TextButtonStyle(){{
font = Fonts.def;
fontColor = Color.white;
up = discordBanner;
}};
infot = new TextButtonStyle(){{
font = Fonts.def;
fontColor = Color.white;
up = infoBanner;
}};
clearPartialt = new TextButtonStyle(){{
down = flatOver;
up = pane;
@@ -225,14 +194,6 @@ public class Styles{
up = buttonOver;
over = buttonDown;
}};
righti = new ImageButtonStyle(){{
over = buttonRightOver;
down = buttonRightDown;
up = buttonRight;
disabled = buttonRightDisabled;
imageDisabledColor = Color.clear;
imageUpColor = Color.white;
}};
emptyi = new ImageButtonStyle(){{
imageDownColor = Pal.accent;
imageOverColor = Color.lightGray;
@@ -282,11 +243,6 @@ public class Styles{
imageDisabledColor = Color.gray;
imageUpColor = Color.white;
}};
clearPartial2i = new ImageButtonStyle(){{
down = whiteui;
up = pane;
over = flatDown;
}};
clearTogglei = new ImageButtonStyle(){{
down = flatDown;
checked = flatDown;
@@ -330,12 +286,6 @@ public class Styles{
}};
nonePane = new ScrollPaneStyle();
defaultKeybindDialog = new KeybindDialog.KeybindDialogStyle(){{
keyColor = Pal.accent;
keyNameColor = Color.white;
controllerColor = Color.lightGray;
}};
defaultSlider = new SliderStyle(){{
background = sliderBack;
knob = sliderKnob;

View File

@@ -6,7 +6,6 @@ import arc.graphics.*;
import arc.input.*;
import arc.input.InputDevice.*;
import arc.scene.event.*;
import arc.scene.style.*;
import arc.scene.ui.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
@@ -18,7 +17,6 @@ import mindustry.ui.*;
import static arc.Core.*;
public class KeybindDialog extends Dialog{
protected KeybindDialogStyle style;
protected Section section;
protected KeyBind rebindKey = null;
protected boolean rebindAxis = false;
@@ -30,7 +28,6 @@ public class KeybindDialog extends Dialog{
public KeybindDialog(){
super(bundle.get("keybind.title", "Rebind Keys"));
style = scene.getStyle(KeybindDialogStyle.class);
setup();
addCloseButton();
setFillParent(true);
@@ -48,11 +45,6 @@ public class KeybindDialog extends Dialog{
});
}
public void setStyle(KeybindDialogStyle style){
this.style = style;
setup();
}
private void setup(){
cont.clear();
@@ -124,7 +116,7 @@ public class KeybindDialog extends Dialog{
table.add().height(10);
table.row();
if(section.device.type() == DeviceType.controller){
table.table(info -> info.add("Controller Type: [#" + style.controllerColor.toString().toUpperCase() + "]" +
table.table(info -> info.add("Controller Type: [lightGray]" +
Strings.capitalize(section.device.name())).left());
}
table.row();
@@ -140,12 +132,12 @@ public class KeybindDialog extends Dialog{
}
if(keybind.defaultValue(section.device.type()) instanceof Axis){
table.add(bundle.get("keybind." + keybind.name() + ".name", Strings.capitalize(keybind.name())), style.keyNameColor).left().padRight(40).padLeft(8);
table.add(bundle.get("keybind." + keybind.name() + ".name", Strings.capitalize(keybind.name())), Color.white).left().padRight(40).padLeft(8);
table.labelWrap(() -> {
Axis axis = keybinds.get(section, keybind);
return axis.key != null ? axis.key.toString() : axis.min + " [red]/[] " + axis.max;
}).color(style.keyColor).left().minWidth(90).fillX().padRight(20);
}).color(Pal.accent).left().minWidth(90).fillX().padRight(20);
table.button("@settings.rebind", tstyle, () -> {
rebindAxis = true;
@@ -153,8 +145,8 @@ public class KeybindDialog extends Dialog{
openDialog(section, keybind);
}).width(130f);
}else{
table.add(bundle.get("keybind." + keybind.name() + ".name", Strings.capitalize(keybind.name())), style.keyNameColor).left().padRight(40).padLeft(8);
table.label(() -> keybinds.get(section, keybind).key.toString()).color(style.keyColor).left().minWidth(90).padRight(20);
table.add(bundle.get("keybind." + keybind.name() + ".name", Strings.capitalize(keybind.name())), Color.white).left().padRight(40).padLeft(8);
table.label(() -> keybinds.get(section, keybind).key.toString()).color(Pal.accent).left().minWidth(90).padRight(20);
table.button("@settings.rebind", tstyle, () -> {
rebindAxis = false;
@@ -239,10 +231,4 @@ public class KeybindDialog extends Dialog{
rebindDialog.show();
Time.runTask(1f, () -> getScene().setScrollFocus(rebindDialog));
}
public static class KeybindDialogStyle extends Style{
public Color keyColor = Color.white;
public Color keyNameColor = Color.white;
public Color controllerColor = Color.white;
}
}

View File

@@ -29,6 +29,7 @@ import mindustry.type.*;
import mindustry.ui.*;
import static mindustry.Vars.*;
import static mindustry.gen.Tex.*;
public class HudFragment extends Fragment{
private static final float dsize = 65f, pauseHeight = 36f;
@@ -199,8 +200,17 @@ public class HudFragment extends Fragment{
//wave info button with text
s.add(makeStatusTable()).grow().name("status");
var rightStyle = new ImageButtonStyle(){{
over = buttonRightOver;
down = buttonRightDown;
up = buttonRight;
disabled = buttonRightDisabled;
imageDisabledColor = Color.clear;
imageUpColor = Color.white;
}};
//table with button to skip wave
s.button(Icon.play, Styles.righti, 30f, () -> {
s.button(Icon.play, rightStyle, 30f, () -> {
if(net.client() && player.admin){
Call.adminRequest(player, AdminAction.wave);
}else{

View File

@@ -9,6 +9,7 @@ import arc.scene.actions.*;
import arc.scene.event.*;
import arc.scene.style.*;
import arc.scene.ui.*;
import arc.scene.ui.TextButton.*;
import arc.scene.ui.layout.*;
import arc.util.*;
import mindustry.core.*;
@@ -18,6 +19,7 @@ import mindustry.graphics.*;
import mindustry.ui.*;
import static mindustry.Vars.*;
import static mindustry.gen.Tex.*;
public class MenuFragment extends Fragment{
private Table container, submenu;
@@ -52,8 +54,17 @@ public class MenuFragment extends Fragment{
//info icon
if(mobile){
parent.fill(c -> c.bottom().left().button("", Styles.infot, ui.about::show).size(84, 45).name("info"));
parent.fill(c -> c.bottom().right().button("", Styles.discordt, ui.discord::show).size(84, 45).name("discord"));
parent.fill(c -> c.bottom().left().button("", new TextButtonStyle(){{
font = Fonts.def;
fontColor = Color.white;
up = infoBanner;
}}, ui.about::show).size(84, 45).name("info"));
parent.fill(c -> c.bottom().right().button("", new TextButtonStyle(){{
font = Fonts.def;
fontColor = Color.white;
up = discordBanner;
}}, ui.discord::show).size(84, 45).name("discord"));
}else if(becontrol.active()){
parent.fill(c -> c.bottom().right().button("@be.check", Icon.refresh, () -> {
ui.loadfrag.show();