feat: Falling blocks
This commit is contained in:
@ -26,6 +26,7 @@ public class SpriteLoader {
|
||||
OAK_PLANKS,
|
||||
OAK_DOOR,
|
||||
OBSIDIAN,
|
||||
SAND,
|
||||
|
||||
// Flowers etc
|
||||
GRASS_BUSH,
|
||||
@ -78,6 +79,7 @@ public class SpriteLoader {
|
||||
ITEM_OAK_DOOR,
|
||||
ITEM_WOOL,
|
||||
ITEM_OBSIDIAN,
|
||||
ITEM_SAND,
|
||||
|
||||
// Ore Items
|
||||
ITEM_COAL_ORE,
|
||||
@ -172,6 +174,7 @@ public class SpriteLoader {
|
||||
SPRITES_MAP.put(SPRITES.WOOL, new Wool());
|
||||
SPRITES_MAP.put(SPRITES.COBBLESTONE, new SimpleSprite("cobblestone.ans"));
|
||||
SPRITES_MAP.put(SPRITES.OBSIDIAN, new SimpleSprite("obsidian.ans"));
|
||||
SPRITES_MAP.put(SPRITES.SAND, new SimpleSprite("sand.ans"));
|
||||
|
||||
// Flowers etc.
|
||||
SPRITES_MAP.put(SPRITES.GRASS_BUSH, new SimpleSprite("grass_bush.ans"));
|
||||
@ -224,6 +227,7 @@ public class SpriteLoader {
|
||||
SPRITES_MAP.put(SPRITES.ITEM_OAK_DOOR, new SimpleSprite("oak_door/items/oak_door.ans"));
|
||||
SPRITES_MAP.put(SPRITES.ITEM_WOOL, new WoolItem());
|
||||
SPRITES_MAP.put(SPRITES.ITEM_OBSIDIAN, new SimpleSprite("items/obsidian.ans"));
|
||||
SPRITES_MAP.put(SPRITES.ITEM_SAND, new SimpleSprite("items/sand.ans"));
|
||||
|
||||
// Ore Items
|
||||
SPRITES_MAP.put(SPRITES.ITEM_COAL_ORE, new SimpleSprite("items/coal_ore.ans"));
|
||||
|
11
src/main/java/cz/jzitnik/game/annotations/BreaksFalling.java
Normal file
11
src/main/java/cz/jzitnik/game/annotations/BreaksFalling.java
Normal file
@ -0,0 +1,11 @@
|
||||
package cz.jzitnik.game.annotations;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.lang.annotation.ElementType;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface BreaksFalling {
|
||||
}
|
11
src/main/java/cz/jzitnik/game/annotations/FallingBlock.java
Normal file
11
src/main/java/cz/jzitnik/game/annotations/FallingBlock.java
Normal file
@ -0,0 +1,11 @@
|
||||
package cz.jzitnik.game.annotations;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.lang.annotation.ElementType;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface FallingBlock {
|
||||
}
|
@ -4,12 +4,14 @@ import cz.jzitnik.game.SpriteLoader;
|
||||
import cz.jzitnik.game.annotations.BlockDropPercentage;
|
||||
import cz.jzitnik.game.annotations.BlockRegistry;
|
||||
import cz.jzitnik.game.annotations.BreakableByWater;
|
||||
import cz.jzitnik.game.annotations.BreaksFalling;
|
||||
import cz.jzitnik.game.annotations.CustomDrop;
|
||||
import cz.jzitnik.game.annotations.PlaceOnSolid;
|
||||
import cz.jzitnik.game.entities.Block;
|
||||
|
||||
@PlaceOnSolid
|
||||
@BreakableByWater
|
||||
@BreaksFalling
|
||||
@CustomDrop(tool = "shears", drops = "grass_bush")
|
||||
@BlockDropPercentage(13)
|
||||
@BlockRegistry(value = "grass_bush", drops = "wheat_seeds")
|
||||
|
@ -0,0 +1,17 @@
|
||||
package cz.jzitnik.game.entities.items.registry.blocks;
|
||||
|
||||
import cz.jzitnik.game.SpriteLoader;
|
||||
import cz.jzitnik.game.annotations.BlockRegistry;
|
||||
import cz.jzitnik.game.annotations.FallingBlock;
|
||||
import cz.jzitnik.game.entities.Block;
|
||||
import cz.jzitnik.game.entities.items.ItemType;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@FallingBlock
|
||||
@BlockRegistry("sand")
|
||||
public class SandBlock extends Block {
|
||||
public SandBlock() {
|
||||
super("sand", SpriteLoader.SPRITES.SAND, 1, ItemType.SHOVEL, new ArrayList<>());
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package cz.jzitnik.game.entities.items.registry.items;
|
||||
|
||||
import cz.jzitnik.game.SpriteLoader;
|
||||
import cz.jzitnik.game.annotations.ItemRegistry;
|
||||
import cz.jzitnik.game.entities.items.Item;
|
||||
import cz.jzitnik.game.entities.items.ItemType;
|
||||
|
||||
@ItemRegistry("sand")
|
||||
public class SandItem extends Item {
|
||||
public SandItem() {
|
||||
super("sand", "Sand", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_SAND);
|
||||
}
|
||||
}
|
@ -3,7 +3,6 @@ package cz.jzitnik.game.generation;
|
||||
import cz.jzitnik.game.entities.Block;
|
||||
import cz.jzitnik.game.Game;
|
||||
import cz.jzitnik.game.SpriteLoader;
|
||||
import cz.jzitnik.game.entities.items.ItemBlockSupplier;
|
||||
import cz.jzitnik.game.sprites.Steve;
|
||||
|
||||
import java.util.List;
|
||||
@ -33,9 +32,6 @@ public class Generation {
|
||||
// Spawn player at a valid starting point
|
||||
world[terrainHeight[256] - 1][256].add(steveBlock2);
|
||||
world[terrainHeight[256] - 2][256].add(steveBlock);
|
||||
|
||||
game.getInventory().addItem(ItemBlockSupplier.getItem("water_bucket"));
|
||||
game.getInventory().addItem(ItemBlockSupplier.getItem("lava_bucket"));
|
||||
}
|
||||
|
||||
private static void initializeWorld(List<Block>[][] world) {
|
||||
|
@ -0,0 +1,50 @@
|
||||
package cz.jzitnik.game.logic.services.falling;
|
||||
|
||||
import cz.jzitnik.game.Game;
|
||||
import cz.jzitnik.game.annotations.BreaksFalling;
|
||||
import cz.jzitnik.game.annotations.CustomLogic;
|
||||
import cz.jzitnik.game.annotations.FallingBlock;
|
||||
import cz.jzitnik.game.entities.Block;
|
||||
import cz.jzitnik.game.logic.CustomLogicInterface;
|
||||
|
||||
@CustomLogic
|
||||
public class FallingLogic implements CustomLogicInterface {
|
||||
private static final int RADIUS = 30;
|
||||
|
||||
@Override
|
||||
public void nextIteration(Game game) {
|
||||
var world = game.getWorld();
|
||||
int[] data = game.getPlayerCords();
|
||||
int playerX = data[0];
|
||||
int playerY = data[1];
|
||||
|
||||
int startX = Math.max(0, playerX - RADIUS);
|
||||
int startY = Math.max(0, playerY - RADIUS);
|
||||
int endX = Math.min(world[0].length - 1, playerX + RADIUS);
|
||||
int endY = Math.min(world.length - 1, playerY + RADIUS);
|
||||
|
||||
for (int y = startY; y <= endY; y++) {
|
||||
for (int x = startX; x <= endX; x++) {
|
||||
var blocks = world[y][x];
|
||||
|
||||
if (world[y+1][x].stream().anyMatch(block -> block.getClass().isAnnotationPresent(BreaksFalling.class))) {
|
||||
var fallingBlocks = blocks.stream().filter(block -> block.getClass().isAnnotationPresent(FallingBlock.class)).toList();
|
||||
for (Block block : fallingBlocks) {
|
||||
blocks.remove(block);
|
||||
game.getInventory().addItem(block.getDrops());
|
||||
}
|
||||
}
|
||||
|
||||
if (!world[y+1][x].stream().allMatch(block -> block.isGhost())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var fallingBlocks = blocks.stream().filter(block -> block.getClass().isAnnotationPresent(FallingBlock.class)).toList();
|
||||
for (Block block : fallingBlocks) {
|
||||
blocks.remove(block);
|
||||
world[y + 1][x].add(block);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user