From 7b7f2a2a6943be1dad439993fa7c9e55f24c2488 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Wed, 4 Jan 2023 12:32:23 +0100 Subject: [PATCH] updated crafting --- Mine2d/assets/icon.png | Bin 0 -> 4202235 bytes Mine2d/assets/items/circuit-board.png | Bin 0 -> 218 bytes Mine2d/assets/items/copper-wire.png | Bin 0 -> 252 bytes Mine2d/assets/items/electric-circuit.png | Bin 0 -> 254 bytes Mine2d/assets/items/fuse.png | Bin 0 -> 227 bytes Mine2d/assets/items/gps.png | Bin 0 -> 267 bytes Mine2d/assets/items/ingot-copper.png | Bin 0 -> 205 bytes Mine2d/assets/items/ingot-silver.png | Bin 0 -> 190 bytes Mine2d/assets/items/pickaxe-stone.png | Bin 249 -> 265 bytes Mine2d/assets/items/silicon.png | Bin 0 -> 217 bytes Mine2d/engine/Window.cs | 4 + Mine2d/game/backend/interactor/Connect.cs | 7 +- Mine2d/game/core/Bootstrapper.cs | 4 +- Mine2d/game/core/data/ItemId.cs | 8 ++ Mine2d/game/core/items/ItemRegistry.cs | 12 +++ Mine2d/game/core/tiles/Workbench.cs | 70 ++++++++++++++++++ Mine2d/game/core/world/ChunkGenerator.cs | 18 ++--- Mine2d/game/frontend/ItemRenderer.cs | 6 ++ .../inventory/PlayerInventoryRenderer.cs | 2 +- .../frontend/inventory/WorkbenchInventory.cs | 46 +++++++++--- Mine2d/game/frontend/renderer/HudRenderer.cs | 20 +++++ .../game/frontend/renderer/TooltipRenderer.cs | 13 ++-- Mine2d/game/state/Player.cs | 1 + 23 files changed, 173 insertions(+), 38 deletions(-) create mode 100644 Mine2d/assets/icon.png create mode 100644 Mine2d/assets/items/circuit-board.png create mode 100644 Mine2d/assets/items/copper-wire.png create mode 100644 Mine2d/assets/items/electric-circuit.png create mode 100644 Mine2d/assets/items/fuse.png create mode 100644 Mine2d/assets/items/gps.png create mode 100644 Mine2d/assets/items/ingot-copper.png create mode 100644 Mine2d/assets/items/ingot-silver.png create mode 100644 Mine2d/assets/items/silicon.png diff --git a/Mine2d/assets/icon.png b/Mine2d/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0d2de67c675ac4c509b04f03dcc65fb9716748 GIT binary patch literal 4202235 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̥r|lzteZ+A5b*$&PJjRb0t5&UAV7cs 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 literal 0 HcmV?d00001 diff --git a/Mine2d/assets/items/electric-circuit.png b/Mine2d/assets/items/electric-circuit.png new file mode 100644 index 0000000000000000000000000000000000000000..c5c89d524f8ebe631bd70494450fee88c69b895a GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|c6hothFJ6_ zCrGgNoS0MIp8i+eZSsU%sTg@-yR+~2|2vk&uqnzdr7>7KP3SQL+vbLn9o`WWR6}AX zOR(&We7NoKjT;9(tM^NQKmgBOxNrRUU-sy+|C(kkA+|n0cut-<^=tmjsjb%o+;Z4ze*J1rw4ZDnlk;m!ro^j) zT?ZC_*HPY-mTBn7Rc+sF6RUV~Pw_ag aF;pM%s{Q=^?-QUy89ZJ6T-G@yGywoe?O9p? literal 0 HcmV?d00001 diff --git a/Mine2d/assets/items/gps.png b/Mine2d/assets/items/gps.png new file mode 100644 index 0000000000000000000000000000000000000000..04a43daf40aa46116b6156e0f57d73432e07d730 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|j(WN{hFJ6_ zCrD%*=s45K!~M&@M{Q^NdI{@(nZyJTIJETV>Fe(!Zt?&@|B@pQvSv!oXmn82G(+y}?zWhZsCv L{an^LB{Ts5!pvy6 literal 0 HcmV?d00001 diff --git a/Mine2d/assets/items/ingot-copper.png b/Mine2d/assets/items/ingot-copper.png new file mode 100644 index 0000000000000000000000000000000000000000..5286e35160e810992574455cbbead9aa315aee81 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|+C5zyLo9l) zPTb9VK!JyKZU+-*r|S)MV}qcyg!wv6EiUd_?)=FCr=En0>^m&K=ze;2@RX#CKX&I< zCr@Ky*}Hj)x2(!4hb9S4L#ZW=o8L$+Ik+?A)Y3`i)AnpW-|i;%X^qaqY3Z`OOjGtq zx{5CFaMRnk+o@||;%kiyeij@7hZx+OPM?@uXKg;c+|E?Y#wZ!+BnD4cKbLh*2~7ZS Cl1Wbh literal 0 HcmV?d00001 diff --git a/Mine2d/assets/items/ingot-silver.png b/Mine2d/assets/items/ingot-silver.png new file mode 100644 index 0000000000000000000000000000000000000000..7a853d74c8d75040d55f689a47e368bc2c3115c8 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Dm+~rLo9l) zPP7&}pupkcd91AeS*GPJxdS070v9&=Y}@p}_GiZ*yX&44SMgPUzo(w2{Xv02ai+>r zg(kbeOIj|d#~-b;CDJ!ZcfFMtlfI?oQjv;4pO{A_tf8{|O7&Ox m&0vX3YEW&uePnW-HUBDJ2ks@eOJ#v>VDNPHb6Mw<&;$TRen6H0 literal 0 HcmV?d00001 diff --git a/Mine2d/assets/items/pickaxe-stone.png b/Mine2d/assets/items/pickaxe-stone.png index 0382d97299eba1757471ba4714f53193c87ca626..1c8d3b16d9e120a01b770f318dbd8b7c5e2f681a 100644 GIT binary patch delta 224 zcmV<603ZMP0f_>TF@M8JL_t(Ijm3~n3WG2ZgNee+&`e-{IQuIsXa(TdXEFiyc*&d!kcI&xM7c!)ouYPKeEI9WSK@xB7mI6}5toTLr` zd$Eso8ep^{_gaED3@DZq0bz61#Nt9_fYkPW<{xz5=b5-05AWE0{H=uF@Lj3L_t(Ijm3{m3WP8WM!&S_vd}Ad|3i6#0l|d}Q!|UfplwDJ z1}2-9{JgvX{|*9xVHmnX$w}MXG_SP($8iJzutzO9DRTgn08)EPP8x;jwJg>fJis)s zB(gzjg~(=k=77p_GII@D-I8HO%wa!|z8ZMvh-{y8nz#fUhe`LdZUahA$}!ro6_ieW zF2FX|dLDM71GL)5+BC1!LPIy~X*Uqp;E8qzxU=~Z0O0ZFpT!$~pmD%YAM-~50000< KMNUMnLSTaK*?^icR?2cjnmB znjMTM{Ek1($qDRu#FWHy=$X(C?hA8!w7o9!9x@P&UevU)lUMu~6GMeb#=_l2;hsR} OF?hQAxvX + { + 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; }