diff --git a/Mine2d/assets/icon.png b/Mine2d/assets/icon.png new file mode 100644 index 0000000..2e0d2de Binary files /dev/null and b/Mine2d/assets/icon.png differ diff --git a/Mine2d/assets/items/circuit-board.png b/Mine2d/assets/items/circuit-board.png new file mode 100644 index 0000000..a129d12 Binary files /dev/null and b/Mine2d/assets/items/circuit-board.png differ diff --git a/Mine2d/assets/items/copper-wire.png b/Mine2d/assets/items/copper-wire.png new file mode 100644 index 0000000..f90b4f9 Binary files /dev/null and b/Mine2d/assets/items/copper-wire.png differ diff --git a/Mine2d/assets/items/electric-circuit.png b/Mine2d/assets/items/electric-circuit.png new file mode 100644 index 0000000..c5c89d5 Binary files /dev/null and b/Mine2d/assets/items/electric-circuit.png differ diff --git a/Mine2d/assets/items/fuse.png b/Mine2d/assets/items/fuse.png new file mode 100644 index 0000000..f818663 Binary files /dev/null and b/Mine2d/assets/items/fuse.png differ diff --git a/Mine2d/assets/items/gps.png b/Mine2d/assets/items/gps.png new file mode 100644 index 0000000..04a43da Binary files /dev/null and b/Mine2d/assets/items/gps.png differ diff --git a/Mine2d/assets/items/ingot-copper.png b/Mine2d/assets/items/ingot-copper.png new file mode 100644 index 0000000..5286e35 Binary files /dev/null and b/Mine2d/assets/items/ingot-copper.png differ diff --git a/Mine2d/assets/items/ingot-silver.png b/Mine2d/assets/items/ingot-silver.png new file mode 100644 index 0000000..7a853d7 Binary files /dev/null and b/Mine2d/assets/items/ingot-silver.png differ diff --git a/Mine2d/assets/items/pickaxe-stone.png b/Mine2d/assets/items/pickaxe-stone.png index 0382d97..1c8d3b1 100644 Binary files a/Mine2d/assets/items/pickaxe-stone.png and b/Mine2d/assets/items/pickaxe-stone.png differ diff --git a/Mine2d/assets/items/silicon.png b/Mine2d/assets/items/silicon.png new file mode 100644 index 0000000..a961172 Binary files /dev/null and b/Mine2d/assets/items/silicon.png differ diff --git a/Mine2d/engine/Window.cs b/Mine2d/engine/Window.cs index c9c57cf..c5d95cd 100644 --- a/Mine2d/engine/Window.cs +++ b/Mine2d/engine/Window.cs @@ -14,6 +14,10 @@ public class Window h, SDL_WindowFlags.SDL_WINDOW_OPENGL | SDL_WindowFlags.SDL_WINDOW_RESIZABLE ); + var (ptr, size) = new ResourceLoader().LoadToIntPtr("assets.icon.png"); + var sdlBuffer = SDL_RWFromMem(ptr, size); + var surface = IMG_Load_RW(sdlBuffer, 1); + SDL_SetWindowIcon(this.window, surface); } public Window(string title, int x, int y, int w, int h, SDL_WindowFlags flags) diff --git a/Mine2d/game/backend/interactor/Connect.cs b/Mine2d/game/backend/interactor/Connect.cs index 0384f26..bf455a8 100644 --- a/Mine2d/game/backend/interactor/Connect.cs +++ b/Mine2d/game/backend/interactor/Connect.cs @@ -21,12 +21,7 @@ public class Connect Position = new Vector2(512244, 5390), }; ctx.GameState.Players.Add( - new Player - { - Name = packet.PlayerName, - Id = packet.PlayerGuid, - Position = new Vector2(512244, 5390), - } + player ); } } diff --git a/Mine2d/game/core/Bootstrapper.cs b/Mine2d/game/core/Bootstrapper.cs index 3a8fc3f..a28134b 100644 --- a/Mine2d/game/core/Bootstrapper.cs +++ b/Mine2d/game/core/Bootstrapper.cs @@ -10,8 +10,6 @@ public class Bootstrapper { var ctx = Context.Get(); ctx.GameState.World = new World(); - ctx.GameState.World.AddChunk(ChunkGenerator.CreateFilledChunk(0, 1, STile.From(Tiles.Stone))); - ctx.GameState.World.AddChunk(ChunkGenerator.CreateSpawnChunk(1000, 10)); - ctx.GameState.World.AddChunk(ChunkGenerator.CreateFilledChunk(1, 0, STile.From(Tiles.Stone))); + ChunkGenerator.CreateSpawnChunk(1000, 10); } } diff --git a/Mine2d/game/core/data/ItemId.cs b/Mine2d/game/core/data/ItemId.cs index b4b6df3..d0a885f 100644 --- a/Mine2d/game/core/data/ItemId.cs +++ b/Mine2d/game/core/data/ItemId.cs @@ -19,8 +19,16 @@ public enum ItemId Coal = 120, GoldIngot = 121, IronIngot = 122, + CopperIngot = 123, + SilverIngot = 124, PickaxeBasic = 200, PickaxeStone = 201, PickaxeIron = 202, PickaxeGold = 203, + CopperWire = 300, + Silicon = 301, + CircuitBoard = 302, + ElectricCircuit = 303, + Fuse = 304, + Gps = 400, } diff --git a/Mine2d/game/core/items/ItemRegistry.cs b/Mine2d/game/core/items/ItemRegistry.cs index 17ef6ea..79c3db0 100644 --- a/Mine2d/game/core/items/ItemRegistry.cs +++ b/Mine2d/game/core/items/ItemRegistry.cs @@ -31,12 +31,24 @@ public class ItemRegistry this.Register(ItemId.RawUranium, new Item(ItemId.RawUranium, "Raw Uranium", "items.raw-uranium" )); this.Register(ItemId.Diamond, new Item(ItemId.Diamond, "Diamond", "items.diamond" )); this.Register(ItemId.Coal, new Item(ItemId.Coal, "Coal", "items.coal" )); + // Ingots this.Register(ItemId.IronIngot, new Item(ItemId.IronIngot, "Iron Ingot", "items.ingot-iron" )); this.Register(ItemId.GoldIngot, new Item(ItemId.GoldIngot, "Gold Ingot", "items.ingot-gold" )); + this.Register(ItemId.CopperIngot, new Item(ItemId.CopperIngot, "Copper Ingot", "items.ingot-copper" )); + this.Register(ItemId.SilverIngot, new Item(ItemId.SilverIngot, "Silver Ingot", "items.ingot-silver" )); + // Pickaxes this.Register(ItemId.PickaxeBasic, new PickaxeItem(ItemId.PickaxeBasic, "Basic Pickaxe", "items.pickaxe-basic", 15, 4)); this.Register(ItemId.PickaxeStone, new PickaxeItem(ItemId.PickaxeStone, "Stone Pickaxe", "items.pickaxe-stone", 25, 6)); this.Register(ItemId.PickaxeIron, new PickaxeItem(ItemId.PickaxeIron, "Iron Pickaxe", "items.pickaxe-iron", 40, 7)); this.Register(ItemId.PickaxeGold, new PickaxeItem(ItemId.PickaxeGold, "Gold Pickaxe", "items.pickaxe-gold", 60, 8)); + // Materials + this.Register(ItemId.CopperWire, new Item(ItemId.CopperWire, "Copper Wire", "items.copper-wire" )); + this.Register(ItemId.Silicon, new Item(ItemId.Silicon, "Silicon", "items.silicon" )); + this.Register(ItemId.CircuitBoard, new Item(ItemId.CircuitBoard, "Circuit Board", "items.circuit-board" )); + this.Register(ItemId.ElectricCircuit, new Item(ItemId.ElectricCircuit, "Electric Circuit", "items.electric-circuit" )); + this.Register(ItemId.Fuse, new Item(ItemId.Fuse, "Fuse", "items.fuse" )); + // Utilities + this.Register(ItemId.Gps, new Item(ItemId.Gps, "GPS", "items.gps" )); } public void Register(ItemId id, Item item) diff --git a/Mine2d/game/core/tiles/Workbench.cs b/Mine2d/game/core/tiles/Workbench.cs index c4d01d5..9db5698 100644 --- a/Mine2d/game/core/tiles/Workbench.cs +++ b/Mine2d/game/core/tiles/Workbench.cs @@ -64,6 +64,76 @@ public class Workbench : Tile new ItemStack(ItemId.RawGold, 1), } }); + Recipes.Add(new Recipe + { + Result = new ItemStack(ItemId.CopperIngot, 1), + Ingredients = new List + { + new ItemStack(ItemId.Coal, 1), + new ItemStack(ItemId.RawCopper, 1), + } + }); + Recipes.Add(new Recipe + { + Result = new ItemStack(ItemId.SilverIngot, 1), + Ingredients = new List + { + new ItemStack(ItemId.Coal, 1), + new ItemStack(ItemId.RawSilver, 1), + } + }); + Recipes.Add(new Recipe + { + Result = new ItemStack(ItemId.CopperWire, 4), + Ingredients = new List + { + new ItemStack(ItemId.CopperIngot, 1), + } + }); + Recipes.Add(new Recipe + { + Result = new ItemStack(ItemId.Silicon, 1), + Ingredients = new List + { + new ItemStack(ItemId.Stone, 16), + } + }); + Recipes.Add(new Recipe + { + Result = new ItemStack(ItemId.CircuitBoard, 1), + Ingredients = new List + { + new ItemStack(ItemId.Silicon, 1), + new ItemStack(ItemId.CopperWire, 1), + } + }); + Recipes.Add(new Recipe + { + Result = new ItemStack(ItemId.ElectricCircuit, 1), + Ingredients = new List + { + new ItemStack(ItemId.CircuitBoard, 1), + new ItemStack(ItemId.CopperWire, 5), + } + }); + Recipes.Add(new Recipe + { + Result = new ItemStack(ItemId.Fuse, 1), + Ingredients = new List + { + new ItemStack(ItemId.CopperWire, 1), + new ItemStack(ItemId.Stone, 1), + } + }); + Recipes.Add(new Recipe + { + Result = new ItemStack(ItemId.Gps, 1), + Ingredients = new List + { + new ItemStack(ItemId.ElectricCircuit, 1), + new ItemStack(ItemId.Fuse, 1), + } + }); } public override bool IsSolid() diff --git a/Mine2d/game/core/world/ChunkGenerator.cs b/Mine2d/game/core/world/ChunkGenerator.cs index 99ea880..69038c5 100644 --- a/Mine2d/game/core/world/ChunkGenerator.cs +++ b/Mine2d/game/core/world/ChunkGenerator.cs @@ -76,16 +76,9 @@ public class ChunkGenerator return chunk; } - public static Chunk CreateSpawnChunk(int x, int y) + public static void CreateSpawnChunk(int x, int y) { - var chunk = new Chunk(x, y); - for (var i = 0; i < Constants.ChunkSize; i++) - { - for (var j = 0; j < Constants.ChunkSize; j++) - { - chunk.SetTile(i, j, STile.From(Tiles.Stone)); - } - } + var chunk = CreateChunk(x, y); chunk.SetTile(16, 16, STile.From(0)); chunk.SetTile(15, 16, STile.From(0)); chunk.SetTile(16, 15, STile.From(0)); @@ -95,7 +88,12 @@ public class ChunkGenerator chunk.SetTile(17, 16, STile.From(0)); chunk.SetTile(14, 16, STile.From(0)); chunk.SetTile(16, 14, STile.From(0)); + chunk.SetTile(15, 14, STile.From(0)); chunk.SetTile(17, 16, STile.From((int)Tiles.Workbench)); - return chunk; + chunk.SetTile(14, 17, STile.From((int)Tiles.Stone)); + chunk.SetTile(15, 17, STile.From((int)Tiles.Stone)); + chunk.SetTile(16, 17, STile.From((int)Tiles.Stone)); + chunk.SetTile(17, 17, STile.From((int)Tiles.Stone)); + Context.Get().GameState.World.AddChunk(chunk); } } diff --git a/Mine2d/game/frontend/ItemRenderer.cs b/Mine2d/game/frontend/ItemRenderer.cs index 8bcdf8f..03eb9d1 100644 --- a/Mine2d/game/frontend/ItemRenderer.cs +++ b/Mine2d/game/frontend/ItemRenderer.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Mine2d.engine; using Mine2d.game.core.data; namespace Mine2d.game.frontend; @@ -15,6 +16,11 @@ public static class ItemRenderer var texture = stack.GetTexture(); var renderer = Context.Get().Renderer; var uiScale = Context.Get().FrontendGameState.Settings.UiScale; + Renderer.ProcessStatus(SDL_SetTextureColorMod(texture, 0, 0, 0)); + Renderer.ProcessStatus(SDL_SetTextureAlphaMod(texture, 128)); + renderer.DrawTexture(texture, (int)position.X + uiScale, (int)position.Y + uiScale, 16 * uiScale, 16 * uiScale); + Renderer.ProcessStatus(SDL_SetTextureColorMod(texture, 255, 255, 255)); + Renderer.ProcessStatus(SDL_SetTextureAlphaMod(texture, 255)); renderer.DrawTexture(texture, (int)position.X, (int)position.Y, 16 * uiScale, 16 * uiScale); if (stack.Count > 1) { diff --git a/Mine2d/game/frontend/inventory/PlayerInventoryRenderer.cs b/Mine2d/game/frontend/inventory/PlayerInventoryRenderer.cs index c6494e3..a96304d 100644 --- a/Mine2d/game/frontend/inventory/PlayerInventoryRenderer.cs +++ b/Mine2d/game/frontend/inventory/PlayerInventoryRenderer.cs @@ -54,7 +54,7 @@ public class PlayerInventoryRenderer : Inventory var pickaxe = player.Inventory.Pickaxe; if (pickaxe != null) { - ItemRenderer.RenderItemStack(pickaxe, new Vector2(((4 + (9 * 21)) * uiScale) + x, (((5 * 21) + 4) * uiScale) + y), player.Inventory.Cursor == null, "Test\nTT"); + ItemRenderer.RenderItemStack(pickaxe, new Vector2(((4 + (9 * 21)) * uiScale) + x, (((5 * 21) + 4) * uiScale) + y), player.Inventory.Cursor == null); } } diff --git a/Mine2d/game/frontend/inventory/WorkbenchInventory.cs b/Mine2d/game/frontend/inventory/WorkbenchInventory.cs index 30a186a..a160b4a 100644 --- a/Mine2d/game/frontend/inventory/WorkbenchInventory.cs +++ b/Mine2d/game/frontend/inventory/WorkbenchInventory.cs @@ -30,14 +30,24 @@ public class WorkbenchInventory : Inventory PlayerInventoryRenderer.Render(this.x, this.y + (50 * uiScale)); var rX = this.x + (4 * uiScale); + var xOffset = 0; + var yOffset = 0; var rY = this.y + (4 * uiScale); - foreach ( var r in Workbench.Recipes) { + foreach (var r in Workbench.Recipes) + { var desc = "Requires:\n"; - foreach (var i in r.Ingredients) { + foreach (var i in r.Ingredients) + { desc += $"{i.Count}x {i.GetName()}\n"; } - ItemRenderer.RenderItemStack(r.Result, new Vector2(rX, rY), true, desc); - rX += 21 * uiScale; + ItemRenderer.RenderItemStack(r.Result, new Vector2(rX + xOffset, rY + yOffset), true, desc); + + xOffset += 21 * uiScale; + if (xOffset == 21 * uiScale * 9) + { + xOffset = 0; + yOffset += 21 * uiScale; + } } } @@ -49,27 +59,39 @@ public class WorkbenchInventory : Inventory var cursorPosition = Context.Get().FrontendGameState.CursorPosition; var player = PlayerEntity.GetSelf(); var rX = this.x + (4 * uiScale); + var xOffset = 0; + var yOffset = 0; var rY = this.y + (4 * uiScale); - foreach ( var r in Workbench.Recipes) { - if(cursorPosition.X >= rX && cursorPosition.X <= rX + (21 * uiScale) && cursorPosition.Y >= rY && cursorPosition.Y <= rY + (21 * uiScale)) { + foreach (var r in Workbench.Recipes) + { + if (cursorPosition.X >= rX + xOffset && cursorPosition.X <= rX + xOffset + (21 * uiScale) && cursorPosition.Y >= rY + yOffset && cursorPosition.Y <= rY + yOffset + (21 * uiScale)) + { Console.WriteLine("Clicked on recipe" + r.Result.GetName()); var canCraft = true; - foreach (var i in r.Ingredients) { - if (!player.Inventory.HasItemStack(i)) { + foreach (var i in r.Ingredients) + { + if (!player.Inventory.HasItemStack(i)) + { canCraft = false; break; } } - if (canCraft) { - foreach (var i in r.Ingredients) { + if (canCraft) + { + foreach (var i in r.Ingredients) + { player.Inventory.RemoveItemStack(i); } player.Inventory.PickupItemStack(r.Result); } } - - rX += 21 * uiScale; + xOffset += 21 * uiScale; + if (xOffset == 21 * uiScale * 9) + { + xOffset = 0; + yOffset += 21 * uiScale; + } } } } \ No newline at end of file diff --git a/Mine2d/game/frontend/renderer/HudRenderer.cs b/Mine2d/game/frontend/renderer/HudRenderer.cs index e3e42ab..7220f74 100644 --- a/Mine2d/game/frontend/renderer/HudRenderer.cs +++ b/Mine2d/game/frontend/renderer/HudRenderer.cs @@ -1,6 +1,7 @@ using Mine2d.engine; using Mine2d.engine.utils; using Mine2d.game.core; +using Mine2d.game.core.data; namespace Mine2d.game.frontend.renderer; @@ -30,6 +31,7 @@ public class HudRenderer : IRenderer public void Render() { this.RenderHotbar(); + this.RenderGps(); } private void RenderHotbar() @@ -52,4 +54,22 @@ public class HudRenderer : IRenderer ItemRenderer.RenderItemStack(stack, new Vector2((4 + (i * 24)) * uiScale, 4 * uiScale)); } } + + private void RenderGps() + { + var player = PlayerEntity.GetSelf(); + if (player?.Inventory.HasItemStack(new ItemStack(ItemId.Gps, 1)) != true) return; + var renderer = Context.Get().Renderer; + var (wWidth, _) = Context.Get().Window.GetSize(); + var x = player.PrettyPosition.X.ToString("F2"); + var y = player.PrettyPosition.Y.ToString("F2"); + var (texture, width, height, surfaceMessage) = renderer.CreateTextTexture("GPS"); + renderer.DrawTexture(texture, wWidth - width, 0, width, height); + SDL_DestroyTexture(texture); + SDL_FreeSurface(surfaceMessage); + (texture, width, height, surfaceMessage) = renderer.CreateTextTexture($"X: {x} Y: {y}"); + renderer.DrawTexture(texture, wWidth - width, height, width, height); + SDL_DestroyTexture(texture); + SDL_FreeSurface(surfaceMessage); + } } diff --git a/Mine2d/game/frontend/renderer/TooltipRenderer.cs b/Mine2d/game/frontend/renderer/TooltipRenderer.cs index a8468d6..9a50677 100644 --- a/Mine2d/game/frontend/renderer/TooltipRenderer.cs +++ b/Mine2d/game/frontend/renderer/TooltipRenderer.cs @@ -30,6 +30,7 @@ public class TooltipRenderer : IRenderer var tooltipX = (int)tooltipPosition.X; var tooltipY = (int)tooltipPosition.Y; var (texture, width, height, surfaceMessage) = renderer.CreateTextTexture(tooltip); + var tooltipWidth = Math.Min(300, width); renderer.DrawTexture( this.tooltipTexture, tooltipX, @@ -46,7 +47,7 @@ public class TooltipRenderer : IRenderer this.tooltipTexture, tooltipX + 4 * uiScale, tooltipY, - width, + tooltipWidth, 4 * uiScale, 4, 0, @@ -56,7 +57,7 @@ public class TooltipRenderer : IRenderer renderer.DrawTexture( this.tooltipTexture, - tooltipX + width + 4 * uiScale, + tooltipX + tooltipWidth + 4 * uiScale, tooltipY, 4 * uiScale, 4 * uiScale, @@ -82,7 +83,7 @@ public class TooltipRenderer : IRenderer this.tooltipTexture, tooltipX + 4 * uiScale, tooltipY + 4 * uiScale, - width, + tooltipWidth, height, 4, 4, @@ -92,7 +93,7 @@ public class TooltipRenderer : IRenderer renderer.DrawTexture( this.tooltipTexture, - tooltipX + width + 4 * uiScale, + tooltipX + tooltipWidth + 4 * uiScale, tooltipY + 4 * uiScale, 4 * uiScale, height, @@ -118,7 +119,7 @@ public class TooltipRenderer : IRenderer this.tooltipTexture, tooltipX + 4 * uiScale, tooltipY + height + 4 * uiScale, - width, + tooltipWidth, 4 * uiScale, 4, 5, @@ -128,7 +129,7 @@ public class TooltipRenderer : IRenderer renderer.DrawTexture( this.tooltipTexture, - tooltipX + width + 4 * uiScale, + tooltipX + tooltipWidth + 4 * uiScale, tooltipY + height + 4 * uiScale, 4 * uiScale, 4 * uiScale, diff --git a/Mine2d/game/state/Player.cs b/Mine2d/game/state/Player.cs index eb4c53c..7c56dbc 100644 --- a/Mine2d/game/state/Player.cs +++ b/Mine2d/game/state/Player.cs @@ -6,6 +6,7 @@ public class Player { public string Name { get; set; } public Vector2 Position { get; set; } + public Vector2 PrettyPosition { get => (this.Position - new Vector2(512244, 5390)) / 16; } public Guid Id { get; set; } public Vector2 Mining { get; set; } public int MiningCooldown { get; set; }