This commit is contained in:
Anuken
2019-08-01 10:38:16 -04:00
45 changed files with 251 additions and 80 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8 -5
View File
@@ -1,12 +1,12 @@
package io.anuke.mindustry;
import io.anuke.arc.*;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Log;
import io.anuke.arc.util.Time;
import io.anuke.arc.math.*;
import io.anuke.arc.util.*;
import io.anuke.mindustry.core.*;
import io.anuke.mindustry.game.EventType.GameLoadEvent;
import io.anuke.mindustry.io.BundleLoader;
import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.io.*;
import static io.anuke.mindustry.Vars.*;
@@ -26,6 +26,9 @@ public class Mindustry extends ApplicationCore{
Vars.init();
Log.setUseColors(false);
BundleLoader.load();
Musics.load();
Sounds.load();
content.load();
content.loadColors();
@@ -33,6 +33,7 @@ import static io.anuke.mindustry.Vars.*;
*/
public class Control implements ApplicationListener{
public final Saves saves;
public final MusicControl music;
private Interval timer = new Interval(2);
private boolean hiscore = false;
@@ -42,6 +43,7 @@ public class Control implements ApplicationListener{
public Control(){
batch = new SpriteBatch();
saves = new Saves();
music = new MusicControl();
data = new GlobalData();
Unit.dp.product = settings.getInt("uiscale", 100) / 100f;
@@ -228,6 +230,8 @@ public class Control implements ApplicationListener{
public void dispose(){
content.dispose();
Net.dispose();
Musics.dispose();
Sounds.dispose();
ui.editor.dispose();
}
@@ -307,6 +311,19 @@ public class Control implements ApplicationListener{
//autosave global data if it's modified
data.checkSave();
if(state.is(State.menu)){
if(ui.deploy.isShown()){
music.silence(); //TODO deploy music
}else if(ui.editor.isShown()){
music.play(Musics.editor);
}else{
music.play(Musics.menu);
}
}else{
//TODO game music
music.silence();
}
if(!state.is(State.menu)){
input.update();
@@ -60,6 +60,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
}
unit.onSuperDeath();
unit.type.deathSound.at(unit);
//visual only.
if(Net.client()){
@@ -257,6 +257,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
dead = true;
Events.fire(new BlockDestroyEvent(tile));
block.breakSound.at(tile);
block.onDestroyed(tile);
world.removeBlock(tile);
remove();
@@ -20,6 +20,7 @@ import io.anuke.mindustry.entities.units.Statuses;
import io.anuke.mindustry.game.EventType.UnitDestroyEvent;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.Teams.TeamData;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.net.Interpolator;
import io.anuke.mindustry.net.Net;
@@ -108,6 +109,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
Effects.effect(Fx.explosion, this);
Effects.shake(2f, 2f, this);
Sounds.bang.at(this);
item.amount = 0;
drownTime = 0f;
status.clear();
@@ -0,0 +1,40 @@
package io.anuke.mindustry.game;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.audio.*;
import io.anuke.arc.math.*;
import io.anuke.arc.util.*;
/** Controls playback of multiple music tracks.*/
public class MusicControl{
private static final float finTime = 80f, foutTime = 80f;
private @Nullable Music current;
public void play(@Nullable Music music){
if(current == null && music != null){
current = music;
current.setLooping(true);
current.setVolume(0f);
current.play();
}else if(current == music && music != null){
current.setVolume(Mathf.clamp(current.getVolume() + Time.delta()/finTime));
}else if(current != null){
current.setVolume(Mathf.clamp(current.getVolume() - Time.delta()/foutTime));
if(current.getVolume() <= 0.01f){
current.stop();
current = null;
if(music != null){
current = music;
current.setVolume(0f);
current.setLooping(true);
current.play();
}
}
}
}
public void silence(){
play(null);
}
}
@@ -50,12 +50,12 @@ public class CrashSender{
try{
File file = new File(OS.getAppDataDirectoryString(Vars.appName), "crashes/crash-report-" + DateTimeFormatter.ofPattern("MM_dd_yyyy_HH_mm_ss").format(LocalDateTime.now()) + ".txt");
new File(OS.getAppDataDirectoryString(Vars.appName)).mkdir();
Files.write(file.toPath(), parseException(exception).getBytes());
Files.createDirectories(Paths.get(OS.getAppDataDirectoryString(Vars.appName), "crashes"));
Files.write(file.toPath(), parseException(exception).getBytes());
writeListener.accept(file);
}catch(Throwable ignored){
}catch(Throwable e){
e.printStackTrace();
Log.err("Failed to save local crash report.");
}
+11 -8
View File
@@ -1,14 +1,16 @@
package io.anuke.mindustry.type;
import io.anuke.arc.Core;
import io.anuke.arc.collection.ObjectSet;
import io.anuke.arc.function.Supplier;
import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.entities.type.BaseUnit;
import io.anuke.arc.*;
import io.anuke.arc.audio.*;
import io.anuke.arc.collection.*;
import io.anuke.arc.function.*;
import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.scene.ui.layout.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.ui.ContentDisplay;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.ui.*;
public class UnitType extends UnlockableContent{
public final TypeID typeID;
@@ -35,6 +37,7 @@ public class UnitType extends UnlockableContent{
public Weapon weapon;
public float weaponOffsetY, engineOffset = 6f, engineSize = 2f;
public ObjectSet<StatusEffect> immunities = new ObjectSet<>();
public Sound deathSound = Sounds.bang;
public TextureRegion iconRegion, legRegion, baseRegion, region;
+19 -17
View File
@@ -1,22 +1,20 @@
package io.anuke.mindustry.type;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
import io.anuke.arc.Core;
import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.arc.math.Angles;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Time;
import io.anuke.arc.util.Tmp;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.Effects.Effect;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.bullet.BulletType;
import io.anuke.mindustry.entities.traits.ShooterTrait;
import io.anuke.mindustry.entities.type.Player;
import io.anuke.mindustry.gen.Call;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.*;
import io.anuke.arc.audio.*;
import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.*;
import io.anuke.arc.util.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.Effects.*;
import io.anuke.mindustry.entities.bullet.*;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.gen.Sounds;
import io.anuke.mindustry.net.Net;
public class Weapon{
@@ -56,6 +54,8 @@ public class Weapon{
/** whether shooter rotation is ignored when shooting. */
public boolean ignoreRotation = false;
public Sound shootSound = Sounds.shoot;
public TextureRegion region;
protected Weapon(String name){
@@ -69,6 +69,7 @@ public class Weapon{
@Remote(targets = Loc.server, called = Loc.both, unreliable = true)
public static void onPlayerShootWeapon(Player player, float x, float y, float rotation, boolean left){
if(player == null) return;
//clients do not see their own shoot events: they are simulated completely clientside to prevent laggy visuals
//messing with the firerate or any other stats does not affect the server (take that, script kiddies!)
@@ -91,6 +92,7 @@ public class Weapon{
float baseX = shooter.getX(), baseY = shooter.getY();
Weapon weapon = shooter.getWeapon();
weapon.shootSound.at(x, y);
sequenceNum = 0;
if(weapon.shotDelay > 0.01f){
@@ -1,18 +1,17 @@
package io.anuke.mindustry.ui.dialogs;
import io.anuke.arc.Core;
import io.anuke.arc.Events;
import io.anuke.arc.input.KeyCode;
import io.anuke.arc.scene.ui.Dialog;
import io.anuke.arc.scene.ui.ScrollPane;
import io.anuke.arc.util.Align;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.game.EventType.ResizeEvent;
import io.anuke.mindustry.graphics.Pal;
import io.anuke.arc.*;
import io.anuke.arc.input.*;
import io.anuke.arc.scene.event.*;
import io.anuke.arc.scene.ui.*;
import io.anuke.arc.util.*;
import io.anuke.mindustry.core.GameState.*;
import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.net.Net;
import static io.anuke.mindustry.Vars.iconsize;
import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.*;
public class FloatingDialog extends Dialog{
private boolean wasPaused;
@@ -32,7 +31,9 @@ public class FloatingDialog extends Dialog{
state.set(State.playing);
}
}
Sounds.back.play();
});
ClickListener.clicked = () -> Sounds.press.play();
shown(() -> {
if(shouldPause && !state.is(State.menu)){
+25 -25
View File
@@ -1,38 +1,36 @@
package io.anuke.mindustry.world;
import io.anuke.annotations.Annotations.CallSuper;
import io.anuke.arc.Core;
import io.anuke.arc.Graphics.Cursor;
import io.anuke.arc.Graphics.Cursor.SystemCursor;
import io.anuke.arc.collection.Array;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.*;
import io.anuke.arc.Graphics.*;
import io.anuke.arc.Graphics.Cursor.*;
import io.anuke.arc.audio.*;
import io.anuke.arc.collection.EnumSet;
import io.anuke.arc.function.BooleanProvider;
import io.anuke.arc.function.Function;
import io.anuke.arc.graphics.Color;
import io.anuke.arc.collection.*;
import io.anuke.arc.function.*;
import io.anuke.arc.graphics.*;
import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.graphics.g2d.TextureAtlas.AtlasRegion;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.arc.util.Align;
import io.anuke.arc.util.Time;
import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.entities.Damage;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.effect.Puddle;
import io.anuke.mindustry.entities.effect.RubbleDecal;
import io.anuke.arc.graphics.g2d.TextureAtlas.*;
import io.anuke.arc.math.*;
import io.anuke.arc.scene.ui.layout.*;
import io.anuke.arc.util.*;
import io.anuke.arc.util.pooling.*;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.bullet.*;
import io.anuke.mindustry.entities.effect.*;
import io.anuke.mindustry.entities.type.Unit;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.game.UnlockableContent;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.input.InputHandler.PlaceDraw;
import io.anuke.mindustry.input.InputHandler.*;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.ui.Bar;
import io.anuke.mindustry.ui.ContentDisplay;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OverlayFloor;
import io.anuke.mindustry.ui.*;
import io.anuke.mindustry.world.blocks.*;
import io.anuke.mindustry.world.consumers.*;
import io.anuke.mindustry.world.meta.*;
import java.util.Arrays;
import java.util.*;
import static io.anuke.mindustry.Vars.*;
@@ -98,6 +96,8 @@ public class Block extends BlockStorage{
public boolean outlineIcon = false;
/** Whether this block has a shadow under it. */
public boolean hasShadow = true;
/** Sounds made when this block breaks.*/
public Sound breakSound = Sounds.die;
/** Cost of constructing this block. */
public ItemStack[] buildRequirements = new ItemStack[]{};
@@ -15,7 +15,7 @@ import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.game.EventType.BlockBuildEndEvent;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block;
@@ -54,6 +54,7 @@ public class BuildBlock extends Block{
Effects.effect(Fx.breakBlock, tile.drawx(), tile.drawy(), block.size);
world.removeBlock(tile);
Events.fire(new BlockBuildEndEvent(tile, team, true));
Sounds.breaks.at(tile);
}
@Remote(called = Loc.server)
@@ -74,6 +75,7 @@ public class BuildBlock extends Block{
Core.app.post(() -> tile.block().playerPlaced(tile));
}
Core.app.post(() -> Events.fire(new BlockBuildEndEvent(tile, team, false)));
Sounds.place.at(tile);
}
@Override