diff --git a/src/main/java/minicraft/entity/ItemEntity.java b/src/main/java/minicraft/entity/ItemEntity.java index 5f8dd280..d9be1caa 100644 --- a/src/main/java/minicraft/entity/ItemEntity.java +++ b/src/main/java/minicraft/entity/ItemEntity.java @@ -8,6 +8,7 @@ import minicraft.graphic.Color; import minicraft.graphic.Screen; import minicraft.item.Item; +import minicraft.item.Items; import minicraft.level.tile.Tiles; public class ItemEntity extends Entity implements ClientTickable { @@ -154,9 +155,9 @@ public void render(Screen screen) { } if (Settings.getBoolean("shadows")) { - item.sprite.render(screen, x - 4, y - 4, 4, -1, Color.BLACK); // item shadow uses black color + item.sprite.render(screen, x - 5, y - 8, 4, -1, Color.BLACK); // item shadow uses black color } - item.sprite.render(screen, x - 4, y - 4 - (int)(zz)); + item.sprite.render(screen, x - 5, y - 8 - (int)(zz)); } @Override @@ -180,4 +181,17 @@ protected List getDataPrints() { prints.add(0, item.toString()); return prints; } + + @Override + public int getLightRadius() { + return ( + this.item.equals(Items.get("Torch")) || + this.item.equals(Items.get("Lava Bucket")) || + this.item.equals(Items.get("Lantern")) || + this.item.equals(Items.get("Iron Lantern")) || + this.item.equals(Items.get("Gold Lantern")) || + this.item.equals(Items.get("Summon Altar")) + ) ? 1 : 0; + } + } diff --git a/src/main/java/minicraft/entity/furniture/Tnt.java b/src/main/java/minicraft/entity/furniture/Tnt.java index 245de7bf..f85de79c 100644 --- a/src/main/java/minicraft/entity/furniture/Tnt.java +++ b/src/main/java/minicraft/entity/furniture/Tnt.java @@ -18,15 +18,16 @@ import minicraft.graphic.Screen; import minicraft.graphic.Sprite; import minicraft.item.Item; +import minicraft.item.PowerGloveItem; import minicraft.level.Level; import minicraft.level.tile.Tile; import minicraft.level.tile.Tiles; import minicraft.screen.AchievementsDisplay; public class Tnt extends Furniture implements ActionListener { - private static int FUSE_TIME = 90; - private static int BLAST_RADIUS = 32; - private static int BLAST_DAMAGE = 75; + private static final int FUSE_TIME = 90; + private static final int BLAST_RADIUS = 32; + private static final int BLAST_DAMAGE = 75; private int damage = 0; private int light = 0; @@ -35,8 +36,8 @@ public class Tnt extends Furniture implements ActionListener { private Timer explodeTimer; private Level levelSave; - private final String[] explosionBlacklist = new String[] { - "hard rock", "obsidian wall", "raw obsidian", "stairs up", "stairs down", "infinite fall" + private static final String[] explosionBlacklist = new String[] { + "hard rock", "obsidian wall", "raw obsidian", "stairs up", "stairs down", "infinite fall", "summon altar" }; /** @@ -150,11 +151,18 @@ public void actionPerformed(ActionEvent e) { @Override public boolean interact(Player player, Item heldItem, Direction attackDir) { - if (!fuseLit) { - fuseLit = true; - Sound.genericFuse.playOnLevel(this.x, this.y); - return true; - } + if (heldItem instanceof PowerGloveItem) { + if (!fuseLit) { + return super.interact(player, heldItem, attackDir); + } + return true; + } else { + if (!fuseLit) { + fuseLit = true; + Sound.genericFuse.playOnLevel(this.x, this.y); + return true; + } + } return false; } diff --git a/src/main/java/minicraft/entity/mob/AirWizard.java b/src/main/java/minicraft/entity/mob/AirWizard.java index ddd9a978..9d737c95 100644 --- a/src/main/java/minicraft/entity/mob/AirWizard.java +++ b/src/main/java/minicraft/entity/mob/AirWizard.java @@ -217,19 +217,18 @@ else if (attackTime > 0 && currentPhase == 3) { if (tickTime % 4 != 0 && currentPhase != 1) { speed = 1; } - - - if (player != null && randomWalkTime == 0) { - int xd = player.x - x; // x dist to player - int yd = player.y - y; // y dist to player - if (random.nextInt(4) == 0 && xd * xd + yd * yd < 50 * 50 && attackDelay == 0 && attackTime == 0) { - if (currentPhase == 1) { - attackDelay = 60 * 4; // ...then set attackDelay to 240 (4 seconds at default 60 ticks/sec) - } else { - attackDelay = 60 * 2; // ...then set attackDelay to 120 (2 seconds at default 60 ticks/sec) - } - } - } + + if (player != null && randomWalkTime == 0) { + int xd = player.x - x; // x dist to player + int yd = player.y - y; // y dist to player + if (random.nextInt(4) == 0 && xd * xd + yd * yd < 50 * 50 && attackDelay == 0 && attackTime == 0) { + if (currentPhase == 1) { + attackDelay = 60 * 4; // ...then set attackDelay to 240 (4 seconds at default 60 ticks/sec) + } else { + attackDelay = 60 * 2; // ...then set attackDelay to 120 (2 seconds at default 60 ticks/sec) + } + } + } } diff --git a/src/main/java/minicraft/entity/mob/Goat.java b/src/main/java/minicraft/entity/mob/Goat.java index ea374a41..fa037f80 100644 --- a/src/main/java/minicraft/entity/mob/Goat.java +++ b/src/main/java/minicraft/entity/mob/Goat.java @@ -21,13 +21,15 @@ public void tick() { // follows to the player if holds wheat followOnHold(Items.get("Wheat"), 3); - - Tile tile = level.getTile(x >> 4, y >> 4); - if (tile == Tiles.get("Grass") || tile == Tiles.get("Sand") || tile == Tiles.get("Lawn") || tile == Tiles.get("Rose") || tile == Tiles.get("Daisy") || tile == Tiles.get("Dandelion") || tile == Tiles.get("Poppy")) { - this.remove(); - level.add(new Sheep(), x, y); - - } + + if (tickTime /16 %24 == 0) { + Tile tile = level.getTile(x >> 4, y >> 4); + if (tile == Tiles.get("Grass") || tile == Tiles.get("Sand") || tile == Tiles.get("Lawn") || tile == Tiles.get("Rose") || tile == Tiles.get("Daisy") || tile == Tiles.get("Dandelion") || tile == Tiles.get("Poppy")) { + this.remove(); + level.add(new Sheep(), x, y); + + } + } } public void die() { @@ -37,16 +39,10 @@ public void die() { if (Settings.get("diff").equals("Peaceful")) { min = 1; max = 3; - } - if (Settings.get("diff").equals("Easy")) { + } else if (Settings.get("diff").equals("Easy") || Settings.get("diff").equals("Normal")) { min = 1; max = 2; - } - if (Settings.get("diff").equals("Normal")) { - min = 1; - max = 2; - } - if (Settings.get("diff").equals("Hard")) { + } else if (Settings.get("diff").equals("Hard")) { min = 0; max = 1; } diff --git a/src/main/java/minicraft/entity/mob/Sheep.java b/src/main/java/minicraft/entity/mob/Sheep.java index a687a4ff..0fcc9563 100644 --- a/src/main/java/minicraft/entity/mob/Sheep.java +++ b/src/main/java/minicraft/entity/mob/Sheep.java @@ -63,23 +63,25 @@ public void tick() { // follows to the player if holds wheat followOnHold(Items.get("Wheat"), 3); - - Tile tile = level.getTile(x >> 4, y >> 4); - if (tile == Tiles.get("Snow")) { - remove(); - level.add(new Goat(), x, y); - } - // Sheep sounds - if (tickTime /16 %24 == 0 && random.nextInt(8) == 4) { - if (random.nextBoolean()) { - if (!random.nextBoolean()) { - Sound.sheepSay1.playOnLevel(this.x, this.y); + if (tickTime /16 %24 == 0) { + Tile tile = level.getTile(x >> 4, y >> 4); + if (tile == Tiles.get("Snow")) { + remove(); + level.add(new Goat(), x, y); + } + + // Sheep sounds + if (random.nextInt(8) == 4) { + if (random.nextBoolean()) { + if (!random.nextBoolean()) { + Sound.sheepSay1.playOnLevel(this.x, this.y); + } else { + Sound.sheepSay2.playOnLevel(this.x, this.y); + } } else { - Sound.sheepSay2.playOnLevel(this.x, this.y); + Sound.sheepSay3.playOnLevel(this.x, this.y); } - } else { - Sound.sheepSay3.playOnLevel(this.x, this.y); } } diff --git a/src/main/java/minicraft/graphic/Screen.java b/src/main/java/minicraft/graphic/Screen.java index 80f92581..78840e05 100644 --- a/src/main/java/minicraft/graphic/Screen.java +++ b/src/main/java/minicraft/graphic/Screen.java @@ -415,6 +415,42 @@ public void renderLight(int x, int y, int lightRadius) { } } } + + public void renderLight(int x, int y, int lightRadius, int intensReduce) { + // Apply the x and y offsets to the light's position (by screen scrolling) + x -= xOffset; + y -= yOffset; + + // Calculate the starting and ending positions of the light circle on the x and y axis, ensuring the light does not render outside the screen + int x0 = Math.max(x - lightRadius, 0); // start x + int y0 = Math.max(y - lightRadius, 0); // start y + int x1 = Math.min(x + lightRadius, w); // end x + int y1 = Math.min(y + lightRadius, h); // end y + + // Declare the distance from the center of the light circle along the y axis + int yd = 0; + + // Loop through each y position + for (int yy = y0; yy < y1; yy++) { + // Calculate distance between current y position and previous y position + yd = yy - y; + yd *= yd; + // Loop through each x position + for (int xx = x0; xx < x1; xx++) { + int xd = xx - x; // Calculate distance between current x position and previous x position + int dist = xd * xd + yd; // Calculate total distance between current position and center of the circle + + // If the current position is within the circle of light + if (dist <= lightRadius * lightRadius) { + // Calculate the brightness of the light at the current position + int br = 255 - dist * 255 / (lightRadius * lightRadius); + br -= intensReduce; + // Set the pixel value to the maximum between its current value and the calculated brightness + pixels[xx + yy * w] = Math.max(pixels[xx + yy * w], br); + } + } + } + } public void setPixel(int xp, int yp, int color) { // If the pixel is out of bounds, then skip the rest of the loop. diff --git a/src/main/java/minicraft/item/TileItem.java b/src/main/java/minicraft/item/TileItem.java index 530d3287..672e35eb 100644 --- a/src/main/java/minicraft/item/TileItem.java +++ b/src/main/java/minicraft/item/TileItem.java @@ -36,6 +36,8 @@ protected static ArrayList getAllInstances() { items.add(new TileItem("Ice", (new Sprite(15, 21, 0)), "Ice", "Hole", "Water")); items.add(new TileItem("Brown Mushroom", (new Sprite(25, 0, 0)), "Brown Mushroom", "Mycelium")); items.add(new TileItem("Red Mushroom", (new Sprite(24, 0, 0)), "Red Mushroom", "Mycelium")); + + items.add(new TileItem("Summon Altar", (new Sprite(32, 0, 0)), "Summon Altar", "Grass", "Dirt", "Sand")); // Creative mode available tiles: items.add(new TileItem("Natural Rock", (new Sprite(2, 0, 0)), "Rock", "Hole", "Dirt", "Sand", "Path", "Grass", "Snow")); @@ -140,15 +142,24 @@ public boolean interactOn(Tile tile, Level level, int xt, int yt, Player player, } } } + + for (int i = 0; i < 3; i++) { + int randX = (int) Math.ceil(Math.random() * 12) - 4; + int randY = (int) Math.ceil(Math.random() * 12) - 4; + level.add(new BrightParticle(xt * 16 + randX, yt * 16 + randY)); + } } } - - for (int i = 0; i < 3; i++) { - int randX = (int) Math.ceil(Math.random() * 12) - 4; - int randY = (int) Math.ceil(Math.random() * 12) - 4; - level.add(new BrightParticle(xt * 16 + randX, yt * 16 + randY)); - } - + + } else if (getName() == "Summon Altar") { + for (int y = yt - 1; y <= yt + 1; y++) { + for (int x = xt - 1; x <= xt + 1; x++) { + if (level.getTile(x, y) != Tiles.get("Summon Altar")) { + level.setTile(x, y, Tiles.get("Summon Altar")); + } + } + } + } else { level.setTile(xt, yt, model); // TODO maybe data should be part of the saved tile..? //Sound.playerPlace.playOnDisplay(); diff --git a/src/main/java/minicraft/level/Level.java b/src/main/java/minicraft/level/Level.java index 09955ee4..2bdf9b10 100644 --- a/src/main/java/minicraft/level/Level.java +++ b/src/main/java/minicraft/level/Level.java @@ -7,6 +7,7 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.Set; import java.util.function.Predicate; @@ -630,6 +631,42 @@ public void renderLight(Screen screen, int xScroll, int yScroll, int brightness) screen.setOffset(0, 0); } + public void renderLight(Screen screen, int xScroll, int yScroll, int brightness, int additionalRadius) { + int xo = xScroll >> 4; + int yo = yScroll >> 4; + + int w = (Screen.w + 15) >> 4; + int h = (Screen.h + 15) >> 4; + + screen.setOffset(xScroll, yScroll); + + int r = 8; + + List entities = getEntitiesInTiles(xo - r, yo - r, w + xo + r, h + yo + r); + for (Entity entity: entities) { + int lightRadius = entity.getLightRadius(); + if (lightRadius > 0) { + lightRadius += additionalRadius; + screen.renderLight(entity.x - 1, entity.y - 4, lightRadius * brightness, 51); + } + } + + for (int y = yo - r; y <= h + yo + r; y++) { + for (int x = xo - r; x <= w + xo + r; x++) { + if (x < 0 || y < 0 || x >= this.w || y >= this.h) { + continue; + } + + int lightRadius = getTile(x, y).getLightRadius(this, x, y); + if (lightRadius > 0) { + lightRadius += additionalRadius; + screen.renderLight((x << 4) + 8, (y << 4) + 8, lightRadius * brightness, 0); + } + } + } + screen.setOffset(0, 0); + } + private void sortAndRender(Screen screen, List list) { list.sort(spriteSorter); for (Entity entity : list) { @@ -1284,18 +1321,15 @@ private void generateVillages() { private void playRandomMusic(int depth) { - int randomNum = random.nextInt(8); - if (depth == 0) { - Sound[] sounds = {Sound.Theme_Surface, Sound.Theme_Cave, Sound.Theme_Peaceful, Sound.Theme_Peaceful}; - sounds[randomNum].playOnDisplay(); - } else if (depth == -1) { - Sound[] sounds = {Sound.Ambience1, Sound.Ambience2, Sound.Ambience3, Sound.Ambience4}; - sounds[randomNum].playOnDisplay(); - } else if (depth == -2) { - Sound[] sounds = {Sound.Theme_Cavern, Sound.Theme_Cavern_drip}; - sounds[randomNum].playOnDisplay(); - } else if (depth == 1) { - Sound[] sounds = {Sound.Theme_Surface, Sound.Theme_Fall}; + Map soundMap = new HashMap<>(); + soundMap.put(0, new Sound[]{Sound.Theme_Surface, Sound.Theme_Cave, Sound.Theme_Peaceful, Sound.Theme_Peaceful}); + soundMap.put(-1, new Sound[]{Sound.Ambience1, Sound.Ambience2, Sound.Ambience3, Sound.Ambience4}); + soundMap.put(-2, new Sound[]{Sound.Theme_Cavern, Sound.Theme_Cavern_drip}); + soundMap.put(1, new Sound[]{Sound.Theme_Surface, Sound.Theme_Fall}); + + if (soundMap.containsKey(depth)) { + Sound[] sounds = soundMap.get(depth); + int randomNum = random.nextInt(sounds.length); sounds[randomNum].playOnDisplay(); } } diff --git a/src/main/java/minicraft/level/tile/AltarTile.java b/src/main/java/minicraft/level/tile/AltarTile.java new file mode 100644 index 00000000..dd4c8c7e --- /dev/null +++ b/src/main/java/minicraft/level/tile/AltarTile.java @@ -0,0 +1,146 @@ +package minicraft.level.tile; + +import minicraft.core.Game; +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.entity.particle.SmashParticle; +import minicraft.entity.particle.TextParticle; +import minicraft.graphic.Color; +import minicraft.graphic.ConnectorSprite; +import minicraft.graphic.Screen; +import minicraft.graphic.Sprite; +import minicraft.item.Item; +import minicraft.item.Items; +import minicraft.item.ToolItem; +import minicraft.item.ToolType; +import minicraft.level.Level; + +/// this is the typical stone you see underground and on the surface, that gives coal. + +public class AltarTile extends Tile { + private ConnectorSprite sprite = new ConnectorSprite(AltarTile.class, new Sprite(27, 6, 3, 3, 1), new Sprite(32, 6, 2, 2, 1), new Sprite(30, 6, 2, 2, 1)); + + protected AltarTile(String name) { + super(name, (ConnectorSprite) null); + connectorSprite = sprite; + } + + private int tickTime = 0; + + private Sprite cornerSpriteA = new Sprite(30, 9, 1, 1, 1, 0); + private Sprite cornerSpriteB = new Sprite(30, 9, 1, 1, 1, 1); + private Sprite cornerSpriteC = new Sprite(31, 9, 1, 1, 1, 0); + private Sprite cornerSpriteD = new Sprite(31, 9, 1, 1, 1, 1); + + private Sprite gemSprite = new Sprite(30, 8, 1, 1, 1, 0); + + + @Override + public boolean tick(Level level, int xt, int yt) { + tickTime = (tickTime + 1) % 4; + gemSprite = new Sprite(30 + tickTime % 2, 8, 1, 1, 1, 0); + + int damage = level.getData(xt, yt); + if (damage > 0) { + level.setData(xt, yt, damage - 1); + return true; + } + return false; + } + + @Override + public void render(Screen screen, Level level, int x, int y) { + boolean isCenterOfAltar = true; + for (int dy = -1; dy <= 1 && isCenterOfAltar; dy++) { + for (int dx = -1; dx <= 1 && isCenterOfAltar; dx++) { + if (dx == 0 && dy == 0) continue; // Skip the center tile + if (!(level.getTile(x + dx, y + dy) instanceof AltarTile)) { + isCenterOfAltar = false; + } + } + } + + sprite.sparse.color = DirtTile.dirtColor(level.depth); + sprite.render(screen, level, x, y); + + if (isCenterOfAltar) { + x <<= 4; + y <<= 4; + + // center plate + cornerSpriteA.render(screen, x, y - 2); + cornerSpriteB.render(screen, x + 8, y - 2); + cornerSpriteC.render(screen, x + 8, (y - 2) + 8); + cornerSpriteD.render(screen, x, (y - 2) + 8); + + // center gem + gemSprite.render(screen, x + 4, y + 1); + } + } + + + @Override + public boolean mayPass(Level level, int x, int y, Entity entity) { + return true; + } + + @Override + public boolean hurt(Level level, int x, int y, Mob source, int hurtDamage, Direction attackDir) { + hurt(level, x, y, hurtDamage); + return true; + } + + @Override + public boolean interact(Level level, int xt, int yt, Player player, Item item, Direction attackDir) { + // creative mode can just act like survival here + if (item instanceof ToolItem) { + ToolItem tool = (ToolItem) item; + if (tool.type == ToolType.Pickaxe && player.payStamina(4 - tool.level) && tool.payDurability()) { + hurt(level, xt, yt, random.nextInt(10) + (tool.level) * 5 + 10); + return true; + } + } + return false; + } + + @Override + public void hurt(Level level, int x, int y, int hurtDamage) { + int damage = level.getData(x, y) + hurtDamage; + int altarHealth = 50; + if (Game.isMode("Creative")) { + hurtDamage = damage = altarHealth; + } + + Sound.genericHurt.playOnLevel(x << 4, y << 4); + level.add(new SmashParticle(x << 4, y << 4)); + level.add(new TextParticle("" + hurtDamage, (x << 4) + 8, (y << 4) + 8, Color.RED)); + + if (damage >= altarHealth) { + level.dropItem((x << 4) + 8, (y << 4) + 8, 1, 1, Items.get("Holy Stone")); + level.setTile(x, y, Tiles.get("Dirt")); + } else { + level.setData(x, y, damage); + } + } + + @Override + public int getLightRadius(Level level, int x, int y) { + boolean isCenterOfAltar = true; + for (int dy = -1; dy <= 1 && isCenterOfAltar; dy++) { + for (int dx = -1; dx <= 1 && isCenterOfAltar; dx++) { + if (dx == 0 && dy == 0) continue; // Skip the center tile + if (!(level.getTile(x + dx, y + dy) instanceof AltarTile)) { + isCenterOfAltar = false; + } + } + } + + if (isCenterOfAltar) { + return 6; + } + return 0; + } +} \ No newline at end of file diff --git a/src/main/java/minicraft/level/tile/CloudTile.java b/src/main/java/minicraft/level/tile/CloudTile.java index e830c539..a4d15b32 100644 --- a/src/main/java/minicraft/level/tile/CloudTile.java +++ b/src/main/java/minicraft/level/tile/CloudTile.java @@ -27,8 +27,6 @@ public boolean connectsTo(Tile tile, boolean isSide) { // Cloud tile cannot conn } }; - private int tickTime = 0; - public static int cloudColor(int depth) { return Color.get(1, 201, 201, 201); } @@ -44,13 +42,12 @@ public void render(Screen screen, Level level, int x, int y) { } public boolean tick(Level level, int x, int y) { - tickTime++; return false; } @Override public void steppedOn(Level level, int x, int y, Entity entity) { - if (tickTime / 8 % 2 == 0 && Settings.get("particles").equals(true)) { + if (tickCount / 8 % 2 == 0 && Settings.get("particles").equals(true)) { if (entity instanceof Mob && random.nextBoolean()) { int spawnX = (entity.x - 4) + random.nextInt(8) - random.nextInt(8); int spawnY = (entity.y - 4) + random.nextInt(8) - random.nextInt(8); diff --git a/src/main/java/minicraft/level/tile/FerrositeTile.java b/src/main/java/minicraft/level/tile/FerrositeTile.java index 00d67c4f..7228e7bb 100644 --- a/src/main/java/minicraft/level/tile/FerrositeTile.java +++ b/src/main/java/minicraft/level/tile/FerrositeTile.java @@ -24,8 +24,6 @@ public boolean connectsTo(Tile tile, boolean isSide) { } }; - private int tickTime = 0; - protected FerrositeTile(String name) { super(name, sprite); connectsToFerrosite = true; @@ -35,12 +33,11 @@ protected FerrositeTile(String name) { @Override public boolean tick(Level level, int xt, int yt) { - tickTime++; return false; } public void steppedOn(Level level, int x, int y, Entity entity) { - if (tickTime / 8 % 2 == 0 && Settings.get("particles").equals(true)) { + if (tickCount / 8 % 2 == 0 && Settings.get("particles").equals(true)) { // Spawn ferrosite particles under the mobs if (entity instanceof Mob) { if (random.nextBoolean()) { diff --git a/src/main/java/minicraft/level/tile/HardRockTile.java b/src/main/java/minicraft/level/tile/HardRockTile.java index a2642fa1..7190bcda 100644 --- a/src/main/java/minicraft/level/tile/HardRockTile.java +++ b/src/main/java/minicraft/level/tile/HardRockTile.java @@ -86,7 +86,6 @@ public void hurt(Level level, int x, int y, int hurtDamage) { @Override public void render(Screen screen, Level level, int x, int y) { - //Tiles.get("Dirt").render(screen, level, x, y); sprite.sparse.color = DirtTile.dirtColor(level.depth); super.render(screen, level, x, y); } diff --git a/src/main/java/minicraft/level/tile/LavaTile.java b/src/main/java/minicraft/level/tile/LavaTile.java index 17a00baa..58d97d27 100644 --- a/src/main/java/minicraft/level/tile/LavaTile.java +++ b/src/main/java/minicraft/level/tile/LavaTile.java @@ -12,6 +12,8 @@ public boolean connectsTo(Tile tile, boolean isSide) { return tile.connectsToFluid; } }; + + private Tile holeTile = Tiles.get("Hole"); protected LavaTile(String name) { super(name, (ConnectorSprite) null); @@ -46,7 +48,7 @@ public boolean tick(Level level, int xt, int yt) { yn += random.nextInt(2) * 2 - 1; } - if (level.getTile(xn, yn) == Tiles.get("Hole")) { + if (level.getTile(xn, yn) == holeTile) { level.setTile(xn, yn, this); } return false; diff --git a/src/main/java/minicraft/level/tile/OrangeTulipTile.java b/src/main/java/minicraft/level/tile/OrangeTulipTile.java deleted file mode 100644 index 53ec1f92..00000000 --- a/src/main/java/minicraft/level/tile/OrangeTulipTile.java +++ /dev/null @@ -1,82 +0,0 @@ -package minicraft.level.tile; - -import minicraft.core.io.Sound; -import minicraft.entity.Direction; -import minicraft.entity.mob.Mob; -import minicraft.entity.mob.Player; -import minicraft.graphic.ConnectorSprite; -import minicraft.graphic.Screen; -import minicraft.graphic.Sprite; -import minicraft.item.Item; -import minicraft.item.Items; -import minicraft.item.ToolItem; -import minicraft.item.ToolType; -import minicraft.level.Level; - -public class OrangeTulipTile extends Tile { - private static final Sprite sprite = new Sprite(6, 12, 1); - - protected OrangeTulipTile(String name) { - super(name, (ConnectorSprite) null); - connectsToGrass = true; - maySpawn = true; - } - - @Override - public boolean hurt(Level level, int x, int y, Mob source, int hurtDamage, Direction attackDir) { - level.dropItem((x << 4) + 8, (y << 4) + 8, 1, 1, Items.get("Orange Tulip")); - level.setTile(x, y, Tiles.get("Grass")); - return true; - } - - @Override - public boolean interact(Level level, int x, int y, Player player, Item item, Direction attackDir) { - if (item instanceof ToolItem) { - ToolItem tool = (ToolItem) item; - if (tool.type == ToolType.Shovel) { - if (player.payStamina(2 - tool.level) && tool.payDurability()) { - Sound.genericHurt.playOnLevel(x << 4, y << 4); - level.setTile(x, y, Tiles.get("Grass")); - level.dropItem((x << 4) + 8, (y << 4) + 8, Items.get("Orange Tulip")); - return true; - } - } - } - return false; - } - - @Override - public void render(Screen screen, Level level, int x, int y) { - Tiles.get("Grass").render(screen, level, x, y); - - int data = level.getData(x, y); - int shape = (data >> 4) % 2; - - x <<= 4; - y <<= 4; - - sprite.render(screen, x + 8 * shape, y); - sprite.render(screen, x + 8 * (shape == 0 ? 1 : 0), y + 8); - } - - @Override - public boolean tick(Level level, int xt, int yt) { - if (random.nextInt(30) != 0) { - return false; - } - - int xn = xt; - int yn = yt; - - if (random.nextBoolean()) { - xn += random.nextInt(2) * 2 - 1; - } else { - yn += random.nextInt(2) * 2 - 1; - } - - if (level.getTile(xn, yn) == Tiles.get("Dirt")) { - level.setTile(xn, yn, Tiles.get("Grass")); - } - return false; - } -} diff --git a/src/main/java/minicraft/level/tile/SkyGrassTile.java b/src/main/java/minicraft/level/tile/SkyGrassTile.java index 79273f23..a790a0f3 100644 --- a/src/main/java/minicraft/level/tile/SkyGrassTile.java +++ b/src/main/java/minicraft/level/tile/SkyGrassTile.java @@ -16,10 +16,16 @@ public class SkyGrassTile extends Tile { private static ConnectorSprite sprite = new ConnectorSprite(SkyGrassTile.class, new Sprite(36, 21, 3, 3, 1), new Sprite(41, 21, 2, 2, 1), new Sprite(39, 21, 2, 2, 1)) { @Override public boolean connectsTo(Tile tile, boolean isSide) { // Sky grass cannot connect with these tiles - return tile != Tiles.get("Infinite fall") && tile != Tiles.get("Ferrosite") - && tile != Tiles.get("Cloud cactus") && tile != Tiles.get("Cloud") && tile != Tiles.get("Goldroot Tree"); + return tile != Tiles.get("Infinite fall") && + tile != Tiles.get("Ferrosite") && + tile != Tiles.get("Cloud cactus") && + tile != Tiles.get("Cloud") && + tile != Tiles.get("Goldroot Tree"); } }; + + private Tile cloudTile = Tiles.get("Cloud"); + private Tile ferrositeTile = Tiles.get("Ferrosite"); protected SkyGrassTile(String name) { super(name, (ConnectorSprite) null); @@ -45,7 +51,7 @@ public boolean tick(Level level, int xt, int yt) { yn += random.nextInt(2) * 2 - 1; } - if (level.getTile(xn, yn) == Tiles.get("Cloud")) { + if (level.getTile(xn, yn) == cloudTile) { level.setTile(xn, yn, this); } @@ -54,10 +60,10 @@ public boolean tick(Level level, int xt, int yt) { @Override public void render(Screen screen, Level level, int x, int y) { - if (Tiles.get("Cloud") != null) { - Tiles.get("Cloud").render(screen, level, x, y); + if (cloudTile != null) { + cloudTile.render(screen, level, x, y); } else { - Tiles.get("Ferrosite").render(screen, level, x, y); + ferrositeTile.render(screen, level, x, y); } sprite.render(screen, level, x, y); } @@ -75,7 +81,7 @@ public boolean interact(Level level, int xt, int yt, Player player, Item item, D if (toolType == ToolType.Shovel) { if (player.payStamina(4 - tool.level) && tool.payDurability()) { Sound.genericHurt.playOnLevel(xt << 4, yt << 4); - level.setTile(xt, yt, Tiles.get("Ferrosite")); // would allow you to shovel cloud, I think. + level.setTile(xt, yt, ferrositeTile); // would allow you to shovel cloud, I think. if (random.nextInt(20) == 0) { // 20% chance to drop sky seeds level.dropItem((xt << 4) + 8, (yt << 4) + 8, 2, Items.get("Sky Seeds")); } diff --git a/src/main/java/minicraft/level/tile/SkyLawnTile.java b/src/main/java/minicraft/level/tile/SkyLawnTile.java index 042d2c69..5c51be63 100644 --- a/src/main/java/minicraft/level/tile/SkyLawnTile.java +++ b/src/main/java/minicraft/level/tile/SkyLawnTile.java @@ -14,6 +14,8 @@ public class SkyLawnTile extends Tile { private static final Sprite sprite = new Sprite(40, 23, 1); + + private Tile skyGrassTile = Tiles.get("Sky grass"); protected SkyLawnTile(String name) { super(name, (ConnectorSprite) null); @@ -26,7 +28,7 @@ public boolean hurt(Level level, int x, int y, Mob source, int hurtDamage, Direc if (random.nextInt(12) == 1) { // 20% chance to drop sky seeds level.dropItem((x << 4) + 8, (y << 4) + 8, Items.get("Sky Seeds")); } - level.setTile(x, y, Tiles.get("Sky grass")); + level.setTile(x, y, skyGrassTile); return true; } @@ -52,7 +54,7 @@ public boolean interact(Level level, int x, int y, Player player, Item item, Dir @Override public void render(Screen screen, Level level, int x, int y) { - Tiles.get("Sky grass").render(screen, level, x, y); + skyGrassTile.render(screen, level, x, y); int data = level.getData(x, y); int shape = (data >> 4) % 2; diff --git a/src/main/java/minicraft/level/tile/Tiles.java b/src/main/java/minicraft/level/tile/Tiles.java index 231e2c57..e601cebd 100644 --- a/src/main/java/minicraft/level/tile/Tiles.java +++ b/src/main/java/minicraft/level/tile/Tiles.java @@ -151,6 +151,7 @@ public static void initialize() { Tiles.add(97, new SproutTile("Daisy Sprout", Tiles.get("Grass"), Tiles.get("Daisy"))); Tiles.add(98, new SproutTile("Dandelion Sprout", Tiles.get("Grass"), Tiles.get("Dandelion"))); + Tiles.add(99, new AltarTile("Summon Altar")); // tiles.put((short)?, new SandRockTile("Sand rock")); diff --git a/src/main/java/minicraft/level/tile/TorchTile.java b/src/main/java/minicraft/level/tile/TorchTile.java index 6ad930d1..3985b9a1 100644 --- a/src/main/java/minicraft/level/tile/TorchTile.java +++ b/src/main/java/minicraft/level/tile/TorchTile.java @@ -18,10 +18,7 @@ public class TorchTile extends Tile { private static Sprite sprite = new Sprite(5, 3, 0); - private static int LIGHT = 5; private Tile onType; - - private int tickTime = 0; int spawnX = 0; int spawnY = 0; @@ -62,7 +59,7 @@ public void render(Screen screen, Level level, int x, int y) { onType.render(screen, level, x, y); sprite.render(screen, (x << 4) + 4, (y << 4) + 4); - if (!Updater.paused && tickTime / 2 % 2 == 0 && Settings.getBoolean("particles")) { + if (!Updater.paused && tickCount / 2 % 2 == 0 && Settings.getBoolean("particles")) { if (random.nextBoolean()) { level.add(new FireParticle(spawnX, spawnY)); } @@ -71,9 +68,14 @@ public void render(Screen screen, Level level, int x, int y) { @Override public boolean tick(Level level, int x, int y) { - tickTime++; - - spawnX = (x << 4) + 4; + + int data = level.getData(x, y); + if (data != 5) { + level.setData(x, y, data + 1); + } + + + spawnX = (x << 4) + 4; spawnY = (y << 4) + random.nextInt(2) - random.nextInt(1); return false; @@ -81,7 +83,11 @@ public boolean tick(Level level, int x, int y) { @Override public int getLightRadius(Level level, int x, int y) { - return LIGHT; + if (level.getData(x, y) == 0) { + return 1; + } + + return level.getData(x, y); } @Override diff --git a/src/main/java/minicraft/level/tile/WaterTile.java b/src/main/java/minicraft/level/tile/WaterTile.java index 37f911a2..6eb04dca 100644 --- a/src/main/java/minicraft/level/tile/WaterTile.java +++ b/src/main/java/minicraft/level/tile/WaterTile.java @@ -13,6 +13,10 @@ public boolean connectsTo(Tile tile, boolean isSide) { return tile.connectsToFluid; } }; + + private Tile holeTile = Tiles.get("Hole"); + private Tile lavaTile = Tiles.get("Lava"); + private Tile rawObsidianTile = Tiles.get("Raw Obsidian"); protected WaterTile(String name) { super(name, (ConnectorSprite) null); @@ -43,12 +47,10 @@ public boolean tick(Level level, int xt, int yt) { case 1: yn += random.nextInt(2) * 2 - 1; break; } - if (level.getTile(xn, yn) == Tiles.get("Hole")) { + if (level.getTile(xn, yn) == holeTile) { level.setTile(xn, yn, this); } - Tile lavaTile = Tiles.get("Lava"); - Tile rawObsidianTile = Tiles.get("raw obsidian"); for (int x = -1; x < 2; x++) { if (level.getTile(xt + x, yt) == lavaTile) { level.setTile(xt + x, yt, rawObsidianTile); diff --git a/src/main/resources/resources/textures/Legacy/tiles.png b/src/main/resources/resources/textures/Legacy/tiles.png index aa97fd2b..55407c83 100644 Binary files a/src/main/resources/resources/textures/Legacy/tiles.png and b/src/main/resources/resources/textures/Legacy/tiles.png differ diff --git a/src/main/resources/resources/textures/entities.png b/src/main/resources/resources/textures/entities.png index 78d37214..904448e4 100644 Binary files a/src/main/resources/resources/textures/entities.png and b/src/main/resources/resources/textures/entities.png differ diff --git a/src/main/resources/resources/textures/tiles.png b/src/main/resources/resources/textures/tiles.png index 5cf956a9..ccd40b1e 100644 Binary files a/src/main/resources/resources/textures/tiles.png and b/src/main/resources/resources/textures/tiles.png differ