From 16b04a62babbfda7a8bf8214e189717bbd1ccfa2 Mon Sep 17 00:00:00 2001 From: jsrobson10 Date: Wed, 22 Jul 2020 19:39:11 +1000 Subject: [PATCH] Started adding a proper save menu --- .classpath | 2 +- src/projectzombie/Main.java | 14 - src/projectzombie/display/DisplayWindow.java | 36 +- src/projectzombie/init/Layers.java | 12 +- src/projectzombie/init/Models.java | 9 +- src/projectzombie/menu/MenuMain.java | 10 +- src/projectzombie/menu/MenuSaves.java | 79 ++++ src/projectzombie/menu/MenuSettings.java | 9 + .../menu/gui/GuiButtonModel.java | 66 +++ src/projectzombie/settings/Settings.java | 9 +- src/projectzombie/world/World.java | 22 +- src/projectzombie/world/chunk/Chunk.java | 16 +- src/projectzombie/world/chunk/ChunkEmpty.java | 4 + .../world/chunk/ChunkEventHandler.java | 1 + src/projectzombie/world/layer/Layer.java | 7 + src/resources/texture/gui/button_delete.png | Bin 0 -> 614 bytes .../texture/gui/button_delete_hover.png | Bin 0 -> 597 bytes src/resources/texture/gui/button_play.png | Bin 0 -> 626 bytes .../texture/gui/button_play_hover.png | Bin 0 -> 632 bytes src/resources/texture/gui/label.png | Bin 0 -> 4017 bytes src/resources/texture/list.txt | 401 +++++++++--------- src/resources/texture/particle/snow.png | Bin 0 -> 13964 bytes 22 files changed, 465 insertions(+), 232 deletions(-) create mode 100644 src/projectzombie/menu/MenuSaves.java create mode 100644 src/projectzombie/menu/gui/GuiButtonModel.java create mode 100644 src/resources/texture/gui/button_delete.png create mode 100644 src/resources/texture/gui/button_delete_hover.png create mode 100644 src/resources/texture/gui/button_play.png create mode 100644 src/resources/texture/gui/button_play_hover.png create mode 100644 src/resources/texture/gui/label.png create mode 100644 src/resources/texture/particle/snow.png 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 0000000000000000000000000000000000000000..11cfadba3902d7f69024bca72992fb93fc8a14a5 GIT binary patch literal 614 zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4kiW$2Bz0tQ49=>Et$^F0iMpz3I#>^X_+~x z3=A3*YbV-z9Cna78Xvq>NtC@?r0_(*T%C?Ci!9Nu0L3d@YprI){8BW@^azTPVZGke zEZ-f+jGsBKcEO@zXrk~o8 zoIF>ay-F>NEP}4n&*&tFO$z!T8~>f-!&kj?oBy2uYgu)5&(Vek51Ye0m(}9b=iS=E zd+zrU!LUi8kBT1!PS*4IbE5R7JvJ+ToF(=lyAYxM$yf5#ohMgDC$r`Cxq(G=l2@LRGrnD51Y)~c|*_h$XJ zsAVv^68ehG!h*%EYs%hdpWnUvcJH6<O>_%)r1c48n{I zv*t)JFfg!}c>21sKVcVRVP_5(@;Ju8z)>IlgrY!Z$Jt1446+)hgT*vuaF>Cn9SohRiwdOkilFaK!{FM~{u`c}Ws T)5I7U7#KWV{an^LB{Ts5jR^vi literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..620881f895e3c2086580296dfb9f40a4a8b64449 GIT binary patch literal 597 zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4kiW$2Bz0tQ49=>Et$^F0iMpz3I#>^X_+~x z3=A3*YbV-z9Cna78Xvq>NtC@?r0_(*T%C?Ci!9Nu0L3d@YprI){8BW@^azTPVZGke zEZ-f+jGsBKcEO@zXrk~o8 zoIF>ay-F>NEP}4n&*&tFO$z!T8~>f-!&kj?oBy2uYgu)5&(Vek51Ye0m(}9b=iS=E zd+zrU!LUi8kBT1!PS*4IbE5R7JvJ+ToF(=lyAYxM$yf5#ohMgDC$r`Cxq(G=l2@LRGrnD51Y)~c|*_h$XJ zsAVv^68ehG!h*%EYs%hdpWnUvcJH6<O>_%)r1c48n{I zv*t)JFfg!}c>21sKVcVRVUv&IP(8uGz>wnU;uvCaIyom@L4JdQfx(K&OFyf*7>5b8 z9Eodp<`tIPeEs3IwgR)T+Y@%~h&kA_rbJdS&Nb{KpKYg|eS)Y_DAf3Q+ zaK*EU3ukVWRkmjroM=$^?0KomR2B1+rDhB{E literal 0 HcmV?d00001 diff --git a/src/resources/texture/gui/button_play.png b/src/resources/texture/gui/button_play.png new file mode 100644 index 0000000000000000000000000000000000000000..6b620997dae92151a1fe981252e57a0ca74a3446 GIT binary patch literal 626 zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4mJh`hTcwDUIqrnmP}{o08eLUg@U5|w9K4T z1_q6ZwG(YU4m-#kjSt?cB+A|`Qg|X@u1-gnMV4q+fZ`RdwN^7?ekqz{dIZJDuwHL! zmhTQ_7f+9sjbU~Cz8$f44UJz~KH}IIk(0c%H}d3_4)xCDRm+0+ zP52t|bkEU9?eNIY^Zv9x+_P`bk}{;m2`77K|nPEY2M_5V*xEWqSOlUD=#toB}m$>%L6e zAH=@Q-gEudEjI)&Z0C)M*=~}`zvB+$BLB9WQ|m;QXo_$h_$^r*%=cnHYgO3Zd$WF9 z)G`=d34O(8VZq|oHD&L!&+p!SyZ6ub@|*YUtg%Ja&6DoVU|?WiOY(MiVOYn&z`$S@ zGOL4ufq}EYBeIx*fm;}a85w5Hkzin8U@!6Xb!C6TF2=&jB%~~LiGhJ3-_yl0#Nu>v z%BQp+=N()R96E5|zyS?M*~9<#CnO{!EijV!!?r0w_>Z;t!8E^RO^qkm4)Um9OAvG7 z@-Usz8nIp=+u-EHLvwfzo_OfFVdQ&MBb@0It{m!~g&Q literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1f891156a307f3214e596d959ec47f79bcc884a9 GIT binary patch literal 632 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 literal 0 HcmV?d00001