diff --git a/src/client/java/minicraft/core/Renderer.java b/src/client/java/minicraft/core/Renderer.java index 8d92bab9d..a4004bcbd 100644 --- a/src/client/java/minicraft/core/Renderer.java +++ b/src/client/java/minicraft/core/Renderer.java @@ -16,9 +16,8 @@ import minicraft.gfx.MinicraftImage; import minicraft.gfx.Point; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Items; import minicraft.item.PotionType; import minicraft.item.ToolItem; @@ -55,6 +54,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; public class Renderer extends Game { private Renderer() { @@ -65,7 +65,7 @@ private Renderer() { static float SCALE = 3; public static Screen screen; // Creates the main screen - public static SpriteLinker spriteLinker = new SpriteLinker(); // The sprite linker for sprites + public static final SpriteManager spriteManager = new SpriteManager(); // The sprite linker for sprites static Canvas canvas = new Canvas(); private static BufferedImage image; // Creates an image to be displayed on the screen. @@ -80,8 +80,6 @@ private Renderer() { private static int potionRenderOffset = 0; - private static LinkedSprite hudSheet; - public static MinicraftImage loadDefaultSkinSheet() { MinicraftImage skinsSheet; try { @@ -105,11 +103,13 @@ public static void initScreen() { screen = new Screen(image); //lightScreen = new Screen(); - hudSheet = new LinkedSprite(SpriteType.Gui, "hud"); - canvas.createBufferStrategy(3); } + private static MinicraftImage getHudSheet() { + return Renderer.spriteManager.getSheet(SpriteType.Gui, "hud"); + } + /** * Renders the current screen. Called in game loop, a bit after tick(). @@ -199,7 +199,7 @@ private static void renderLevel() { if (xScroll > (level.w << 4) - Screen.w) xScroll = (level.w << 4) - Screen.w; // ...Right border. if (yScroll > (level.h << 4) - Screen.h) yScroll = (level.h << 4) - Screen.h; // ...Bottom border. if (currentLevel > 3) { // If the current level is higher than 3 (which only the sky level (and dungeon) is) - MinicraftImage cloud = spriteLinker.getSheet(SpriteType.Tile, "cloud_background"); + MinicraftImage cloud = spriteManager.getSheet(SpriteType.Tile, "cloud_background"); for (int y = 0; y < 28; y++) for (int x = 0; x < 48; x++) { // Creates the background for the sky (and dungeon) level: @@ -223,10 +223,11 @@ private static void renderLevel() { * Renders the main game GUI (hearts, Stamina bolts, name of the current item, etc.) */ private static void renderGui() { + MinicraftImage hudSheet = getHudSheet(); // This draws the black square where the selected item would be if you were holding it if (!isMode("minicraft.settings.mode.creative") || player.activeItem != null) { for (int x = 10; x < 26; x++) { - screen.render(x * 8, Screen.h - 8, 5, 2, 0, hudSheet.getSheet()); + screen.render(x * 8, Screen.h - 8, 5, 2, 0, hudSheet); } } @@ -246,7 +247,7 @@ private static void renderGui() { else Font.drawBackground(" x" + ac, screen, 84, Screen.h - 16); // Displays the arrow icon - screen.render(10 * 8 + 4, Screen.h - 16, 4, 1, 0, hudSheet.getSheet()); + screen.render(10 * 8 + 4, Screen.h - 16, 4, 1, 0, hudSheet); } } @@ -364,16 +365,16 @@ private static void renderGui() { for (int i = 1; i <= 30; i++) { // Renders your current red default hearts, golden hearts for 20 HP, obsidian hearts for 30 HP, or black hearts for damaged health. if (i < 11) { - screen.render((i - 1) * 8, Screen.h - 16, 0, 1, 0, hudSheet.getSheet()); // Empty Hearts + screen.render((i - 1) * 8, Screen.h - 16, 0, 1, 0, hudSheet); // Empty Hearts } if (i < player.health + 1 && i < 11) { - screen.render((i - 1) * 8, Screen.h - 16, 0, 0, 0, hudSheet.getSheet()); // Red Hearts + screen.render((i - 1) * 8, Screen.h - 16, 0, 0, 0, hudSheet); // Red Hearts } if (i < player.health + 1 && i < 21 && i >= 11) { - screen.render((i - 11) * 8, Screen.h - 16, 0, 2, 0, hudSheet.getSheet()); // Yellow Hearts + screen.render((i - 11) * 8, Screen.h - 16, 0, 2, 0, hudSheet); // Yellow Hearts } if (i < player.health + 1 && i >= 21) { - screen.render((i - 21) * 8, Screen.h - 16, 0, 3, 0, hudSheet.getSheet()); // Obsidian Hearts + screen.render((i - 21) * 8, Screen.h - 16, 0, 3, 0, hudSheet); // Obsidian Hearts } } for (int i = 0; i < Player.maxStat; i++) { @@ -387,24 +388,24 @@ private static void renderGui() { if (player.staminaRechargeDelay > 0) { // Creates the white/gray blinking effect when you run out of stamina. if (player.staminaRechargeDelay / 4 % 2 == 0) { - screen.render(i * 8, Screen.h - 8, 1, 2, 0, hudSheet.getSheet()); + screen.render(i * 8, Screen.h - 8, 1, 2, 0, hudSheet); } else { - screen.render(i * 8, Screen.h - 8, 1, 1, 0, hudSheet.getSheet()); + screen.render(i * 8, Screen.h - 8, 1, 1, 0, hudSheet); } } else { // Renders your current stamina, and uncharged gray stamina. if (i < player.stamina) { - screen.render(i * 8, Screen.h - 8, 1, 0, 0, hudSheet.getSheet()); + screen.render(i * 8, Screen.h - 8, 1, 0, 0, hudSheet); } else { - screen.render(i * 8, Screen.h - 8, 1, 1, 0, hudSheet.getSheet()); + screen.render(i * 8, Screen.h - 8, 1, 1, 0, hudSheet); } } // Renders hunger if (i < player.hunger) { - screen.render(i * 8 + (Screen.w - 80), Screen.h - 16, 2, 0, 0, hudSheet.getSheet()); + screen.render(i * 8 + (Screen.w - 80), Screen.h - 16, 2, 0, 0, hudSheet); } else { - screen.render(i * 8 + (Screen.w - 80), Screen.h - 16, 2, 1, 0, hudSheet.getSheet()); + screen.render(i * 8 + (Screen.w - 80), Screen.h - 16, 2, 1, 0, hudSheet); } } } @@ -437,21 +438,22 @@ public static void renderBossbar(int length, String title) { int INACTIVE_BOSSBAR = 4; // sprite x position int ACTIVE_BOSSBAR = 5; // sprite x position + MinicraftImage hudSheet = getHudSheet(); - screen.render(x + (max_bar_length * 2), y, 0, INACTIVE_BOSSBAR, 1, hudSheet.getSheet()); // left corner + screen.render(x + (max_bar_length * 2), y, 0, INACTIVE_BOSSBAR, 1, hudSheet); // left corner // The middle for (int bx = 0; bx < max_bar_length; bx++) { for (int by = 0; by < 1; by++) { - screen.render(x + bx * 2, y + by * 8, 3, INACTIVE_BOSSBAR, 0, hudSheet.getSheet()); + screen.render(x + bx * 2, y + by * 8, 3, INACTIVE_BOSSBAR, 0, hudSheet); } } - screen.render(x - 5, y, 0, ACTIVE_BOSSBAR, 0, hudSheet.getSheet()); // right corner + screen.render(x - 5, y, 0, ACTIVE_BOSSBAR, 0, hudSheet); // right corner for (int bx = 0; bx < bar_length; bx++) { for (int by = 0; by < 1; by++) { - screen.render(x + bx * 2, y + by * 8, 3, ACTIVE_BOSSBAR, 0, hudSheet.getSheet()); + screen.render(x + bx * 2, y + by * 8, 3, ACTIVE_BOSSBAR, 0, hudSheet); } } @@ -551,26 +553,27 @@ private static void renderFocusNagger() { int yy = (HEIGHT - 8) / 2; // The height of the box int w = msg.length(); // Length of message in characters. int h = 1; + MinicraftImage hudSheet = getHudSheet(); // Renders the four corners of the box - screen.render(xx - 8, yy - 8, 0, 6, 0, hudSheet.getSheet()); - screen.render(xx + w * 8, yy - 8, 0, 6, 1, hudSheet.getSheet()); - screen.render(xx - 8, yy + 8, 0, 6, 2, hudSheet.getSheet()); - screen.render(xx + w * 8, yy + 8, 0, 6, 3, hudSheet.getSheet()); + screen.render(xx - 8, yy - 8, 0, 6, 0, hudSheet); + screen.render(xx + w * 8, yy - 8, 0, 6, 1, hudSheet); + screen.render(xx - 8, yy + 8, 0, 6, 2, hudSheet); + screen.render(xx + w * 8, yy + 8, 0, 6, 3, hudSheet); // Renders each part of the box... for (int x = 0; x < w; x++) { - screen.render(xx + x * 8, yy - 8, 1, 6, 0, hudSheet.getSheet()); // ...Top part - screen.render(xx + x * 8, yy + 8, 1, 6, 2, hudSheet.getSheet()); // ...Bottom part + screen.render(xx + x * 8, yy - 8, 1, 6, 0, hudSheet); // ...Top part + screen.render(xx + x * 8, yy + 8, 1, 6, 2, hudSheet); // ...Bottom part } for (int y = 0; y < h; y++) { - screen.render(xx - 8, yy + y * 8, 2, 6, 0, hudSheet.getSheet()); // ...Left part - screen.render(xx + w * 8, yy + y * 8, 2, 6, 1, hudSheet.getSheet()); // ...Right part + screen.render(xx - 8, yy + y * 8, 2, 6, 0, hudSheet); // ...Left part + screen.render(xx + w * 8, yy + y * 8, 2, 6, 1, hudSheet); // ...Right part } // The middle for (int x = 0; x < w; x++) { - screen.render(xx + x * 8, yy, 3, 6, 0, hudSheet.getSheet()); + screen.render(xx + x * 8, yy, 3, 6, 0, hudSheet); } // Renders the focus nagger text with a flash effect... diff --git a/src/client/java/minicraft/entity/Arrow.java b/src/client/java/minicraft/entity/Arrow.java index 8b565c286..8ef095511 100644 --- a/src/client/java/minicraft/entity/Arrow.java +++ b/src/client/java/minicraft/entity/Arrow.java @@ -5,20 +5,30 @@ import minicraft.gfx.Color; import minicraft.gfx.Rectangle; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; -import minicraft.util.Logging; - -import javax.security.auth.DestroyFailedException; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import java.util.List; public class Arrow extends Entity implements ClientTickable { + private static final SpriteLink spriteRight; + private static final SpriteLink spriteLeft; + private static final SpriteLink spriteUp; + private static final SpriteLink spriteDown; + + static { + SpriteLink.SpriteLinkBuilder builder = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "arrow").setSpriteSize(1, 1); + spriteRight = builder.setSpritePos(0, 0).createSpriteLink(); + spriteLeft = builder.setSpritePos(1, 0).createSpriteLink(); + spriteUp = builder.setSpritePos(2, 0).createSpriteLink(); + spriteDown = builder.setSpritePos(3, 0).createSpriteLink(); + } + private Direction dir; private int damage; public Mob owner; private int speed; - private LinkedSprite sprite = new LinkedSprite(SpriteType.Entity, "arrow").setSpriteSize(1, 1); + private final SpriteLink sprite; public Arrow(Mob owner, Direction dir, int dmg) { this(owner, owner.x, owner.y, dir, dmg); @@ -34,11 +44,12 @@ public Arrow(Mob owner, int x, int y, Direction dir, int dmg) { damage = dmg; col = Color.get(-1, 111, 222, 430); - int xt = 0; - if (dir == Direction.LEFT) xt = 1; - if (dir == Direction.UP) xt = 2; - if (dir == Direction.DOWN) xt = 3; - sprite.setSpritePos(xt, 0); + switch (dir) { + case UP: sprite = spriteUp; break; + case DOWN: sprite = spriteDown; break; + case LEFT: sprite = spriteLeft; break; + case RIGHT: default: sprite = spriteRight; break; + } if (damage > 3) speed = 8; else if (damage >= 0) speed = 7; @@ -79,11 +90,6 @@ public void tick() { && !level.getTile(x >> 4, y >> 4).connectsToFluid(level, x >> 4, y >> 4) && level.getTile(x >> 4, y >> 4).id != 16) { this.remove(); - try { - sprite.destroy(); - } catch (DestroyFailedException e) { - Logging.SPRITE.trace(e); - } } } } diff --git a/src/client/java/minicraft/entity/FireSpark.java b/src/client/java/minicraft/entity/FireSpark.java index 6a67764de..7532a9a44 100644 --- a/src/client/java/minicraft/entity/FireSpark.java +++ b/src/client/java/minicraft/entity/FireSpark.java @@ -5,10 +5,11 @@ import minicraft.entity.mob.Player; import minicraft.gfx.Color; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; public class FireSpark extends Entity { - private static final SpriteLinker.LinkedSprite sprite = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "spark"); + private static final SpriteManager.SpriteLink sprite = + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "spark").createSpriteLink(); private final int lifeTime; // How much time until the spark disappears private final double xa, ya; // The x and y acceleration diff --git a/src/client/java/minicraft/entity/Spark.java b/src/client/java/minicraft/entity/Spark.java index 049d45d88..e451be5f3 100644 --- a/src/client/java/minicraft/entity/Spark.java +++ b/src/client/java/minicraft/entity/Spark.java @@ -5,8 +5,8 @@ import minicraft.entity.mob.Player; import minicraft.gfx.Color; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; public class Spark extends Entity { private final int lifeTime; // How much time until the spark disappears @@ -15,7 +15,7 @@ public class Spark extends Entity { private double xx, yy; // The x and y positions private int time; // The amount of time that has passed private final AirWizard owner; // The AirWizard that created this spark - private LinkedSprite sprite = new LinkedSprite(SpriteType.Entity, "spark"); + private final SpriteLink sprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "spark").createSpriteLink(); /** * Creates a new spark. Owner is the AirWizard which is spawning this spark. @@ -77,9 +77,8 @@ public void render(Screen screen) { randmirror = random.nextInt(4); } - sprite.setMirror(randmirror); screen.render(x - 4, y - 4 + 2, sprite.getSprite(), 0, false, Color.BLACK); // renders the shadow on the ground - screen.render(x - 4, y - 4 - 2, sprite); // Renders the spark + screen.render(x - 4, y - 4 - 2, sprite.getSprite(), randmirror, false); // Renders the spark } /** diff --git a/src/client/java/minicraft/entity/furniture/Bed.java b/src/client/java/minicraft/entity/furniture/Bed.java index d385e937a..c6b9d6d30 100644 --- a/src/client/java/minicraft/entity/furniture/Bed.java +++ b/src/client/java/minicraft/entity/furniture/Bed.java @@ -5,8 +5,8 @@ import minicraft.core.io.Localization; import minicraft.entity.mob.Player; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.DyeItem; import minicraft.level.Level; import minicraft.util.MyUtils; @@ -16,8 +16,8 @@ public class Bed extends Furniture { - private static final HashMap sprites = new HashMap<>(); - private static final HashMap itemSprites = new HashMap<>(); + private static final HashMap sprites = new HashMap<>(); + private static final HashMap itemSprites = new HashMap<>(); @Override public @NotNull Furniture copy() { @@ -26,8 +26,10 @@ public class Bed extends Furniture { static { for (DyeItem.DyeColor color : DyeItem.DyeColor.values()) { - sprites.put(color, new LinkedSprite(SpriteType.Entity, color.toString().toLowerCase() + "_bed")); - itemSprites.put(color, new LinkedSprite(SpriteType.Item, color.toString().toLowerCase() + "_bed")); + sprites.put(color, new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, + color.toString().toLowerCase() + "_bed").createSpriteLink()); + itemSprites.put(color, new SpriteLink.SpriteLinkBuilder(SpriteType.Item, + color.toString().toLowerCase() + "_bed").createSpriteLink()); } } diff --git a/src/client/java/minicraft/entity/furniture/Chest.java b/src/client/java/minicraft/entity/furniture/Chest.java index bba338890..19e681abc 100644 --- a/src/client/java/minicraft/entity/furniture/Chest.java +++ b/src/client/java/minicraft/entity/furniture/Chest.java @@ -5,8 +5,8 @@ import minicraft.entity.Direction; import minicraft.entity.ItemHolder; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Inventory; import minicraft.item.Item; import minicraft.item.Items; @@ -26,15 +26,14 @@ public Chest() { } public Chest(String name) { - this(name, new LinkedSprite(SpriteType.Item, "chest")); + this(name, new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "chest").createSpriteLink()); } - /** * Creates a chest with a custom name. * @param name Name of chest. */ - public Chest(String name, LinkedSprite itemSprite) { - super(name, new LinkedSprite(SpriteType.Entity, "chest"), itemSprite, 3, 3); // Name of the chest + public Chest(String name, SpriteLink itemSprite) { + super(name, new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "chest").createSpriteLink(), itemSprite, 3, 3); // Name of the chest inventory = new Inventory(); // Initialize the inventory. } diff --git a/src/client/java/minicraft/entity/furniture/Composter.java b/src/client/java/minicraft/entity/furniture/Composter.java index 079d90795..673d6bf1b 100644 --- a/src/client/java/minicraft/entity/furniture/Composter.java +++ b/src/client/java/minicraft/entity/furniture/Composter.java @@ -2,17 +2,21 @@ import minicraft.entity.Direction; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.StackableItem; import org.jetbrains.annotations.Nullable; public class Composter extends Furniture { - private static final SpriteLinker.LinkedSprite sprite = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "composter"); - private static final SpriteLinker.LinkedSprite spriteFilled = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "composter_filled"); - private static final SpriteLinker.LinkedSprite spriteFull = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "composter_full"); - private static final SpriteLinker.LinkedSprite itemSprite = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Item, "composter"); + private static final SpriteManager.SpriteLink sprite = + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "composter").createSpriteLink(); + private static final SpriteManager.SpriteLink spriteFilled = + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "composter_filled").createSpriteLink(); + private static final SpriteManager.SpriteLink spriteFull = + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "composter_full").createSpriteLink(); + private static final SpriteManager.SpriteLink itemSprite = + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Item, "composter").createSpriteLink(); private static final int MAX_COMPOST = 7; private int compost = 0; diff --git a/src/client/java/minicraft/entity/furniture/Crafter.java b/src/client/java/minicraft/entity/furniture/Crafter.java index a3e2af5f2..a6ad15442 100644 --- a/src/client/java/minicraft/entity/furniture/Crafter.java +++ b/src/client/java/minicraft/entity/furniture/Crafter.java @@ -2,8 +2,8 @@ import minicraft.core.Game; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Recipe; import minicraft.item.Recipes; import minicraft.screen.CraftingDisplay; @@ -14,20 +14,27 @@ public class Crafter extends Furniture { public enum Type { - Workbench(new LinkedSprite(SpriteType.Entity, "workbench"), new LinkedSprite(SpriteType.Item, "workbench"), 3, 2, Recipes.workbenchRecipes), - Oven(new LinkedSprite(SpriteType.Entity, "oven"), new LinkedSprite(SpriteType.Item, "oven"), 3, 2, Recipes.ovenRecipes), - Furnace(new LinkedSprite(SpriteType.Entity, "furnace"), new LinkedSprite(SpriteType.Item, "furnace"), 3, 2, Recipes.furnaceRecipes), - Anvil(new LinkedSprite(SpriteType.Entity, "anvil"), new LinkedSprite(SpriteType.Item, "anvil"), 3, 2, Recipes.anvilRecipes), - Enchanter(new LinkedSprite(SpriteType.Entity, "enchanter"), new LinkedSprite(SpriteType.Item, "enchanter"), 7, 2, Recipes.enchantRecipes), - Loom(new LinkedSprite(SpriteType.Entity, "loom"), new LinkedSprite(SpriteType.Item, "loom"), 7, 2, Recipes.loomRecipes), - DyeVat(new LinkedSprite(SpriteType.Entity, "dyevat"), new LinkedSprite(SpriteType.Item, "dyevat"), 0, 0, Recipes.dyeVatRecipes); + Workbench(new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "workbench").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "workbench").createSpriteLink(), 3, 2, Recipes.workbenchRecipes), + Oven(new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "oven").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "oven").createSpriteLink(), 3, 2, Recipes.ovenRecipes), + Furnace(new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "furnace").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "furnace").createSpriteLink(), 3, 2, Recipes.furnaceRecipes), + Anvil(new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "anvil").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "anvil").createSpriteLink(), 3, 2, Recipes.anvilRecipes), + Enchanter(new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "enchanter").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "enchanter").createSpriteLink(), 7, 2, Recipes.enchantRecipes), + Loom(new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "loom").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "loom").createSpriteLink(), 7, 2, Recipes.loomRecipes), + DyeVat(new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "dyevat").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "dyevat").createSpriteLink(), 0, 0, Recipes.dyeVatRecipes); public ArrayList recipes; - protected LinkedSprite sprite; - protected LinkedSprite itemSprite; + protected SpriteLink sprite; + protected SpriteLink itemSprite; protected int xr, yr; - Type(LinkedSprite sprite, LinkedSprite itemSprite, int xr, int yr, ArrayList list) { + Type(SpriteLink sprite, SpriteLink itemSprite, int xr, int yr, ArrayList list) { this.sprite = sprite; this.itemSprite = itemSprite; this.xr = xr; diff --git a/src/client/java/minicraft/entity/furniture/DeathChest.java b/src/client/java/minicraft/entity/furniture/DeathChest.java index a1fb4d030..1eab3be1c 100644 --- a/src/client/java/minicraft/entity/furniture/DeathChest.java +++ b/src/client/java/minicraft/entity/furniture/DeathChest.java @@ -9,15 +9,15 @@ import minicraft.gfx.Color; import minicraft.gfx.Font; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Inventory; import minicraft.item.Item; import minicraft.item.StackableItem; public class DeathChest extends Chest { - private static LinkedSprite normalSprite = new LinkedSprite(SpriteType.Entity, "chest"); - private static LinkedSprite redSprite = new LinkedSprite(SpriteType.Entity, "red_chest"); + private static SpriteLink normalSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "chest").createSpriteLink(); + private static SpriteLink redSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "red_chest").createSpriteLink(); public int time; // Time passed (used for death chest despawn) private int redtick = 0; //This is used to determine the shade of red when the chest is about to expire. @@ -30,7 +30,7 @@ public class DeathChest extends Chest { * Creates a custom chest with the name Death Chest */ public DeathChest() { - super("Death Chest", new LinkedSprite(SpriteType.Item, "dungeon_chest")); + super("Death Chest", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "dungeon_chest").createSpriteLink()); this.sprite = normalSprite; /// Set the expiration time based on the world difficulty. diff --git a/src/client/java/minicraft/entity/furniture/DungeonChest.java b/src/client/java/minicraft/entity/furniture/DungeonChest.java index faf63c717..91481362f 100644 --- a/src/client/java/minicraft/entity/furniture/DungeonChest.java +++ b/src/client/java/minicraft/entity/furniture/DungeonChest.java @@ -7,8 +7,8 @@ import minicraft.entity.particle.SmashParticle; import minicraft.entity.particle.TextParticle; import minicraft.gfx.Color; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.StackableItem; @@ -18,8 +18,8 @@ import java.util.Random; public class DungeonChest extends Chest { - private static final LinkedSprite openSprite = new LinkedSprite(SpriteType.Entity, "dungeon_chest"); - private static final LinkedSprite lockSprite = new LinkedSprite(SpriteType.Entity, "white_chest"); + private static final SpriteLink openSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "dungeon_chest").createSpriteLink(); + private static final SpriteLink lockSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "white_chest").createSpriteLink(); private boolean isLocked; diff --git a/src/client/java/minicraft/entity/furniture/Furniture.java b/src/client/java/minicraft/entity/furniture/Furniture.java index 2f0cc22a8..c1a69f485 100644 --- a/src/client/java/minicraft/entity/furniture/Furniture.java +++ b/src/client/java/minicraft/entity/furniture/Furniture.java @@ -5,7 +5,7 @@ import minicraft.entity.Entity; import minicraft.entity.mob.Player; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.FurnitureItem; import minicraft.item.Item; import minicraft.item.PowerGloveItem; @@ -20,8 +20,8 @@ public class Furniture extends Entity { protected int pushTime = 0, multiPushTime = 0; // Time for each push; multi is for multiplayer, to make it so not so many updates are sent. private Direction pushDir = Direction.NONE; // The direction to push the furniture - public LinkedSprite sprite; - public LinkedSprite itemSprite; + public SpriteLink sprite; + public SpriteLink itemSprite; public String name; /** @@ -30,7 +30,7 @@ public class Furniture extends Entity { * @param name Name of the furniture. * @param sprite Furniture sprite. */ - public Furniture(String name, LinkedSprite sprite, LinkedSprite itemSprite) { + public Furniture(String name, SpriteLink sprite, SpriteLink itemSprite) { this(name, sprite, itemSprite, 3, 3); } @@ -42,7 +42,7 @@ public Furniture(String name, LinkedSprite sprite, LinkedSprite itemSprite) { * @param xr Horizontal radius. * @param yr Vertical radius. */ - public Furniture(String name, LinkedSprite sprite, LinkedSprite itemSprite, int xr, int yr) { + public Furniture(String name, SpriteLink sprite, SpriteLink itemSprite, int xr, int yr) { // All of these are 2x2 on the spritesheet; radius is for collisions only. super(xr, yr); this.name = name; diff --git a/src/client/java/minicraft/entity/furniture/KnightStatue.java b/src/client/java/minicraft/entity/furniture/KnightStatue.java index e2a6f5219..e498a6b7f 100644 --- a/src/client/java/minicraft/entity/furniture/KnightStatue.java +++ b/src/client/java/minicraft/entity/furniture/KnightStatue.java @@ -5,7 +5,7 @@ import minicraft.entity.Direction; import minicraft.entity.mob.ObsidianKnight; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.item.Item; import org.jetbrains.annotations.NotNull; @@ -14,7 +14,8 @@ public class KnightStatue extends Furniture { private final int bossHealth; public KnightStatue(int health) { - super("KnightStatue", new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "knight_statue"), new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Item, "knight_statue"), 3, 2); + super("KnightStatue", new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "knight_statue").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Item, "knight_statue").createSpriteLink(), 3, 2); bossHealth = health; } diff --git a/src/client/java/minicraft/entity/furniture/Lantern.java b/src/client/java/minicraft/entity/furniture/Lantern.java index 664a63e5a..1891aabdb 100644 --- a/src/client/java/minicraft/entity/furniture/Lantern.java +++ b/src/client/java/minicraft/entity/furniture/Lantern.java @@ -1,7 +1,7 @@ package minicraft.entity.furniture; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import org.jetbrains.annotations.NotNull; public class Lantern extends Furniture { @@ -27,9 +27,9 @@ public enum Type { * @param type Type of lantern. */ public Lantern(Lantern.Type type) { - super(type.title, new LinkedSprite(SpriteType.Entity, type == Type.NORM ? "lantern" : - type == Type.IRON ? "iron_lantern" : "gold_lantern"), new LinkedSprite(SpriteType.Item, type == Type.NORM ? "lantern" : - type == Type.IRON ? "iron_lantern" : "gold_lantern"), 3, 2); + super(type.title, new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, type == Type.NORM ? "lantern" : + type == Type.IRON ? "iron_lantern" : "gold_lantern").createSpriteLink(), new SpriteLink.SpriteLinkBuilder(SpriteType.Item, type == Type.NORM ? "lantern" : + type == Type.IRON ? "iron_lantern" : "gold_lantern").createSpriteLink(), 3, 2); this.type = type; } diff --git a/src/client/java/minicraft/entity/furniture/Spawner.java b/src/client/java/minicraft/entity/furniture/Spawner.java index 3a9f74479..8763e883d 100644 --- a/src/client/java/minicraft/entity/furniture/Spawner.java +++ b/src/client/java/minicraft/entity/furniture/Spawner.java @@ -20,8 +20,8 @@ import minicraft.entity.particle.TextParticle; import minicraft.gfx.Color; import minicraft.gfx.Point; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.FurnitureItem; import minicraft.item.Item; import minicraft.item.PotionType; @@ -72,16 +72,17 @@ private void initMob(MobAi m) { * @param m Mob which will be spawned. */ public Spawner(MobAi m) { - super(getClassName(m.getClass()) + " Spawner", new LinkedSprite(SpriteType.Entity, "spawner"), m instanceof Cow ? new LinkedSprite(SpriteType.Item, "cow_spawner") : - m instanceof Pig ? new LinkedSprite(SpriteType.Item, "pig_spawner") : - m instanceof Sheep ? new LinkedSprite(SpriteType.Item, "sheep_spawner") : - m instanceof Slime ? new LinkedSprite(SpriteType.Item, "slime_spawner") : - m instanceof Zombie ? new LinkedSprite(SpriteType.Item, "zombie_spawner") : - m instanceof Creeper ? new LinkedSprite(SpriteType.Item, "creeper_spawner") : - m instanceof Skeleton ? new LinkedSprite(SpriteType.Item, "skeleton_spawner") : - m instanceof Snake ? new LinkedSprite(SpriteType.Item, "snake_spawner") : - m instanceof Knight ? new LinkedSprite(SpriteType.Item, "knight_spawner") : - new LinkedSprite(SpriteType.Item, "air_wizard_spawner"), 7, 2); + super(getClassName(m.getClass()) + " Spawner", new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "spawner").createSpriteLink(), + m instanceof Cow ? new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "cow_spawner") .createSpriteLink(): + m instanceof Pig ? new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "pig_spawner") .createSpriteLink(): + m instanceof Sheep ? new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "sheep_spawner") .createSpriteLink(): + m instanceof Slime ? new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "slime_spawner") .createSpriteLink(): + m instanceof Zombie ? new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "zombie_spawner") .createSpriteLink(): + m instanceof Creeper ? new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "creeper_spawner") .createSpriteLink(): + m instanceof Skeleton ? new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "skeleton_spawner") .createSpriteLink(): + m instanceof Snake ? new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "snake_spawner") .createSpriteLink(): + m instanceof Knight ? new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "knight_spawner") .createSpriteLink(): + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "air_wizard_spawner").createSpriteLink(), 7, 2); health = 100; initMob(m); resetSpawnInterval(); diff --git a/src/client/java/minicraft/entity/furniture/Tnt.java b/src/client/java/minicraft/entity/furniture/Tnt.java index de02d17c7..dfe739c6e 100644 --- a/src/client/java/minicraft/entity/furniture/Tnt.java +++ b/src/client/java/minicraft/entity/furniture/Tnt.java @@ -9,8 +9,8 @@ import minicraft.gfx.Color; import minicraft.gfx.Rectangle; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.PowerGloveItem; import minicraft.level.Level; @@ -36,7 +36,8 @@ public class Tnt extends Furniture { * Creates a new tnt furniture. */ public Tnt() { - super("Tnt", new LinkedSprite(SpriteType.Entity, "tnt"), new LinkedSprite(SpriteType.Item, "tnt"), 3, 2); + super("Tnt", new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "tnt").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "tnt").createSpriteLink(), 3, 2); fuseLit = false; ftik = 0; } diff --git a/src/client/java/minicraft/entity/mob/AirWizard.java b/src/client/java/minicraft/entity/mob/AirWizard.java index 8f2c2705e..78221418d 100644 --- a/src/client/java/minicraft/entity/mob/AirWizard.java +++ b/src/client/java/minicraft/entity/mob/AirWizard.java @@ -10,13 +10,13 @@ import minicraft.gfx.Color; import minicraft.gfx.Font; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Items; import minicraft.network.Analytics; import minicraft.screen.AchievementsDisplay; public class AirWizard extends EnemyMob { - private static final LinkedSprite[][][] sprites = new LinkedSprite[][][] { + private static final SpriteLink[][][] sprites = new SpriteLink[][][] { Mob.compileMobSpriteAnimations(0, 0, "air_wizard"), Mob.compileMobSpriteAnimations(0, 2, "air_wizard") }; diff --git a/src/client/java/minicraft/entity/mob/Cow.java b/src/client/java/minicraft/entity/mob/Cow.java index 4275db4d7..84c87325e 100644 --- a/src/client/java/minicraft/entity/mob/Cow.java +++ b/src/client/java/minicraft/entity/mob/Cow.java @@ -1,14 +1,14 @@ package minicraft.entity.mob; import minicraft.core.io.Settings; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Items; import minicraft.level.tile.GrassTile; import minicraft.level.tile.Tile; import minicraft.level.tile.Tiles; public class Cow extends PassiveMob { - private static LinkedSprite[][] sprites = Mob.compileMobSpriteAnimations(0, 0, "cow"); + private static SpriteLink[][] sprites = Mob.compileMobSpriteAnimations(0, 0, "cow"); /** * Creates the cow with the right sprites and color. diff --git a/src/client/java/minicraft/entity/mob/Creeper.java b/src/client/java/minicraft/entity/mob/Creeper.java index 94860cc37..888e2e176 100644 --- a/src/client/java/minicraft/entity/mob/Creeper.java +++ b/src/client/java/minicraft/entity/mob/Creeper.java @@ -9,7 +9,7 @@ import minicraft.entity.furniture.Spawner; import minicraft.gfx.Point; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Items; import minicraft.level.tile.Tiles; @@ -17,11 +17,11 @@ import java.util.List; public class Creeper extends EnemyMob { - private static LinkedSprite[][][] sprites = new LinkedSprite[][][] { - new LinkedSprite[][] { Mob.compileSpriteList(0, 0, 2, 2, 0, 2, "creeper") }, - new LinkedSprite[][] { Mob.compileSpriteList(0, 2, 2, 2, 0, 2, "creeper") }, - new LinkedSprite[][] { Mob.compileSpriteList(0, 4, 2, 2, 0, 2, "creeper") }, - new LinkedSprite[][] { Mob.compileSpriteList(0, 6, 2, 2, 0, 2, "creeper") } + private static SpriteLink[][][] sprites = new SpriteLink[][][] { + new SpriteLink[][] { Mob.compileSpriteList(0, 0, 2, 2, 0, 2, "creeper") }, + new SpriteLink[][] { Mob.compileSpriteList(0, 2, 2, 2, 0, 2, "creeper") }, + new SpriteLink[][] { Mob.compileSpriteList(0, 4, 2, 2, 0, 2, "creeper") }, + new SpriteLink[][] { Mob.compileSpriteList(0, 6, 2, 2, 0, 2, "creeper") } }; private static final int MAX_FUSE_TIME = 60; diff --git a/src/client/java/minicraft/entity/mob/EnemyMob.java b/src/client/java/minicraft/entity/mob/EnemyMob.java index 0788005ec..2a842138c 100644 --- a/src/client/java/minicraft/entity/mob/EnemyMob.java +++ b/src/client/java/minicraft/entity/mob/EnemyMob.java @@ -6,7 +6,7 @@ import minicraft.entity.Entity; import minicraft.entity.furniture.Bed; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.level.Level; import minicraft.level.tile.Tile; import minicraft.level.tile.Tiles; @@ -14,7 +14,7 @@ public class EnemyMob extends MobAi { public int lvl; - protected LinkedSprite[][][] lvlSprites; + protected SpriteLink[][][] lvlSprites; public int detectDist; @Override @@ -39,7 +39,7 @@ else if (!isWithinLight()) // Otherwise, it despawns when it is not within light * @param rwTime How long the mob will walk in a random direction. (random walk duration) * @param rwChance The chance of this mob will walk in a random direction (random walk chance) */ - public EnemyMob(int lvl, LinkedSprite[][][] lvlSprites, int health, boolean isFactor, int detectDist, int lifetime, int rwTime, int rwChance) { + public EnemyMob(int lvl, SpriteLink[][][] lvlSprites, int health, boolean isFactor, int detectDist, int lifetime, int rwTime, int rwChance) { super(lvlSprites[0], isFactor ? (lvl == 0 ? 1 : lvl * lvl) * health * ((Double) (Math.pow(2, Settings.getIdx("diff")))).intValue() : health, lifetime, rwTime, rwChance); this.lvl = lvl == 0 ? 1 : lvl; this.lvlSprites = java.util.Arrays.copyOf(lvlSprites, lvlSprites.length); @@ -57,7 +57,7 @@ public EnemyMob(int lvl, LinkedSprite[][][] lvlSprites, int health, boolean isFa * @param rwTime How long the mob will walk in a random direction. (random walk duration) * @param rwChance The chance of this mob will walk in a random direction (random walk chance) */ - public EnemyMob(int lvl, LinkedSprite[][][] lvlSprites, int health, boolean isFactor, int detectDist, int rwTime, int rwChance) { + public EnemyMob(int lvl, SpriteLink[][][] lvlSprites, int health, boolean isFactor, int detectDist, int rwTime, int rwChance) { this(lvl, lvlSprites, health, isFactor, detectDist, 60 * Updater.normSpeed, rwTime, rwChance); } @@ -71,7 +71,7 @@ public EnemyMob(int lvl, LinkedSprite[][][] lvlSprites, int health, boolean isFa * @param health How much health the mob has. * @param detectDist The distance where the mob will detect the player and start moving towards him/her. */ - public EnemyMob(int lvl, LinkedSprite[][][] lvlSprites, int health, int detectDist) { + public EnemyMob(int lvl, SpriteLink[][][] lvlSprites, int health, int detectDist) { this(lvl, lvlSprites, health, true, detectDist, 60, 200); } diff --git a/src/client/java/minicraft/entity/mob/Knight.java b/src/client/java/minicraft/entity/mob/Knight.java index d42a2089e..3a241c871 100644 --- a/src/client/java/minicraft/entity/mob/Knight.java +++ b/src/client/java/minicraft/entity/mob/Knight.java @@ -1,11 +1,11 @@ package minicraft.entity.mob; import minicraft.core.io.Settings; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Items; public class Knight extends EnemyMob { - private static LinkedSprite[][][] sprites = new LinkedSprite[][][] { + private static SpriteLink[][][] sprites = new SpriteLink[][][] { Mob.compileMobSpriteAnimations(0, 0, "knight"), Mob.compileMobSpriteAnimations(0, 2, "knight"), Mob.compileMobSpriteAnimations(0, 4, "knight"), diff --git a/src/client/java/minicraft/entity/mob/Mob.java b/src/client/java/minicraft/entity/mob/Mob.java index c19efad36..c1c4f10b3 100644 --- a/src/client/java/minicraft/entity/mob/Mob.java +++ b/src/client/java/minicraft/entity/mob/Mob.java @@ -8,15 +8,15 @@ import minicraft.entity.particle.BurnParticle; import minicraft.entity.particle.TextParticle; import minicraft.gfx.Color; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.PotionType; import minicraft.level.tile.Tile; import minicraft.level.tile.Tiles; public abstract class Mob extends Entity { - protected LinkedSprite[][] sprites; // This contains all the mob's sprites, sorted first by direction (index corresponding to the dir variable), and then by walk animation state. + protected SpriteLink[][] sprites; // This contains all the mob's sprites, sorted first by direction (index corresponding to the dir variable), and then by walk animation state. public int walkDist = 0; // How far we've walked currently, incremented after each movement. This is used to change the sprite; "(walkDist >> 3) & 1" switches between a value of 0 and 1 every 8 increments of walkDist. public Direction dir = Direction.DOWN; // The direction the mob is facing, used in attacking and rendering. 0 is down, 1 is up, 2 is left, 3 is right @@ -35,7 +35,7 @@ public abstract class Mob extends Entity { * @param sprites All of this mob's sprites. * @param health The mob's max health. */ - public Mob(LinkedSprite[][] sprites, int health) { + public Mob(SpriteLink[][] sprites, int health) { super(4, 3); this.sprites = sprites; this.health = this.maxHealth = health; @@ -154,25 +154,25 @@ protected boolean removeWhenFarAway(@SuppressWarnings("unused") double distance) /** * This is an easy way to make a list of sprites that are all part of the same "Sprite", so they have similar parameters, but they're just at different locations on the spreadsheet. */ - public static LinkedSprite[] compileSpriteList(int sheetX, int sheetY, int width, int height, int mirror, int number, String key) { - LinkedSprite[] sprites = new LinkedSprite[number]; + public static SpriteLink[] compileSpriteList(int sheetX, int sheetY, int width, int height, int mirror, int number, String key) { + SpriteLink[] sprites = new SpriteLink[number]; for (int i = 0; i < sprites.length; i++) - sprites[i] = new LinkedSprite(SpriteType.Entity, key).setSpriteDim(sheetX + width * i, sheetY, width, height) - .setMirror(mirror).setFlip(mirror); + sprites[i] = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, key).setSpriteDim(sheetX + width * i, sheetY, width, height) + .setMirror(mirror).setFlip(mirror).createSpriteLink(); return sprites; } - public static LinkedSprite[][] compileMobSpriteAnimations(int sheetX, int sheetY, String key) { - LinkedSprite[][] sprites = new LinkedSprite[4][2]; + public static SpriteLink[][] compileMobSpriteAnimations(int sheetX, int sheetY, String key) { + SpriteLink[][] sprites = new SpriteLink[4][2]; // dir numbers: 0=down, 1=up, 2=left, 3=right. /// On the spritesheet, most mobs have 4 sprites there, first facing down, then up, then right 1, then right 2. The first two get flipped to animate them, but the last two get flipped to change direction. // Contents: down 1, up 1, right 1, right 2 - LinkedSprite[] set1 = compileSpriteList(sheetX, sheetY, 2, 2, 0, 4, key); + SpriteLink[] set1 = compileSpriteList(sheetX, sheetY, 2, 2, 0, 4, key); // Contents: down 2, up 2, left 1, left 2 - LinkedSprite[] set2 = compileSpriteList(sheetX, sheetY, 2, 2, 1, 4, key); + SpriteLink[] set2 = compileSpriteList(sheetX, sheetY, 2, 2, 1, 4, key); // Down sprites[0][0] = set1[0]; diff --git a/src/client/java/minicraft/entity/mob/MobAi.java b/src/client/java/minicraft/entity/mob/MobAi.java index 00c2df1eb..ea8a96d82 100644 --- a/src/client/java/minicraft/entity/mob/MobAi.java +++ b/src/client/java/minicraft/entity/mob/MobAi.java @@ -9,7 +9,7 @@ import minicraft.gfx.Point; import minicraft.gfx.Rectangle; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Item; import minicraft.item.PotionType; import minicraft.level.Level; @@ -32,7 +32,7 @@ public abstract class MobAi extends Mob { * @param rwTime How long the mob will walk in a random direction. (random walk duration) * @param rwChance The chance of this mob will walk in a random direction (random walk chance) */ - protected MobAi(LinkedSprite[][] sprites, int maxHealth, int lifetime, int rwTime, int rwChance) { + protected MobAi(SpriteLink[][] sprites, int maxHealth, int lifetime, int rwTime, int rwChance) { super(sprites, maxHealth); this.lifetime = lifetime; randomWalkTime = 0; @@ -133,7 +133,7 @@ public void render(Screen screen) { int xo = x - 8; int yo = y - 11; - LinkedSprite curSprite = sprites[dir.getDir()][(walkDist >> 3) % sprites[dir.getDir()].length]; + SpriteLink curSprite = sprites[dir.getDir()][(walkDist >> 3) % sprites[dir.getDir()].length]; if (hurtTime > 0) { screen.render(xo, yo, curSprite.getSprite(), true); } else { diff --git a/src/client/java/minicraft/entity/mob/ObsidianKnight.java b/src/client/java/minicraft/entity/mob/ObsidianKnight.java index 5d874e1a5..fbabefa65 100644 --- a/src/client/java/minicraft/entity/mob/ObsidianKnight.java +++ b/src/client/java/minicraft/entity/mob/ObsidianKnight.java @@ -13,23 +13,17 @@ import minicraft.gfx.Color; import minicraft.gfx.Font; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.item.Items; import minicraft.screen.AchievementsDisplay; import org.jetbrains.annotations.Range; public class ObsidianKnight extends EnemyMob { - private static final SpriteLinker.LinkedSprite[][][] armored = new SpriteLinker.LinkedSprite[][][] { - Mob.compileMobSpriteAnimations(0, 0, "obsidian_knight_armored"), - Mob.compileMobSpriteAnimations(0, 2, "obsidian_knight_armored"), - Mob.compileMobSpriteAnimations(0, 4, "obsidian_knight_armored"), - Mob.compileMobSpriteAnimations(0, 6, "obsidian_knight_armored") + private static final SpriteManager.SpriteLink[][][] armored = new SpriteManager.SpriteLink[][][] { + Mob.compileMobSpriteAnimations(0, 0, "obsidian_knight_armored") }; - private static final SpriteLinker.LinkedSprite[][][] broken = new SpriteLinker.LinkedSprite[][][] { - Mob.compileMobSpriteAnimations(0, 0, "obsidian_knight_broken"), - Mob.compileMobSpriteAnimations(0, 2, "obsidian_knight_broken"), - Mob.compileMobSpriteAnimations(0, 4, "obsidian_knight_broken"), - Mob.compileMobSpriteAnimations(0, 6, "obsidian_knight_broken") + private static final SpriteManager.SpriteLink[][][] broken = new SpriteManager.SpriteLink[][][] { + Mob.compileMobSpriteAnimations(0, 0, "obsidian_knight_broken") }; public static ObsidianKnight entity = null; diff --git a/src/client/java/minicraft/entity/mob/PassiveMob.java b/src/client/java/minicraft/entity/mob/PassiveMob.java index e6ec7f6cb..c412717d1 100644 --- a/src/client/java/minicraft/entity/mob/PassiveMob.java +++ b/src/client/java/minicraft/entity/mob/PassiveMob.java @@ -4,7 +4,7 @@ import minicraft.core.Updater; import minicraft.core.io.Settings; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.level.Level; import minicraft.level.tile.Tile; import minicraft.level.tile.Tiles; @@ -17,7 +17,7 @@ public class PassiveMob extends MobAi { * healthFactor = 3. * @param sprites The mob's sprites. */ - public PassiveMob(LinkedSprite[][] sprites) { + public PassiveMob(SpriteLink[][] sprites) { this(sprites, 3); } @@ -27,7 +27,7 @@ public PassiveMob(LinkedSprite[][] sprites) { * @param healthFactor Determines the mobs health. Will be multiplied by the difficulty * and then added with 5. */ - public PassiveMob(LinkedSprite[][] sprites, int healthFactor) { + public PassiveMob(SpriteLink[][] sprites, int healthFactor) { super(sprites, 5 + healthFactor * Settings.getIdx("diff"), 5 * 60 * Updater.normSpeed, 45, 40); } diff --git a/src/client/java/minicraft/entity/mob/Pig.java b/src/client/java/minicraft/entity/mob/Pig.java index 8881d7391..74e3269aa 100644 --- a/src/client/java/minicraft/entity/mob/Pig.java +++ b/src/client/java/minicraft/entity/mob/Pig.java @@ -1,11 +1,11 @@ package minicraft.entity.mob; import minicraft.core.io.Settings; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Items; public class Pig extends PassiveMob { - private static LinkedSprite[][] sprites = Mob.compileMobSpriteAnimations(0, 0, "pig"); + private static SpriteLink[][] sprites = Mob.compileMobSpriteAnimations(0, 0, "pig"); /** * Creates a pig. diff --git a/src/client/java/minicraft/entity/mob/Player.java b/src/client/java/minicraft/entity/mob/Player.java index 385e78052..362dc925b 100644 --- a/src/client/java/minicraft/entity/mob/Player.java +++ b/src/client/java/minicraft/entity/mob/Player.java @@ -1,6 +1,7 @@ package minicraft.entity.mob; import minicraft.core.Game; +import minicraft.core.Renderer; import minicraft.core.Updater; import minicraft.core.World; import minicraft.core.io.InputHandler; @@ -19,12 +20,13 @@ import minicraft.entity.particle.Particle; import minicraft.entity.particle.TextParticle; import minicraft.gfx.Color; +import minicraft.gfx.MinicraftImage; import minicraft.gfx.Point; import minicraft.gfx.Rectangle; import minicraft.gfx.Screen; import minicraft.gfx.Sprite; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.ArmorItem; import minicraft.item.FishingData; import minicraft.item.FishingRodItem; @@ -60,6 +62,7 @@ import java.util.HashMap; import java.util.List; +import java.util.function.Supplier; public class Player extends Mob implements ItemHolder, ClientTickable { protected InputHandler input; @@ -86,8 +89,8 @@ public class Player extends Mob implements ItemHolder, ClientTickable { public static int baseHealth = 10; public static final int maxArmor = 100; - public static LinkedSprite[][] sprites; - public static LinkedSprite[][] carrySprites; + public static SpriteLink[][] sprites; + public static SpriteLink[][] carrySprites; private final Inventory inventory; @@ -135,7 +138,7 @@ public class Player extends Mob implements ItemHolder, ClientTickable { public int fishingTicks = maxFishingTicks; public int fishingLevel; - private LinkedSprite hudSheet; + private Supplier hudSheet; // Note: the player's health & max health are inherited from Mob.java @@ -210,7 +213,7 @@ public void updateInv(String items) { spawny = previousInstance.spawny; } - hudSheet = new LinkedSprite(SpriteType.Gui, "hud"); + hudSheet = () -> Renderer.spriteManager.getSheet(SpriteType.Gui, "hud"); updateSprites(); } @@ -845,7 +848,7 @@ private int getAttackDamage(Entity e) { */ public void updateSprites() { // Get the current skin we are using as a MobSprite array. - LinkedSprite[][][] selectedSkin = SkinDisplay.getSkinAsMobSprite(); + SpriteLink[][][] selectedSkin = SkinDisplay.getSkinAsMobSprite(); // Assign the skin to the states. sprites = selectedSkin[0]; @@ -865,21 +868,21 @@ public void render(Screen screen) { // animation effect if (tickTime / 8 % 2 == 0) { - screen.render(xo + 0, yo + 3, 5, 0, 0, hudSheet.getSheet()); // Render the water graphic - screen.render(xo + 8, yo + 3, 5, 0, 1, hudSheet.getSheet()); // Render the mirrored water graphic to the right. + screen.render(xo + 0, yo + 3, 5, 0, 0, hudSheet.get()); // Render the water graphic + screen.render(xo + 8, yo + 3, 5, 0, 1, hudSheet.get()); // Render the mirrored water graphic to the right. } else { - screen.render(xo + 0, yo + 3, 5, 1, 0, hudSheet.getSheet()); - screen.render(xo + 8, yo + 3, 5, 1, 1, hudSheet.getSheet()); + screen.render(xo + 0, yo + 3, 5, 1, 0, hudSheet.get()); + screen.render(xo + 8, yo + 3, 5, 1, 1, hudSheet.get()); } } else if (level.getTile(x >> 4, y >> 4) == Tiles.get("lava")) { if (tickTime / 8 % 2 == 0) { - screen.render(xo + 0, yo + 3, 6, 0, 1, hudSheet.getSheet()); // Render the lava graphic - screen.render(xo + 8, yo + 3, 6, 0, 0, hudSheet.getSheet()); // Render the mirrored lava graphic to the right. + screen.render(xo + 0, yo + 3, 6, 0, 1, hudSheet.get()); // Render the lava graphic + screen.render(xo + 8, yo + 3, 6, 0, 0, hudSheet.get()); // Render the mirrored lava graphic to the right. } else { - screen.render(xo + 0, yo + 3, 6, 1, 1, hudSheet.getSheet()); - screen.render(xo + 8, yo + 3, 6, 1, 0, hudSheet.getSheet()); + screen.render(xo + 0, yo + 3, 6, 1, 1, hudSheet.get()); + screen.render(xo + 8, yo + 3, 6, 1, 0, hudSheet.get()); } } } @@ -887,10 +890,10 @@ public void render(Screen screen) { // Renders indicator for what tile the item will be placed on if (activeItem instanceof TileItem && !isSwimming()) { Point t = getInteractionTile(); - screen.render(t.x * 16, t.y * 16, 3, 2, 0, hudSheet.getSheet()); - screen.render(t.x * 16 + 8, t.y * 16, 3, 2, 1, hudSheet.getSheet()); - screen.render(t.x * 16, t.y * 16 + 8, 3, 2, 2, hudSheet.getSheet()); - screen.render(t.x * 16 + 8, t.y * 16 + 8, 3, 2, 3, hudSheet.getSheet()); + screen.render(t.x * 16, t.y * 16, 3, 2, 0, hudSheet.get()); + screen.render(t.x * 16 + 8, t.y * 16, 3, 2, 1, hudSheet.get()); + screen.render(t.x * 16, t.y * 16 + 8, 3, 2, 2, hudSheet.get()); + screen.render(t.x * 16 + 8, t.y * 16 + 8, 3, 2, 3, hudSheet.get()); } // Makes the player white if they have just gotten hurt @@ -898,10 +901,10 @@ public void render(Screen screen) { col = Color.WHITE; // Make the sprite white. } - LinkedSprite[][] spriteSet = activeItem instanceof FurnitureItem ? carrySprites : sprites; + SpriteLink[][] spriteSet = activeItem instanceof FurnitureItem ? carrySprites : sprites; // Renders falling - LinkedSprite curSprite; + SpriteLink curSprite; if (onFallDelay > 0) { // This makes falling look really cool. int spriteToUse = Math.round(onFallDelay / 2f) % carrySprites.length; @@ -923,29 +926,29 @@ public void render(Screen screen) { if (attackTime > 0) { switch (attackDir) { case UP: // If currently attacking upwards... - screen.render(xo + 0, yo - 4, 3, 0, 0, hudSheet.getSheet()); // Render left half-slash - screen.render(xo + 8, yo - 4, 3, 0, 1, hudSheet.getSheet()); // Render right half-slash (mirror of left). + screen.render(xo + 0, yo - 4, 3, 0, 0, hudSheet.get()); // Render left half-slash + screen.render(xo + 8, yo - 4, 3, 0, 1, hudSheet.get()); // Render right half-slash (mirror of left). if (attackItem != null && !(attackItem instanceof PowerGloveItem)) { // If the player had an item when they last attacked... screen.render(xo + 4, yo - 4, attackItem.sprite.getSprite(), 1, false); // Then render the icon of the item, mirrored } break; case LEFT: // Attacking to the left... (Same as above) - screen.render(xo - 4, yo, 4, 0, 1, hudSheet.getSheet()); - screen.render(xo - 4, yo + 8, 4, 0, 3, hudSheet.getSheet()); + screen.render(xo - 4, yo, 4, 0, 1, hudSheet.get()); + screen.render(xo - 4, yo + 8, 4, 0, 3, hudSheet.get()); if (attackItem != null && !(attackItem instanceof PowerGloveItem)) { screen.render(xo - 4, yo + 4, attackItem.sprite.getSprite(), 1, false); } break; case RIGHT: // Attacking to the right (Same as above) - screen.render(xo + 8 + 4, yo, 4, 0, 0, hudSheet.getSheet()); - screen.render(xo + 8 + 4, yo + 8, 4, 0, 2, hudSheet.getSheet()); + screen.render(xo + 8 + 4, yo, 4, 0, 0, hudSheet.get()); + screen.render(xo + 8 + 4, yo + 8, 4, 0, 2, hudSheet.get()); if (attackItem != null && !(attackItem instanceof PowerGloveItem)) { screen.render(xo + 8 + 4, yo + 4, attackItem.sprite.getSprite()); } break; case DOWN: // Attacking downwards (Same as above) - screen.render(xo + 0, yo + 8 + 4, 3, 0, 2, hudSheet.getSheet()); - screen.render(xo + 8, yo + 8 + 4, 3, 0, 3, hudSheet.getSheet()); + screen.render(xo + 0, yo + 8 + 4, 3, 0, 2, hudSheet.get()); + screen.render(xo + 8, yo + 8 + 4, 3, 0, 3, hudSheet.get()); if (attackItem != null && !(attackItem instanceof PowerGloveItem)) { screen.render(xo + 4, yo + 8 + 4, attackItem.sprite.getSprite()); } diff --git a/src/client/java/minicraft/entity/mob/Sheep.java b/src/client/java/minicraft/entity/mob/Sheep.java index 63a18cc3a..35c2ff1d0 100644 --- a/src/client/java/minicraft/entity/mob/Sheep.java +++ b/src/client/java/minicraft/entity/mob/Sheep.java @@ -6,7 +6,7 @@ import minicraft.core.io.Settings; import minicraft.entity.Direction; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; @@ -18,21 +18,21 @@ import java.util.HashMap; public class Sheep extends PassiveMob { - private static final HashMap sprites = new HashMap<>(); - private static final HashMap cutSprites = new HashMap<>(); + private static final HashMap sprites = new HashMap<>(); + private static final HashMap cutSprites = new HashMap<>(); static { for (DyeItem.DyeColor color : DyeItem.DyeColor.values()) { - LinkedSprite[][] mobSprites = Mob.compileMobSpriteAnimations(0, 0, "sheep"); - for (LinkedSprite[] mobSprite : mobSprites) { - for (LinkedSprite linkedSprite : mobSprite) { + SpriteLink[][] mobSprites = Mob.compileMobSpriteAnimations(0, 0, "sheep"); + for (SpriteLink[] mobSprite : mobSprites) { + for (SpriteLink linkedSprite : mobSprite) { linkedSprite.setColor(color.color); } } sprites.put(color, mobSprites); mobSprites = Mob.compileMobSpriteAnimations(0, 2, "sheep"); - for (LinkedSprite[] mobSprite : mobSprites) { - for (LinkedSprite linkedSprite : mobSprite) { + for (SpriteLink[] mobSprite : mobSprites) { + for (SpriteLink linkedSprite : mobSprite) { linkedSprite.setColor(color.color); } } @@ -57,9 +57,9 @@ public void render(Screen screen) { int xo = x - 8; int yo = y - 11; - LinkedSprite[][] curAnim = cut ? cutSprites.get(color) : sprites.get(color); + SpriteLink[][] curAnim = cut ? cutSprites.get(color) : sprites.get(color); - LinkedSprite curSprite = curAnim[dir.getDir()][(walkDist >> 3) % curAnim[dir.getDir()].length]; + SpriteLink curSprite = curAnim[dir.getDir()][(walkDist >> 3) % curAnim[dir.getDir()].length]; if (hurtTime > 0) { screen.render(xo, yo, curSprite.getSprite(), true); } else { diff --git a/src/client/java/minicraft/entity/mob/Skeleton.java b/src/client/java/minicraft/entity/mob/Skeleton.java index fdf78ac5c..116d126cf 100644 --- a/src/client/java/minicraft/entity/mob/Skeleton.java +++ b/src/client/java/minicraft/entity/mob/Skeleton.java @@ -3,11 +3,11 @@ import minicraft.core.Game; import minicraft.core.io.Settings; import minicraft.entity.Arrow; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Items; public class Skeleton extends EnemyMob { - private static LinkedSprite[][][] sprites = new LinkedSprite[][][] { + private static SpriteLink[][][] sprites = new SpriteLink[][][] { Mob.compileMobSpriteAnimations(0, 0, "skeleton"), Mob.compileMobSpriteAnimations(0, 2, "skeleton"), Mob.compileMobSpriteAnimations(0, 4, "skeleton"), diff --git a/src/client/java/minicraft/entity/mob/Slime.java b/src/client/java/minicraft/entity/mob/Slime.java index e8294c2c6..b7fa4eb21 100644 --- a/src/client/java/minicraft/entity/mob/Slime.java +++ b/src/client/java/minicraft/entity/mob/Slime.java @@ -4,15 +4,15 @@ import minicraft.core.io.Settings; import minicraft.entity.Direction; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Items; public class Slime extends EnemyMob { - private static LinkedSprite[][][] sprites = new LinkedSprite[][][] { - new LinkedSprite[][] { Mob.compileSpriteList(0, 0, 2, 2, 0, 2, "slime") }, - new LinkedSprite[][] { Mob.compileSpriteList(0, 2, 2, 2, 0, 2, "slime") }, - new LinkedSprite[][] { Mob.compileSpriteList(0, 4, 2, 2, 0, 2, "slime") }, - new LinkedSprite[][] { Mob.compileSpriteList(0, 6, 2, 2, 0, 2, "slime") } + private static SpriteLink[][][] sprites = new SpriteLink[][][] { + new SpriteLink[][] { Mob.compileSpriteList(0, 0, 2, 2, 0, 2, "slime") }, + new SpriteLink[][] { Mob.compileSpriteList(0, 2, 2, 2, 0, 2, "slime") }, + new SpriteLink[][] { Mob.compileSpriteList(0, 4, 2, 2, 0, 2, "slime") }, + new SpriteLink[][] { Mob.compileSpriteList(0, 6, 2, 2, 0, 2, "slime") } }; private int jumpTime = 0; // jumpTimer, also acts as a rest timer before the next jump diff --git a/src/client/java/minicraft/entity/mob/Snake.java b/src/client/java/minicraft/entity/mob/Snake.java index 81c66b340..a7ed41ac7 100644 --- a/src/client/java/minicraft/entity/mob/Snake.java +++ b/src/client/java/minicraft/entity/mob/Snake.java @@ -2,11 +2,11 @@ import minicraft.core.io.Settings; import minicraft.entity.Entity; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Items; public class Snake extends EnemyMob { - private static LinkedSprite[][][] sprites = new LinkedSprite[][][] { + private static SpriteLink[][][] sprites = new SpriteLink[][][] { Mob.compileMobSpriteAnimations(0, 0, "snake"), Mob.compileMobSpriteAnimations(0, 2, "snake"), Mob.compileMobSpriteAnimations(0, 4, "snake"), diff --git a/src/client/java/minicraft/entity/mob/Zombie.java b/src/client/java/minicraft/entity/mob/Zombie.java index 5885203a0..071d421ca 100644 --- a/src/client/java/minicraft/entity/mob/Zombie.java +++ b/src/client/java/minicraft/entity/mob/Zombie.java @@ -1,11 +1,11 @@ package minicraft.entity.mob; import minicraft.core.io.Settings; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.item.Items; public class Zombie extends EnemyMob { - private static LinkedSprite[][][] sprites = new LinkedSprite[][][] { + private static SpriteLink[][][] sprites = new SpriteLink[][][] { Mob.compileMobSpriteAnimations(0, 0, "zombie"), Mob.compileMobSpriteAnimations(0, 2, "zombie"), Mob.compileMobSpriteAnimations(0, 4, "zombie"), diff --git a/src/client/java/minicraft/entity/particle/BurnParticle.java b/src/client/java/minicraft/entity/particle/BurnParticle.java index 0ef444d80..07b338fa4 100644 --- a/src/client/java/minicraft/entity/particle/BurnParticle.java +++ b/src/client/java/minicraft/entity/particle/BurnParticle.java @@ -1,12 +1,13 @@ package minicraft.entity.particle; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; public class BurnParticle extends Particle { /// This is used for Spawners, when they spawn an entity. - private static final SpriteLinker.LinkedSprite sprite = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Gui, "hud") - .setSpriteDim(6, 2, 1, 1) - .setMirror(3); + private static final SpriteManager.SpriteLink sprite = + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Gui, "hud") + .setSpriteDim(6, 2, 1, 1) + .setMirror(3).createSpriteLink(); /** * Creates a new particle at the given position. It has a lifetime of 30 ticks diff --git a/src/client/java/minicraft/entity/particle/FireParticle.java b/src/client/java/minicraft/entity/particle/FireParticle.java index 900019d8f..48a504992 100644 --- a/src/client/java/minicraft/entity/particle/FireParticle.java +++ b/src/client/java/minicraft/entity/particle/FireParticle.java @@ -1,7 +1,7 @@ package minicraft.entity.particle; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; public class FireParticle extends Particle { /// This is used for Spawners, when they spawn an entity. @@ -13,6 +13,7 @@ public class FireParticle extends Particle { * @param y Y map position */ public FireParticle(int x, int y) { - super(x, y, 30, new LinkedSprite(SpriteType.Gui, "hud").setSpriteDim(4, 2, 1, 1)); + super(x, y, 30, new SpriteLink.SpriteLinkBuilder(SpriteType.Gui, "hud") + .setSpriteDim(4, 2, 1, 1).createSpriteLink()); } } diff --git a/src/client/java/minicraft/entity/particle/Particle.java b/src/client/java/minicraft/entity/particle/Particle.java index 04e0382ec..c18cf2a19 100644 --- a/src/client/java/minicraft/entity/particle/Particle.java +++ b/src/client/java/minicraft/entity/particle/Particle.java @@ -3,7 +3,7 @@ import minicraft.entity.ClientTickable; import minicraft.entity.Entity; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.util.Logging; import javax.security.auth.DestroyFailedException; @@ -12,7 +12,7 @@ public class Particle extends Entity implements ClientTickable { private int time; // lifetime elapsed. private int lifetime; - protected LinkedSprite sprite; + protected SpriteLink sprite; /** * Creates an particle entity at the given position. The particle has a x and y radius = 1. @@ -22,7 +22,7 @@ public class Particle extends Entity implements ClientTickable { * @param lifetime How many game ticks the particle lives before its removed * @param sprite The particle's sprite */ - public Particle(int x, int y, int xr, int lifetime, LinkedSprite sprite) { + public Particle(int x, int y, int xr, int lifetime, SpriteLink sprite) { // Make a particle at the given coordinates super(xr, 1); this.x = x; @@ -32,7 +32,7 @@ public Particle(int x, int y, int xr, int lifetime, LinkedSprite sprite) { time = 0; } - public Particle(int x, int y, int lifetime, LinkedSprite sprite) { + public Particle(int x, int y, int lifetime, SpriteLink sprite) { this(x, y, 1, lifetime, sprite); } diff --git a/src/client/java/minicraft/entity/particle/SandParticle.java b/src/client/java/minicraft/entity/particle/SandParticle.java index b5048f565..f740b074d 100644 --- a/src/client/java/minicraft/entity/particle/SandParticle.java +++ b/src/client/java/minicraft/entity/particle/SandParticle.java @@ -1,19 +1,20 @@ package minicraft.entity.particle; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import java.util.Random; public class SandParticle extends Particle { - public static final LinkedSprite sprite = new LinkedSprite(SpriteType.Entity, "sand_footsteps"); - /** * Creating a sand particle. * @param x X map position * @param y Y map position */ public SandParticle(int x, int y) { - super(x, y, 180 + new Random().nextInt(81) - 40, sprite); + super(x, y, 180 + new Random().nextInt(81) - 40, null); + sprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "sand_footsteps").setMirror(random.nextInt(4)) + .createSpriteLink(); } } diff --git a/src/client/java/minicraft/entity/particle/SmashParticle.java b/src/client/java/minicraft/entity/particle/SmashParticle.java index c5063c1ec..20fec920d 100644 --- a/src/client/java/minicraft/entity/particle/SmashParticle.java +++ b/src/client/java/minicraft/entity/particle/SmashParticle.java @@ -1,7 +1,7 @@ package minicraft.entity.particle; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; public class SmashParticle extends Particle { /** @@ -11,6 +11,6 @@ public class SmashParticle extends Particle { * @param y Y map position */ public SmashParticle(int x, int y) { - super(x, y, 10, new LinkedSprite(SpriteType.Entity, "smash")); + super(x, y, 10, new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "smash").createSpriteLink()); } } diff --git a/src/client/java/minicraft/entity/particle/WaterParticle.java b/src/client/java/minicraft/entity/particle/WaterParticle.java index b91491dc2..9a75ae75a 100644 --- a/src/client/java/minicraft/entity/particle/WaterParticle.java +++ b/src/client/java/minicraft/entity/particle/WaterParticle.java @@ -1,6 +1,6 @@ package minicraft.entity.particle; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; public class WaterParticle extends Particle { private final int destX; @@ -8,7 +8,7 @@ public class WaterParticle extends Particle { private int count; private boolean stopped; - public WaterParticle(int x, int y, int lifetime, SpriteLinker.LinkedSprite sprite, int destX, int destY) { + public WaterParticle(int x, int y, int lifetime, SpriteManager.SpriteLink sprite, int destX, int destY) { super(x, y, lifetime, sprite); this.destX = destX; this.destY = destY; diff --git a/src/client/java/minicraft/gfx/Font.java b/src/client/java/minicraft/gfx/Font.java index dc8eb1766..525d287e4 100644 --- a/src/client/java/minicraft/gfx/Font.java +++ b/src/client/java/minicraft/gfx/Font.java @@ -1,7 +1,7 @@ package minicraft.gfx; import minicraft.core.Renderer; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import java.util.ArrayList; import java.util.Arrays; @@ -34,7 +34,7 @@ public static void draw(String msg, Screen screen, int x, int y) { int ix = chars.indexOf(msg.charAt(i)); // The current letter in the message loop if (ix >= 0) { // If that character's position is larger than or equal to 0, then render the character on the screen. - screen.render(x + i * textWidth(msg.substring(i, i + 1)), y, ix % 32, ix / 32, 0, Renderer.spriteLinker.getSheet(SpriteType.Gui, "font"), whiteTint); + screen.render(x + i * textWidth(msg.substring(i, i + 1)), y, ix % 32, ix / 32, 0, Renderer.spriteManager.getSheet(SpriteType.Gui, "font"), whiteTint); } } } @@ -74,7 +74,7 @@ public static void drawBackground(String msg, Screen screen, int x, int y) { public static void drawBackground(String msg, Screen screen, int x, int y, int whiteTint) { for (int i = 0; i < msg.length(); i++) { // Renders the black boxes under the text - screen.render(x + i * textWidth(msg.substring(i, i + 1)), y, 5, 2, 0, Renderer.spriteLinker.getSheet(SpriteType.Gui, "hud")); + screen.render(x + i * textWidth(msg.substring(i, i + 1)), y, 5, 2, 0, Renderer.spriteManager.getSheet(SpriteType.Gui, "hud")); } // Renders the text diff --git a/src/client/java/minicraft/gfx/MinicraftImage.java b/src/client/java/minicraft/gfx/MinicraftImage.java index 42183125a..d6acee38d 100644 --- a/src/client/java/minicraft/gfx/MinicraftImage.java +++ b/src/client/java/minicraft/gfx/MinicraftImage.java @@ -1,6 +1,6 @@ package minicraft.gfx; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.util.Logging; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Range; @@ -53,7 +53,7 @@ public MinicraftImage(@NotNull BufferedImage image) { * @param width the requested width for this image, must be a non-zero natural number * @param height the requested height for this image, must be a non-zero natural number * @throws IllegalArgumentException if either {@code width} or {@code height} is zero or negative - * @see LinkedSprite + * @see SpriteLink */ public MinicraftImage(@NotNull BufferedImage image, int width, int height) { Objects.requireNonNull(image, "image"); diff --git a/src/client/java/minicraft/gfx/Screen.java b/src/client/java/minicraft/gfx/Screen.java index 2b1f72a01..033581c71 100644 --- a/src/client/java/minicraft/gfx/Screen.java +++ b/src/client/java/minicraft/gfx/Screen.java @@ -2,8 +2,8 @@ import minicraft.core.Renderer; import minicraft.core.Updater; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import org.intellij.lang.annotations.MagicConstant; import org.jetbrains.annotations.NotNull; @@ -299,7 +299,7 @@ public void render(int xp, int yp, int xt, int yt, int bits, MinicraftImage shee render(xp, yp, xt, yt, bits, sheet, whiteTint, fullbright, 0); } - public void render(int xp, int yp, LinkedSprite sprite) { + public void render(int xp, int yp, SpriteLink sprite) { render(xp, yp, sprite.getSprite()); } @@ -314,7 +314,6 @@ public void render(int xp, int yp, Sprite sprite, boolean fullbright) { public void render(int xp, int yp, Sprite sprite, int mirror, boolean fullbright) { render(xp, yp, sprite, mirror, fullbright, 0); } - public void render(int xp, int yp, Sprite sprite, int mirror, boolean fullbright, int color) { boolean mirrorX = (mirror & BIT_MIRROR_X) > 0; // Horizontally. boolean mirrorY = (mirror & BIT_MIRROR_Y) > 0; // Vertically. @@ -376,7 +375,7 @@ public void render(int xp, int yp, int xt, int yt, int tw, int th, MinicraftImag // Validation check if (xt + tw > sheet.width && yt + th > sheet.height) { - render(xp, yp, 0, 0, mirrors, Renderer.spriteLinker.missingSheet(SpriteType.Item)); + render(xp, yp, 0, 0, mirrors, Renderer.spriteManager.missingSheet(SpriteType.Item)); return; } diff --git a/src/client/java/minicraft/gfx/SpriteAnimation.java b/src/client/java/minicraft/gfx/SpriteAnimation.java index 7df098a68..447a9534f 100644 --- a/src/client/java/minicraft/gfx/SpriteAnimation.java +++ b/src/client/java/minicraft/gfx/SpriteAnimation.java @@ -3,9 +3,9 @@ import minicraft.core.Renderer; import minicraft.core.Updater; import minicraft.core.World; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteMeta; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteMeta; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tile; import minicraft.util.Logging; @@ -42,7 +42,7 @@ public static void refreshAnimations() { spriteAnimations.forEach(a -> a.refreshAnimation(metas.get(a.key))); } - private LinkedSprite[] animations; + private SpriteLink[] animations; private SpriteMeta metadata; // The metadata of the sprite sheet. private int frame = 0; // The current frame of the animation. private int frametick = 0; // The current tick of the current frame. It would be always 0 if no animation. @@ -51,14 +51,14 @@ public static void refreshAnimations() { private boolean destoryed = false; // Whether this instance is still registered. // Border settings. - private LinkedSprite border = null; - private LinkedSprite corner = null; + private SpriteLink border = null; + private SpriteLink corner = null; private TileConnectionChecker connectionChecker; private boolean singletonWithConnective = false; // Refreshing only data. - private SpriteType type; - private String key; + private final SpriteType type; + private final String key; /** * Constructing animations with the provided key. The meta is given by default. @@ -114,7 +114,7 @@ public SpriteAnimation setSingletonWithConnective(boolean connective) { * @return The instance itself. */ public SpriteAnimation setColor(int color) { - for (LinkedSprite sprite : animations) { + for (SpriteLink sprite : animations) { sprite.setColor(color); } @@ -135,48 +135,11 @@ public SpriteAnimation setColor(int frame, int color) { return this; } - /** - * Setting the mirror of all animation frames. - * @param mirror The mirror of sprite/ - * @return The instance itself. - */ - public SpriteAnimation setMirror(int mirror) { - for (LinkedSprite sprite : animations) { - sprite.setMirror(mirror); - } - - return this; - } - - /** - * Setting the mirror of the specific animation frame. - * @param frame The specific frame. - * @param mirror The mirror of sprite. - * @return The instance itself. - */ - public SpriteAnimation setMirror(int frame, int mirror) { - if (frame < 0) frame = 0; - if (frame >= animations.length) frame = animations.length - 1; - animations[frame].setMirror(mirror); - - return this; - } - - /** - * Setting the sprite sheet mirror of all frames. - * @param mirror The mirror of sprite sheet. - * @return The instance itself. - */ - public SpriteAnimation setSpriteMirror(int mirror) { - for (LinkedSprite sprite : animations) sprite.setFlip(mirror); - return this; - } - /** * Getting the current frame of animation. * @return The current frame sprite. */ - public LinkedSprite getCurrentFrame() { + public SpriteLink getCurrentFrame() { return animations[frame]; } @@ -185,7 +148,7 @@ public LinkedSprite getCurrentFrame() { * @param frame The specific frame. * @return The frame sprite. */ - public LinkedSprite getFrame(int frame) { + public SpriteLink getFrame(int frame) { return animations[frame]; } @@ -284,9 +247,9 @@ public void refreshAnimation(SpriteMeta metadata) { frame = 0; frametick = 0; this.metadata = metadata; - MinicraftImage sheet = Renderer.spriteLinker.getSheet(type, key); + MinicraftImage sheet = Renderer.spriteManager.getSheet(type, key); if (sheet == null) { - animations = new LinkedSprite[] { SpriteLinker.missingTexture(type) }; + animations = new SpriteLink[] {SpriteManager.missingTexture(type) }; border = null; corner = null; return; @@ -296,7 +259,7 @@ public void refreshAnimation(SpriteMeta metadata) { // Destroying all previous LinkedSprite. try { - if (animations != null) for (LinkedSprite sprite : animations) sprite.destroy(); + if (animations != null) for (SpriteLink sprite : animations) sprite.destroy(); if (border != null) border.destroy(); if (corner != null) corner.destroy(); } catch (DestroyFailedException e) { @@ -305,16 +268,17 @@ public void refreshAnimation(SpriteMeta metadata) { if (metadata != null) { if (metadata.frames < 1) metadata.frames = 1; - animations = new LinkedSprite[metadata.frames]; + animations = new SpriteLink[metadata.frames]; for (int f = 0; f < animations.length; f++) { - animations[f] = new LinkedSprite(type, key).setSpriteDim(0, f * width, width, width); + animations[f] = new SpriteLink.SpriteLinkBuilder(type, key).setSpriteDim(0, f * width, width, width) + .createSpriteLink(false); } // Tile sprite only. - if (metadata.border != null) border = new LinkedSprite(type, metadata.border); - if (metadata.corner != null) corner = new LinkedSprite(type, metadata.corner); + if (metadata.border != null) border = new SpriteLink.SpriteLinkBuilder(type, metadata.border).createSpriteLink(false); + if (metadata.corner != null) corner = new SpriteLink.SpriteLinkBuilder(type, metadata.corner).createSpriteLink(false); } else { - animations = new LinkedSprite[] { new LinkedSprite(type, key).setSpriteSize(width, width) }; + animations = new SpriteLink[] { new SpriteLink.SpriteLinkBuilder(type, key).setSpriteSize(width, width) .createSpriteLink(false)}; border = null; corner = null; } @@ -323,7 +287,7 @@ public void refreshAnimation(SpriteMeta metadata) { @Override public void destroy() throws DestroyFailedException { spriteAnimations.remove(this); - if (animations != null) for (LinkedSprite sprite : animations) sprite.destroy(); + if (animations != null) for (SpriteLink sprite : animations) sprite.destroy(); if (border != null) border.destroy(); if (corner != null) corner.destroy(); destoryed = true; diff --git a/src/client/java/minicraft/gfx/SpriteLinker.java b/src/client/java/minicraft/gfx/SpriteLinker.java deleted file mode 100644 index fd3badbbd..000000000 --- a/src/client/java/minicraft/gfx/SpriteLinker.java +++ /dev/null @@ -1,365 +0,0 @@ -package minicraft.gfx; - -import minicraft.core.Renderer; -import minicraft.util.Logging; - -import javax.security.auth.DestroyFailedException; -import javax.security.auth.Destroyable; - -import java.util.ArrayList; -import java.util.HashMap; - -public class SpriteLinker { - /** - * Buffering SpriteSheet for caching. - */ - private final HashMap entitySheets = new HashMap<>(), - guiSheets = new HashMap<>(), itemSheets = new HashMap<>(), tileSheets = new HashMap<>(); - - /** - * Storing all exist in-used LinkedSprite. - */ - private final ArrayList linkedSheets = new ArrayList<>(); - - /** - * Clearing all Sprite buffers for the upcoming resource pack application. - */ - public void resetSprites() { - entitySheets.clear(); - guiSheets.clear(); - itemSheets.clear(); - tileSheets.clear(); - } - - /** - * The safe size check which will be required for the higher resolution sprites must be used - * before this method invoked. But in new rendering engine. - * @param t The sheet type. - * @param key The sheet key. - * @param spriteSheet The sheet. - */ - public void setSprite(SpriteType t, String key, MinicraftImage spriteSheet) { - switch (t) { - case Entity: - entitySheets.put(key, spriteSheet); - break; - case Gui: - guiSheets.put(key, spriteSheet); - break; - case Item: - itemSheets.put(key, spriteSheet); - break; - case Tile: - tileSheets.put(key, spriteSheet); - break; - } - } - - /** - * Getting the sprite sheet with the category and key. - * @param t The sprite category - * @param key The resource key. - * @return The sprite sheet. null if not found. - */ - public MinicraftImage getSheet(SpriteType t, String key) { - switch (t) { - case Entity: - return entitySheets.get(key); - case Gui: - return guiSheets.get(key); - case Item: - return itemSheets.get(key); - case Tile: - return tileSheets.get(key); - } - - return null; - } - - /** - * Cleaing all skin sheets in entity sheets. - */ - public void clearSkins() { - for (String k : new ArrayList<>(entitySheets.keySet())) { - if (k.startsWith("skin.")) entitySheets.remove(k); - } - } - - /** - * Setting the skin in entity sheet. - * @param key The key of the sheet. - * @param spriteSheet The sheet to be added. - */ - public void setSkin(String key, MinicraftImage spriteSheet) { - setSprite(SpriteType.Entity, key, spriteSheet); - } - - /** - * Getting the missing texture texture with the specific sprite type. - * @param type The sprite category. - * @return The missing texture or null if invalid sprite type. - */ - public static LinkedSprite missingTexture(SpriteType type) { - switch (type) { - case Entity: - return new LinkedSprite(SpriteType.Entity, "missing_entity"); - case Item: - return new LinkedSprite(SpriteType.Item, "missing_item"); - case Tile: - return new LinkedSprite(SpriteType.Tile, "missing_tile"); - default: - return null; - } - } - - /** - * Getting the sheet of missing texture with the specific sprite type. - * @param type The sprite category. - * @return Ths missing texture sprite sheet or null if invalid sprite type. - */ - public MinicraftImage missingSheet(SpriteType type) { - switch (type) { // The sheets should be found. - case Entity: - return entitySheets.get("missing_entity"); - case Item: - return itemSheets.get("missing_item"); - case Tile: - return tileSheets.get("missing_tile"); - default: - return null; - } - } - - /** - * Updating all existing LinkedSheet for resource pack application. - */ - public void updateLinkedSheets() { - Logging.SPRITE.debug("Updating all LinkedSprite."); - linkedSheets.forEach(s -> s.reload()); - } - - /** - * The metadata of the sprite sheet. - */ - public static class SpriteMeta { - /** - * The sprite animation configuration. - */ - public int frames = 1, // Minimum with 1. - frametime = 0; // 0 if no animation. - /** - * The sprite connector configuration. - */ - public String border = null, corner = null; - } - - /** - * The sprite categories in the image resources. TODO Removed for the new save system - */ - public static enum SpriteType { - Item, Gui, Tile, Entity; // Only for resource packs; Skin is not applied. - } - - /** - * Linking the LinkedSprite into specific sheet map. This should only be used by {@link LinkedSprite}. - * @param sheet The sprite to be linked. - * @param type The sprite type to be linked. - */ - public void linkSpriteSheet(LinkedSprite sheet, SpriteType type) { - // Because of the private access. - switch (type) { - case Entity: - sheet.linkedMap = Renderer.spriteLinker.entitySheets; - break; - case Gui: - sheet.linkedMap = Renderer.spriteLinker.guiSheets; - break; - case Item: - sheet.linkedMap = Renderer.spriteLinker.itemSheets; - break; - case Tile: - sheet.linkedMap = Renderer.spriteLinker.tileSheets; - break; - } - } - - /** - * A sprite collector with resource collector. - */ - public static class LinkedSprite implements Destroyable { - private final String key; // The resource key. - - /** - * The sprite configuration. - */ - private int x, y, w, h, color = -1, mirror = 0, flip = 0; - - // Sprite data. - private HashMap linkedMap; - private SpriteType spriteType; - private Sprite sprite; - private boolean destoryed; // It is not linked when destoryed. - private boolean reloaded = false; // Whether the sprite is reloaded. - - /** - * Create new LinkedSprite for the specific category and resource key. - * @param t The category of the sprite. - * @param key The resource key of the sprite. - */ - public LinkedSprite(SpriteType t, String key) { - this.key = key; - this.spriteType = t; - Renderer.spriteLinker.linkSpriteSheet(this, t); - Renderer.spriteLinker.linkedSheets.add(this); - } - - /** - * Getting the sprite sheet of the linked sprite. - * @return The current linked sprite. - */ - public MinicraftImage getSheet() { - return linkedMap.get(key); - } - - /** - * Setting the sprite size. - * @param w The sprite width. - * @param h The sprite height - * @return The instance itself. - */ - public LinkedSprite setSpriteSize(int w, int h) { - this.w = w; - this.h = h; - reloaded = false; // Reload this. - return this; - } - - /** - * Setting the sprite position. - * @param x The x position of the sprite. - * @param y The y position of the sprite. - * @return The instance itself. - */ - public LinkedSprite setSpritePos(int x, int y) { - this.x = x; - this.y = y; - reloaded = false; // Reload this. - return this; - } - - /** - * Setting the sprite position and size. - * @param x The x position of the sprite. - * @param y The y position of the sprite. - * @param w The sprite width. - * @param h The sprite height - * @return The instance itself. - */ - public LinkedSprite setSpriteDim(int x, int y, int w, int h) { - setSpriteSize(w, h); - setSpritePos(x, y); - reloaded = false; // Reload this. - return this; - } - - /** - * Setting the white tint. - * @param color The color of the white tint. - * @return The instance itself. - */ - public LinkedSprite setColor(int color) { - this.color = color; - reloaded = false; // Reload this. - return this; - } - - /** - * Setting the mirror of the sprite. - * @param mirror The mirror of the sprite. - * @return The instance itself. - */ - public LinkedSprite setMirror(int mirror) { - this.mirror = mirror; - reloaded = false; // Reload this. - return this; - } - - /** - * Setting the flip of the sprite sheet. - * @param flip The mirror of the sprite sheet. - * @return The instance itself. - */ - public LinkedSprite setFlip(int flip) { - this.flip = flip; - reloaded = false; - return this; - } - - /** - * Getting the sprite with the configuration. - * @return The generated sprite. - */ - public Sprite getSprite() { - if (!reloaded) { // Reload if it requires to be reloaded. - reloadSprite(); - } - - return sprite; - } - - /** - * Requiring the sprite to be reloaded when the next time generated. - */ - public void reload() { - reloaded = false; - } - - /** - * Reloading the sprite with the configuration. - */ - private void reloadSprite() { - MinicraftImage sheet = linkedMap.get(key); - if (sheet != null) { - if (w <= 0) w = sheet.width / 8; // Set the size as the maximum size of the sheet. - if (h <= 0) h = sheet.height / 8; // Set the size as the maximum size of the sheet. - - boolean flipX = (0x01 & flip) > 0, flipY = (0x02 & flip) > 0; - - Sprite.Px[][] pixels = new Sprite.Px[h][w]; - for (int r = 0; r < h; r++) { - for (int c = 0; c < w; c++) { - // The offsets are there to determine the pixel that will be there: the one in order, or on the opposite side. - int xOffset = flipX ? w - 1 - c : c; - int yOffset = flipY ? h - 1 - r : r; - pixels[r][c] = new Sprite.Px(x + xOffset, y + yOffset, mirror, sheet); - } - } - - sprite = new Sprite(pixels); - sprite.color = color; - } else { - Logging.SPRITE.warn("SpriteSheet with resource ID not found: {}", key); - sprite = missingTexture(spriteType).getSprite(); - } - - reloaded = true; - } - - /** - * Unlink this LinkedSprite from SpriteLinker. - */ - @Override - public void destroy() throws DestroyFailedException { - Renderer.spriteLinker.linkedSheets.remove(this); // Unlink this instance. - destoryed = true; - } - - /** - * If this LinkedSprite is unlinked from SpriteLinker. - */ - @Override - public boolean isDestroyed() { - return destoryed; - } - } -} diff --git a/src/client/java/minicraft/gfx/SpriteManager.java b/src/client/java/minicraft/gfx/SpriteManager.java new file mode 100644 index 000000000..71aa0c190 --- /dev/null +++ b/src/client/java/minicraft/gfx/SpriteManager.java @@ -0,0 +1,344 @@ +package minicraft.gfx; + +import minicraft.core.Renderer; +import minicraft.util.Logging; + +import javax.security.auth.DestroyFailedException; +import javax.security.auth.Destroyable; + +import java.util.ArrayList; +import java.util.HashMap; + +public class SpriteManager { + /** Buffering SpriteSheet for caching. */ + private final HashMap entitySheets = new HashMap<>(), + guiSheets = new HashMap<>(), itemSheets = new HashMap<>(), tileSheets = new HashMap<>(); + + /** Storing all exist in-used LinkedSprite. */ + private final ArrayList linkedSheets = new ArrayList<>(); + + /** Clearing all Sprite buffers for the upcoming resource pack application. */ + public void resetSprites() { + entitySheets.clear(); + guiSheets.clear(); + itemSheets.clear(); + tileSheets.clear(); + } + + /** + * The safe size check which will be required for the higher resolution sprites must be used + * before this method invoked. But in new rendering engine. + * @param t The sheet type. + * @param key The sheet key. + * @param spriteSheet The sheet. + */ + public void setSprite(SpriteType t, String key, MinicraftImage spriteSheet) { + switch (t) { + case Entity: entitySheets.put(key, spriteSheet); break; + case Gui: guiSheets.put(key, spriteSheet); break; + case Item: itemSheets.put(key, spriteSheet); break; + case Tile: tileSheets.put(key, spriteSheet); break; + } + } + + /** + * Getting the sprite sheet with the category and key. + * @param spriteType The sprite category + * @param key The resource key. + * @return The sprite sheet. null if not found. + */ + public MinicraftImage getSheet(SpriteType spriteType, String key) { + switch (spriteType) { + case Entity: return entitySheets.get(key); + case Gui: return guiSheets.get(key); + case Item: return itemSheets.get(key); + case Tile: return tileSheets.get(key); + } + + return null; + } + + /** Clearing all skin sheets in entity sheets. */ + public void clearSkins() { + entitySheets.keySet().removeIf(k -> k.startsWith("skin.")); + } + + /** + * Setting the skin in entity sheet. + * @param key The key of the sheet. + * @param spriteSheet The sheet to be added. + */ + public void setSkin(String key, MinicraftImage spriteSheet) { + setSprite(SpriteType.Entity, key, spriteSheet); + } + + public void refreshSkins() { + linkedSheets.forEach(s -> { + if (s.key.startsWith("skin.")) + s.reloadSprite(); + }); + } + + private static final String MISSING_ENTITY_KEY = "missing_entity", MISSING_ITEM_KEY = "missing_item", MISSING_TILE_KEY = "missing_tile"; + + /** + * Getting the missing texture with the specific sprite category. + * @param type The sprite category. + * @return The missing texture or null if invalid sprite category. + */ + public static SpriteLink missingTexture(SpriteType type) { + switch (type) { + case Entity: return SpriteLink.MISSING_ENTITY_TEXTURE; + case Item: return SpriteLink.MISSING_ITEM_TEXTURE; + case Tile: return SpriteLink.MISSING_TILE_TEXTURE; + default: return null; + } + } + + /** + * Getting the sheet of missing texture with the specific sprite type. + * @param type The sprite category. + * @return Ths missing texture sprite sheet or null if invalid sprite type. + */ + public MinicraftImage missingSheet(SpriteType type) { + switch (type) { // The sheets should be found. + case Entity: return entitySheets.get(MISSING_ENTITY_KEY); + case Item: return itemSheets.get(MISSING_ITEM_KEY); + case Tile: return tileSheets.get(MISSING_TILE_KEY); + default: return null; + } + } + + /** Updating all existing LinkedSheet for resource pack application. */ + public void updateLinkedSheets() { + Logging.SPRITE.debug("Updating all LinkedSprite."); + linkedSheets.forEach(SpriteLink::reloadSprite); + } + + /** The metadata of the sprite sheet. */ + public static class SpriteMeta { + /** The sprite animation configuration. */ + public int frames = 1, // Minimum with 1. + frametime = 0; // 0 if no animation. + /** The sprite connector configuration. */ + public String border = null, corner = null; + } + + /** The sprite categories in the image resources. TODO Removed for the new save system */ + public enum SpriteType { + Item, Gui, Tile, Entity // Only for resource packs; Skin is not applied. + } + + public HashMap getMappingByType(SpriteType type) { + switch (type) { + case Entity: return entitySheets; + default: case Gui: return guiSheets; + case Item: return itemSheets; + case Tile: return tileSheets; + } + } + + /** A sprite collector with resource collector. */ + public static class SpriteLink implements Destroyable { + /** Textures for missing textures for entity, item or tile */ + public static final SpriteLink + MISSING_ENTITY_TEXTURE = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, MISSING_ENTITY_KEY).createSpriteLink(true), + MISSING_ITEM_TEXTURE = new SpriteLink.SpriteLinkBuilder(SpriteType.Item, MISSING_ITEM_KEY).createSpriteLink(true), + MISSING_TILE_TEXTURE = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, MISSING_TILE_KEY).createSpriteLink(true); + + private final String key; // The resource key. + private final SpriteType spriteType; + private final HashMap linkedMap; + + /** Sprite configurations. */ + private final int x, y, w, h, mirror, flip; + private int color; // Modifiable due to the property of Sprite#color + private final boolean immutable; // Whether the color field is immutable. + + // Sprite data. + private Sprite sprite = null; + private boolean destroyed = false; // It is not linked when destroyed. + + private SpriteLink(SpriteType spriteType, String key, HashMap linkedMap, + int x, int y, int w, int h, int color, int mirror, int flip, boolean immutable) { + this.key = key; + this.spriteType = spriteType; + this.linkedMap = linkedMap; + this.x = x; + this.y = y; + this.w = w; + this.h = h; + this.color = color; + this.mirror = mirror; + this.flip = flip; + this.immutable = immutable; + reloadSprite(true); // First attempt to load a sprite. A failure (missing resources) would be expected before resource initialization. + } + + /** + * Getting the sprite sheet of the linked sprite. + * @return The current linked sprite. + */ + public MinicraftImage getSheet() { + return linkedMap.get(key); + } + + /** + * Setting the white tint. The value is unchanged if the object is set as immutable. + * @param color The color of the white tint. + * @return The instance itself. + */ + public SpriteLink setColor(int color) { + if (immutable) { + this.color = color; + if (sprite != null) sprite.color = color; + } + return this; + } + + /** + * Getting the sprite with the configuration. + * @return The generated sprite. + */ + public Sprite getSprite() { + return sprite; + } + + /** Reloading the sprite with the configuration. */ + private void reloadSprite() { reloadSprite(false); } + private void reloadSprite(boolean onInitialize) { + MinicraftImage sheet = linkedMap.get(key); + if (sheet != null) { + int h = this.h == 0 ? sheet.height/8 : this.h; + int w = this.w == 0 ? sheet.width/8 : this.w; + if ((x + w) * 8 <= sheet.width && (y + h) * 8 <= sheet.height) { + boolean flipX = (0x01 & flip) > 0, flipY = (0x02 & flip) > 0; + Sprite.Px[][] pixels = new Sprite.Px[h][w]; + for (int r = 0; r < h; r++) { + for (int c = 0; c < w; c++) { + // The offsets are there to determine the pixel that will be there: the one in order, or on the opposite side. + int xOffset = flipX ? w-1 - c : c; + int yOffset = flipY ? h-1 - r : r; + pixels[r][c] = new Sprite.Px(x + xOffset, y + yOffset, mirror, sheet); + } + } + + sprite = new Sprite(pixels); + sprite.color = color; + } else { + Logging.SPRITE.warn("SpriteSheet or required sprite with resource ID is invalid: {}", key); + Logging.SPRITE.debug("Invalid sprite: x: {}; y: {}; w: {}, h: {}", x, y, w, h); + sprite = missingTexture(spriteType).getSprite(); + } + } else if (!onInitialize) { + Logging.SPRITE.warn("SpriteSheet with resource ID not found: {}", key); + sprite = missingTexture(spriteType).getSprite(); + } + } + + /** Unlink this LinkedSprite from SpriteLinker. */ + @Override + public void destroy() throws DestroyFailedException { + Renderer.spriteManager.linkedSheets.remove(this); // Unlink this instance. + destroyed = true; + } + /** If this {@link SpriteLink} is unlinked from {@link SpriteManager}. */ + @Override + public boolean isDestroyed() { + return destroyed; + } + + public static class SpriteLinkBuilder { + private final String key; // The resource key. + private final SpriteType spriteType; + + private int x, y, w, h, color = -1, mirror = 0, flip = 0; + + /** + * Create new {@link SpriteLinkBuilder} for the creation of {@link SpriteLink} with the specific category and resource key. + * @param spriteType The category of the sprite. + * @param key The resource key of the sprite. + */ + public SpriteLinkBuilder(SpriteType spriteType, String key) { + this.key = key; + this.spriteType = spriteType; + } + + /** + * Setting the sprite size. + * @param w The sprite width. + * @param h The sprite height + * @return The instance itself. + */ + public SpriteLinkBuilder setSpriteSize(int w, int h) { + this.w = w; + this.h = h; + return this; + } + + /** + * Setting the sprite position. + * @param x The x position of the sprite. + * @param y The y position of the sprite. + * @return The instance itself. + */ + public SpriteLinkBuilder setSpritePos(int x, int y) { + this.x = x; + this.y = y; + return this; + } + + /** + * Setting the sprite position and size. + * @param x The x position of the sprite. + * @param y The y position of the sprite. + * @param w The sprite width. + * @param h The sprite height + * @return The instance itself. + */ + public SpriteLinkBuilder setSpriteDim(int x, int y, int w, int h) { + setSpriteSize(w, h); + setSpritePos(x, y); + return this; + } + + /** + * Setting the white tint. + * @param color The color of the white tint. + * @return The instance itself. + */ + public SpriteLinkBuilder setColor(int color) { + this.color = color; + return this; + } + + /** + * Setting the mirror of the sprite. + * @param mirror The mirror of the sprite. + * @return The instance itself. + */ + public SpriteLinkBuilder setMirror(int mirror) { + this.mirror = mirror; + return this; + } + + /** + * Setting the flip of the sprite sheet. + * @param flip The mirror of the sprite sheet. + * @return The instance itself. + */ + public SpriteLinkBuilder setFlip(int flip) { + this.flip = flip; + return this; + } + + public SpriteLink createSpriteLink() { return createSpriteLink(true); } + public SpriteLink createSpriteLink(boolean immutable) { + HashMap linkedMap = Renderer.spriteManager.getMappingByType(spriteType); + SpriteLink sprite = new SpriteLink(spriteType, key, linkedMap, x, y, w, h, color, mirror, flip, immutable); + Renderer.spriteManager.linkedSheets.add(sprite); + return sprite; + } + } + } +} diff --git a/src/client/java/minicraft/item/ArmorItem.java b/src/client/java/minicraft/item/ArmorItem.java index 80304ef3f..9cebe4e27 100644 --- a/src/client/java/minicraft/item/ArmorItem.java +++ b/src/client/java/minicraft/item/ArmorItem.java @@ -2,8 +2,8 @@ import minicraft.entity.Direction; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tile; import org.jetbrains.annotations.NotNull; @@ -15,11 +15,16 @@ public class ArmorItem extends StackableItem { protected static ArrayList getAllInstances() { ArrayList items = new ArrayList<>(); - items.add(new ArmorItem("Leather Armor", new LinkedSprite(SpriteType.Item, "leather_armor"), .3f, 1)); - items.add(new ArmorItem("Snake Armor", new LinkedSprite(SpriteType.Item, "snake_armor"), .4f, 2)); - items.add(new ArmorItem("Iron Armor", new LinkedSprite(SpriteType.Item, "iron_armor"), .5f, 3)); - items.add(new ArmorItem("Gold Armor", new LinkedSprite(SpriteType.Item, "gold_armor"), .7f, 4)); - items.add(new ArmorItem("Gem Armor", new LinkedSprite(SpriteType.Item, "gem_armor"), 1f, 5)); + items.add(new ArmorItem("Leather Armor", + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "leather_armor").createSpriteLink(), .3f, 1)); + items.add(new ArmorItem("Snake Armor", + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "snake_armor").createSpriteLink(), .4f, 2)); + items.add(new ArmorItem("Iron Armor", + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "iron_armor").createSpriteLink(), .5f, 3)); + items.add(new ArmorItem("Gold Armor", + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "gold_armor").createSpriteLink(), .7f, 4)); + items.add(new ArmorItem("Gem Armor", + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "gem_armor").createSpriteLink(), 1f, 5)); return items; } @@ -28,11 +33,11 @@ protected static ArrayList getAllInstances() { private final int staminaCost; public final int level; - private ArmorItem(String name, LinkedSprite sprite, float health, int level) { + private ArmorItem(String name, SpriteLink sprite, float health, int level) { this(name, sprite, 1, health, level); } - private ArmorItem(String name, LinkedSprite sprite, int count, float health, int level) { + private ArmorItem(String name, SpriteLink sprite, int count, float health, int level) { super(name, sprite, count); this.armor = health; this.level = level; diff --git a/src/client/java/minicraft/item/BookItem.java b/src/client/java/minicraft/item/BookItem.java index 2a3b8bf4d..ffa50bb88 100644 --- a/src/client/java/minicraft/item/BookItem.java +++ b/src/client/java/minicraft/item/BookItem.java @@ -4,8 +4,8 @@ import minicraft.core.io.Localization; import minicraft.entity.Direction; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tile; import minicraft.screen.BookDisplay; @@ -18,8 +18,9 @@ public class BookItem extends Item { protected static ArrayList getAllInstances() { ArrayList items = new ArrayList(); - items.add(new BookItem("Book", new LinkedSprite(SpriteType.Item, "book"), () -> Localization.getLocalized("minicraft.displays.book.default_book"))); - items.add(new BookItem("Antidious", new LinkedSprite(SpriteType.Item, "antidious_book"), () -> BookData.antVenomBook.collect(), true)); + items.add(new BookItem("Book", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "book").createSpriteLink(), () -> Localization.getLocalized("minicraft.displays.book.default_book"))); + items.add(new BookItem("Antidious", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "antidious_book") + .createSpriteLink(), () -> BookData.antVenomBook.collect(), true)); return items; } @@ -31,11 +32,11 @@ public static interface BookContent { protected BookContent book; // TODO this is not saved yet; it could be, for editable books. private final boolean hasTitlePage; - private BookItem(String title, LinkedSprite sprite, BookContent book) { + private BookItem(String title, SpriteLink sprite, BookContent book) { this(title, sprite, book, false); } - private BookItem(String title, LinkedSprite sprite, BookContent book, boolean hasTitlePage) { + private BookItem(String title, SpriteLink sprite, BookContent book, boolean hasTitlePage) { super(title, sprite); this.book = book; this.hasTitlePage = hasTitlePage; diff --git a/src/client/java/minicraft/item/BucketItem.java b/src/client/java/minicraft/item/BucketItem.java index 608c6e8c2..d6e858c81 100644 --- a/src/client/java/minicraft/item/BucketItem.java +++ b/src/client/java/minicraft/item/BucketItem.java @@ -3,8 +3,8 @@ import minicraft.core.Game; import minicraft.entity.Direction; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tile; import minicraft.level.tile.Tiles; @@ -52,8 +52,8 @@ private BucketItem(Fill fill) { } private BucketItem(Fill fill, int count) { - super(fill.toString() + " Bucket", new LinkedSprite(SpriteType.Item, fill == Fill.Empty ? "bucket" : - fill == Fill.Lava ? "lava_bucket" : "water_bucket"), count); + super(fill.toString() + " Bucket", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, fill == Fill.Empty ? "bucket" : + fill == Fill.Lava ? "lava_bucket" : "water_bucket").createSpriteLink(), count); this.filling = fill; } diff --git a/src/client/java/minicraft/item/ClothingItem.java b/src/client/java/minicraft/item/ClothingItem.java index f23922640..751bf4058 100644 --- a/src/client/java/minicraft/item/ClothingItem.java +++ b/src/client/java/minicraft/item/ClothingItem.java @@ -4,8 +4,8 @@ import minicraft.entity.Direction; import minicraft.entity.mob.Player; import minicraft.gfx.Color; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tile; import org.jetbrains.annotations.NotNull; @@ -17,26 +17,26 @@ public class ClothingItem extends StackableItem { protected static ArrayList getAllInstances() { ArrayList items = new ArrayList<>(); - items.add(new ClothingItem("Red Clothes", new LinkedSprite(SpriteType.Item, "red_clothes"), Color.get(1, 204, 0, 0))); - items.add(new ClothingItem("Blue Clothes", new LinkedSprite(SpriteType.Item, "blue_clothes"), Color.get(1, 0, 0, 204))); - items.add(new ClothingItem("Green Clothes", new LinkedSprite(SpriteType.Item, "green_clothes"), Color.get(1, 0, 204, 0))); - items.add(new ClothingItem("Yellow Clothes", new LinkedSprite(SpriteType.Item, "yellow_clothes"), Color.get(1, 204, 204, 0))); - items.add(new ClothingItem("Black Clothes", new LinkedSprite(SpriteType.Item, "black_clothes"), Color.get(1, 51))); - items.add(new ClothingItem("Orange Clothes", new LinkedSprite(SpriteType.Item, "orange_clothes"), Color.get(1, 255, 102, 0))); - items.add(new ClothingItem("Purple Clothes", new LinkedSprite(SpriteType.Item, "purple_clothes"), Color.get(1, 102, 0, 153))); - items.add(new ClothingItem("Cyan Clothes", new LinkedSprite(SpriteType.Item, "cyan_clothes"), Color.get(1, 0, 102, 153))); - items.add(new ClothingItem("Reg Clothes", new LinkedSprite(SpriteType.Item, "reg_clothes"), Color.get(1, 51, 51, 0))); // Dark Green + items.add(new ClothingItem("Red Clothes", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "red_clothes").createSpriteLink(), Color.get(1, 204, 0, 0))); + items.add(new ClothingItem("Blue Clothes", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "blue_clothes").createSpriteLink(), Color.get(1, 0, 0, 204))); + items.add(new ClothingItem("Green Clothes", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "green_clothes").createSpriteLink(), Color.get(1, 0, 204, 0))); + items.add(new ClothingItem("Yellow Clothes", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "yellow_clothes").createSpriteLink(), Color.get(1, 204, 204, 0))); + items.add(new ClothingItem("Black Clothes", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "black_clothes").createSpriteLink(), Color.get(1, 51))); + items.add(new ClothingItem("Orange Clothes", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "orange_clothes").createSpriteLink(), Color.get(1, 255, 102, 0))); + items.add(new ClothingItem("Purple Clothes", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "purple_clothes").createSpriteLink(), Color.get(1, 102, 0, 153))); + items.add(new ClothingItem("Cyan Clothes", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "cyan_clothes").createSpriteLink(), Color.get(1, 0, 102, 153))); + items.add(new ClothingItem("Reg Clothes", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "reg_clothes").createSpriteLink(), Color.get(1, 51, 51, 0))); // Dark Green return items; } private int playerCol; - private ClothingItem(String name, LinkedSprite sprite, int pcol) { + private ClothingItem(String name, SpriteLink sprite, int pcol) { this(name, 1, sprite, pcol); } - private ClothingItem(String name, int count, LinkedSprite sprite, int pcol) { + private ClothingItem(String name, int count, SpriteLink sprite, int pcol) { super(name, sprite, count); playerCol = pcol; } diff --git a/src/client/java/minicraft/item/DyeItem.java b/src/client/java/minicraft/item/DyeItem.java index 923e905a1..f2d6b71af 100644 --- a/src/client/java/minicraft/item/DyeItem.java +++ b/src/client/java/minicraft/item/DyeItem.java @@ -1,6 +1,6 @@ package minicraft.item; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.util.MyUtils; import org.jetbrains.annotations.NotNull; @@ -12,8 +12,9 @@ protected static ArrayList getAllInstances() { ArrayList items = new ArrayList<>(); for (DyeColor color : DyeColor.values()) { - items.add(new DyeItem(MyUtils.capitalizeFully(color.toString().replace('_', ' ')) + " Dye", new SpriteLinker.LinkedSprite( - SpriteLinker.SpriteType.Item, color.toString().toLowerCase() + "_dye"), color)); + items.add(new DyeItem(MyUtils.capitalizeFully(color.toString().replace('_', ' ')) + " Dye", + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Item, color.toString().toLowerCase() + "_dye") + .createSpriteLink(), color)); } return items; @@ -21,7 +22,7 @@ protected static ArrayList getAllInstances() { public final DyeColor color; - protected DyeItem(String name, SpriteLinker.LinkedSprite sprite, DyeColor color) { + protected DyeItem(String name, SpriteManager.SpriteLink sprite, DyeColor color) { super(name, sprite); this.color = color; } diff --git a/src/client/java/minicraft/item/FishingRodItem.java b/src/client/java/minicraft/item/FishingRodItem.java index 957ed1017..007831c27 100644 --- a/src/client/java/minicraft/item/FishingRodItem.java +++ b/src/client/java/minicraft/item/FishingRodItem.java @@ -3,8 +3,8 @@ import minicraft.core.Game; import minicraft.entity.Direction; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tile; import minicraft.level.tile.Tiles; @@ -48,8 +48,8 @@ protected static ArrayList getAllInstances() { }; public FishingRodItem(int level) { - super(LEVEL_NAMES[level] + " Fishing Rod", new LinkedSprite(SpriteType.Item, - LEVEL_NAMES[level].toLowerCase().replace("wood", "wooden") + "_fishing_rod")); + super(LEVEL_NAMES[level] + " Fishing Rod", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, + LEVEL_NAMES[level].toLowerCase().replace("wood", "wooden") + "_fishing_rod").createSpriteLink()); this.level = level; } diff --git a/src/client/java/minicraft/item/FoodItem.java b/src/client/java/minicraft/item/FoodItem.java index 1be9c9e81..13e16e6ae 100644 --- a/src/client/java/minicraft/item/FoodItem.java +++ b/src/client/java/minicraft/item/FoodItem.java @@ -2,8 +2,8 @@ import minicraft.entity.Direction; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tile; import org.jetbrains.annotations.NotNull; @@ -15,16 +15,16 @@ public class FoodItem extends StackableItem { protected static ArrayList getAllInstances() { ArrayList items = new ArrayList<>(); - items.add(new FoodItem("Baked Potato", new LinkedSprite(SpriteType.Item, "baked_potato"), 1)); - items.add(new FoodItem("Apple", new LinkedSprite(SpriteType.Item, "apple"), 1)); - items.add(new FoodItem("Raw Pork", new LinkedSprite(SpriteType.Item, "pork"), 1)); - items.add(new FoodItem("Raw Fish", new LinkedSprite(SpriteType.Item, "fish"), 1)); - items.add(new FoodItem("Raw Beef", new LinkedSprite(SpriteType.Item, "beef"), 1)); - items.add(new FoodItem("Bread", new LinkedSprite(SpriteType.Item, "bread"), 2)); - items.add(new FoodItem("Cooked Fish", new LinkedSprite(SpriteType.Item, "cooked_fish"), 3)); - items.add(new FoodItem("Cooked Pork", new LinkedSprite(SpriteType.Item, "cooked_pork"), 3)); - items.add(new FoodItem("Steak", new LinkedSprite(SpriteType.Item, "cooked_beef"), 3)); - items.add(new FoodItem("Gold Apple", new LinkedSprite(SpriteType.Item, "golden_apple"), 10)); + items.add(new FoodItem("Baked Potato", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "baked_potato").createSpriteLink(), 1)); + items.add(new FoodItem("Apple", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "apple").createSpriteLink(), 1)); + items.add(new FoodItem("Raw Pork", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "pork").createSpriteLink(), 1)); + items.add(new FoodItem("Raw Fish", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "fish").createSpriteLink(), 1)); + items.add(new FoodItem("Raw Beef", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "beef").createSpriteLink(), 1)); + items.add(new FoodItem("Bread", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "bread").createSpriteLink(), 2)); + items.add(new FoodItem("Cooked Fish", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "cooked_fish").createSpriteLink(), 3)); + items.add(new FoodItem("Cooked Pork", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "cooked_pork").createSpriteLink(), 3)); + items.add(new FoodItem("Steak", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "cooked_beef").createSpriteLink(), 3)); + items.add(new FoodItem("Gold Apple", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "golden_apple").createSpriteLink(), 10)); return items; } @@ -32,11 +32,11 @@ protected static ArrayList getAllInstances() { private final int feed; // The amount of hunger the food "satisfies" you by. private static final int staminaCost = 2; // The amount of stamina it costs to consume the food. - private FoodItem(String name, LinkedSprite sprite, int feed) { + private FoodItem(String name, SpriteLink sprite, int feed) { this(name, sprite, 1, feed); } - private FoodItem(String name, LinkedSprite sprite, int count, int feed) { + private FoodItem(String name, SpriteLink sprite, int count, int feed) { super(name, sprite, count); this.feed = feed; } diff --git a/src/client/java/minicraft/item/HeartItem.java b/src/client/java/minicraft/item/HeartItem.java index 632d5d2b3..923b0f8f4 100644 --- a/src/client/java/minicraft/item/HeartItem.java +++ b/src/client/java/minicraft/item/HeartItem.java @@ -3,7 +3,7 @@ import minicraft.core.Updater; import minicraft.entity.Direction; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.level.Level; import minicraft.level.tile.Tile; import org.jetbrains.annotations.NotNull; @@ -15,7 +15,8 @@ public class HeartItem extends StackableItem { protected static ArrayList getAllInstances() { ArrayList items = new ArrayList<>(); - items.add(new HeartItem("Obsidian Heart", new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Item, "obsidian_heart"), 5)); + items.add(new HeartItem("Obsidian Heart", + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Item, "obsidian_heart").createSpriteLink(), 5)); return items; } @@ -23,11 +24,11 @@ protected static ArrayList getAllInstances() { private int health; // The amount of health to increase by. private int staminaCost; // The amount of stamina it costs to consume. - private HeartItem(String name, SpriteLinker.LinkedSprite sprite, int health) { + private HeartItem(String name, SpriteManager.SpriteLink sprite, int health) { this(name, sprite, 1, health); } - private HeartItem(String name, SpriteLinker.LinkedSprite sprite, int count, int health) { + private HeartItem(String name, SpriteManager.SpriteLink sprite, int count, int health) { super(name, sprite, count); this.health = health; staminaCost = 7; diff --git a/src/client/java/minicraft/item/Item.java b/src/client/java/minicraft/item/Item.java index 2761d3b2c..da3387122 100644 --- a/src/client/java/minicraft/item/Item.java +++ b/src/client/java/minicraft/item/Item.java @@ -5,9 +5,9 @@ import minicraft.entity.mob.Player; import minicraft.gfx.Font; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tile; import org.jetbrains.annotations.NotNull; @@ -17,16 +17,16 @@ public abstract class Item { /* Note: Most of the stuff in the class is expanded upon in StackableItem/PowerGloveItem/FurnitureItem/etc */ private final String name; - public LinkedSprite sprite; + public SpriteLink sprite; public boolean used_pending = false; // This is for multiplayer, when an item has been used, and is pending server response as to the outcome, this is set to true so it cannot be used again unless the server responds that the item wasn't used. Which should basically replace the item anyway, soo... yeah. this never gets set back. protected Item(String name) { - sprite = SpriteLinker.missingTexture(SpriteType.Item); + sprite = SpriteManager.missingTexture(SpriteType.Item); this.name = name; } - protected Item(String name, LinkedSprite sprite) { + protected Item(String name, SpriteLink sprite) { this.name = name; this.sprite = sprite; } diff --git a/src/client/java/minicraft/item/PotionItem.java b/src/client/java/minicraft/item/PotionItem.java index 55ca3775e..a8156f1dd 100644 --- a/src/client/java/minicraft/item/PotionItem.java +++ b/src/client/java/minicraft/item/PotionItem.java @@ -3,8 +3,8 @@ import minicraft.core.Game; import minicraft.entity.Direction; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tile; import minicraft.screen.AchievementsDisplay; @@ -30,7 +30,8 @@ private PotionItem(PotionType type) { } private PotionItem(PotionType type, int count) { - super(type.name, new LinkedSprite(SpriteType.Item, "potion").setColor(type.dispColor), count); + super(type.name, new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "potion") + .setColor(type.dispColor).createSpriteLink(), count); this.type = type; } diff --git a/src/client/java/minicraft/item/StackableItem.java b/src/client/java/minicraft/item/StackableItem.java index 74b931cf2..53d7e2de0 100644 --- a/src/client/java/minicraft/item/StackableItem.java +++ b/src/client/java/minicraft/item/StackableItem.java @@ -2,9 +2,8 @@ import minicraft.core.Game; import minicraft.core.io.Localization; -import minicraft.gfx.SpriteLinker; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -16,30 +15,30 @@ public class StackableItem extends Item { protected static ArrayList getAllInstances() { ArrayList items = new ArrayList<>(); - items.add(new StackableItem("Wood", new LinkedSprite(SpriteType.Item, "wood"))); - items.add(new StackableItem("Leather", new LinkedSprite(SpriteType.Item, "leather"))); - items.add(new StackableItem("Wheat", new LinkedSprite(SpriteType.Item, "wheat"))); - items.add(new StackableItem("Key", new LinkedSprite(SpriteType.Item, "key"))); - items.add(new StackableItem("Arrow", new LinkedSprite(SpriteType.Item, "arrow"))); - items.add(new StackableItem("String", new LinkedSprite(SpriteType.Item, "string"))); - items.add(new StackableItem("Coal", new LinkedSprite(SpriteType.Item, "coal"))); - items.add(new StackableItem("Iron Ore", new LinkedSprite(SpriteType.Item, "iron_ore"))); - items.add(new StackableItem("Lapis", new LinkedSprite(SpriteType.Item, "lapis"))); - items.add(new StackableItem("Gold Ore", new LinkedSprite(SpriteType.Item, "gold_ore"))); - items.add(new StackableItem("Iron", new LinkedSprite(SpriteType.Item, "iron_ingot"))); - items.add(new StackableItem("Gold", new LinkedSprite(SpriteType.Item, "gold_ingot"))); - items.add(new StackableItem("Gunpowder", new LinkedSprite(SpriteType.Item, "gunpowder"))); - items.add(new StackableItem("Slime", new LinkedSprite(SpriteType.Item, "slime"))); - items.add(new StackableItem("Glass", new LinkedSprite(SpriteType.Item, "glass"))); - items.add(new StackableItem("Cloth", new LinkedSprite(SpriteType.Item, "cloth"))); - items.add(new StackableItem("Gem", new LinkedSprite(SpriteType.Item, "gem"))); - items.add(new StackableItem("Scale", new LinkedSprite(SpriteType.Item, "scale"))); - items.add(new StackableItem("Shard", new LinkedSprite(SpriteType.Item, "shard"))); - items.add(new StackableItem("Cloud Ore", new LinkedSprite(SpriteType.Item, "cloud_ore"))); - items.add(new StackableItem("Glass Bottle", new LinkedSprite(SpriteType.Item, "glass_bottle"))); - items.add(new StackableItem("Tomato", new LinkedSprite(SpriteType.Item, "tomato"))); - items.add(new StackableItem("Bone", new LinkedSprite(SpriteType.Item, "bone"))); - items.add(new StackableItem("Fertilizer", new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Item, "fertilizer"))); + items.add(new StackableItem("Wood", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "wood").createSpriteLink())); + items.add(new StackableItem("Leather", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "leather").createSpriteLink())); + items.add(new StackableItem("Wheat", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "wheat").createSpriteLink())); + items.add(new StackableItem("Key", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "key").createSpriteLink())); + items.add(new StackableItem("Arrow", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "arrow").createSpriteLink())); + items.add(new StackableItem("String", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "string").createSpriteLink())); + items.add(new StackableItem("Coal", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "coal").createSpriteLink())); + items.add(new StackableItem("Iron Ore", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "iron_ore").createSpriteLink())); + items.add(new StackableItem("Lapis", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "lapis").createSpriteLink())); + items.add(new StackableItem("Gold Ore", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "gold_ore").createSpriteLink())); + items.add(new StackableItem("Iron", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "iron_ingot").createSpriteLink())); + items.add(new StackableItem("Gold", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "gold_ingot").createSpriteLink())); + items.add(new StackableItem("Gunpowder", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "gunpowder").createSpriteLink())); + items.add(new StackableItem("Slime", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "slime").createSpriteLink())); + items.add(new StackableItem("Glass", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "glass").createSpriteLink())); + items.add(new StackableItem("Cloth", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "cloth").createSpriteLink())); + items.add(new StackableItem("Gem", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "gem").createSpriteLink())); + items.add(new StackableItem("Scale", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "scale").createSpriteLink())); + items.add(new StackableItem("Shard", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "shard").createSpriteLink())); + items.add(new StackableItem("Cloud Ore", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "cloud_ore").createSpriteLink())); + items.add(new StackableItem("Glass Bottle", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "glass_bottle").createSpriteLink())); + items.add(new StackableItem("Tomato", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "tomato").createSpriteLink())); + items.add(new StackableItem("Bone", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "bone").createSpriteLink())); + items.add(new StackableItem("Fertilizer", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "fertilizer").createSpriteLink())); return items; } @@ -47,12 +46,12 @@ protected static ArrayList getAllInstances() { public int count; public int maxCount = 100; - protected StackableItem(String name, LinkedSprite sprite) { + protected StackableItem(String name, SpriteLink sprite) { super(name, sprite); count = 1; } - protected StackableItem(String name, LinkedSprite sprite, int count) { + protected StackableItem(String name, SpriteLink sprite, int count) { this(name, sprite); this.count = count; } diff --git a/src/client/java/minicraft/item/SummonItem.java b/src/client/java/minicraft/item/SummonItem.java index bf0d73df0..9072d2a0c 100644 --- a/src/client/java/minicraft/item/SummonItem.java +++ b/src/client/java/minicraft/item/SummonItem.java @@ -8,8 +8,8 @@ import minicraft.entity.mob.AirWizard; import minicraft.entity.mob.ObsidianKnight; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tile; import org.jetbrains.annotations.NotNull; @@ -23,19 +23,20 @@ public class SummonItem extends StackableItem { protected static ArrayList getAllInstances() { ArrayList items = new ArrayList<>(); - items.add(new SummonItem("Totem of Air", new LinkedSprite(SpriteType.Item, "air_totem"), "Air Wizard")); - items.add(new SummonItem("Obsidian Poppet", new LinkedSprite(SpriteType.Item, "knight_statue"), "Obsidian Knight")); //TODO: Obsidian Poppet Textures + items.add(new SummonItem("Totem of Air", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "air_totem").createSpriteLink(), "Air Wizard")); + items.add(new SummonItem("Obsidian Poppet", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "knight_statue") + .createSpriteLink(), "Obsidian Knight")); //TODO: Obsidian Poppet Textures return items; } private final String mob; - private SummonItem(String name, LinkedSprite sprite, String mob) { + private SummonItem(String name, SpriteLink sprite, String mob) { this(name, sprite, 1, mob); } - private SummonItem(String name, LinkedSprite sprite, int count, String mob) { + private SummonItem(String name, SpriteLink sprite, int count, String mob) { super(name, sprite, count); this.mob = mob; } diff --git a/src/client/java/minicraft/item/TileItem.java b/src/client/java/minicraft/item/TileItem.java index c6e1d87b4..031d955dd 100644 --- a/src/client/java/minicraft/item/TileItem.java +++ b/src/client/java/minicraft/item/TileItem.java @@ -5,9 +5,9 @@ import minicraft.core.io.Sound; import minicraft.entity.Direction; import minicraft.entity.mob.Player; -import minicraft.gfx.SpriteLinker; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.FlowerTile; import minicraft.level.tile.Tile; @@ -31,81 +31,81 @@ protected static ArrayList getAllInstances() { ArrayList items = new ArrayList<>(); /// TileItem sprites all have 1x1 sprites. - items.add(new TileItem("Acorn", new LinkedSprite(SpriteType.Item, "acorn"), new TileModel("tree Sapling"), "grass")); - items.add(new TileItem("Dirt", new LinkedSprite(SpriteType.Item, "dirt"), new TileModel("dirt"), "hole", "water", "lava")); - items.add(new TileItem("Natural Rock", new LinkedSprite(SpriteType.Item, "stone"), new TileModel("rock"), "hole", "dirt", "sand", "grass", "path", "water", "lava")); + items.add(new TileItem("Acorn", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "acorn").createSpriteLink(), new TileModel("tree Sapling"), "grass")); + items.add(new TileItem("Dirt", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "dirt").createSpriteLink(), new TileModel("dirt"), "hole", "water", "lava")); + items.add(new TileItem("Natural Rock", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "stone").createSpriteLink(), new TileModel("rock"), "hole", "dirt", "sand", "grass", "path", "water", "lava")); String[] solidTiles = { "dirt", "Wood Planks", "Stone Bricks", "Obsidian", "Wool", "Red Wool", "Blue Wool", "Green Wool", "Yellow Wool", "Black Wool", "grass", "sand", "path", "ornate stone", "ornate obsidian", "Raw Obsidian", "Stone" }; TileModel.TileDataGetter placeOverWithID = (model1, target, level, xt, yt, player, attackDir) -> target.id; - items.add(new TileItem("Plank", new LinkedSprite(SpriteType.Item, "plank"), new TileModel("Wood Planks"), "hole", "water", "cloud")); - items.add(new TileItem("Ornate Wood", new LinkedSprite(SpriteType.Item, "plank"), new TileModel("Ornate Wood"), "hole", "water", "cloud")); - items.add(new TileItem("Plank Wall", new LinkedSprite(SpriteType.Item, "plank_wall"), new TileModel("Wood Wall"), "Wood Planks")); - items.add(new TileItem("Wood Door", new LinkedSprite(SpriteType.Item, "wood_door"), new TileModel("Wood Door"), "Wood Planks")); - items.add(new TileItem("Wood Fence", new LinkedSprite(SpriteType.Item, "wood_fence"), new TileModel("Wood Fence", placeOverWithID), solidTiles)); - items.add(new TileItem("Stone", new LinkedSprite(SpriteType.Item, "stone"), new TileModel("Stone"), "hole", "water", "cloud", "lava")); - items.add(new TileItem("Stone Brick", new LinkedSprite(SpriteType.Item, "stone_brick"), new TileModel("Stone Bricks"), "hole", "water", "cloud", "lava")); - items.add(new TileItem("Ornate Stone", new LinkedSprite(SpriteType.Item, "stone_brick"), new TileModel("Ornate Stone"), "hole", "water", "cloud", "lava")); - items.add(new TileItem("Stone Wall", new LinkedSprite(SpriteType.Item, "stone_wall"), new TileModel("Stone Wall"), "Stone Bricks")); - items.add(new TileItem("Stone Door", new LinkedSprite(SpriteType.Item, "stone_door"), new TileModel("Stone Door"), "Stone Bricks")); - items.add(new TileItem("Stone Fence", new LinkedSprite(SpriteType.Item, "stone_fence"), new TileModel("Stone Fence", placeOverWithID), solidTiles)); - items.add(new TileItem("Raw Obsidian", new LinkedSprite(SpriteType.Item, "obsidian"), new TileModel("Raw Obsidian"), "hole", "water", "cloud", "lava")); - items.add(new TileItem("Obsidian Brick", new LinkedSprite(SpriteType.Item, "obsidian_brick"), new TileModel("Obsidian"), "hole", "water", "cloud", "lava")); - items.add(new TileItem("Ornate Obsidian", new LinkedSprite(SpriteType.Item, "obsidian_brick"), new TileModel("Ornate Obsidian"), "hole", "water", "cloud", "lava")); - items.add(new TileItem("Obsidian Wall", new LinkedSprite(SpriteType.Item, "obsidian_wall"), new TileModel("Obsidian Wall"), "Obsidian")); - items.add(new TileItem("Obsidian Door", new LinkedSprite(SpriteType.Item, "obsidian_door"), new TileModel("Obsidian Door"), "Obsidian")); - items.add(new TileItem("Obsidian Fence", new LinkedSprite(SpriteType.Item, "obsidian_fence"), new TileModel("Obsidian Fence", placeOverWithID), solidTiles)); - - items.add(new TileItem("Sand", new LinkedSprite(SpriteType.Item, "sand"), new TileModel("sand"), "hole", "water", "lava")); - items.add(new TileItem("Cactus", new LinkedSprite(SpriteType.Item, "cactus"), new TileModel("cactus Sapling"), "sand")); - items.add(new TileItem("Cloud", new LinkedSprite(SpriteType.Item, "cloud"), new TileModel("cloud"), "Infinite Fall")); + items.add(new TileItem("Plank", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "plank").createSpriteLink(), new TileModel("Wood Planks"), "hole", "water", "cloud")); + items.add(new TileItem("Ornate Wood", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "plank").createSpriteLink(), new TileModel("Ornate Wood"), "hole", "water", "cloud")); + items.add(new TileItem("Plank Wall", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "plank_wall").createSpriteLink(), new TileModel("Wood Wall"), "Wood Planks")); + items.add(new TileItem("Wood Door", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "wood_door").createSpriteLink(), new TileModel("Wood Door"), "Wood Planks")); + items.add(new TileItem("Wood Fence", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "wood_fence").createSpriteLink(), new TileModel("Wood Fence", placeOverWithID), solidTiles)); + items.add(new TileItem("Stone", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "stone").createSpriteLink(), new TileModel("Stone"), "hole", "water", "cloud", "lava")); + items.add(new TileItem("Stone Brick", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "stone_brick").createSpriteLink(), new TileModel("Stone Bricks"), "hole", "water", "cloud", "lava")); + items.add(new TileItem("Ornate Stone", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "stone_brick").createSpriteLink(), new TileModel("Ornate Stone"), "hole", "water", "cloud", "lava")); + items.add(new TileItem("Stone Wall", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "stone_wall").createSpriteLink(), new TileModel("Stone Wall"), "Stone Bricks")); + items.add(new TileItem("Stone Door", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "stone_door").createSpriteLink(), new TileModel("Stone Door"), "Stone Bricks")); + items.add(new TileItem("Stone Fence", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "stone_fence").createSpriteLink(), new TileModel("Stone Fence", placeOverWithID), solidTiles)); + items.add(new TileItem("Raw Obsidian", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "obsidian").createSpriteLink(), new TileModel("Raw Obsidian"), "hole", "water", "cloud", "lava")); + items.add(new TileItem("Obsidian Brick", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "obsidian_brick").createSpriteLink(), new TileModel("Obsidian"), "hole", "water", "cloud", "lava")); + items.add(new TileItem("Ornate Obsidian", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "obsidian_brick").createSpriteLink(), new TileModel("Ornate Obsidian"), "hole", "water", "cloud", "lava")); + items.add(new TileItem("Obsidian Wall", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "obsidian_wall").createSpriteLink(), new TileModel("Obsidian Wall"), "Obsidian")); + items.add(new TileItem("Obsidian Door", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "obsidian_door").createSpriteLink(), new TileModel("Obsidian Door"), "Obsidian")); + items.add(new TileItem("Obsidian Fence", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "obsidian_fence").createSpriteLink(), new TileModel("Obsidian Fence", placeOverWithID), solidTiles)); + + items.add(new TileItem("Sand", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "sand").createSpriteLink(), new TileModel("sand"), "hole", "water", "lava")); + items.add(new TileItem("Cactus", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "cactus").createSpriteLink(), new TileModel("cactus Sapling"), "sand")); + items.add(new TileItem("Cloud", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "cloud").createSpriteLink(), new TileModel("cloud"), "Infinite Fall")); TileModel.TileDataGetter seedPlanting = (model1, target, level, xt, yt, player, attackDir) -> { AchievementsDisplay.setAchievement("minicraft.achievement.plant_seed", true); return TileModel.KEEP_DATA.getTileData(model1, target, level, xt, yt, player, attackDir); }; - items.add(new TileItem("Wheat Seeds", new LinkedSprite(SpriteType.Item, "seed"), new TileModel("wheat", seedPlanting), "farmland")); - items.add(new TileItem("Potato", new LinkedSprite(SpriteType.Item, "potato"), new TileModel("potato", TileModel.KEEP_DATA), "farmland")); - items.add(new TileItem("Carrot", new LinkedSprite(SpriteType.Item, "carrot"), new TileModel("carrot", TileModel.KEEP_DATA), "farmland")); - items.add(new TileItem("Tomato Seeds", new LinkedSprite(SpriteType.Item, "seed"), new TileModel("tomato", seedPlanting), "farmland")); - items.add(new TileItem("Heavenly Berries", new LinkedSprite(SpriteType.Item, "heavenly_berries"), new TileModel("heavenly berries", TileModel.KEEP_DATA), "farmland")); - items.add(new TileItem("Hellish Berries", new LinkedSprite(SpriteType.Item, "hellish_berries"), new TileModel("hellish berries", TileModel.KEEP_DATA), "farmland")); - items.add(new TileItem("Grass Seeds", new LinkedSprite(SpriteType.Item, "seed"), new TileModel("grass"), "dirt")); - - items.add(new TileItem("Torch", new LinkedSprite(SpriteType.Item, "torch"), new TileModel("Torch", placeOverWithID), solidTiles)); - items.add(new TileItem("Sign", new LinkedSprite(SpriteType.Item, "sign"), new TileModel("Sign", (model1, target, level, xt, yt, player, attackDir) -> { + items.add(new TileItem("Wheat Seeds", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "seed").createSpriteLink(), new TileModel("wheat", seedPlanting), "farmland")); + items.add(new TileItem("Potato", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "potato").createSpriteLink(), new TileModel("potato", TileModel.KEEP_DATA), "farmland")); + items.add(new TileItem("Carrot", new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteType.Item, "carrot").createSpriteLink(), new TileModel("carrot", TileModel.KEEP_DATA), "farmland")); + items.add(new TileItem("Tomato Seeds", new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteType.Item, "seed").createSpriteLink(), new TileModel("tomato", seedPlanting), "farmland")); + items.add(new TileItem("Heavenly Berries", new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteType.Item, "heavenly_berries").createSpriteLink(), new TileModel("heavenly berries", TileModel.KEEP_DATA), "farmland")); + items.add(new TileItem("Hellish Berries", new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteType.Item, "hellish_berries").createSpriteLink(), new TileModel("hellish berries", TileModel.KEEP_DATA), "farmland")); + items.add(new TileItem("Grass Seeds", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "seed").createSpriteLink(), new TileModel("grass"), "dirt")); + + items.add(new TileItem("Torch", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "torch").createSpriteLink(), new TileModel("Torch", placeOverWithID), solidTiles)); + items.add(new TileItem("Sign", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "sign").createSpriteLink(), new TileModel("Sign", (model1, target, level, xt, yt, player, attackDir) -> { Game.setDisplay(new SignDisplay(level, xt, yt)); return placeOverWithID.getTileData(model1, target, level, xt, yt, player, attackDir); }), solidTiles)); Function flowerModelGenerator = variant -> (model1, target, level, xt, yt, player, attackDir) -> variant.ordinal(); - items.add(new TileItem("Rose", new LinkedSprite(SpriteType.Item, "rose"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.ROSE)), "grass")); - items.add(new TileItem("Oxeye Daisy", new LinkedSprite(SpriteType.Item, "oxeye_daisy"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.OXEYE_DAISY)), "grass")); - items.add(new TileItem("Sunflower", new LinkedSprite(SpriteType.Item, "sunflower"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.SUNFLOWER)), "grass")); - items.add(new TileItem("Allium", new LinkedSprite(SpriteType.Item, "allium"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.ALLIUM)), "grass")); - items.add(new TileItem("Blue Orchid", new LinkedSprite(SpriteType.Item, "blue_orchid"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.BLUE_ORCHID)), "grass")); - items.add(new TileItem("Cornflower", new LinkedSprite(SpriteType.Item, "cornflower"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.CORNFLOWER)), "grass")); - items.add(new TileItem("Dandelion", new LinkedSprite(SpriteType.Item, "dandelion"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.DANDELION)), "grass")); - items.add(new TileItem("Hydrangea", new LinkedSprite(SpriteType.Item, "hydrangea"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.HYDRANGEA)), "grass")); - items.add(new TileItem("Iris", new LinkedSprite(SpriteType.Item, "iris"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.IRIS)), "grass")); - items.add(new TileItem("Orange Tulip", new LinkedSprite(SpriteType.Item, "orange_tulip"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.ORANGE_TULIP)), "grass")); - items.add(new TileItem("Pink Tulip", new LinkedSprite(SpriteType.Item, "pink_tulip"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.PINK_TULIP)), "grass")); - items.add(new TileItem("Red Tulip", new LinkedSprite(SpriteType.Item, "red_tulip"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.RED_TULIP)), "grass")); - items.add(new TileItem("White Tulip", new LinkedSprite(SpriteType.Item, "white_tulip"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.WHITE_TULIP)), "grass")); - items.add(new TileItem("Peony", new LinkedSprite(SpriteType.Item, "peony"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.PEONY)), "grass")); - items.add(new TileItem("Periwinkle", new LinkedSprite(SpriteType.Item, "periwinkle"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.PERIWINKLE)), "grass")); - items.add(new TileItem("Pink Lily", new LinkedSprite(SpriteType.Item, "pink_lily"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.PINK_LILY)), "grass")); - items.add(new TileItem("White Lily", new LinkedSprite(SpriteType.Item, "white_lily"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.WHITE_LILY)), "grass")); - items.add(new TileItem("Poppy", new LinkedSprite(SpriteType.Item, "poppy"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.POPPY)), "grass")); - items.add(new TileItem("Violet", new LinkedSprite(SpriteType.Item, "violet"), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.VIOLET)), "grass")); + items.add(new TileItem("Rose", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "rose").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.ROSE)), "grass")); + items.add(new TileItem("Oxeye Daisy", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "oxeye_daisy").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.OXEYE_DAISY)), "grass")); + items.add(new TileItem("Sunflower", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "sunflower").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.SUNFLOWER)), "grass")); + items.add(new TileItem("Allium", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "allium").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.ALLIUM)), "grass")); + items.add(new TileItem("Blue Orchid", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "blue_orchid").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.BLUE_ORCHID)), "grass")); + items.add(new TileItem("Cornflower", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "cornflower").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.CORNFLOWER)), "grass")); + items.add(new TileItem("Dandelion", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "dandelion").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.DANDELION)), "grass")); + items.add(new TileItem("Hydrangea", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "hydrangea").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.HYDRANGEA)), "grass")); + items.add(new TileItem("Iris", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "iris").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.IRIS)), "grass")); + items.add(new TileItem("Orange Tulip", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "orange_tulip").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.ORANGE_TULIP)), "grass")); + items.add(new TileItem("Pink Tulip", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "pink_tulip").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.PINK_TULIP)), "grass")); + items.add(new TileItem("Red Tulip", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "red_tulip").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.RED_TULIP)), "grass")); + items.add(new TileItem("White Tulip", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "white_tulip").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.WHITE_TULIP)), "grass")); + items.add(new TileItem("Peony", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "peony").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.PEONY)), "grass")); + items.add(new TileItem("Periwinkle", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "periwinkle").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.PERIWINKLE)), "grass")); + items.add(new TileItem("Pink Lily", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "pink_lily").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.PINK_LILY)), "grass")); + items.add(new TileItem("White Lily", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "white_lily").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.WHITE_LILY)), "grass")); + items.add(new TileItem("Poppy", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "poppy").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.POPPY)), "grass")); + items.add(new TileItem("Violet", new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "violet").createSpriteLink(), new TileModel("flower", flowerModelGenerator.apply(FlowerTile.FlowerVariant.VIOLET)), "grass")); // Creative mode available tiles: - items.add(new TileItem("Farmland", SpriteLinker.missingTexture(SpriteType.Item), new TileModel("farmland"), "dirt", "grass", "hole")); - items.add(new TileItem("Hole", SpriteLinker.missingTexture(SpriteType.Item), new TileModel("hole"), "dirt", "grass")); - items.add(new TileItem("Lava", SpriteLinker.missingTexture(SpriteType.Item), new TileModel("lava"), "dirt", "grass", "hole")); - items.add(new TileItem("Path", SpriteLinker.missingTexture(SpriteType.Item), new TileModel("path"), "dirt", "grass", "hole")); - items.add(new TileItem("Water", SpriteLinker.missingTexture(SpriteType.Item), new TileModel("water"), "dirt", "grass", "hole")); + items.add(new TileItem("Farmland", SpriteManager.missingTexture(SpriteType.Item), new TileModel("farmland"), "dirt", "grass", "hole")); + items.add(new TileItem("Hole", SpriteManager.missingTexture(SpriteType.Item), new TileModel("hole"), "dirt", "grass")); + items.add(new TileItem("Lava", SpriteManager.missingTexture(SpriteType.Item), new TileModel("lava"), "dirt", "grass", "hole")); + items.add(new TileItem("Path", SpriteManager.missingTexture(SpriteType.Item), new TileModel("path"), "dirt", "grass", "hole")); + items.add(new TileItem("Water", SpriteManager.missingTexture(SpriteType.Item), new TileModel("water"), "dirt", "grass", "hole")); return items; } @@ -113,15 +113,15 @@ protected static ArrayList getAllInstances() { public final @Nullable TileModel model; public final List validTiles; - protected TileItem(String name, LinkedSprite sprite, TileModel model, String... validTiles) { + protected TileItem(String name, SpriteLink sprite, TileModel model, String... validTiles) { this(name, sprite, 1, model, Arrays.asList(validTiles)); } - protected TileItem(String name, LinkedSprite sprite, int count, TileModel model, String... validTiles) { + protected TileItem(String name, SpriteLink sprite, int count, TileModel model, String... validTiles) { this(name, sprite, count, model, Arrays.asList(validTiles)); } - protected TileItem(String name, LinkedSprite sprite, int count, @Nullable TileModel model, List validTiles) { + protected TileItem(String name, SpriteLink sprite, int count, @Nullable TileModel model, List validTiles) { super(name, sprite, count); this.model = model; this.validTiles = new ArrayList<>(); diff --git a/src/client/java/minicraft/item/ToolItem.java b/src/client/java/minicraft/item/ToolItem.java index 6a8c945db..03142aa5c 100644 --- a/src/client/java/minicraft/item/ToolItem.java +++ b/src/client/java/minicraft/item/ToolItem.java @@ -4,8 +4,8 @@ import minicraft.core.io.Localization; import minicraft.entity.Entity; import minicraft.entity.mob.Mob; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -46,7 +46,8 @@ private static String getSpriteName(String typeName, String level) { * Tool Item, requires a tool type (ToolType.Sword, ToolType.Axe, ToolType.Hoe, etc) and a level (0 = wood, 2 = iron, 4 = gem, etc) */ public ToolItem(ToolType type, int level) { - super(LEVEL_NAMES[level] + " " + type.name(), new LinkedSprite(SpriteType.Item, getSpriteName(type.toString(), LEVEL_NAMES[level] + "_"))); + super(LEVEL_NAMES[level] + " " + type.name(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Item, getSpriteName(type.toString(), LEVEL_NAMES[level] + "_")).createSpriteLink()); this.type = type; this.level = level; @@ -56,7 +57,7 @@ public ToolItem(ToolType type, int level) { } public ToolItem(ToolType type) { - super(type.name(), new LinkedSprite(SpriteType.Item, getSpriteName(type.toString(), ""))); + super(type.name(), new SpriteLink.SpriteLinkBuilder(SpriteType.Item, getSpriteName(type.toString(), "")).createSpriteLink()); this.type = type; dur = type.durability; diff --git a/src/client/java/minicraft/item/UnknownItem.java b/src/client/java/minicraft/item/UnknownItem.java index a338ab50e..52cda6098 100644 --- a/src/client/java/minicraft/item/UnknownItem.java +++ b/src/client/java/minicraft/item/UnknownItem.java @@ -1,13 +1,13 @@ package minicraft.item; -import minicraft.gfx.SpriteLinker; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager; +import minicraft.gfx.SpriteManager.SpriteType; import org.jetbrains.annotations.NotNull; public class UnknownItem extends StackableItem { protected UnknownItem(String reqName) { - super(reqName, SpriteLinker.missingTexture(SpriteType.Item)); + super(reqName, SpriteManager.missingTexture(SpriteType.Item)); } public @NotNull UnknownItem copy() { diff --git a/src/client/java/minicraft/item/WateringCanItem.java b/src/client/java/minicraft/item/WateringCanItem.java index 8786ab011..17db77742 100644 --- a/src/client/java/minicraft/item/WateringCanItem.java +++ b/src/client/java/minicraft/item/WateringCanItem.java @@ -5,7 +5,7 @@ import minicraft.entity.particle.Particle; import minicraft.entity.particle.WaterParticle; import minicraft.gfx.Point; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.level.Level; import minicraft.level.tile.DirtTile; import minicraft.level.tile.FlowerTile; @@ -26,15 +26,18 @@ protected static ArrayList getAllInstances() { return items; } - private static final SpriteLinker.LinkedSprite sprite = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Item, "watering_can"); - private static final SpriteLinker.LinkedSprite spriteFilled = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Item, "watering_can_filled"); - private static final SpriteLinker.LinkedSprite particleSprite = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "glint"); + private static final SpriteManager.SpriteLink sprite = new SpriteManager.SpriteLink.SpriteLinkBuilder( + SpriteManager.SpriteType.Item, "watering_can").createSpriteLink(); + private static final SpriteManager.SpriteLink spriteFilled = new SpriteManager.SpriteLink.SpriteLinkBuilder( + SpriteManager.SpriteType.Item, "watering_can_filled").createSpriteLink(); + private static final SpriteManager.SpriteLink particleSprite = new SpriteManager.SpriteLink.SpriteLinkBuilder( + SpriteManager.SpriteType.Entity, "glint").createSpriteLink(); - private static final SpriteLinker.LinkedSprite[] spriteSplash = new SpriteLinker.LinkedSprite[] { - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "splash_0"), - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "splash_1"), - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "splash_2"), - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "splash_3") + private static final SpriteManager.SpriteLink[] spriteSplash = new SpriteManager.SpriteLink[] { + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "splash_0").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "splash_1").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "splash_2").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "splash_3").createSpriteLink() }; public final int CAPACITY = 1800; @@ -58,7 +61,7 @@ public boolean interactOn(Tile tile, Level level, int xt, int yt, Player player, Random random = new Random(); if (renderingTick >= 8) { for (int i = 0; i < 4; i++) { - SpriteLinker.LinkedSprite splash = spriteSplash[random.nextInt(spriteSplash.length)]; + SpriteManager.SpriteLink splash = spriteSplash[random.nextInt(spriteSplash.length)]; // 2-pixel deviation for centering particle sprites. int destX = player.x - 2 + 12 * attackDir.getX() + random.nextInt(9) - 4; int destY = player.y - 2 + 12 * attackDir.getY() + random.nextInt(9) - 4; diff --git a/src/client/java/minicraft/item/WoolItem.java b/src/client/java/minicraft/item/WoolItem.java index ce5f3321b..57cee68fe 100644 --- a/src/client/java/minicraft/item/WoolItem.java +++ b/src/client/java/minicraft/item/WoolItem.java @@ -1,6 +1,6 @@ package minicraft.item; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.util.MyUtils; import org.jetbrains.annotations.NotNull; @@ -11,8 +11,9 @@ protected static ArrayList getAllInstances() { ArrayList items = new ArrayList<>(); for (DyeItem.DyeColor color : DyeItem.DyeColor.values()) { - items.add(new WoolItem(MyUtils.capitalizeFully(color.toString().replace('_', ' ')) + " Wool", new SpriteLinker.LinkedSprite( - SpriteLinker.SpriteType.Item, color.toString().toLowerCase() + "_wool"), color)); + items.add(new WoolItem(MyUtils.capitalizeFully(color.toString().replace('_', ' ')) + " Wool", + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Item, color.toString().toLowerCase() + "_wool") + .createSpriteLink(), color)); } return items; @@ -20,7 +21,7 @@ protected static ArrayList getAllInstances() { public final DyeItem.DyeColor color; - protected WoolItem(String name, SpriteLinker.LinkedSprite sprite, DyeItem.DyeColor color) { + protected WoolItem(String name, SpriteManager.SpriteLink sprite, DyeItem.DyeColor color) { super(name, sprite, new TileModel(name), "hole", "water"); this.color = color; } diff --git a/src/client/java/minicraft/level/tile/BossWallTile.java b/src/client/java/minicraft/level/tile/BossWallTile.java index 54c2d7f82..5db3f9196 100644 --- a/src/client/java/minicraft/level/tile/BossWallTile.java +++ b/src/client/java/minicraft/level/tile/BossWallTile.java @@ -7,13 +7,13 @@ import minicraft.entity.mob.ObsidianKnight; import minicraft.entity.mob.Player; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.item.Item; import minicraft.item.ToolItem; import minicraft.level.Level; public class BossWallTile extends WallTile { - private static SpriteAnimation obsidian = new SpriteAnimation(SpriteLinker.SpriteType.Tile, "obsidian_wall") + private static SpriteAnimation obsidian = new SpriteAnimation(SpriteManager.SpriteType.Tile, "obsidian_wall") .setConnectionChecker((level, x, y, tile, side) -> tile instanceof WallTile); private static final String wallMsg = "minicraft.notification.defeat_obsidian_knight_first"; diff --git a/src/client/java/minicraft/level/tile/CactusTile.java b/src/client/java/minicraft/level/tile/CactusTile.java index 8f076592a..f5ac964ab 100644 --- a/src/client/java/minicraft/level/tile/CactusTile.java +++ b/src/client/java/minicraft/level/tile/CactusTile.java @@ -11,7 +11,7 @@ import minicraft.gfx.Color; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Items; import minicraft.level.Level; diff --git a/src/client/java/minicraft/level/tile/CloudTile.java b/src/client/java/minicraft/level/tile/CloudTile.java index 869ffb0f1..3dbe66a15 100644 --- a/src/client/java/minicraft/level/tile/CloudTile.java +++ b/src/client/java/minicraft/level/tile/CloudTile.java @@ -5,7 +5,7 @@ import minicraft.entity.Entity; import minicraft.entity.mob.Player; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/ConnectTile.java b/src/client/java/minicraft/level/tile/ConnectTile.java index f46f1a197..196254768 100644 --- a/src/client/java/minicraft/level/tile/ConnectTile.java +++ b/src/client/java/minicraft/level/tile/ConnectTile.java @@ -3,7 +3,7 @@ import minicraft.entity.Entity; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; // TODO Remove this. diff --git a/src/client/java/minicraft/level/tile/DecorTile.java b/src/client/java/minicraft/level/tile/DecorTile.java index a3ee6968c..cec4fa2fc 100644 --- a/src/client/java/minicraft/level/tile/DecorTile.java +++ b/src/client/java/minicraft/level/tile/DecorTile.java @@ -6,7 +6,7 @@ import minicraft.entity.mob.Player; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/DirtTile.java b/src/client/java/minicraft/level/tile/DirtTile.java index 32bdf3112..cc21b72cb 100644 --- a/src/client/java/minicraft/level/tile/DirtTile.java +++ b/src/client/java/minicraft/level/tile/DirtTile.java @@ -6,7 +6,7 @@ import minicraft.gfx.Color; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/DoorTile.java b/src/client/java/minicraft/level/tile/DoorTile.java index 495595c7a..d21d531a6 100644 --- a/src/client/java/minicraft/level/tile/DoorTile.java +++ b/src/client/java/minicraft/level/tile/DoorTile.java @@ -7,7 +7,7 @@ import minicraft.entity.mob.Player; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/ExplodedTile.java b/src/client/java/minicraft/level/tile/ExplodedTile.java index b79123d94..6edf842cf 100644 --- a/src/client/java/minicraft/level/tile/ExplodedTile.java +++ b/src/client/java/minicraft/level/tile/ExplodedTile.java @@ -2,7 +2,7 @@ import minicraft.entity.Entity; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; /// This class is for tiles WHILE THEY ARE EXPLODING diff --git a/src/client/java/minicraft/level/tile/FenceTile.java b/src/client/java/minicraft/level/tile/FenceTile.java index c62f84ab6..9b74fa9be 100644 --- a/src/client/java/minicraft/level/tile/FenceTile.java +++ b/src/client/java/minicraft/level/tile/FenceTile.java @@ -9,7 +9,7 @@ import minicraft.entity.particle.SmashParticle; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; @@ -18,9 +18,9 @@ public class FenceTile extends Tile { - private static final SpriteAnimation wood = new SpriteAnimation(SpriteType.Tile, "wood_fence"); - private static final SpriteAnimation stone = new SpriteAnimation(SpriteType.Tile, "stone_fence"); - private static final SpriteAnimation obsidian = new SpriteAnimation(SpriteType.Tile, "obsidian_fence"); + private static final SpriteAnimation wood = new SpriteAnimation(SpriteManager.SpriteType.Tile, "wood_fence"); + private static final SpriteAnimation stone = new SpriteAnimation(SpriteManager.SpriteType.Tile, "stone_fence"); + private static final SpriteAnimation obsidian = new SpriteAnimation(SpriteManager.SpriteType.Tile, "obsidian_fence"); protected final Material type; @@ -44,10 +44,10 @@ protected FenceTile(Material type, String name) { sprite = obsidian; break; } - top = new SpriteAnimation(SpriteType.Tile, type.toString().toLowerCase() + "_fence_top"); - bottom = new SpriteAnimation(SpriteType.Tile, type.toString().toLowerCase() + "_fence_bottom"); - left = new SpriteAnimation(SpriteType.Tile, type.toString().toLowerCase() + "_fence_left"); - right = new SpriteAnimation(SpriteType.Tile, type.toString().toLowerCase() + "_fence_right"); + top = new SpriteAnimation(SpriteManager.SpriteType.Tile, type.toString().toLowerCase() + "_fence_top"); + bottom = new SpriteAnimation(SpriteManager.SpriteType.Tile, type.toString().toLowerCase() + "_fence_bottom"); + left = new SpriteAnimation(SpriteManager.SpriteType.Tile, type.toString().toLowerCase() + "_fence_left"); + right = new SpriteAnimation(SpriteManager.SpriteType.Tile, type.toString().toLowerCase() + "_fence_right"); } @Override diff --git a/src/client/java/minicraft/level/tile/FloorTile.java b/src/client/java/minicraft/level/tile/FloorTile.java index 466cfafc0..319db55e0 100644 --- a/src/client/java/minicraft/level/tile/FloorTile.java +++ b/src/client/java/minicraft/level/tile/FloorTile.java @@ -5,7 +5,7 @@ import minicraft.entity.Entity; import minicraft.entity.mob.Player; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/FlowerTile.java b/src/client/java/minicraft/level/tile/FlowerTile.java index eb34b1097..0e904df0a 100644 --- a/src/client/java/minicraft/level/tile/FlowerTile.java +++ b/src/client/java/minicraft/level/tile/FlowerTile.java @@ -6,7 +6,7 @@ import minicraft.entity.mob.Player; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/GrassTile.java b/src/client/java/minicraft/level/tile/GrassTile.java index 4e66b4118..5b5162ffb 100644 --- a/src/client/java/minicraft/level/tile/GrassTile.java +++ b/src/client/java/minicraft/level/tile/GrassTile.java @@ -5,7 +5,7 @@ import minicraft.entity.mob.Player; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/HardRockTile.java b/src/client/java/minicraft/level/tile/HardRockTile.java index 84bc8f2b5..df35a18b4 100644 --- a/src/client/java/minicraft/level/tile/HardRockTile.java +++ b/src/client/java/minicraft/level/tile/HardRockTile.java @@ -11,7 +11,7 @@ import minicraft.gfx.Color; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/HoleTile.java b/src/client/java/minicraft/level/tile/HoleTile.java index a55474fd9..d7314c45c 100644 --- a/src/client/java/minicraft/level/tile/HoleTile.java +++ b/src/client/java/minicraft/level/tile/HoleTile.java @@ -3,7 +3,7 @@ import minicraft.entity.Entity; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; public class HoleTile extends Tile { diff --git a/src/client/java/minicraft/level/tile/LavaBrickTile.java b/src/client/java/minicraft/level/tile/LavaBrickTile.java index 5400df3ae..e72b333c8 100644 --- a/src/client/java/minicraft/level/tile/LavaBrickTile.java +++ b/src/client/java/minicraft/level/tile/LavaBrickTile.java @@ -6,7 +6,7 @@ import minicraft.entity.mob.Mob; import minicraft.entity.mob.Player; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.ToolItem; import minicraft.item.ToolType; diff --git a/src/client/java/minicraft/level/tile/LavaTile.java b/src/client/java/minicraft/level/tile/LavaTile.java index 7ab019118..ec078f092 100644 --- a/src/client/java/minicraft/level/tile/LavaTile.java +++ b/src/client/java/minicraft/level/tile/LavaTile.java @@ -3,7 +3,7 @@ import minicraft.entity.Entity; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; public class LavaTile extends Tile { diff --git a/src/client/java/minicraft/level/tile/MaterialTile.java b/src/client/java/minicraft/level/tile/MaterialTile.java index c3220f9c6..791780866 100644 --- a/src/client/java/minicraft/level/tile/MaterialTile.java +++ b/src/client/java/minicraft/level/tile/MaterialTile.java @@ -5,7 +5,7 @@ import minicraft.entity.Entity; import minicraft.entity.mob.Player; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/OreTile.java b/src/client/java/minicraft/level/tile/OreTile.java index e34470f95..d5d9bc845 100644 --- a/src/client/java/minicraft/level/tile/OreTile.java +++ b/src/client/java/minicraft/level/tile/OreTile.java @@ -11,7 +11,7 @@ import minicraft.gfx.Color; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/PathTile.java b/src/client/java/minicraft/level/tile/PathTile.java index 781604b40..e8d3db2b4 100644 --- a/src/client/java/minicraft/level/tile/PathTile.java +++ b/src/client/java/minicraft/level/tile/PathTile.java @@ -4,7 +4,7 @@ import minicraft.entity.Direction; import minicraft.entity.mob.Player; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/RockTile.java b/src/client/java/minicraft/level/tile/RockTile.java index 6fde9871f..5d34b53ca 100644 --- a/src/client/java/minicraft/level/tile/RockTile.java +++ b/src/client/java/minicraft/level/tile/RockTile.java @@ -12,7 +12,7 @@ import minicraft.gfx.Color; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/SandTile.java b/src/client/java/minicraft/level/tile/SandTile.java index 960dcde72..875aa80d5 100644 --- a/src/client/java/minicraft/level/tile/SandTile.java +++ b/src/client/java/minicraft/level/tile/SandTile.java @@ -8,7 +8,7 @@ import minicraft.entity.particle.SandParticle; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/SaplingTile.java b/src/client/java/minicraft/level/tile/SaplingTile.java index c871d2841..6b85d3239 100644 --- a/src/client/java/minicraft/level/tile/SaplingTile.java +++ b/src/client/java/minicraft/level/tile/SaplingTile.java @@ -5,7 +5,7 @@ import minicraft.entity.mob.Mob; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; public class SaplingTile extends Tile { diff --git a/src/client/java/minicraft/level/tile/SignTile.java b/src/client/java/minicraft/level/tile/SignTile.java index 88fb97ff5..b90c713ed 100644 --- a/src/client/java/minicraft/level/tile/SignTile.java +++ b/src/client/java/minicraft/level/tile/SignTile.java @@ -1,15 +1,13 @@ package minicraft.level.tile; import minicraft.core.Game; -import minicraft.core.Renderer; import minicraft.core.io.Sound; import minicraft.entity.Direction; -import minicraft.entity.Entity; import minicraft.entity.mob.Mob; import minicraft.entity.mob.Player; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; @@ -17,13 +15,11 @@ import minicraft.level.Level; import minicraft.level.tile.entity.SignTileEntity; import minicraft.screen.SignDisplay; -import minicraft.screen.SignDisplayMenu; import minicraft.util.AdvancementElement; -import org.tinylog.Logger; public class SignTile extends Tile { protected SignTile() { - super("Sign", new SpriteAnimation(SpriteLinker.SpriteType.Tile, "sign")); + super("Sign", new SpriteAnimation(SpriteManager.SpriteType.Tile, "sign")); } @Override diff --git a/src/client/java/minicraft/level/tile/StairsTile.java b/src/client/java/minicraft/level/tile/StairsTile.java index 58d07c39c..c649488ec 100644 --- a/src/client/java/minicraft/level/tile/StairsTile.java +++ b/src/client/java/minicraft/level/tile/StairsTile.java @@ -8,7 +8,7 @@ import minicraft.entity.mob.Player; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.PowerGloveItem; import minicraft.level.Level; diff --git a/src/client/java/minicraft/level/tile/TorchTile.java b/src/client/java/minicraft/level/tile/TorchTile.java index f60626698..ba544cd26 100644 --- a/src/client/java/minicraft/level/tile/TorchTile.java +++ b/src/client/java/minicraft/level/tile/TorchTile.java @@ -5,7 +5,7 @@ import minicraft.entity.mob.Player; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.PowerGloveItem; diff --git a/src/client/java/minicraft/level/tile/TreeTile.java b/src/client/java/minicraft/level/tile/TreeTile.java index 6b9a76160..e9b8500da 100644 --- a/src/client/java/minicraft/level/tile/TreeTile.java +++ b/src/client/java/minicraft/level/tile/TreeTile.java @@ -11,8 +11,8 @@ import minicraft.gfx.Color; import minicraft.gfx.Screen; import minicraft.gfx.Sprite; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; @@ -22,20 +22,20 @@ import minicraft.util.AdvancementElement; public class TreeTile extends Tile { - private static final LinkedSprite oakSprite = new LinkedSprite(SpriteType.Tile, "oak"); - private static final LinkedSprite oakSpriteFull = new LinkedSprite(SpriteType.Tile, "oak_full"); - private static final LinkedSprite spruceSprite = new LinkedSprite(SpriteType.Tile, "spruce"); - private static final LinkedSprite spruceSpriteFull = new LinkedSprite(SpriteType.Tile, "spruce_full"); - private static final LinkedSprite birchSprite = new LinkedSprite(SpriteType.Tile, "birch"); - private static final LinkedSprite birchSpriteFull = new LinkedSprite(SpriteType.Tile, "birch_full"); - private static final LinkedSprite ashSprite = new LinkedSprite(SpriteType.Tile, "ash"); - private static final LinkedSprite ashSpriteFull = new LinkedSprite(SpriteType.Tile, "ash_full"); - private static final LinkedSprite aspenSprite = new LinkedSprite(SpriteType.Tile, "aspen"); - private static final LinkedSprite aspenSpriteFull = new LinkedSprite(SpriteType.Tile, "aspen_full"); - private static final LinkedSprite firSprite = new LinkedSprite(SpriteType.Tile, "fir"); - private static final LinkedSprite firSpriteFull = new LinkedSprite(SpriteType.Tile, "fir_full"); - private static final LinkedSprite willowSprite = new LinkedSprite(SpriteType.Tile, "willow"); - private static final LinkedSprite willowSpriteFull = new LinkedSprite(SpriteType.Tile, "willow_full"); + private static final SpriteLink oakSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "oak").createSpriteLink(); + private static final SpriteLink oakSpriteFull = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "oak_full").createSpriteLink(); + private static final SpriteLink spruceSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "spruce").createSpriteLink(); + private static final SpriteLink spruceSpriteFull = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "spruce_full").createSpriteLink(); + private static final SpriteLink birchSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "birch").createSpriteLink(); + private static final SpriteLink birchSpriteFull = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "birch_full").createSpriteLink(); + private static final SpriteLink ashSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "ash").createSpriteLink(); + private static final SpriteLink ashSpriteFull = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "ash_full").createSpriteLink(); + private static final SpriteLink aspenSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "aspen").createSpriteLink(); + private static final SpriteLink aspenSpriteFull = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "aspen_full").createSpriteLink(); + private static final SpriteLink firSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "fir").createSpriteLink(); + private static final SpriteLink firSpriteFull = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "fir_full").createSpriteLink(); + private static final SpriteLink willowSprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "willow").createSpriteLink(); + private static final SpriteLink willowSpriteFull = new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "willow_full").createSpriteLink(); public enum TreeType { OAK(oakSprite, oakSpriteFull), @@ -46,10 +46,10 @@ public enum TreeType { FIR(firSprite, firSpriteFull), WILLOW(willowSprite, willowSpriteFull); - private final LinkedSprite treeSprite; - private final LinkedSprite treeSpriteFull; + private final SpriteLink treeSprite; + private final SpriteLink treeSpriteFull; - TreeType(LinkedSprite treeSprite, LinkedSprite treeSpriteFull) { + TreeType(SpriteLink treeSprite, SpriteLink treeSpriteFull) { this.treeSprite = treeSprite; this.treeSpriteFull = treeSpriteFull; } diff --git a/src/client/java/minicraft/level/tile/WallTile.java b/src/client/java/minicraft/level/tile/WallTile.java index 48466fd54..cc218b194 100644 --- a/src/client/java/minicraft/level/tile/WallTile.java +++ b/src/client/java/minicraft/level/tile/WallTile.java @@ -12,7 +12,7 @@ import minicraft.entity.particle.TextParticle; import minicraft.gfx.Color; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.ToolItem; diff --git a/src/client/java/minicraft/level/tile/WaterTile.java b/src/client/java/minicraft/level/tile/WaterTile.java index cf99612e0..29d9e4750 100644 --- a/src/client/java/minicraft/level/tile/WaterTile.java +++ b/src/client/java/minicraft/level/tile/WaterTile.java @@ -3,7 +3,7 @@ import minicraft.entity.Entity; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; public class WaterTile extends Tile { diff --git a/src/client/java/minicraft/level/tile/WoolTile.java b/src/client/java/minicraft/level/tile/WoolTile.java index a7a7d2ac1..e6e095f7c 100644 --- a/src/client/java/minicraft/level/tile/WoolTile.java +++ b/src/client/java/minicraft/level/tile/WoolTile.java @@ -5,7 +5,7 @@ import minicraft.entity.Entity; import minicraft.entity.mob.Player; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.DyeItem; import minicraft.item.Item; import minicraft.item.Items; diff --git a/src/client/java/minicraft/level/tile/farming/CarrotTile.java b/src/client/java/minicraft/level/tile/farming/CarrotTile.java index 542fee7d6..feb656f5b 100644 --- a/src/client/java/minicraft/level/tile/farming/CarrotTile.java +++ b/src/client/java/minicraft/level/tile/farming/CarrotTile.java @@ -1,17 +1,17 @@ package minicraft.level.tile.farming; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tiles; public class CarrotTile extends CropTile { - private final LinkedSprite[] spritStages = new LinkedSprite[] { - new LinkedSprite(SpriteType.Tile, "carrot_stage0"), - new LinkedSprite(SpriteType.Tile, "carrot_stage1"), - new LinkedSprite(SpriteType.Tile, "carrot_stage2"), - new LinkedSprite(SpriteType.Tile, "carrot_stage3") + private final SpriteLink[] spritStages = new SpriteLink[] { + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "carrot_stage0").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "carrot_stage1").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "carrot_stage2").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "carrot_stage3").createSpriteLink() }; public CarrotTile(String name) { diff --git a/src/client/java/minicraft/level/tile/farming/CropTile.java b/src/client/java/minicraft/level/tile/farming/CropTile.java index 6291fa75b..a875216d4 100644 --- a/src/client/java/minicraft/level/tile/farming/CropTile.java +++ b/src/client/java/minicraft/level/tile/farming/CropTile.java @@ -6,7 +6,7 @@ import minicraft.entity.mob.Mob; import minicraft.entity.mob.Player; import minicraft.entity.particle.Particle; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.item.Item; import minicraft.item.Items; import minicraft.item.StackableItem; @@ -99,7 +99,8 @@ public boolean tick(Level level, int xt, int yt) { return successful; } - private static final SpriteLinker.LinkedSprite particleSprite = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "glint"); + private static final SpriteManager.SpriteLink particleSprite = + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "glint").createSpriteLink(); @Override public boolean interact(Level level, int xt, int yt, Player player, Item item, Direction attackDir) { diff --git a/src/client/java/minicraft/level/tile/farming/FarmTile.java b/src/client/java/minicraft/level/tile/farming/FarmTile.java index 6205714dd..f7e462f98 100644 --- a/src/client/java/minicraft/level/tile/farming/FarmTile.java +++ b/src/client/java/minicraft/level/tile/farming/FarmTile.java @@ -5,7 +5,7 @@ import minicraft.entity.mob.Player; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.item.Item; import minicraft.item.ToolItem; import minicraft.item.ToolType; diff --git a/src/client/java/minicraft/level/tile/farming/HeavenlyBerriesTile.java b/src/client/java/minicraft/level/tile/farming/HeavenlyBerriesTile.java index c4fc57100..c52fba20c 100644 --- a/src/client/java/minicraft/level/tile/farming/HeavenlyBerriesTile.java +++ b/src/client/java/minicraft/level/tile/farming/HeavenlyBerriesTile.java @@ -1,16 +1,16 @@ package minicraft.level.tile.farming; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.level.Level; import minicraft.level.tile.Tiles; public class HeavenlyBerriesTile extends CropTile { - private final SpriteLinker.LinkedSprite[] spritStages = new SpriteLinker.LinkedSprite[] { - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Tile, "heavenly_berries_stage0"), - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Tile, "heavenly_berries_stage1"), - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Tile, "heavenly_berries_stage2"), - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Tile, "heavenly_berries_stage3") + private final SpriteManager.SpriteLink[] spritStages = new SpriteManager.SpriteLink[] { + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "heavenly_berries_stage0").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "heavenly_berries_stage1").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "heavenly_berries_stage2").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "heavenly_berries_stage3").createSpriteLink() }; public HeavenlyBerriesTile(String name) { diff --git a/src/client/java/minicraft/level/tile/farming/HellishBerriesTile.java b/src/client/java/minicraft/level/tile/farming/HellishBerriesTile.java index 6d4f7bcb5..f0335c614 100644 --- a/src/client/java/minicraft/level/tile/farming/HellishBerriesTile.java +++ b/src/client/java/minicraft/level/tile/farming/HellishBerriesTile.java @@ -1,16 +1,16 @@ package minicraft.level.tile.farming; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.level.Level; import minicraft.level.tile.Tiles; public class HellishBerriesTile extends CropTile { - private final SpriteLinker.LinkedSprite[] spritStages = new SpriteLinker.LinkedSprite[] { - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Tile, "hellish_berries_stage0"), - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Tile, "hellish_berries_stage1"), - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Tile, "hellish_berries_stage2"), - new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Tile, "hellish_berries_stage3") + private final SpriteManager.SpriteLink[] spritStages = new SpriteManager.SpriteLink[] { + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "hellish_berries_stage0").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "hellish_berries_stage1").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "hellish_berries_stage2").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "hellish_berries_stage3").createSpriteLink() }; public HellishBerriesTile(String name) { diff --git a/src/client/java/minicraft/level/tile/farming/PotatoTile.java b/src/client/java/minicraft/level/tile/farming/PotatoTile.java index 619dbf2fc..ac25c2b25 100644 --- a/src/client/java/minicraft/level/tile/farming/PotatoTile.java +++ b/src/client/java/minicraft/level/tile/farming/PotatoTile.java @@ -1,19 +1,19 @@ package minicraft.level.tile.farming; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tiles; public class PotatoTile extends CropTile { - private final LinkedSprite[] spritStages = new LinkedSprite[] { - new LinkedSprite(SpriteType.Tile, "potato_stage0"), - new LinkedSprite(SpriteType.Tile, "potato_stage1"), - new LinkedSprite(SpriteType.Tile, "potato_stage2"), - new LinkedSprite(SpriteType.Tile, "potato_stage3"), - new LinkedSprite(SpriteType.Tile, "potato_stage4"), - new LinkedSprite(SpriteType.Tile, "potato_stage5") + private final SpriteLink[] spritStages = new SpriteLink[] { + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "potato_stage0").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "potato_stage1").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "potato_stage2").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "potato_stage3").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "potato_stage4").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "potato_stage5").createSpriteLink() }; public PotatoTile(String name) { diff --git a/src/client/java/minicraft/level/tile/farming/TomatoTile.java b/src/client/java/minicraft/level/tile/farming/TomatoTile.java index a8329ae63..3ae3b2aa9 100644 --- a/src/client/java/minicraft/level/tile/farming/TomatoTile.java +++ b/src/client/java/minicraft/level/tile/farming/TomatoTile.java @@ -1,17 +1,16 @@ package minicraft.level.tile.farming; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager; import minicraft.level.Level; import minicraft.level.tile.Tiles; public class TomatoTile extends CropTile { - private final LinkedSprite[] spritStages = new LinkedSprite[] { - new LinkedSprite(SpriteType.Tile, "tomato_stage0"), - new LinkedSprite(SpriteType.Tile, "tomato_stage1"), - new LinkedSprite(SpriteType.Tile, "tomato_stage2"), - new LinkedSprite(SpriteType.Tile, "tomato_stage3") + private final SpriteManager.SpriteLink[] spritStages = new SpriteManager.SpriteLink[] { + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "tomato_stage0").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "tomato_stage1").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "tomato_stage2").createSpriteLink(), + new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Tile, "tomato_stage3").createSpriteLink() }; public TomatoTile(String name) { diff --git a/src/client/java/minicraft/level/tile/farming/WheatTile.java b/src/client/java/minicraft/level/tile/farming/WheatTile.java index 31fb0fe5a..ff37c1d6c 100644 --- a/src/client/java/minicraft/level/tile/farming/WheatTile.java +++ b/src/client/java/minicraft/level/tile/farming/WheatTile.java @@ -1,19 +1,19 @@ package minicraft.level.tile.farming; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteLink; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.level.tile.Tiles; public class WheatTile extends CropTile { - private final LinkedSprite[] spritStages = new LinkedSprite[] { - new LinkedSprite(SpriteType.Tile, "wheat_stage0"), - new LinkedSprite(SpriteType.Tile, "wheat_stage1"), - new LinkedSprite(SpriteType.Tile, "wheat_stage2"), - new LinkedSprite(SpriteType.Tile, "wheat_stage3"), - new LinkedSprite(SpriteType.Tile, "wheat_stage4"), - new LinkedSprite(SpriteType.Tile, "wheat_stage5") + private final SpriteLink[] spritStages = new SpriteLink[] { + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "wheat_stage0").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "wheat_stage1").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "wheat_stage2").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "wheat_stage3").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "wheat_stage4").createSpriteLink(), + new SpriteLink.SpriteLinkBuilder(SpriteType.Tile, "wheat_stage5").createSpriteLink() }; public WheatTile(String name) { diff --git a/src/client/java/minicraft/screen/ContainerDisplay.java b/src/client/java/minicraft/screen/ContainerDisplay.java index 05da5855e..5876637ed 100644 --- a/src/client/java/minicraft/screen/ContainerDisplay.java +++ b/src/client/java/minicraft/screen/ContainerDisplay.java @@ -4,16 +4,14 @@ import minicraft.core.Game; import minicraft.core.Renderer; import minicraft.core.io.InputHandler; -import minicraft.core.io.Localization; import minicraft.entity.ItemHolder; import minicraft.entity.furniture.Chest; import minicraft.entity.mob.Player; import minicraft.gfx.Color; -import minicraft.gfx.Font; import minicraft.gfx.MinicraftImage; import minicraft.gfx.Rectangle; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.item.Inventory; import minicraft.item.Item; import minicraft.item.StackableItem; @@ -23,7 +21,7 @@ public class ContainerDisplay extends Display { private static final int padding = 10; private final MinicraftImage counterSheet = - Renderer.spriteLinker.getSheet(SpriteLinker.SpriteType.Gui, "inventory_counter"); + Renderer.spriteManager.getSheet(SpriteManager.SpriteType.Gui, "inventory_counter"); private Player player; private Chest chest; diff --git a/src/client/java/minicraft/screen/LevelTransitionDisplay.java b/src/client/java/minicraft/screen/LevelTransitionDisplay.java index 6f8a3a970..ae027f78d 100644 --- a/src/client/java/minicraft/screen/LevelTransitionDisplay.java +++ b/src/client/java/minicraft/screen/LevelTransitionDisplay.java @@ -1,11 +1,14 @@ package minicraft.screen; import minicraft.core.Game; +import minicraft.core.Renderer; import minicraft.core.World; import minicraft.core.io.InputHandler; +import minicraft.gfx.MinicraftImage; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; + +import java.util.function.Supplier; public class LevelTransitionDisplay extends Display { @@ -14,7 +17,7 @@ public class LevelTransitionDisplay extends Display { private int dir; // Direction that you are changing levels. (going up or down stairs) private int time = 0; // Time it spends on this menu - private LinkedSprite hudSheet = new LinkedSprite(SpriteType.Gui, "hud"); + private final Supplier hudSheet = () -> Renderer.spriteManager.getSheet(SpriteType.Gui, "hud"); public LevelTransitionDisplay(int dir) { super(false, false); @@ -34,9 +37,9 @@ public void render(Screen screen) { int dd = (y + x % 2 * 2 + x / 3) - time * 2; // Used as part of the positioning. if (dd < 0 && dd > -30) { if (dir > 0) - screen.render(x * 8, y * 8, 5, 2, 0, hudSheet.getSheet()); // If the direction is upwards then render the squares going up + screen.render(x * 8, y * 8, 5, 2, 0, hudSheet.get()); // If the direction is upwards then render the squares going up else - screen.render(x * 8, Screen.h - y * 8 - 8, 5, 2, 0, hudSheet.getSheet()); // If the direction is negative, then the squares will go down. + screen.render(x * 8, Screen.h - y * 8 - 8, 5, 2, 0, hudSheet.get()); // If the direction is negative, then the squares will go down. } } } diff --git a/src/client/java/minicraft/screen/Menu.java b/src/client/java/minicraft/screen/Menu.java index ca402bc4a..abbf10a9e 100644 --- a/src/client/java/minicraft/screen/Menu.java +++ b/src/client/java/minicraft/screen/Menu.java @@ -1,5 +1,6 @@ package minicraft.screen; +import minicraft.core.Renderer; import minicraft.core.io.InputHandler; import minicraft.core.io.Localization; import minicraft.core.io.Sound; @@ -11,8 +12,7 @@ import minicraft.gfx.Point; import minicraft.gfx.Rectangle; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.screen.entry.BlankEntry; import minicraft.screen.entry.ListEntry; import org.jetbrains.annotations.NotNull; @@ -23,6 +23,7 @@ import java.util.Iterator; import java.util.List; import java.util.Locale; +import java.util.function.Supplier; public class Menu { @@ -68,7 +69,7 @@ public class Menu { */ private String typingSearcher; - private LinkedSprite hudSheet = new LinkedSprite(SpriteType.Gui, "hud"); + private final Supplier hudSheet = () -> Renderer.spriteManager.getSheet(SpriteType.Gui, "hud"); private Menu() { } @@ -324,13 +325,13 @@ public void render(Screen screen) { if (drawVertically) { for (int i = 0; i < title.length(); i++) { if (hasFrame) - screen.render(titleLoc.x, titleLoc.y + i * Font.textHeight(), 3, 6, 0, hudSheet.getSheet()); + screen.render(titleLoc.x, titleLoc.y + i * Font.textHeight(), 3, 6, 0, hudSheet.get()); Font.draw(title.substring(i, i + 1), screen, titleLoc.x, titleLoc.y + i * Font.textHeight(), titleColor); } } else { for (int i = 0; i < title.length(); i++) { if (hasFrame) - screen.render(titleLoc.x + i * Font.textWidth(" "), titleLoc.y, 3, 6, 0, hudSheet.getSheet()); + screen.render(titleLoc.x + i * Font.textWidth(" "), titleLoc.y, 3, 6, 0, hudSheet.get()); Font.draw(title.substring(i, i + 1), screen, titleLoc.x + i * Font.textWidth(" "), titleLoc.y, titleColor); } } @@ -349,7 +350,7 @@ public void render(Screen screen) { for (int i = 0; i < typingSearcher.length() + 4; i++) { if (hasFrame) { - screen.render(xSearcherBar + spaceWidth * i - leading, titleLoc.y - 8, 3, 6, 0, hudSheet.getSheet()); + screen.render(xSearcherBar + spaceWidth * i - leading, titleLoc.y - 8, 3, 6, 0, hudSheet.get()); } Font.draw("> " + typingSearcher + " <", screen, xSearcherBar - leading, titleLoc.y - 8, typingSearcher.length() < Menu.LIMIT_TYPING_SEARCHER ? Color.YELLOW : Color.RED); @@ -427,7 +428,7 @@ private void renderFrame(Screen screen) { int spriteoffset = (xend && yend ? 0 : (yend ? 1 : (xend ? 2 : 3))); // determines which sprite to use int mirrors = (x == right ? 1 : 0) + (y == bottom ? 2 : 0); // gets mirroring - screen.render(x, y, spriteoffset, 6, mirrors, hudSheet.getSheet()); + screen.render(x, y, spriteoffset, 6, mirrors, hudSheet.get()); if (x < right && x + MinicraftImage.boxWidth > right) x = right - MinicraftImage.boxWidth; diff --git a/src/client/java/minicraft/screen/OnScreenKeyboardMenu.java b/src/client/java/minicraft/screen/OnScreenKeyboardMenu.java index 6d6f285dc..72c12a5e8 100644 --- a/src/client/java/minicraft/screen/OnScreenKeyboardMenu.java +++ b/src/client/java/minicraft/screen/OnScreenKeyboardMenu.java @@ -11,12 +11,11 @@ import minicraft.gfx.Point; import minicraft.gfx.Rectangle; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import org.jetbrains.annotations.Nullable; import java.awt.Label; import java.awt.event.KeyEvent; -import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.stream.Stream; @@ -275,7 +274,7 @@ public void render(Screen screen) { final int keyHeight = 14; final int keyWidth = 16; VirtualKey[][] keys = shiftPressed ? keysB : keysF; - MinicraftImage sheet = Renderer.spriteLinker.getSheet(SpriteLinker.SpriteType.Gui, "osk"); + MinicraftImage sheet = Renderer.spriteManager.getSheet(SpriteManager.SpriteType.Gui, "osk"); for (int r = 0; r < keys.length; r++) { int totalLength = (keys[r].length * keyWidth); totalLength += keyWidth * 2 * (int) Stream.of(keys[r]).filter(k -> k == spaceBar).count(); diff --git a/src/client/java/minicraft/screen/PlayerInvDisplay.java b/src/client/java/minicraft/screen/PlayerInvDisplay.java index 65373e58e..d7a5ad7a1 100644 --- a/src/client/java/minicraft/screen/PlayerInvDisplay.java +++ b/src/client/java/minicraft/screen/PlayerInvDisplay.java @@ -12,7 +12,7 @@ import minicraft.gfx.Point; import minicraft.gfx.Rectangle; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.item.Inventory; import minicraft.item.Item; import minicraft.item.Items; @@ -26,7 +26,7 @@ public class PlayerInvDisplay extends Display { private final Player player; private final MinicraftImage counterSheet = - Renderer.spriteLinker.getSheet(SpriteLinker.SpriteType.Gui, "inventory_counter"); + Renderer.spriteManager.getSheet(SpriteManager.SpriteType.Gui, "inventory_counter"); private String itemDescription = ""; private Menu.Builder descriptionMenuBuilder; diff --git a/src/client/java/minicraft/screen/QuestsDisplay.java b/src/client/java/minicraft/screen/QuestsDisplay.java index e185c58f7..40bcf911e 100644 --- a/src/client/java/minicraft/screen/QuestsDisplay.java +++ b/src/client/java/minicraft/screen/QuestsDisplay.java @@ -13,7 +13,7 @@ import minicraft.gfx.Point; import minicraft.gfx.Rectangle; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker; +import minicraft.gfx.SpriteManager; import minicraft.saveload.Load; import minicraft.screen.entry.BlankEntry; import minicraft.screen.entry.ListEntry; @@ -314,7 +314,7 @@ public void render(int xp, int yp, int xt, int yt, int bits, MinicraftImage shee // Ignoring mirror. // Validation check if (xt * 8 + yt * 8 * sheet.width + 7 + 7 * sheet.width >= sheet.pixels.length) { - sheet = Renderer.spriteLinker.missingSheet(SpriteLinker.SpriteType.Item); + sheet = Renderer.spriteManager.missingSheet(SpriteManager.SpriteType.Item); xt = 0; yt = 0; } diff --git a/src/client/java/minicraft/screen/ResourcePackDisplay.java b/src/client/java/minicraft/screen/ResourcePackDisplay.java index 6ca66a950..607e09f51 100644 --- a/src/client/java/minicraft/screen/ResourcePackDisplay.java +++ b/src/client/java/minicraft/screen/ResourcePackDisplay.java @@ -13,8 +13,8 @@ import minicraft.gfx.Point; import minicraft.gfx.Screen; import minicraft.gfx.SpriteAnimation; -import minicraft.gfx.SpriteLinker; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.saveload.Save; import minicraft.screen.entry.ListEntry; import minicraft.screen.entry.SelectEntry; @@ -731,7 +731,7 @@ public static void reloadResources() { Collections.reverse(loadQuery); // Clear all previously loaded resources. - Renderer.spriteLinker.resetSprites(); + Renderer.spriteManager.resetSprites(); Localization.resetLocalizations(); BookData.resetBooks(); Sound.resetSounds(); @@ -750,13 +750,13 @@ public static void reloadResources() { } } - SpriteAnimation.refreshAnimations(); - Renderer.spriteLinker.updateLinkedSheets(); - Localization.loadLanguage(); - // Refreshing skins SkinDisplay.refreshSkins(); SkinDisplay.releaseSkins(); + + SpriteAnimation.refreshAnimations(); + Renderer.spriteManager.updateLinkedSheets(); + Localization.loadLanguage(); } /** @@ -812,7 +812,7 @@ private static void loadTextures(ResourcePack pack, SpriteType type) throws IOEx for (String m : pack.getFiles(path, (p, isDir) -> p.toString().endsWith(".png.json") && !isDir)) { try { JSONObject obj = new JSONObject(readStringFromInputStream(pack.getResourceAsStream(m))); - SpriteLinker.SpriteMeta meta = new SpriteLinker.SpriteMeta(); + SpriteManager.SpriteMeta meta = new SpriteManager.SpriteMeta(); String imgName = m.substring(0, m.length() - 5); pngs.remove(imgName); BufferedImage image = ImageIO.read(pack.getResourceAsStream(imgName)); @@ -831,7 +831,7 @@ private static void loadTextures(ResourcePack pack, SpriteType type) throws IOEx validateImageAsset(pack, imgName, image, 16, 16); sheet = new MinicraftImage(image, 16, 16); } - Renderer.spriteLinker.setSprite(type, m.substring(path.length(), m.length() - 9), sheet); + Renderer.spriteManager.setSprite(type, m.substring(path.length(), m.length() - 9), sheet); JSONObject borderObj = obj.optJSONObject("border"); if (borderObj != null) { @@ -843,7 +843,7 @@ private static void loadTextures(ResourcePack pack, SpriteType type) throws IOEx try { BufferedImage img = ImageIO.read(pack.getResourceAsStream(borderK)); validateImageAsset(pack, borderK, img, 24, 24); - Renderer.spriteLinker.setSprite(type, meta.border, new MinicraftImage(img, 24, 24)); + Renderer.spriteManager.setSprite(type, meta.border, new MinicraftImage(img, 24, 24)); } catch (IOException e) { Logging.RESOURCEHANDLER_RESOURCEPACK.warn(e, "Unable to read {} with {} in pack: {}", borderK, m, pack.name); meta.border = null; @@ -858,7 +858,7 @@ private static void loadTextures(ResourcePack pack, SpriteType type) throws IOEx try { BufferedImage img = ImageIO.read(pack.getResourceAsStream(cornerK)); validateImageAsset(pack, cornerK, img, 16, 16); - Renderer.spriteLinker.setSprite(type, meta.corner, new MinicraftImage(img, 16, 16)); + Renderer.spriteManager.setSprite(type, meta.corner, new MinicraftImage(img, 16, 16)); } catch (IOException e) { Logging.RESOURCEHANDLER_RESOURCEPACK.warn(e, "Unable to read {} with {} in pack: {}", cornerK, m, pack.name); meta.corner = null; @@ -890,7 +890,7 @@ private static void loadTextures(ResourcePack pack, SpriteType type) throws IOEx sheet = new MinicraftImage(image); } - Renderer.spriteLinker.setSprite(type, p.substring(path.length(), p.length() - 4), sheet); + Renderer.spriteManager.setSprite(type, p.substring(path.length(), p.length() - 4), sheet); } catch (IOException e) { Logging.RESOURCEHANDLER_RESOURCEPACK.warn("Unable to load {} in pack : {}", p, pack.name); } diff --git a/src/client/java/minicraft/screen/SkinDisplay.java b/src/client/java/minicraft/screen/SkinDisplay.java index e19a80616..fae497b79 100644 --- a/src/client/java/minicraft/screen/SkinDisplay.java +++ b/src/client/java/minicraft/screen/SkinDisplay.java @@ -12,7 +12,7 @@ import minicraft.gfx.MinicraftImage; import minicraft.gfx.Point; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.LinkedSprite; +import minicraft.gfx.SpriteManager.SpriteLink; import minicraft.saveload.Save; import minicraft.screen.entry.ListEntry; import minicraft.screen.entry.SelectEntry; @@ -37,7 +37,7 @@ * Many skins can be put according to the number of files. */ public class SkinDisplay extends Display { - private static final LinkedHashMap skins = new LinkedHashMap<>(); + private static final LinkedHashMap skins = new LinkedHashMap<>(); private static final ArrayList defaultSkins = new ArrayList<>(); private static final MinicraftImage defaultSheet; private static final File FOLDER_LOCATION = new File(FileHandler.gameDir + "/skins"); @@ -58,7 +58,6 @@ public class SkinDisplay extends Display { selectedSkin = defaultSkins.get(0); Logging.RESOURCEHANDLER_SKIN.debug("Refreshing skins."); - refreshSkins(); } public SkinDisplay() { @@ -74,17 +73,18 @@ public SkinDisplay() { refreshSkins(); refreshEntries(); menus[0].setSelection(new ArrayList<>(skins.keySet()).indexOf(selectedSkin)); + Renderer.spriteManager.refreshSkins(); } public static void refreshSkins() { - Renderer.spriteLinker.clearSkins(); + Renderer.spriteManager.clearSkins(); skins.clear(); // Pointing the keys to the default sheet, - Renderer.spriteLinker.setSkin("skin.minicraft.skin.paul", defaultSheet); - Renderer.spriteLinker.setSkin("skin.minicraft.skin.paul_cape", defaultSheet); - Renderer.spriteLinker.setSkin("skin.minicraft.skin.minecraft_steve", defaultSheet); - Renderer.spriteLinker.setSkin("skin.minicraft.skin.minecraft_alex", defaultSheet); + Renderer.spriteManager.setSkin("skin.minicraft.skin.paul", defaultSheet); + Renderer.spriteManager.setSkin("skin.minicraft.skin.paul_cape", defaultSheet); + Renderer.spriteManager.setSkin("skin.minicraft.skin.minecraft_steve", defaultSheet); + Renderer.spriteManager.setSkin("skin.minicraft.skin.minecraft_alex", defaultSheet); skins.put("minicraft.skin.paul", Mob.compileMobSpriteAnimations(0, 0, "skin.minicraft.skin.paul")); skins.put("minicraft.skin.paul_cape", Mob.compileMobSpriteAnimations(0, 4, "skin.minicraft.skin.paul_cape")); @@ -120,16 +120,7 @@ private void refreshEntries() { public static void releaseSkins() { for (String skin : new ArrayList<>(skins.keySet())) { if (!defaultSkins.contains(skin) && !skin.equals(selectedSkin)) { - Renderer.spriteLinker.setSkin("skin." + skin, null); - if (skins.containsKey(skin)) for (LinkedSprite[] a : skins.remove(skin)) { - for (LinkedSprite b : a) { - try { - b.destroy(); - } catch (DestroyFailedException e) { - Logging.RESOURCEHANDLER_SKIN.trace(e); - } - } - } + deregisterSkin(skin); } } } @@ -198,7 +189,7 @@ private synchronized static void refreshSkinFiles(List files) { MinicraftImage.validateImageDimension(img); MinicraftImage.validateImageDimension(img, 64, 32); MinicraftImage sheet = new MinicraftImage(img, 64, 32); - Renderer.spriteLinker.setSkin("skin." + name, sheet); + Renderer.spriteManager.setSkin("skin." + name, sheet); skins.put(name, Mob.compileMobSpriteAnimations(0, 0, "skin." + name)); } catch (IOException e) { Logging.RESOURCEHANDLER_SKIN.error("Could not read image at path {}. The file is probably missing or formatted wrong.", skinPath); @@ -213,15 +204,19 @@ private synchronized static void refreshSkinFiles(List files) { Logging.RESOURCEHANDLER_SKIN.warn("Potentially incompatible image at {}:\n" + "Source: width {}; height {}", skinPath, e.getWidth(), e.getHeight()); } else { - Renderer.spriteLinker.setSkin("skin." + name, null); - if (skins.containsKey(name)) for (LinkedSprite[] a : skins.remove(name)) { - for (LinkedSprite b : a) { - try { - b.destroy(); - } catch (DestroyFailedException e) { - Logging.RESOURCEHANDLER_SKIN.trace(e); - } - } + deregisterSkin(name); + } + } + } + + private static void deregisterSkin(String name) { + Renderer.spriteManager.setSkin("skin." + name, null); + if (skins.containsKey(name)) for (SpriteLink[] a : skins.remove(name)) { + for (SpriteLink b : a) { + try { + b.destroy(); + } catch (DestroyFailedException e) { + Logging.RESOURCEHANDLER_SKIN.trace(e); } } } @@ -271,7 +266,7 @@ public void render(Screen screen) { int spriteIndex = (step / 40) % 8; // 9 = 8 Frames for sprite // Render preview of skin. - LinkedSprite sprite = new ArrayList<>(skins.values()).get(menus[0].getSelection())[spriteIndex / 2][spriteIndex % 2]; + SpriteLink sprite = new ArrayList<>(skins.values()).get(menus[0].getSelection())[spriteIndex / 2][spriteIndex % 2]; screen.render(xOffset, yOffset, sprite); // Help text. @@ -289,8 +284,8 @@ public static void setSelectedSkin(String selectedSkin) { // First array is one of the four animations. @NotNull - public static LinkedSprite[][][] getSkinAsMobSprite() { - LinkedSprite[][][] mobSprites = new LinkedSprite[2][][]; + public static SpriteLink[][][] getSkinAsMobSprite() { + SpriteLink[][][] mobSprites = new SpriteLink[2][][]; if (!skins.keySet().contains(selectedSkin)) selectedSkin = defaultSkins.get(0); if (defaultSkins.contains(selectedSkin)) { diff --git a/src/client/java/minicraft/screen/TitleDisplay.java b/src/client/java/minicraft/screen/TitleDisplay.java index de083b95f..3d1ab6528 100644 --- a/src/client/java/minicraft/screen/TitleDisplay.java +++ b/src/client/java/minicraft/screen/TitleDisplay.java @@ -11,7 +11,7 @@ import minicraft.gfx.MinicraftImage; import minicraft.gfx.Point; import minicraft.gfx.Screen; -import minicraft.gfx.SpriteLinker.SpriteType; +import minicraft.gfx.SpriteManager.SpriteType; import minicraft.level.Level; import minicraft.network.Network; import minicraft.screen.entry.BlankEntry; @@ -113,7 +113,7 @@ public void tick(InputHandler input) { public void render(Screen screen) { super.render(screen); - MinicraftImage sheet = Renderer.spriteLinker.getSheet(SpriteType.Gui, "title"); + MinicraftImage sheet = Renderer.spriteManager.getSheet(SpriteType.Gui, "title"); int h = sheet.height / 8; // Height of squares (on the spritesheet) int w = sheet.width / 8; // Width of squares (on the spritesheet) int xo = (Screen.w - sheet.width) / 2; // X location of the title