feat(sounds): Added some new sounds

This commit is contained in:
Jakub Žitník 2025-03-26 20:46:52 +01:00
parent 95e1e52205
commit c674663cc0
Signed by: jzitnik
GPG Key ID: C577A802A6AF4EF3
23 changed files with 111 additions and 18 deletions

@ -12,8 +12,10 @@ import cz.jzitnik.game.mobs.EntitySpawnProvider;
import cz.jzitnik.game.sprites.Breaking; import cz.jzitnik.game.sprites.Breaking;
import cz.jzitnik.game.sprites.Steve.SteveState; import cz.jzitnik.game.sprites.Steve.SteveState;
import cz.jzitnik.game.annotations.AutoTransient; import cz.jzitnik.game.annotations.AutoTransient;
import cz.jzitnik.game.annotations.WalkSound;
import cz.jzitnik.game.annotations.BreaksByPlace; import cz.jzitnik.game.annotations.BreaksByPlace;
import cz.jzitnik.game.annotations.MineSound; import cz.jzitnik.game.annotations.MineSound;
import cz.jzitnik.game.annotations.PlaceSound;
import cz.jzitnik.game.blocks.Chest; import cz.jzitnik.game.blocks.Chest;
import cz.jzitnik.game.blocks.Furnace; import cz.jzitnik.game.blocks.Furnace;
import cz.jzitnik.game.config.Configuration; import cz.jzitnik.game.config.Configuration;
@ -27,6 +29,7 @@ import cz.jzitnik.tui.ScreenMovingCalculationProvider;
import cz.jzitnik.tui.ScreenRenderer; import cz.jzitnik.tui.ScreenRenderer;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.jline.terminal.Terminal; import org.jline.terminal.Terminal;
import java.util.ArrayList; import java.util.ArrayList;
@ -93,6 +96,8 @@ public class Game extends AutoTransientSupport {
entitySpawnProvider.update(this, terminal); entitySpawnProvider.update(this, terminal);
playMovePlayerSound(cords[0] + 1, cords[1]);
update(screenRenderer); update(screenRenderer);
} }
@ -114,6 +119,8 @@ public class Game extends AutoTransientSupport {
entitySpawnProvider.update(this, terminal); entitySpawnProvider.update(this, terminal);
playMovePlayerSound(cords[0] - 1, cords[1]);
update(screenRenderer); update(screenRenderer);
} }
@ -275,6 +282,8 @@ public class Game extends AutoTransientSupport {
gameStates.dependencies.eventHandlerProvider.handleMine(screenRenderer, this, x, y); gameStates.dependencies.eventHandlerProvider.handleMine(screenRenderer, this, x, y);
screenRenderer.render(this);
for (Block block : blocksCopy) { for (Block block : blocksCopy) {
if (block.getClass().isAnnotationPresent(MineSound.class)) { if (block.getClass().isAnnotationPresent(MineSound.class)) {
var key = block.getClass().getAnnotation(MineSound.class).value(); var key = block.getClass().getAnnotation(MineSound.class).value();
@ -285,8 +294,6 @@ public class Game extends AutoTransientSupport {
} }
} }
screenRenderer.render(this);
update(screenRenderer); update(screenRenderer);
} }
@ -359,6 +366,9 @@ public class Game extends AutoTransientSupport {
ArrayList<Block> combinedList = new ArrayList<>(); ArrayList<Block> combinedList = new ArrayList<>();
combinedList.addAll(world[cords2[1]][cords2[0]]); combinedList.addAll(world[cords2[1]][cords2[0]]);
combinedList.addAll(world[cords2[1] + 1][cords2[0]]); combinedList.addAll(world[cords2[1] + 1][cords2[0]]);
if (player.getFallDistance() != 0) {
playMovePlayerSound(cords2[0], cords2[1]);
}
player.fell(combinedList, this, screenRenderer); player.fell(combinedList, this, screenRenderer);
screenRenderer.render(this); screenRenderer.render(this);
break; break;
@ -435,6 +445,11 @@ public class Game extends AutoTransientSupport {
.toList(); .toList();
if (placeHandler.place(this, x, y)) { if (placeHandler.place(this, x, y)) {
if (item.getClass().isAnnotationPresent(PlaceSound.class)) {
var key = item.getClass().getAnnotation(PlaceSound.class).value();
gameStates.dependencies.sound.playSound(configuration, key);
}
blocks.removeAll(blocksRemove); blocks.removeAll(blocksRemove);
gameStates.dependencies.eventHandlerProvider.handlePlace(screenRenderer, this, x, y); gameStates.dependencies.eventHandlerProvider.handlePlace(screenRenderer, this, x, y);
screenRenderer.render(this); screenRenderer.render(this);
@ -470,4 +485,16 @@ public class Game extends AutoTransientSupport {
screenRenderer.render(this); screenRenderer.render(this);
}).start(); }).start();
} }
private void playMovePlayerSound(int x, int y) {
var blocks = world[y+1][x];
for (Block block : blocks) {
if (block.getClass().isAnnotationPresent(WalkSound.class)) {
var key = block.getClass().getAnnotation(WalkSound.class).value();
gameStates.dependencies.sound.playSound(configuration, key);
}
}
}
} }

@ -0,0 +1,15 @@
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;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@RequireAnnotation(ItemRegistry.class)
public @interface PlaceSound {
SoundKey value();
}

@ -14,5 +14,5 @@ import java.lang.annotation.ElementType;
public @interface SoundRegistry { public @interface SoundRegistry {
SoundKey key(); SoundKey key();
SoundType type(); SoundType type();
String resourceLocation(); String[] resourceLocation();
} }

@ -0,0 +1,15 @@
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;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@RequireAnnotation(BlockRegistry.class)
public @interface WalkSound {
SoundKey value();
}

@ -2,9 +2,9 @@ package cz.jzitnik.game.core.sound;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Random;
import java.util.Set; import java.util.Set;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException; import javax.sound.sampled.UnsupportedAudioFileException;
@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
public class Sound { public class Sound {
private Random random = new Random();
private HashMap<SoundKey, SoundRegistry> map = new HashMap<>(); private HashMap<SoundKey, SoundRegistry> map = new HashMap<>();
public Sound() { public Sound() {
@ -41,7 +42,10 @@ public class Sound {
var annotation = map.get(soundKey); var annotation = map.get(soundKey);
try { try {
Clip clip = SoundPlayer.playSound(annotation.resourceLocation(), volume); var resources = annotation.resourceLocation();
var resource = resources[random.nextInt(resources.length)];
SoundPlayer.playSound(resource, volume);
} catch (LineUnavailableException | IOException | UnsupportedAudioFileException | InterruptedException e) { } catch (LineUnavailableException | IOException | UnsupportedAudioFileException | InterruptedException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();

@ -1,5 +1,6 @@
package cz.jzitnik.game.core.sound; package cz.jzitnik.game.core.sound;
public enum SoundKey { public enum SoundKey {
DIRT_MINE GRASS,
GRASS_WALKING
} }

@ -1,9 +0,0 @@
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.DIRT_MINE, resourceLocation = "dirt_mine.wav", type = SoundType.BLOCK)
public class DirtMineSound {
}

@ -0,0 +1,14 @@
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 = {
"dirt/grass1.wav",
"dirt/grass2.wav",
"dirt/grass3.wav",
"dirt/grass4.wav"
}, type = SoundType.BLOCK)
public class GrassSound {
}

@ -0,0 +1,16 @@
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 = {
"dirt/walk1.wav",
"dirt/walk2.wav",
"dirt/walk3.wav",
"dirt/walk4.wav",
"dirt/walk5.wav",
"dirt/walk6.wav",
}, type = SoundType.BLOCK)
public class GrassWalkingSound {
}

@ -2,16 +2,13 @@ package cz.jzitnik.game.entities.items.registry.blocks.blocks;
import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.annotations.BlockRegistry; import cz.jzitnik.game.annotations.BlockRegistry;
import cz.jzitnik.game.annotations.MineSound;
import cz.jzitnik.game.annotations.ResetDataOnMine; import cz.jzitnik.game.annotations.ResetDataOnMine;
import cz.jzitnik.game.core.sound.SoundKey;
import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.entities.items.ItemType; import cz.jzitnik.game.entities.items.ItemType;
import cz.jzitnik.game.logic.services.grass.GrassDirtData; import cz.jzitnik.game.logic.services.grass.GrassDirtData;
import java.util.ArrayList; import java.util.ArrayList;
@MineSound(SoundKey.DIRT_MINE)
@ResetDataOnMine @ResetDataOnMine
@BlockRegistry("dirt") @BlockRegistry("dirt")
public class DirtBlock extends Block { public class DirtBlock extends Block {

@ -2,13 +2,20 @@ package cz.jzitnik.game.entities.items.registry.blocks.blocks;
import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.annotations.BlockRegistry; import cz.jzitnik.game.annotations.BlockRegistry;
import cz.jzitnik.game.annotations.MineSound;
import cz.jzitnik.game.annotations.PlaceSound;
import cz.jzitnik.game.annotations.ResetDataOnMine; import cz.jzitnik.game.annotations.ResetDataOnMine;
import cz.jzitnik.game.annotations.WalkSound;
import cz.jzitnik.game.core.sound.SoundKey;
import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.entities.items.ItemType; import cz.jzitnik.game.entities.items.ItemType;
import cz.jzitnik.game.logic.services.grass.GrassDirtData; import cz.jzitnik.game.logic.services.grass.GrassDirtData;
import java.util.ArrayList; import java.util.ArrayList;
@MineSound(SoundKey.GRASS)
@PlaceSound(SoundKey.GRASS)
@WalkSound(SoundKey.GRASS_WALKING)
@ResetDataOnMine @ResetDataOnMine
@BlockRegistry(value = "grass", drops = "dirt") @BlockRegistry(value = "grass", drops = "dirt")
public class GrassBlock extends Block { public class GrassBlock extends Block {

@ -2,9 +2,12 @@ package cz.jzitnik.game.entities.items.registry.items.blocks;
import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.annotations.ItemRegistry; import cz.jzitnik.game.annotations.ItemRegistry;
import cz.jzitnik.game.annotations.PlaceSound;
import cz.jzitnik.game.core.sound.SoundKey;
import cz.jzitnik.game.entities.items.Item; import cz.jzitnik.game.entities.items.Item;
import cz.jzitnik.game.entities.items.ItemType; import cz.jzitnik.game.entities.items.ItemType;
@PlaceSound(SoundKey.DIRT)
@ItemRegistry("dirt") @ItemRegistry("dirt")
public class DirtItem extends Item { public class DirtItem extends Item {
public DirtItem() { public DirtItem() {

@ -2,9 +2,12 @@ package cz.jzitnik.game.entities.items.registry.items.blocks;
import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.annotations.ItemRegistry; import cz.jzitnik.game.annotations.ItemRegistry;
import cz.jzitnik.game.annotations.PlaceSound;
import cz.jzitnik.game.core.sound.SoundKey;
import cz.jzitnik.game.entities.items.Item; import cz.jzitnik.game.entities.items.Item;
import cz.jzitnik.game.entities.items.ItemType; import cz.jzitnik.game.entities.items.ItemType;
@PlaceSound(SoundKey.DIRT)
@ItemRegistry("grass") @ItemRegistry("grass")
public class GrassItem extends Item { public class GrassItem extends Item {
public GrassItem() { public GrassItem() {

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.