diff --git a/src/main/java/cz/jzitnik/game/Game.java b/src/main/java/cz/jzitnik/game/Game.java index e951bdd..c9930f5 100644 --- a/src/main/java/cz/jzitnik/game/Game.java +++ b/src/main/java/cz/jzitnik/game/Game.java @@ -15,6 +15,7 @@ import cz.jzitnik.game.annotations.AutoTransient; import cz.jzitnik.game.annotations.WalkSound; import cz.jzitnik.game.annotations.BreaksByPlace; import cz.jzitnik.game.annotations.MineSound; +import cz.jzitnik.game.annotations.MiningSound; import cz.jzitnik.game.annotations.PlaceSound; import cz.jzitnik.game.blocks.Chest; import cz.jzitnik.game.blocks.Furnace; @@ -199,9 +200,19 @@ public class Game extends AutoTransientSupport { double hardness = world[y][x].stream().filter(block -> !block.getBlockId().equals("air")).toList().getFirst() .calculateHardness(inventory); + var blocks = world[y][x]; + this.mining = true; new Thread(() -> { + for (Block block : blocks) { + if (block.getClass().isAnnotationPresent(MiningSound.class)) { + new Thread(() -> { + gameStates.dependencies.sound.playSound(configuration, + block.getClass().getAnnotation(MiningSound.class).value()); + }).start(); + } + } try { Thread.sleep((long) (hardness * 166)); } catch (InterruptedException e) { @@ -209,7 +220,14 @@ public class Game extends AutoTransientSupport { } breakingBlock.setSpriteState(Breaking.BreakingState.SECOND); screenRenderer.render(this); - + for (Block block : blocks) { + if (block.getClass().isAnnotationPresent(MiningSound.class)) { + new Thread(() -> { + gameStates.dependencies.sound.playSound(configuration, + block.getClass().getAnnotation(MiningSound.class).value()); + }).start(); + } + } try { Thread.sleep((long) (hardness * 166)); } catch (InterruptedException e) { @@ -217,7 +235,14 @@ public class Game extends AutoTransientSupport { } breakingBlock.setSpriteState(Breaking.BreakingState.THIRD); screenRenderer.render(this); - + for (Block block : blocks) { + if (block.getClass().isAnnotationPresent(MiningSound.class)) { + new Thread(() -> { + gameStates.dependencies.sound.playSound(configuration, + block.getClass().getAnnotation(MiningSound.class).value()); + }).start(); + } + } try { Thread.sleep((long) (hardness * 166)); } catch (InterruptedException e) { @@ -282,7 +307,6 @@ public class Game extends AutoTransientSupport { gameStates.dependencies.eventHandlerProvider.handleMine(screenRenderer, this, x, y); - for (Block block : blocksCopy) { if (block.getClass().isAnnotationPresent(MineSound.class)) { var key = block.getClass().getAnnotation(MineSound.class).value(); @@ -478,10 +502,10 @@ public class Game extends AutoTransientSupport { new Thread(() -> { try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } player.getPlayerBlock1().setSpriteState(SteveState.FIRST); player.getPlayerBlock2().setSpriteState(SteveState.SECOND); @@ -490,7 +514,7 @@ public class Game extends AutoTransientSupport { } private void playMovePlayerSound(int x, int y) { - var blocks = world[y+1][x]; + var blocks = world[y + 1][x]; for (Block block : blocks) { if (block.getClass().isAnnotationPresent(WalkSound.class)) { diff --git a/src/main/java/cz/jzitnik/game/annotations/MineSound.java b/src/main/java/cz/jzitnik/game/annotations/MineSound.java index b359716..aed0a93 100644 --- a/src/main/java/cz/jzitnik/game/annotations/MineSound.java +++ b/src/main/java/cz/jzitnik/game/annotations/MineSound.java @@ -6,10 +6,12 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import cz.jzitnik.game.core.sound.SoundKey; +import cz.jzitnik.game.core.sound.SoundType; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @RequireAnnotation(BlockRegistry.class) +@SoundTypeSet(SoundType.BLOCK) public @interface MineSound { SoundKey value(); } diff --git a/src/main/java/cz/jzitnik/game/annotations/MiningSound.java b/src/main/java/cz/jzitnik/game/annotations/MiningSound.java new file mode 100644 index 0000000..98e4cb2 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/annotations/MiningSound.java @@ -0,0 +1,17 @@ +package cz.jzitnik.game.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import cz.jzitnik.game.core.sound.SoundKey; +import cz.jzitnik.game.core.sound.SoundType; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@RequireAnnotation(BlockRegistry.class) +@SoundTypeSet(SoundType.MINING) +public @interface MiningSound { + SoundKey value(); +} diff --git a/src/main/java/cz/jzitnik/game/annotations/PlaceSound.java b/src/main/java/cz/jzitnik/game/annotations/PlaceSound.java index e57a66d..29cea44 100644 --- a/src/main/java/cz/jzitnik/game/annotations/PlaceSound.java +++ b/src/main/java/cz/jzitnik/game/annotations/PlaceSound.java @@ -6,10 +6,12 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import cz.jzitnik.game.core.sound.SoundKey; +import cz.jzitnik.game.core.sound.SoundType; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @RequireAnnotation(BlockRegistry.class) +@SoundTypeSet(SoundType.BLOCK) public @interface PlaceSound { SoundKey value(); } diff --git a/src/main/java/cz/jzitnik/game/annotations/SoundRegistry.java b/src/main/java/cz/jzitnik/game/annotations/SoundRegistry.java index 7e9a20c..af6b72d 100644 --- a/src/main/java/cz/jzitnik/game/annotations/SoundRegistry.java +++ b/src/main/java/cz/jzitnik/game/annotations/SoundRegistry.java @@ -5,7 +5,6 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import cz.jzitnik.game.core.sound.SoundKey; -import cz.jzitnik.game.core.sound.SoundType; import java.lang.annotation.ElementType; @@ -13,6 +12,5 @@ import java.lang.annotation.ElementType; @Retention(RetentionPolicy.RUNTIME) public @interface SoundRegistry { SoundKey key(); - SoundType type(); String[] resourceLocation(); } diff --git a/src/main/java/cz/jzitnik/game/annotations/SoundTypeSet.java b/src/main/java/cz/jzitnik/game/annotations/SoundTypeSet.java new file mode 100644 index 0000000..cae4b1b --- /dev/null +++ b/src/main/java/cz/jzitnik/game/annotations/SoundTypeSet.java @@ -0,0 +1,15 @@ +package cz.jzitnik.game.annotations; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import cz.jzitnik.game.core.sound.SoundType; + +import java.lang.annotation.ElementType; + +@Target(ElementType.ANNOTATION_TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface SoundTypeSet { + SoundType value(); +} diff --git a/src/main/java/cz/jzitnik/game/annotations/WalkSound.java b/src/main/java/cz/jzitnik/game/annotations/WalkSound.java index b6da529..4f5edc2 100644 --- a/src/main/java/cz/jzitnik/game/annotations/WalkSound.java +++ b/src/main/java/cz/jzitnik/game/annotations/WalkSound.java @@ -6,10 +6,12 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import cz.jzitnik.game.core.sound.SoundKey; +import cz.jzitnik.game.core.sound.SoundType; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @RequireAnnotation(BlockRegistry.class) +@SoundTypeSet(SoundType.WALKING) public @interface WalkSound { SoundKey value(); } diff --git a/src/main/java/cz/jzitnik/game/core/sound/Sound.java b/src/main/java/cz/jzitnik/game/core/sound/Sound.java index 523ff0b..5eaa9c2 100644 --- a/src/main/java/cz/jzitnik/game/core/sound/Sound.java +++ b/src/main/java/cz/jzitnik/game/core/sound/Sound.java @@ -11,6 +11,7 @@ import javax.sound.sampled.UnsupportedAudioFileException; import org.reflections.Reflections; import cz.jzitnik.game.annotations.SoundRegistry; +import cz.jzitnik.game.annotations.SoundTypeSet; import cz.jzitnik.game.config.Configuration; import cz.jzitnik.tui.SoundPlayer; import lombok.extern.slf4j.Slf4j; @@ -38,20 +39,23 @@ public class Sound { public void playSound(Configuration configuration, SoundKey soundKey) { var volume = configuration.getSoundVolume(); - + var annotation = map.get(soundKey); var resources = annotation.resourceLocation(); var resource = resources[random.nextInt(resources.length)]; - var typeVolue = annotation.type().getVolume(); - - int totalVolume = (int) ((volume + typeVolue) * 100) / 200; + var typeVolume = annotation.getClass().isAnnotationPresent(SoundTypeSet.class) + ? annotation.getClass().getAnnotation(SoundTypeSet.class).value().getVolume() + : 0; + + log.debug("Type volume: {}", typeVolume); + log.debug("Config volume: {}", volume); new Thread(() -> { try { - SoundPlayer.playSound(resource); - } catch (LineUnavailableException | IOException | UnsupportedAudioFileException | InterruptedException e) { + SoundPlayer.playSound(resource, typeVolume, volume); + } catch (LineUnavailableException | IOException | UnsupportedAudioFileException e) { // TODO Auto-generated catch block e.printStackTrace(); } diff --git a/src/main/java/cz/jzitnik/game/core/sound/SoundType.java b/src/main/java/cz/jzitnik/game/core/sound/SoundType.java index c46a1bf..d02a044 100644 --- a/src/main/java/cz/jzitnik/game/core/sound/SoundType.java +++ b/src/main/java/cz/jzitnik/game/core/sound/SoundType.java @@ -4,7 +4,9 @@ import lombok.Getter; @Getter public enum SoundType { - BLOCK(100); + BLOCK(0), + WALKING(100), + MINING(100); // TODO: Volume is not currently used but will be probably used in future to better normalize the sound volume private final int volume; diff --git a/src/main/java/cz/jzitnik/game/core/sound/registry/GrassSound.java b/src/main/java/cz/jzitnik/game/core/sound/registry/GrassSound.java index 65f6165..9e200f9 100644 --- a/src/main/java/cz/jzitnik/game/core/sound/registry/GrassSound.java +++ b/src/main/java/cz/jzitnik/game/core/sound/registry/GrassSound.java @@ -2,13 +2,12 @@ package cz.jzitnik.game.core.sound.registry; import cz.jzitnik.game.annotations.SoundRegistry; import cz.jzitnik.game.core.sound.SoundKey; -import cz.jzitnik.game.core.sound.SoundType; @SoundRegistry(key = SoundKey.GRASS, resourceLocation = { "grass/grass1.ogg", "grass/grass2.ogg", "grass/grass3.ogg", "grass/grass4.ogg" -}, type = SoundType.BLOCK) +}) public class GrassSound { } diff --git a/src/main/java/cz/jzitnik/game/core/sound/registry/GrassWalkingSound.java b/src/main/java/cz/jzitnik/game/core/sound/registry/GrassWalkingSound.java index a98d9c4..349f440 100644 --- a/src/main/java/cz/jzitnik/game/core/sound/registry/GrassWalkingSound.java +++ b/src/main/java/cz/jzitnik/game/core/sound/registry/GrassWalkingSound.java @@ -2,7 +2,6 @@ package cz.jzitnik.game.core.sound.registry; import cz.jzitnik.game.annotations.SoundRegistry; import cz.jzitnik.game.core.sound.SoundKey; -import cz.jzitnik.game.core.sound.SoundType; @SoundRegistry(key = SoundKey.GRASS_WALKING, resourceLocation = { "grass/walk1.ogg", @@ -11,6 +10,6 @@ import cz.jzitnik.game.core.sound.SoundType; "grass/walk4.ogg", "grass/walk5.ogg", "grass/walk6.ogg", -}, type = SoundType.BLOCK) +}) public class GrassWalkingSound { } diff --git a/src/main/java/cz/jzitnik/game/core/sound/registry/GravelSound.java b/src/main/java/cz/jzitnik/game/core/sound/registry/GravelSound.java index 534e989..fddd7ea 100644 --- a/src/main/java/cz/jzitnik/game/core/sound/registry/GravelSound.java +++ b/src/main/java/cz/jzitnik/game/core/sound/registry/GravelSound.java @@ -2,13 +2,12 @@ package cz.jzitnik.game.core.sound.registry; import cz.jzitnik.game.annotations.SoundRegistry; import cz.jzitnik.game.core.sound.SoundKey; -import cz.jzitnik.game.core.sound.SoundType; @SoundRegistry(key = SoundKey.GRAVEL, resourceLocation = { - "gravel/gravel1.wav", - "gravel/gravel2.wav", - "gravel/gravel3.wav", - "gravel/gravel4.wav" -}, type = SoundType.BLOCK) + "gravel/gravel1.ogg", + "gravel/gravel2.ogg", + "gravel/gravel3.ogg", + "gravel/gravel4.ogg" +}) public class GravelSound { } diff --git a/src/main/java/cz/jzitnik/game/core/sound/registry/GravelWalkingSound.java b/src/main/java/cz/jzitnik/game/core/sound/registry/GravelWalkingSound.java index 33a8038..9a87f69 100644 --- a/src/main/java/cz/jzitnik/game/core/sound/registry/GravelWalkingSound.java +++ b/src/main/java/cz/jzitnik/game/core/sound/registry/GravelWalkingSound.java @@ -2,13 +2,12 @@ package cz.jzitnik.game.core.sound.registry; import cz.jzitnik.game.annotations.SoundRegistry; import cz.jzitnik.game.core.sound.SoundKey; -import cz.jzitnik.game.core.sound.SoundType; @SoundRegistry(key = SoundKey.GRAVEL_WALKING, resourceLocation = { - "gravel/step1.wav", - "gravel/step2.wav", - "gravel/step3.wav", - "gravel/step4.wav", -}, type = SoundType.BLOCK) + "gravel/step1.ogg", + "gravel/step2.ogg", + "gravel/step3.ogg", + "gravel/step4.ogg", +}) public class GravelWalkingSound { } diff --git a/src/main/java/cz/jzitnik/game/core/sound/registry/WoodSound.java b/src/main/java/cz/jzitnik/game/core/sound/registry/WoodSound.java index ca113db..ca332ed 100644 --- a/src/main/java/cz/jzitnik/game/core/sound/registry/WoodSound.java +++ b/src/main/java/cz/jzitnik/game/core/sound/registry/WoodSound.java @@ -2,10 +2,9 @@ package cz.jzitnik.game.core.sound.registry; import cz.jzitnik.game.annotations.SoundRegistry; import cz.jzitnik.game.core.sound.SoundKey; -import cz.jzitnik.game.core.sound.SoundType; @SoundRegistry(key = SoundKey.WOOD, resourceLocation = { "wood/wood1.ogg", -}, type = SoundType.BLOCK) +}) public class WoodSound { } diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/DirtBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/DirtBlock.java index 5956a83..a7bbabc 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/DirtBlock.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/DirtBlock.java @@ -3,6 +3,7 @@ package cz.jzitnik.game.entities.items.registry.blocks.blocks; import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.annotations.BlockRegistry; import cz.jzitnik.game.annotations.MineSound; +import cz.jzitnik.game.annotations.MiningSound; import cz.jzitnik.game.annotations.PlaceSound; import cz.jzitnik.game.annotations.ResetDataOnMine; import cz.jzitnik.game.annotations.WalkSound; @@ -16,6 +17,7 @@ import java.util.ArrayList; @PlaceSound(SoundKey.GRAVEL) @MineSound(SoundKey.GRAVEL) @WalkSound(SoundKey.GRAVEL_WALKING) +@MiningSound(SoundKey.GRAVEL_WALKING) @ResetDataOnMine @BlockRegistry("dirt") public class DirtBlock extends Block { diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/GrassBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/GrassBlock.java index 5fda4cb..24efc4f 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/GrassBlock.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/GrassBlock.java @@ -3,6 +3,7 @@ package cz.jzitnik.game.entities.items.registry.blocks.blocks; import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.annotations.BlockRegistry; import cz.jzitnik.game.annotations.MineSound; +import cz.jzitnik.game.annotations.MiningSound; import cz.jzitnik.game.annotations.PlaceSound; import cz.jzitnik.game.annotations.ResetDataOnMine; import cz.jzitnik.game.annotations.WalkSound; @@ -16,6 +17,7 @@ import java.util.ArrayList; @MineSound(SoundKey.GRASS) @PlaceSound(SoundKey.GRASS) @WalkSound(SoundKey.GRASS_WALKING) +@MiningSound(SoundKey.GRASS_WALKING) @ResetDataOnMine @BlockRegistry(value = "grass", drops = "dirt") public class GrassBlock extends Block { diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/GravelBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/GravelBlock.java index 4e0b132..c6c3499 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/GravelBlock.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/GravelBlock.java @@ -4,6 +4,7 @@ import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.annotations.BlockRegistry; import cz.jzitnik.game.annotations.FallingBlock; import cz.jzitnik.game.annotations.MineSound; +import cz.jzitnik.game.annotations.MiningSound; import cz.jzitnik.game.annotations.PlaceSound; import cz.jzitnik.game.annotations.WalkSound; import cz.jzitnik.game.core.sound.SoundKey; @@ -15,6 +16,7 @@ import java.util.ArrayList; @PlaceSound(SoundKey.GRAVEL) @MineSound(SoundKey.GRAVEL) @WalkSound(SoundKey.GRAVEL_WALKING) +@MiningSound(SoundKey.GRAVEL_WALKING) @FallingBlock @BlockRegistry("gravel") public class GravelBlock extends Block { diff --git a/src/main/java/cz/jzitnik/tui/SoundPlayer.java b/src/main/java/cz/jzitnik/tui/SoundPlayer.java index d51ca04..b7620f5 100644 --- a/src/main/java/cz/jzitnik/tui/SoundPlayer.java +++ b/src/main/java/cz/jzitnik/tui/SoundPlayer.java @@ -7,19 +7,17 @@ import java.io.IOException; @Slf4j public class SoundPlayer { - public static void playSound(String filePath) - throws LineUnavailableException, IOException, UnsupportedAudioFileException, InterruptedException { - if (!filePath.endsWith(".ogg")) { - return; + public static void playSound(String filePath, int backendVolume, int masterVolume) + throws LineUnavailableException, IOException, UnsupportedAudioFileException { + if (!filePath.endsWith(".ogg") || masterVolume == 0) { + return; // No sound if master volume is 0 } log.info("Loading resource: {}", "sounds/" + filePath); - var file = SoundPlayer.class.getClassLoader().getResourceAsStream("sounds/" + filePath); AudioInputStream audioStream = AudioSystem.getAudioInputStream(file); AudioFormat baseFormat = audioStream.getFormat(); - // Convert the audio format to PCM_SIGNED AudioFormat targetFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), @@ -30,10 +28,9 @@ public class SoundPlayer { false ); - // Apply the format change to the stream AudioInputStream dataIn = AudioSystem.getAudioInputStream(targetFormat, audioStream); - byte[] buffer = new byte[8192]; // Larger buffer to reduce read/write operations + byte[] buffer = new byte[8192]; DataLine.Info info = new DataLine.Info(SourceDataLine.class, targetFormat); try (SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info)) { @@ -41,18 +38,29 @@ public class SoundPlayer { line.open(targetFormat); line.start(); + float finalVolume = (backendVolume / 100.0f) * (masterVolume / 100.0f); + log.info("Applying volume: {} (backend: {}, master: {})", finalVolume, backendVolume, masterVolume); + int bytesRead; while ((bytesRead = dataIn.read(buffer, 0, buffer.length)) != -1) { + applyVolume(buffer, bytesRead, finalVolume); line.write(buffer, 0, bytesRead); } - // Ensure the line is fully flushed before stopping line.drain(); } } - // Close streams after use dataIn.close(); audioStream.close(); } + + private static void applyVolume(byte[] buffer, int bytesRead, float volume) { + for (int i = 0; i < bytesRead; i += 2) { // 16-bit PCM samples are 2 bytes each + int sample = (buffer[i] & 0xFF) | (buffer[i + 1] << 8); + sample = (int) (sample * volume); + buffer[i] = (byte) (sample & 0xFF); + buffer[i + 1] = (byte) ((sample >> 8) & 0xFF); + } + } } diff --git a/src/main/resources/sounds/gravel/gravel1.ogg b/src/main/resources/sounds/gravel/gravel1.ogg new file mode 100644 index 0000000..620bacc Binary files /dev/null and b/src/main/resources/sounds/gravel/gravel1.ogg differ diff --git a/src/main/resources/sounds/gravel/gravel1.wav b/src/main/resources/sounds/gravel/gravel1.wav deleted file mode 100644 index 4cdfd59..0000000 Binary files a/src/main/resources/sounds/gravel/gravel1.wav and /dev/null differ diff --git a/src/main/resources/sounds/gravel/gravel2.ogg b/src/main/resources/sounds/gravel/gravel2.ogg new file mode 100644 index 0000000..5c7b8d5 Binary files /dev/null and b/src/main/resources/sounds/gravel/gravel2.ogg differ diff --git a/src/main/resources/sounds/gravel/gravel2.wav b/src/main/resources/sounds/gravel/gravel2.wav deleted file mode 100644 index 1bb2212..0000000 Binary files a/src/main/resources/sounds/gravel/gravel2.wav and /dev/null differ diff --git a/src/main/resources/sounds/gravel/gravel3.ogg b/src/main/resources/sounds/gravel/gravel3.ogg new file mode 100644 index 0000000..f019ab5 Binary files /dev/null and b/src/main/resources/sounds/gravel/gravel3.ogg differ diff --git a/src/main/resources/sounds/gravel/gravel3.wav b/src/main/resources/sounds/gravel/gravel3.wav deleted file mode 100644 index 071ae9d..0000000 Binary files a/src/main/resources/sounds/gravel/gravel3.wav and /dev/null differ diff --git a/src/main/resources/sounds/gravel/gravel4.ogg b/src/main/resources/sounds/gravel/gravel4.ogg new file mode 100644 index 0000000..3526136 Binary files /dev/null and b/src/main/resources/sounds/gravel/gravel4.ogg differ diff --git a/src/main/resources/sounds/gravel/gravel4.wav b/src/main/resources/sounds/gravel/gravel4.wav deleted file mode 100644 index df6964f..0000000 Binary files a/src/main/resources/sounds/gravel/gravel4.wav and /dev/null differ diff --git a/src/main/resources/sounds/gravel/step1.ogg b/src/main/resources/sounds/gravel/step1.ogg new file mode 100644 index 0000000..ea27e29 Binary files /dev/null and b/src/main/resources/sounds/gravel/step1.ogg differ diff --git a/src/main/resources/sounds/gravel/step1.wav b/src/main/resources/sounds/gravel/step1.wav deleted file mode 100644 index 7cd9200..0000000 Binary files a/src/main/resources/sounds/gravel/step1.wav and /dev/null differ diff --git a/src/main/resources/sounds/gravel/step2.ogg b/src/main/resources/sounds/gravel/step2.ogg new file mode 100644 index 0000000..584ba8e Binary files /dev/null and b/src/main/resources/sounds/gravel/step2.ogg differ diff --git a/src/main/resources/sounds/gravel/step2.wav b/src/main/resources/sounds/gravel/step2.wav deleted file mode 100644 index 2432f1a..0000000 Binary files a/src/main/resources/sounds/gravel/step2.wav and /dev/null differ diff --git a/src/main/resources/sounds/gravel/step3.ogg b/src/main/resources/sounds/gravel/step3.ogg new file mode 100644 index 0000000..39d79ce Binary files /dev/null and b/src/main/resources/sounds/gravel/step3.ogg differ diff --git a/src/main/resources/sounds/gravel/step3.wav b/src/main/resources/sounds/gravel/step3.wav deleted file mode 100644 index e4ed706..0000000 Binary files a/src/main/resources/sounds/gravel/step3.wav and /dev/null differ diff --git a/src/main/resources/sounds/gravel/step4.ogg b/src/main/resources/sounds/gravel/step4.ogg new file mode 100644 index 0000000..007dddc Binary files /dev/null and b/src/main/resources/sounds/gravel/step4.ogg differ diff --git a/src/main/resources/sounds/gravel/step4.wav b/src/main/resources/sounds/gravel/step4.wav deleted file mode 100644 index c7da4b6..0000000 Binary files a/src/main/resources/sounds/gravel/step4.wav and /dev/null differ