Initial menu music test

This commit is contained in:
Anuken
2019-07-30 22:50:15 -04:00
68 changed files with 3506 additions and 2063 deletions

View File

@@ -21,6 +21,7 @@ public class Mindustry extends ApplicationCore{
});
Time.mark();
UI.loadSystemCursors();
Vars.init();
Log.setUseColors(false);

View File

@@ -768,7 +768,6 @@ public class Blocks implements ContentList{
}};
thruster = new Wall("thruster"){{
requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with());
health = 55 * 16 * wallHealthMultiplier;
size = 4;
}};
@@ -1079,12 +1078,12 @@ public class Blocks implements ContentList{
differentialGenerator = new SingleTypeGenerator(true, false, "differential-generator"){{
requirements(Category.power, ItemStack.with(Items.copper, 140, Items.titanium, 100, Items.lead, 200, Items.silicon, 130, Items.metaglass, 100));
powerProduction = 16f;
itemDuration = 50f;
itemDuration = 60f;
hasLiquids = true;
size = 3;
consumes.item(Items.pyratite).optional(true, false);
consumes.liquid(Liquids.cryofluid, 0.2f);
consumes.liquid(Liquids.cryofluid, 0.18f);
}};
rtgGenerator = new DecayGenerator("rtg-generator"){{

View File

@@ -168,6 +168,8 @@ public class Control implements ApplicationListener{
Events.on(ZoneConfigureCompleteEvent.class, e -> {
ui.hudfrag.showToast(Core.bundle.format("zone.config.complete", e.zone.configureWave));
});
Musics.menu.play();
}
void createPlayer(){

View File

@@ -326,8 +326,7 @@ public class Renderer implements ApplicationListener{
for(Team team : Team.all){
EntityGroup<BaseUnit> group = unitGroups[team.ordinal()];
if(group.count(p -> p.isFlying() == flying) +
playerGroup.count(p -> p.isFlying() == flying && p.getTeam() == team) == 0 && flying) continue;
if(group.count(p -> p.isFlying() == flying) + playerGroup.count(p -> p.isFlying() == flying && p.getTeam() == team) == 0 && flying) continue;
draw(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder);
draw(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team && !p.isDead(), Unit::drawUnder);

View File

@@ -27,9 +27,13 @@ import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.ui.dialogs.*;
import io.anuke.mindustry.ui.fragments.*;
import static io.anuke.arc.scene.actions.Actions.*;
import static io.anuke.mindustry.Vars.*;
public class UI implements ApplicationListener{
private static final int cursorScaling = 1, outlineThickness = 3;
private static final Color outlineColor = Color.valueOf("444444");
private FreeTypeFontGenerator generator;
public MenuFragment menufrag;
@@ -77,11 +81,11 @@ public class UI implements ApplicationListener{
Core.scene = new Scene(skin);
Core.input.addProcessor(Core.scene);
//Dialog.setShowAction(() -> sequence(translateTo(Core.graphics.getWidth(), 0f), translateBy(-Core.graphics.getWidth(), 0f, 0.1f, Interpolation.fade)));
//Dialog.setHideAction(() -> sequence(translateBy(-Core.graphics.getWidth(), 0f, 0.1f, Interpolation.fade)));
Dialog.setShowAction(() -> sequence(alpha(0f), fadeIn(0.1f)));
Dialog.setHideAction(() -> sequence(fadeOut(0.2f)));
Dialog.setShowAction(Actions::sequence);
Dialog.setHideAction(Actions::sequence);
//Dialog.setShowAction(Actions::sequence);
//Dialog.setHideAction(Actions::sequence);
Tooltips.getInstance().animations = false;
@@ -93,8 +97,16 @@ public class UI implements ApplicationListener{
Colors.put("accent", Pal.accent);
Colors.put("highlight", Pal.accent.cpy().lerp(Color.WHITE, 0.3f));
Colors.put("stat", Pal.stat);
loadExtraCursors();
}
loadCursors();
/** Called from a static context to make the cursor appear immediately upon startup.*/
public static void loadSystemCursors(){
SystemCursor.arrow.set(Core.graphics.newCursor("cursor", cursorScaling, outlineColor, outlineThickness));
SystemCursor.hand.set(Core.graphics.newCursor("hand", cursorScaling, outlineColor, outlineThickness));
SystemCursor.ibeam.set(Core.graphics.newCursor("ibeam", cursorScaling, outlineColor, outlineThickness));
Core.graphics.restoreCursor();
}
void loadExtraStyle(Skin skin){
@@ -116,17 +128,9 @@ public class UI implements ApplicationListener{
skin.add("flat-down", copy, Drawable.class);
}
void loadCursors(){
int cursorScaling = 1, outlineThickness = 3;
Color outlineColor = Color.valueOf("444444");
void loadExtraCursors(){
drillCursor = Core.graphics.newCursor("drill", cursorScaling, outlineColor, outlineThickness);
unloadCursor = Core.graphics.newCursor("unload", cursorScaling, outlineColor, outlineThickness);
SystemCursor.arrow.set(Core.graphics.newCursor("cursor", cursorScaling, outlineColor, outlineThickness));
SystemCursor.hand.set(Core.graphics.newCursor("hand", cursorScaling, outlineColor, outlineThickness));
SystemCursor.ibeam.set(Core.graphics.newCursor("ibeam", cursorScaling, outlineColor, outlineThickness));
Core.graphics.restoreCursor();
}
void generateFonts(Skin skin){
@@ -202,6 +206,7 @@ public class UI implements ApplicationListener{
chatfrag.container().build(hudGroup);
listfrag.build(hudGroup);
loadfrag.build(group);
new FadeInFragment().build(group);
}
@Override

View File

@@ -232,6 +232,7 @@ public class MenuRenderer implements Disposable{
batch.beginDraw();
batch.drawCache(cacheFloor);
batch.endDraw();
Draw.color();
Draw.rect(Draw.wrap(shadows.getTexture()),
width * tilesize / 2f - 4f, height * tilesize / 2f - 4f,
width * tilesize, -height * tilesize);

View File

@@ -3,6 +3,7 @@ package io.anuke.mindustry.io;
import io.anuke.arc.collection.*;
import io.anuke.arc.util.serialization.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.game.Teams.*;
import io.anuke.mindustry.type.*;
@@ -35,7 +36,9 @@ public class JsonIO{
@Override
public Item read(Json json, JsonValue jsonData, Class type){
return Vars.content.getByName(ContentType.item, jsonData.asString());
if(jsonData.asString() == null) return Items.copper;
Item i = Vars.content.getByName(ContentType.item, jsonData.asString());
return i == null ? Items.copper : i;
}
});

View File

@@ -64,14 +64,20 @@ public class Map implements Comparable<Map>{
/** This creates a new instance of Rules.*/
public Rules rules(){
Rules result = JsonIO.read(Rules.class, tags.get("rules", "{}"));
if(result.spawns.isEmpty()) result.spawns = Vars.defaultWaves.get();
return result;
try{
Rules result = JsonIO.read(Rules.class, tags.get("rules", "{}"));
if(result.spawns.isEmpty()) result.spawns = Vars.defaultWaves.get();
return result;
}catch(Exception e){
//error reading rules. ignore?
e.printStackTrace();
return new Rules();
}
}
/** Returns the generation filters that this map uses on load.*/
public Array<GenerateFilter> filters(){
if(tags.getInt("build", -1) < 83 && tags.get("genfilters", "").isEmpty()){
if(tags.getInt("build", -1) < 83 && tags.getInt("build", -1) != -1 && tags.get("genfilters", "").isEmpty()){
return Array.with();
}
return world.maps.readFilters(tags.get("genfilters", ""));

View File

@@ -10,7 +10,7 @@ public class DistortFilter extends GenerateFilter{
{
buffered = true;
options(
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 400f),
new SliderOption("scale", () -> scl, f -> scl = f, 1f, 200f),
new SliderOption("mag", () -> mag, f -> mag = f, 0.5f, 100f)
);
}

View File

@@ -54,7 +54,7 @@ public class Weapon{
/** whether shooter rotation is ignored when shooting. */
public boolean ignoreRotation = false;
public Sound shootSound = Sounds.bang2;
public Sound shootSound = Sounds.railgun;
public TextureRegion region;

View File

@@ -3,7 +3,7 @@ package io.anuke.mindustry.ui.dialogs;
import io.anuke.arc.function.*;
import io.anuke.arc.graphics.Color;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.arc.util.Strings;
import io.anuke.arc.util.*;
import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.core.Platform;

View File

@@ -22,7 +22,9 @@ public class MapPlayDialog extends FloatingDialog{
onResize(() -> {
if(lastMap != null){
Rules rules = this.rules;
show(lastMap);
this.rules = rules;
}
});
}
@@ -53,6 +55,7 @@ public class MapPlayDialog extends FloatingDialog{
modes.addButton(mode.toString(), "toggle", () -> {
selectedGamemode = mode;
rules = mode.apply(map.rules());
Log.info("toggle rules " + rules);
}).update(b -> b.setChecked(selectedGamemode == mode)).size(140f, 54f).disabled(!mode.valid(map));
if(i++ % 2 == 1) modes.row();
}

View File

@@ -319,6 +319,7 @@ public class TechTreeDialog extends FloatingDialog{
if(!child.visible) continue;
Lines.stroke(Unit.dp.scl(4f), locked(node.node) || locked(child.node) ? Pal.gray : Pal.accent);
Draw.alpha(parentAlpha);
Lines.line(node.x + offsetX, node.y + offsetY, child.x + offsetX, child.y + offsetY);
}
}

View File

@@ -0,0 +1,40 @@
package io.anuke.mindustry.ui.fragments;
import io.anuke.arc.*;
import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.*;
import io.anuke.arc.scene.*;
import io.anuke.arc.scene.event.*;
import io.anuke.arc.util.*;
/** Fades in a black overlay.*/
public class FadeInFragment extends Fragment{
private static final float duration = 40f;
float time = 0f;
@Override
public void build(Group parent){
parent.addChild(new Element(){
{
setFillParent(true);
touchable(Touchable.disabled);
}
@Override
public void draw(){
Draw.color(0f, 0f, 0f, Mathf.clamp(1f - time));
Fill.crect(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight());
Draw.color();
}
@Override
public void act(float delta){
super.act(delta);
time += Time.delta() / duration;
if(time > 1){
remove();
}
}
});
}
}

View File

@@ -584,6 +584,7 @@ public class Block extends BlockStorage{
public void displayConsumption(Tile tile, Table table){
table.left();
for(Consume cons : consumes.all()){
if(cons.isOptional() && cons.isBoost()) continue;
cons.build(tile, table);
}
}

View File

@@ -1,18 +1,18 @@
package io.anuke.mindustry.world.blocks.defense.turrets;
import io.anuke.arc.collection.ObjectMap;
import io.anuke.arc.collection.OrderedMap;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.bullet.BulletType;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.arc.collection.*;
import io.anuke.arc.scene.ui.layout.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.entities.bullet.*;
import io.anuke.mindustry.entities.type.Unit;
import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.ui.Bar;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.mindustry.world.meta.values.AmmoListValue;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.ui.*;
import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.consumers.*;
import io.anuke.mindustry.world.meta.*;
import io.anuke.mindustry.world.meta.values.*;
import java.io.*;
@@ -36,6 +36,18 @@ public class ItemTurret extends CooledTurret{
stats.remove(BlockStat.itemCapacity);
stats.add(BlockStat.ammo, new AmmoListValue<>(ammo));
consumes.add(new ConsumeItemFilter(i -> ammo.containsKey(i)){
@Override
public boolean valid(TileEntity entity){
//valid when there's any ammo in the turret
return !((ItemTurretEntity)entity).ammo.isEmpty();
}
@Override
public void display(BlockStats stats){
//don't display
}
});
}
@Override

View File

@@ -1,18 +1,18 @@
package io.anuke.mindustry.world.blocks.defense.turrets;
import io.anuke.arc.collection.ObjectMap;
import io.anuke.arc.collection.OrderedMap;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.bullet.BulletType;
import io.anuke.mindustry.entities.effect.Fire;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.mindustry.world.meta.values.AmmoListValue;
import io.anuke.arc.collection.*;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.bullet.*;
import io.anuke.mindustry.entities.effect.*;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret.*;
import io.anuke.mindustry.world.consumers.*;
import io.anuke.mindustry.world.meta.*;
import io.anuke.mindustry.world.meta.values.*;
import static io.anuke.mindustry.Vars.tilesize;
import static io.anuke.mindustry.Vars.world;
import static io.anuke.mindustry.Vars.*;
public abstract class LiquidTurret extends Turret{
protected ObjectMap<Liquid, BulletType> ammo = new ObjectMap<>();
@@ -32,6 +32,17 @@ public abstract class LiquidTurret extends Turret{
super.setStats();
stats.add(BlockStat.ammo, new AmmoListValue<>(ammo));
consumes.add(new ConsumeLiquidFilter(i -> ammo.containsKey(i), 1f){
@Override
public boolean valid(TileEntity entity){
return !((TurretEntity)entity).ammo.isEmpty();
}
@Override
public void display(BlockStats stats){
}
});
}
@Override

View File

@@ -48,6 +48,10 @@ public abstract class Consume{
return optional;
}
public boolean isBoost(){
return booster;
}
public boolean isUpdate(){
return update;
}

View File

@@ -11,7 +11,7 @@ import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.mindustry.world.meta.BlockStats;
import io.anuke.mindustry.world.meta.values.ItemFilterValue;
import static io.anuke.mindustry.Vars.content;
import static io.anuke.mindustry.Vars.*;
public class ConsumeItemFilter extends Consume{
public final Predicate<Item> filter;
@@ -33,7 +33,7 @@ public class ConsumeItemFilter extends Consume{
@Override
public void build(Tile tile, Table table){
MultiReqImage image = new MultiReqImage();
content.items().each(filter, item -> image.add(new ReqImage(new ItemImage(item.icon(Icon.large), 1), () -> tile.entity != null && tile.entity.items != null && tile.entity.items.has(item))));
content.items().each(i -> filter.test(i) && (!world.isZone() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Icon.large), 1), () -> tile.entity != null && tile.entity.items != null && tile.entity.items.has(item))));
table.add(image).size(8 * 4);
}