diff --git a/.classpath b/.classpath index 61eec66..3f029df 100755 --- a/.classpath +++ b/.classpath @@ -41,6 +41,6 @@ - + diff --git a/src/projectzombie/Main.java b/src/projectzombie/Main.java index c7488d4..3405ca7 100755 --- a/src/projectzombie/Main.java +++ b/src/projectzombie/Main.java @@ -49,20 +49,6 @@ public class Main public static boolean game_paused = false; public static int tickrate = 10; - public static void respawn() - { - // Reset the world and the player - Layers.init(rand.nextLong()); - player = new EntityPlayer(); - GameTimer.resetTime(); - - /*BdfCompressedFileManager bdf = new BdfCompressedFileManager("./layer.bdf"); - Main.world = new World(); - Main.world.BdfClassLoad(bdf);*/ - - BossBars.clear(); - } - public static void main(String[] args) throws IOException { MathHelpers.init(); diff --git a/src/projectzombie/display/DisplayWindow.java b/src/projectzombie/display/DisplayWindow.java index c8dd1c5..14bd834 100755 --- a/src/projectzombie/display/DisplayWindow.java +++ b/src/projectzombie/display/DisplayWindow.java @@ -23,14 +23,17 @@ import projectzombie.input.KeyCharCallback; import projectzombie.input.MouseButtonCallback; import projectzombie.input.ScrollWheelCallback; import projectzombie.mainloop.MainloopEventHandler; +import projectzombie.menu.MenuSettings; +import projectzombie.settings.Settings; public class DisplayWindow implements IMainloopTask { + public static boolean fullscreen = true; + private long window; private long monitor; private int width; private int height; - private boolean fullscreen = true; private boolean mouseVisibility_last = false; public int texture_max_size; @@ -101,7 +104,7 @@ public class DisplayWindow implements IMainloopTask //GLFW.glfwWindowHint(GLFW.GLFW_DOUBLEBUFFER, GLFW.GLFW_FALSE); // Create the window - window = GraphicsHelpers.initWindow("Project Zombie", width, height, monitor); + window = GraphicsHelpers.initWindow("Project Zombie", width, height, fullscreen ? monitor : 0); // Make the context current GLFW.glfwMakeContextCurrent(this.window); @@ -273,14 +276,37 @@ public class DisplayWindow implements IMainloopTask fps += 1; } - public void toggleFullscreen() { - if(fullscreen) { + public void toggleFullscreen() + { + // Exit fullscreen if the window is in fullscreen + if(fullscreen) + { fullscreen = false; GLFW.glfwSetWindowMonitor(window, 0, 1, 1, width, height, GLFW.GLFW_DONT_CARE); - } else { + } + + // Enter fullscreen if the window is windowed + else + { + // Get the monitor size + IntBuffer w = BufferUtils.createIntBuffer(1); + IntBuffer h = BufferUtils.createIntBuffer(1); + GLFW.glfwGetMonitorPhysicalSize(monitor, w, h); + width = w.get()*4; + height = h.get()*4; + + // Enter fullscreen mode fullscreen = true; GLFW.glfwSetWindowMonitor(window, monitor, 0, 0, width, height, GLFW.GLFW_DONT_CARE); } + + // Update the settings file + Settings.update(); + + if(Main.menu instanceof MenuSettings) { + ((MenuSettings) Main.menu).buttonFullscreen.setText( + "Fullscreen: " + (fullscreen ? "On" : "Off")); + } } public void setMouseVisibility(boolean status) { diff --git a/src/projectzombie/init/Layers.java b/src/projectzombie/init/Layers.java index 27b19b4..fc42150 100755 --- a/src/projectzombie/init/Layers.java +++ b/src/projectzombie/init/Layers.java @@ -3,13 +3,16 @@ package projectzombie.init; import java.util.Random; import projectzombie.Main; +import projectzombie.display.bossbar.BossBars; +import projectzombie.entity.player.EntityPlayer; +import projectzombie.time.GameTimer; import projectzombie.world.World; import projectzombie.world.layer.Layer; import projectzombie.world.layer.layergen.LayerGenBossArena; public class Layers { - public static void init(long seed) + public static void createWorld(String path, long seed) { // Create all the layers EARTH = new Layer(new Random(seed), LayerGenerators.EARTH); @@ -17,11 +20,16 @@ public class Layers LAVA_CAVES = new Layer(new Random(seed), LayerGenerators.LAVA_CAVES); // Create the world and set the earth as the default layer - Main.world = new World(); + Main.world = new World(path); Main.world.addLayer(EARTH); Main.world.addLayer(CAVES); Main.world.addLayer(LAVA_CAVES); Main.world.setLayer(0); + + // Initialize some other objects + Main.player = new EntityPlayer(); + GameTimer.resetTime(); + BossBars.clear(); } public static Layer EARTH; diff --git a/src/projectzombie/init/Models.java b/src/projectzombie/init/Models.java index da3eb04..474bd6f 100755 --- a/src/projectzombie/init/Models.java +++ b/src/projectzombie/init/Models.java @@ -94,8 +94,13 @@ public class Models new ModelVertical(Resources.ATLAS.get("/particle/smoke_4.png")), new ModelVertical(Resources.ATLAS.get("/particle/smoke_5.png"))); - public static final ModelGui UI_BUTTON = new ModelGui(Resources.ATLAS.get("/gui/button_normal.png"), new Vec2d(12, 1.5)); - public static final ModelGui UI_BUTTON_HOVER = new ModelGui(Resources.ATLAS.get("/gui/button_hover.png"), new Vec2d(12, 1.5)); + public static final ModelGui UI_BUTTON = new ModelGui(Resources.ATLAS.get("/gui/button_normal.png"), new Vec2d(12, 1.5)); + public static final ModelGui UI_BUTTON_HOVER = new ModelGui(Resources.ATLAS.get("/gui/button_hover.png"), new Vec2d(12, 1.5)); + public static final ModelGui UI_BUTTON_DELETE = new ModelGui(Resources.ATLAS.get("/gui/button_delete.png"), new Vec2d(1.2, 1.2)); + public static final ModelGui UI_BUTTON_DELETE_HOVER = new ModelGui(Resources.ATLAS.get("/gui/button_delete_hover.png"), new Vec2d(1.2, 1.2)); + public static final ModelGui UI_BUTTON_PLAY = new ModelGui(Resources.ATLAS.get("/gui/button_play.png"), new Vec2d(1.2, 1.2)); + public static final ModelGui UI_BUTTON_PLAY_HOVER = new ModelGui(Resources.ATLAS.get("/gui/button_play_hover.png"), new Vec2d(1.2, 1.2)); + public static final ModelGui UI_LABEL = new ModelGui(Resources.ATLAS.get("/gui/label.png"), new Vec2d(24, 3)); public static final ModelGui UI_HEALTH_FG = new ModelGui(Resources.ATLAS.get("/gui/health_full.png"), new Vec2d(6, 0.375)); public static final ModelGui UI_HEALTH_BG = new ModelGui(Resources.ATLAS.get("/gui/health_empty.png"), new Vec2d(6, 0.375)); diff --git a/src/projectzombie/menu/MenuMain.java b/src/projectzombie/menu/MenuMain.java index eb8fc28..a53fb88 100755 --- a/src/projectzombie/menu/MenuMain.java +++ b/src/projectzombie/menu/MenuMain.java @@ -1,7 +1,10 @@ package projectzombie.menu; +import java.util.Random; + import gl_engine.vec.Vec3d; import projectzombie.Main; +import projectzombie.init.Layers; import projectzombie.input.types.InputGUI; import projectzombie.menu.gui.GUIButtonGroup; import projectzombie.menu.gui.GUI; @@ -10,6 +13,8 @@ import projectzombie.menu.gui.components.LabelMain; public class MenuMain extends Menu { + private static final Random rand = new Random(); + private GUI gui; public MenuMain() { @@ -26,8 +31,7 @@ public class MenuMain extends Menu GUIButtonGroup group = new GUIButtonGroup(); group.add(new ButtonBasic("Play", button -> { - Main.respawn(); - Main.menu = new MenuGame(); + Main.menu = new MenuSaves(Main.menu); })); group.add(new ButtonBasic("Settings", button -> { @@ -41,7 +45,7 @@ public class MenuMain extends Menu gui.add(group); gui.setSelected(group.get(0)); - Main.respawn(); + Layers.createWorld(null, rand.nextLong()); Main.player.dead = true; } diff --git a/src/projectzombie/menu/MenuSaves.java b/src/projectzombie/menu/MenuSaves.java new file mode 100644 index 0000000..65bb8b9 --- /dev/null +++ b/src/projectzombie/menu/MenuSaves.java @@ -0,0 +1,79 @@ +package projectzombie.menu; + +import java.util.Random; + +import gl_engine.vec.Vec2d; +import projectzombie.Main; +import projectzombie.init.Layers; +import projectzombie.init.Models; +import projectzombie.input.types.InputGUI; +import projectzombie.menu.gui.GUI; +import projectzombie.menu.gui.GUIAlignment; +import projectzombie.menu.gui.GUIButton; +import projectzombie.menu.gui.GUILabel; +import projectzombie.menu.gui.GuiButtonModel; +import projectzombie.menu.gui.components.ButtonBasic; +import projectzombie.menu.gui.components.ButtonCallback; +import projectzombie.menu.gui.components.ButtonSetting; + +public class MenuSaves extends Menu +{ + private static final Random rand = new Random(); + + private Menu parent; + private GUI gui; + + public MenuSaves(Menu parent) + { + this.parent = parent; + + doGameloop = parent.doGameloop; + doGameRender = parent.doGameRender; + showIngameGUI = parent.showIngameGUI; + + gui = new GUI(); + input = new InputGUI(gui); + keepMouse = false; + + ButtonBasic buttonBack = new ButtonBasic("Back", button -> { + Main.menu = parent; + }); + + ButtonBasic buttonCreate = new ButtonBasic("Create", button -> { + Layers.createWorld(null, rand.nextLong()); + Main.menu = new MenuGame(); + }); + + GuiButtonModel buttonPlay = new GuiButtonModel(Models.UI_BUTTON_DELETE, Models.UI_BUTTON_DELETE_HOVER); + gui.add(buttonPlay); + + buttonBack.setAlign(GUIAlignment.RIGHT); + buttonCreate.setAlign(GUIAlignment.LEFT); + + buttonBack.setPos(new Vec2d(-0.5, -8)); + buttonCreate.setPos(new Vec2d(0.5, -8)); + + GUILabel labelSaves = new GUILabel(); + labelSaves.setText("Saves"); + labelSaves.setSize(new Vec2d(1, 1)); + labelSaves.setPos(new Vec2d(0, 6.8)); + gui.add(labelSaves); + + gui.add(buttonBack); + gui.add(buttonCreate); + } + + @Override + public void render() { + gui.render(); + } + + @Override + public void update() + { + parent.update(); + + super.update(); + } + +} diff --git a/src/projectzombie/menu/MenuSettings.java b/src/projectzombie/menu/MenuSettings.java index dccfbd5..6de6d75 100755 --- a/src/projectzombie/menu/MenuSettings.java +++ b/src/projectzombie/menu/MenuSettings.java @@ -4,6 +4,7 @@ import gl_engine.vec.Vec2d; import projectzombie.Main; import projectzombie.display.DisplayRender; import projectzombie.display.DisplayRenderUI; +import projectzombie.display.DisplayWindow; import projectzombie.entity.EntityParticle; import projectzombie.input.types.InputGUI; import projectzombie.menu.gui.GUIButton; @@ -21,6 +22,8 @@ import projectzombie.world.chunk.Chunk; public class MenuSettings extends Menu { + public ButtonSetting buttonFullscreen; + private GUI gui; private Menu menuOld; @@ -54,6 +57,12 @@ public class MenuSettings extends Menu Settings.update(); })); + group.add(buttonFullscreen = new ButtonSetting("Fullscreen: " + (DisplayWindow.fullscreen ? "On" : "Off"), + button -> { + Main.window.toggleFullscreen(); + button.setText("Fullscreen: " + (DisplayWindow.fullscreen ? "On" : "Off")); + })); + group.add(new ButtonSetting("Debug mode: " + (DisplayRenderUI.debug ? "On" : "Off"), button -> { diff --git a/src/projectzombie/menu/gui/GuiButtonModel.java b/src/projectzombie/menu/gui/GuiButtonModel.java new file mode 100644 index 0000000..fa8b904 --- /dev/null +++ b/src/projectzombie/menu/gui/GuiButtonModel.java @@ -0,0 +1,66 @@ +package projectzombie.menu.gui; + +import gl_engine.matrix.Matrix4; +import gl_engine.vec.Vec2d; +import projectzombie.model.Model; +import projectzombie.model.ModelGui; + +public class GuiButtonModel implements GUIComponent +{ + private ModelGui modelHover; + private ModelGui model; + + private Vec2d pos = new Vec2d(0, 0); + + public GuiButtonModel(ModelGui model, ModelGui modelHover) { + this.modelHover = modelHover; + this.model = model; + } + + public void setPos(Vec2d pos) { + this.pos = pos; + } + + @Override + public void render(Vec2d mousePos) + { + Model model = checkMouseHover(mousePos) ? this.modelHover : this.model; + + model.setModel(Matrix4.translate(pos.x, pos.y, 0)); + model.render(); + } + + @Override + public void update(Vec2d mousePos) { + + } + + @Override + public boolean checkMouseHover(Vec2d mousePos) { + return (mousePos.x > pos.x && mousePos.x < pos.x + model.getWidth() && + mousePos.y > pos.y && mousePos.y < pos.y + model.getHeight()); + } + + @Override + public void onRightClick(Vec2d mousePos) { + // TODO Auto-generated method stub + + } + + @Override + public void onMouseClick(Vec2d mousePos) { + // TODO Auto-generated method stub + + } + + @Override + public void onActivate() { + // TODO Auto-generated method stub + + } + + @Override + public void onBack() { + } + +} diff --git a/src/projectzombie/settings/Settings.java b/src/projectzombie/settings/Settings.java index 06682d3..8c0b710 100755 --- a/src/projectzombie/settings/Settings.java +++ b/src/projectzombie/settings/Settings.java @@ -6,8 +6,10 @@ import bdf.file.BdfFileManager; import bdf.types.BdfNamedList; import bdf.types.BdfObject; import bdf.types.BdfTypes; +import projectzombie.Main; import projectzombie.display.DisplayRender; import projectzombie.display.DisplayRenderUI; +import projectzombie.display.DisplayWindow; import projectzombie.entity.EntityParticle; import projectzombie.world.chunk.Chunk; @@ -38,6 +40,10 @@ public class Settings implements IBdfClassManager DisplayRenderUI.debug = false; } + if(nl.get("fullscreen").getType() == BdfTypes.BOOLEAN) { + DisplayWindow.fullscreen = nl.get("fullscreen").getBoolean(); + } + if(nl.get("shadow_size").getType() == BdfTypes.INTEGER) { SettingQuality quality = DisplayRender.getShadowQuality(); @@ -104,10 +110,11 @@ public class Settings implements IBdfClassManager nl.set("show_fps", BdfObject.withBoolean(DisplayRenderUI.showFPS)); nl.set("debug", BdfObject.withBoolean(DisplayRenderUI.debug)); nl.set("shadow_size", BdfObject.withInteger(shadow_size)); + nl.set("fullscreen", BdfObject.withBoolean(Main.window.fullscreen)); } public static void init() { - FILE_MANAGER = new BdfFileManager(Environment.gdir + "/settings.bdf"); + FILE_MANAGER = new BdfFileManager(Environment.gdir + "/settings.bdf", true); SETTINGS.load(FILE_MANAGER); } diff --git a/src/projectzombie/world/World.java b/src/projectzombie/world/World.java index ae80d88..787c7e8 100755 --- a/src/projectzombie/world/World.java +++ b/src/projectzombie/world/World.java @@ -29,11 +29,20 @@ public class World implements IBdfClassManager private Layer loaded; private ArrayList layers = new ArrayList(); + private String path; private int pool_vao, pool_vbo, pool_ibo; private boolean pool_dirty = true; private int pool_particle_count = 0; private int pool_size = 1; + public World(String path) { + this.path = path; + } + + public String getSavePath() { + return path; + } + public boolean isPoolDirty() { return pool_dirty; } @@ -151,11 +160,15 @@ public class World implements IBdfClassManager DisplayLighting.clearLighting(); DisplayLighting.setDirty(); + if(this.loaded != null) { + this.loaded.free(); + } + this.loaded = layers.get(id); } public void removeLayer(int id) { - layers.remove(id); + layers.remove(id).free(); } public int addLayer(Layer layer) { @@ -227,4 +240,11 @@ public class World implements IBdfClassManager // Save the game timer nl.set("time", BdfObject.withLong(GameTimer.getTime())); } + + public void free() + { + for(Layer layer : layers) { + layer.free(); + } + } } diff --git a/src/projectzombie/world/chunk/Chunk.java b/src/projectzombie/world/chunk/Chunk.java index 078c806..0ece4c1 100755 --- a/src/projectzombie/world/chunk/Chunk.java +++ b/src/projectzombie/world/chunk/Chunk.java @@ -341,7 +341,7 @@ public class Chunk implements IBdfClassManager public int render(Camera camera, FloatBuffer particle_pool, int upto) { - if(this.render_dirty) + if(model == null || this.render_dirty) { this.render_dirty = false; int verticies_size = 0; @@ -689,11 +689,15 @@ public class Chunk implements IBdfClassManager } // Tick the tile - ts.tile.tickRandomly( - layer, - this, - ts, - pos); + ts.tile.tickRandomly(layer, this, ts, pos); + } + + public void free() + { + if(this.model != null) { + this.model.free(); + this.model = null; + } } } diff --git a/src/projectzombie/world/chunk/ChunkEmpty.java b/src/projectzombie/world/chunk/ChunkEmpty.java index 023ca98..f1a2766 100755 --- a/src/projectzombie/world/chunk/ChunkEmpty.java +++ b/src/projectzombie/world/chunk/ChunkEmpty.java @@ -157,4 +157,8 @@ public class ChunkEmpty extends Chunk public boolean isDirty() { return false; } + + @Override + public void free() { + } } diff --git a/src/projectzombie/world/chunk/ChunkEventHandler.java b/src/projectzombie/world/chunk/ChunkEventHandler.java index d0f91b2..cb911a5 100755 --- a/src/projectzombie/world/chunk/ChunkEventHandler.java +++ b/src/projectzombie/world/chunk/ChunkEventHandler.java @@ -48,6 +48,7 @@ public class ChunkEventHandler implements IMainloopTask ) { // Unload the chunk layer.unloadChunk(ce.pos); + ce.o.free(); } } diff --git a/src/projectzombie/world/layer/Layer.java b/src/projectzombie/world/layer/Layer.java index 4f1ae36..fbbd822 100755 --- a/src/projectzombie/world/layer/Layer.java +++ b/src/projectzombie/world/layer/Layer.java @@ -336,4 +336,11 @@ public class Layer implements IBdfClassManager bdf_chunks.add(BdfObject.withNamedList(chunk_nl)); } } + + public void free() + { + for(Map2DElement chunk : chunks) { + chunk.o.free(); + } + } } diff --git a/src/resources/texture/gui/button_delete.png b/src/resources/texture/gui/button_delete.png new file mode 100644 index 0000000..11cfadb Binary files /dev/null and b/src/resources/texture/gui/button_delete.png differ diff --git a/src/resources/texture/gui/button_delete_hover.png b/src/resources/texture/gui/button_delete_hover.png new file mode 100644 index 0000000..620881f Binary files /dev/null and b/src/resources/texture/gui/button_delete_hover.png differ diff --git a/src/resources/texture/gui/button_play.png b/src/resources/texture/gui/button_play.png new file mode 100644 index 0000000..6b62099 Binary files /dev/null and b/src/resources/texture/gui/button_play.png differ diff --git a/src/resources/texture/gui/button_play_hover.png b/src/resources/texture/gui/button_play_hover.png new file mode 100644 index 0000000..1f89115 Binary files /dev/null and b/src/resources/texture/gui/button_play_hover.png differ diff --git a/src/resources/texture/gui/label.png b/src/resources/texture/gui/label.png new file mode 100644 index 0000000..7db9d82 Binary files /dev/null and b/src/resources/texture/gui/label.png differ diff --git a/src/resources/texture/list.txt b/src/resources/texture/list.txt index a022c7e..ac165f3 100644 --- a/src/resources/texture/list.txt +++ b/src/resources/texture/list.txt @@ -1,208 +1,215 @@ -./text/char_question.png -./text/char_l_a.png -./text/char_u_j.png -./text/char_l_u.png -./text/char_u_s.png -./text/char_l_s.png -./text/char_plus.png -./text/char_l_e.png -./text/char_7.png -./text/char_minus.png -./text/char_u_r.png -./text/char_u_l.png -./text/char_obracket.png -./text/char_u_m.png -./text/char_l_t.png -./text/char_percent.png -./text/char_l_y.png -./text/char_0.png -./text/char_4.png -./text/char_l_r.png -./text/char_l_m.png -./text/char_cbracket.png -./text/char_u_g.png -./text/char_u_q.png -./text/char_u_i.png -./text/char_l_w.png -./text/char_l_v.png -./text/char_fslash.png -./text/char_u_p.png -./text/char_gthan.png -./text/char_8.png -./text/char_unknown.png -./text/char_u_n.png -./text/char_l_i.png -./text/char_u_y.png -./text/char_l_p.png -./text/char_lthan.png -./text/char_l_g.png -./text/char_bslash.png -./text/char_1.png -./text/char_u_z.png -./text/char_l_f.png -./text/char_u_w.png -./text/char_9.png -./text/char_l_x.png -./text/char_l_o.png -./text/char_equals.png -./text/char_l_d.png -./text/char_dollar.png -./text/char_hashtag.png -./text/char_l_q.png -./text/char_u_o.png -./text/char_6.png -./text/char_u_d.png -./text/char_u_e.png -./text/char_exclamation.png -./text/char_vertical.png -./text/char_u_k.png -./text/char_u_c.png -./text/char_l_n.png -./text/char_u_b.png -./text/char_u_f.png -./text/char_l_h.png -./text/char_l_k.png -./text/char_u_t.png -./text/char_3.png -./text/char_u_v.png -./text/char_u_h.png -./text/char_u_a.png -./text/char_l_b.png -./text/char_underscore.png -./text/char_u_x.png -./text/char_comma.png -./text/char_l_l.png -./text/char_5.png -./text/char_colon.png -./text/char_l_z.png -./text/char_space.png -./text/char_2.png -./text/char_l_j.png -./text/char_fullstop.png -./text/char_l_c.png -./text/char_u_u.png +./tile/hemp6.png +./tile/hemp7.png +./tile/hemp1.png +./tile/rock.png +./tile/rock_ice.png +./tile/sapling3.png +./tile/ladder.png +./tile/tree_leaves_snow.png +./tile/ice_wall.png +./tile/water.png +./tile/sandstone_wall.png +./tile/ladder_up.png +./tile/cactus4.png +./tile/tall_grass.png +./tile/cactus2.png +./tile/grass_infested.png +./tile/tree_branch_leaves.png +./tile/dirt.png +./tile/wall.png +./tile/tree_base.png +./tile/cactus1.png +./tile/sapling4.png +./tile/hemp3.png +./tile/cactus_top.png +./tile/tunnel_down.png +./tile/stone.png +./tile/snow.png +./tile/boss_portal.png +./tile/hemp4.png +./tile/sand.png +./tile/lantern.png +./tile/ice.png +./tile/sapling1.png +./tile/chest.png +./tile/hemp2.png +./tile/hemp8.png +./tile/cactus3.png +./tile/lava.png +./tile/tree_leaves.png +./tile/hemp5.png +./tile/lava_flow.png +./tile/grass.png +./tile/tree_branch.png +./tile/sandstone.png +./tile/tree_branch_leaves_snow.png +./tile/rock_sandstone.png +./tile/sapling2.png ./list.txt -./player/player_white_front_moving.png -./player/player_white_back_moving.png -./player/player_black_back_moving.png -./player/player_black_back_still.png +./item/log.png +./item/rock.png +./item/acorn.png +./item/ammo_box.png +./item/plant_fibre.png +./item/hemp_seed.png +./item/shield_upgrade.png +./item/grappling_hook.png +./item/log_snow.png +./item/health_potion.png +./item/snow_pile.png +./item/gun_upgrade.png +./item/sandstone.png +./item/flint.png ./player/player_white_back_still.png ./player/player_white_front_still.png ./player/player_black_front_moving.png ./player/player_black_front_still.png -./particle/smoke_trail.png -./particle/water.png -./particle/smoke_0.png -./particle/smoke_1.png -./particle/blood.png -./particle/lava.png -./particle/bullet.png -./particle/smoke_2.png -./particle/smoke_4.png -./particle/smoke_3.png -./particle/smoke_5.png -./gui/temperature.png -./gui/slot_armor_chest.png -./gui/health_empty.png -./gui/button_hover.png -./gui/water.png -./gui/slot_armor_legs.png -./gui/button_normal.png -./gui/hotbar.png -./gui/slot_armor_helmet.png -./gui/inventory.png -./gui/health_full.png -./gui/hotbar_selected.png -./gui/slot_clothing_shirt.png +./player/player_black_back_moving.png +./player/player_black_back_still.png +./player/player_white_back_moving.png +./player/player_white_front_moving.png ./gui/pixel_white.png -./gui/pixel_black.png -./gui/slot_clothing_pants.png -./gui/shield.png -./gui/slot_clothing_boots.png +./gui/water.png ./gui/gun.png -./tile/cactus4.png -./tile/hemp1.png -./tile/dirt.png -./tile/lantern.png -./tile/hemp8.png -./tile/wall.png -./tile/cactus_top.png -./tile/cactus2.png -./tile/rock.png -./tile/water.png -./tile/hemp4.png -./tile/stone.png -./tile/tree_leaves.png -./tile/sapling2.png -./tile/ladder_up.png -./tile/sapling3.png -./tile/lava_flow.png -./tile/ice_wall.png -./tile/grass.png -./tile/chest.png -./tile/sapling4.png -./tile/lava.png -./tile/tall_grass.png -./tile/hemp5.png -./tile/sapling1.png -./tile/snow.png -./tile/sandstone_wall.png -./tile/rock_sandstone.png -./tile/hemp6.png -./tile/cactus1.png -./tile/tree_branch_leaves.png -./tile/tunnel_down.png -./tile/tree_branch_leaves_snow.png -./tile/tree_leaves_snow.png -./tile/rock_ice.png -./tile/boss_portal.png -./tile/ladder.png -./tile/hemp7.png -./tile/grass_infested.png -./tile/tree_branch.png -./tile/sand.png -./tile/tree_base.png -./tile/cactus3.png -./tile/sandstone.png -./tile/hemp3.png -./tile/hemp2.png -./tile/ice.png -./entity/flare.png -./entity/grappling_hook.png -./entity/zombie_back_moving.png -./entity/tnt.png +./gui/button_delete.png +./gui/button_delete_hover.png +./gui/slot_armor_chest.png +./gui/pixel_black.png +./gui/slot_clothing_shirt.png +./gui/button_play.png +./gui/slot_armor_legs.png +./gui/inventory.png +./gui/label.png +./gui/slot_clothing_pants.png +./gui/health_empty.png +./gui/hotbar_selected.png +./gui/health_full.png +./gui/temperature.png +./gui/button_play_hover.png +./gui/slot_armor_helmet.png +./gui/slot_clothing_boots.png +./gui/hotbar.png +./gui/button_normal.png +./gui/shield.png +./gui/button_hover.png +./text/char_bslash.png +./text/char_dollar.png +./text/char_l_w.png +./text/char_u_d.png +./text/char_u_t.png +./text/char_space.png +./text/char_l_x.png +./text/char_l_k.png +./text/char_6.png +./text/char_unknown.png +./text/char_comma.png +./text/char_obracket.png +./text/char_u_w.png +./text/char_7.png +./text/char_l_f.png +./text/char_vertical.png +./text/char_plus.png +./text/char_u_a.png +./text/char_9.png +./text/char_u_k.png +./text/char_u_n.png +./text/char_percent.png +./text/char_u_m.png +./text/char_exclamation.png +./text/char_1.png +./text/char_l_q.png +./text/char_l_z.png +./text/char_l_h.png +./text/char_u_c.png +./text/char_l_g.png +./text/char_l_s.png +./text/char_fullstop.png +./text/char_u_j.png +./text/char_l_m.png +./text/char_l_t.png +./text/char_u_v.png +./text/char_colon.png +./text/char_l_i.png +./text/char_l_y.png +./text/char_u_l.png +./text/char_u_e.png +./text/char_5.png +./text/char_2.png +./text/char_3.png +./text/char_l_p.png +./text/char_fslash.png +./text/char_l_u.png +./text/char_u_f.png +./text/char_u_u.png +./text/char_l_e.png +./text/char_l_l.png +./text/char_u_g.png +./text/char_u_q.png +./text/char_u_b.png +./text/char_l_o.png +./text/char_minus.png +./text/char_l_v.png +./text/char_lthan.png +./text/char_u_s.png +./text/char_equals.png +./text/char_8.png +./text/char_underscore.png +./text/char_u_x.png +./text/char_0.png +./text/char_l_d.png +./text/char_l_c.png +./text/char_l_j.png +./text/char_u_z.png +./text/char_u_h.png +./text/char_hashtag.png +./text/char_gthan.png +./text/char_cbracket.png +./text/char_u_i.png +./text/char_question.png +./text/char_u_o.png +./text/char_u_y.png +./text/char_l_r.png +./text/char_l_b.png +./text/char_l_a.png +./text/char_l_n.png +./text/char_u_p.png +./text/char_u_r.png +./text/char_4.png ./entity/armored_zombie_back_moving.png -./entity/armored_zombie_front_moving.png -./entity/player/hair_side.png -./entity/player/head_top.png -./entity/player/head_side.png -./entity/player/head_back.png -./entity/player/head_bottom.png -./entity/player/hair_front.png -./entity/player/head_front.png -./entity/player/hair_back.png -./entity/player/hair_top.png -./entity/dummy.png -./entity/armored_zombie_front_still.png -./entity/armored_zombie_back_still.png -./entity/zombie_front_moving.png -./entity/boss1/boss_walking_firing.png +./entity/zombie_front_still.png +./entity/tnt.png +./entity/flare.png +./entity/boss1/boss_walking.png ./entity/boss1/boss_firing.png ./entity/boss1/boss_still.png -./entity/boss1/boss_walking.png +./entity/boss1/boss_walking_firing.png +./entity/armored_zombie_back_still.png +./entity/armored_zombie_front_moving.png +./entity/player/head_back.png +./entity/player/hair_top.png +./entity/player/head_front.png +./entity/player/head_top.png +./entity/player/hair_side.png +./entity/player/head_side.png +./entity/player/hair_back.png +./entity/player/hair_front.png +./entity/player/head_bottom.png +./entity/grappling_hook.png ./entity/zombie_back_still.png -./entity/zombie_front_still.png -./item/acorn.png -./item/grappling_hook.png -./item/gun_upgrade.png -./item/shield_upgrade.png -./item/rock.png -./item/log.png -./item/log_snow.png -./item/hemp_seed.png -./item/ammo_box.png -./item/plant_fibre.png -./item/health_potion.png -./item/snow_pile.png -./item/flint.png -./item/sandstone.png +./entity/dummy.png +./entity/zombie_back_moving.png +./entity/armored_zombie_front_still.png +./entity/zombie_front_moving.png +./particle/smoke_1.png +./particle/water.png +./particle/rain.png +./particle/blood.png +./particle/snow.png +./particle/smoke_3.png +./particle/smoke_4.png +./particle/smoke_2.png +./particle/smoke_0.png +./particle/bullet.png +./particle/lava.png +./particle/smoke_trail.png +./particle/smoke_5.png diff --git a/src/resources/texture/particle/snow.png b/src/resources/texture/particle/snow.png new file mode 100644 index 0000000..5ad269a Binary files /dev/null and b/src/resources/texture/particle/snow.png differ