From 5cefdfd802d2a7d199527d3d4b1a5c1df5f844a7 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Wed, 21 Dec 2022 10:59:44 +0100 Subject: [PATCH] added workbench block + fixed breaking --- Mine2d/assets/{ => blocks}/ore1.png | Bin Mine2d/assets/{ => blocks}/ore2.png | Bin Mine2d/assets/{ => blocks}/ore3.png | Bin Mine2d/assets/{ => blocks}/ore4.png | Bin Mine2d/assets/{ => blocks}/stone.png | Bin Mine2d/assets/blocks/workbench.png | Bin 0 -> 257 bytes Mine2d/assets/breaking.ase | Bin 1009 -> 996 bytes Mine2d/assets/breaking.png | Bin 280 -> 282 bytes Mine2d/engine/TextureFactory.cs | 4 +-- Mine2d/game/Mine2dGame.cs | 1 + Mine2d/game/backend/interactor/Breaking.cs | 8 +++++ Mine2d/game/backend/interactor/Connect.cs | 16 ++++++---- Mine2d/game/backend/interactor/ItemPhysics.cs | 2 +- Mine2d/game/core/PlayerEntity.cs | 16 +++++----- Mine2d/game/core/data/Chunk.cs | 14 ++++++++ Mine2d/game/core/data/ItemId.cs | 1 + Mine2d/game/core/data/ItemStack.cs | 10 ++++++ Mine2d/game/core/data/World.cs | 30 ++++++++++++++++++ Mine2d/game/core/items/Item.cs | 3 +- Mine2d/game/core/items/ItemRegistry.cs | 1 + Mine2d/game/core/tiles/Tile.cs | 7 +++- Mine2d/game/core/tiles/TileRegistry.cs | 2 ++ Mine2d/game/core/tiles/Workbench.cs | 16 ++++++++++ Mine2d/game/core/world/ChunkGenerator.cs | 2 +- .../game/frontend/renderer/WorldRenderer.cs | 8 ++--- 25 files changed, 115 insertions(+), 26 deletions(-) rename Mine2d/assets/{ => blocks}/ore1.png (100%) rename Mine2d/assets/{ => blocks}/ore2.png (100%) rename Mine2d/assets/{ => blocks}/ore3.png (100%) rename Mine2d/assets/{ => blocks}/ore4.png (100%) rename Mine2d/assets/{ => blocks}/stone.png (100%) create mode 100644 Mine2d/assets/blocks/workbench.png create mode 100644 Mine2d/game/core/tiles/Workbench.cs diff --git a/Mine2d/assets/ore1.png b/Mine2d/assets/blocks/ore1.png similarity index 100% rename from Mine2d/assets/ore1.png rename to Mine2d/assets/blocks/ore1.png diff --git a/Mine2d/assets/ore2.png b/Mine2d/assets/blocks/ore2.png similarity index 100% rename from Mine2d/assets/ore2.png rename to Mine2d/assets/blocks/ore2.png diff --git a/Mine2d/assets/ore3.png b/Mine2d/assets/blocks/ore3.png similarity index 100% rename from Mine2d/assets/ore3.png rename to Mine2d/assets/blocks/ore3.png diff --git a/Mine2d/assets/ore4.png b/Mine2d/assets/blocks/ore4.png similarity index 100% rename from Mine2d/assets/ore4.png rename to Mine2d/assets/blocks/ore4.png diff --git a/Mine2d/assets/stone.png b/Mine2d/assets/blocks/stone.png similarity index 100% rename from Mine2d/assets/stone.png rename to Mine2d/assets/blocks/stone.png diff --git a/Mine2d/assets/blocks/workbench.png b/Mine2d/assets/blocks/workbench.png new file mode 100644 index 0000000000000000000000000000000000000000..caa1a8e4586533fe1c0ae51deaf17d54dae8b714 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|c6+)whFJ6_ zCrGdsOqe;EKtFum~aefEOhqzSE=59(D}g?B`xgIY%u6{1-oD!M< DW$k9=r^R(HA#wh}Wdi*cb`581iq0^tv}b1Me#fqxjHWzz@&YC`9nm?BNnU3a!p}-F zWu1F4QTdvlQ%%qrl_zmUZw`vH-*}=?XutJJBO}Ah!$SWie`C@MIlz!!u;F8)vBi}| z-H(IXPuF=}c@XU0Gy7aZU^mmL+?jG?$c3u3(mph~{EY;Q0J6{d0h0yx}*2&+4;^*Ct-w^~*B)%Y^3^FZ(Pm zJL{ZXQdDzw_JbGhKmFu_R-TCsi_ZPV_ITC4N5-|LuS?YG|DA35cvnwdK2!hFKI=D+ K*t04vrUC#D5sF>_ delta 388 zcmaFD{*j&W<3z@K#-ke>Co(b`PZnlUu0NrzIpdGIlPs4s!;AB*MP3XH48J}yGNb@$ zMj*BVVpatp2EzYLKn@tNGq5vM%t=l-z~aTF_W$C|6G=O+2yt(i>E9Qr@Ku3_VLd;u zTslxCvPt1UKFA~{pt%T>CU0O8G~jGFv+#;e(wE0U%{qO)ygof5=8IOV9#KE)amtcynrR~}BaSIzpcQu&y# zfnn0yL#gU^n>|@?+;Q=#dAPYhKxU#)*pXYE-n@#tJvWLo6hF7}>_T&5)#Q9;*_eZZ z3|L@dd+JG5z%M%E;Rct>*>G_;aXaIU&HZQoWC+IDTtrDzx&H2R61NwzV+Oa+;U0N zEV|)Lz8O0s)7F^MI%{7W$(zpPO=h(05nlTBM)6SKnYd2a delta 239 zcmV1qHFU-tYEu0o6A5B;Wh)32wQd zS&BNG$y;+Dk%gHBt#RIaZ6xpA6BW#8+9SMn^hWW}#4~wxzGy5Sy{{iX&YG(Iu;|!B zd4?BY9LwUpmD=J{D{|#b(i&%^$V_QxynR})3Zi_kId0h*zLYXD4{5F$zML{DH**JC pe7V4m%D!l$%(gN=BTtd}wqH7x)LJKMh35bO002ovPDHLkV1kv~bm#y8 diff --git a/Mine2d/engine/TextureFactory.cs b/Mine2d/engine/TextureFactory.cs index 2bdae67..bb00b0e 100644 --- a/Mine2d/engine/TextureFactory.cs +++ b/Mine2d/engine/TextureFactory.cs @@ -14,10 +14,10 @@ public class TextureFactory public IntPtr CreateTexture(string[] path) { - var target = this.LoadTexture(path[0]); + var target = this.LoadTexture("blocks." + path[0]); for (var i = 1; i < path.Length; i++) { - var t = this.LoadTexture(path[i]); + var t = this.LoadTexture("blocks." + path[i]); target = this.MergeTextures(target, t); } return target; diff --git a/Mine2d/game/Mine2dGame.cs b/Mine2d/game/Mine2dGame.cs index 84a6f8b..47d8bd4 100644 --- a/Mine2d/game/Mine2dGame.cs +++ b/Mine2d/game/Mine2dGame.cs @@ -1,6 +1,7 @@ using Mine2d.engine; using Mine2d.engine.networking; using Mine2d.game.core; +using Mine2d.game.core.data; using Mine2d.game.state; namespace Mine2d.game; diff --git a/Mine2d/game/backend/interactor/Breaking.cs b/Mine2d/game/backend/interactor/Breaking.cs index d95f125..54d7361 100644 --- a/Mine2d/game/backend/interactor/Breaking.cs +++ b/Mine2d/game/backend/interactor/Breaking.cs @@ -40,6 +40,13 @@ public class Breaking player.MiningCooldown = 10; var tileRegistry = ctx.TileRegistry; var hardness = tileRegistry.GetTile(tileId).Hardness; + if(tile.Hits == 0) { + ctx.GameState.World.Cracks.Enqueue(new CrackQueueEntry + { + Pos = player.Mining, + ResetTime = DateTime.Now.AddSeconds(5) + }); + } chunk.SetTileAt(player.Mining, tile with { Hits = tile.Hits + 1 }); if (tile.Hits >= hardness) { @@ -55,6 +62,7 @@ public class Breaking } } } + Context.Get().GameState.World.ProcessCrackQueue(); } [Interaction(InteractorKind.Server, PacketType.Break)] diff --git a/Mine2d/game/backend/interactor/Connect.cs b/Mine2d/game/backend/interactor/Connect.cs index f0f62d3..4dd87d8 100644 --- a/Mine2d/game/backend/interactor/Connect.cs +++ b/Mine2d/game/backend/interactor/Connect.cs @@ -1,5 +1,6 @@ using Mine2d.engine.system.annotations; using Mine2d.game.backend.network.packets; +using Mine2d.game.core.data; using Mine2d.game.state; namespace Mine2d.game.backend.interactor; @@ -14,14 +15,15 @@ public class Connect var player = ctx.GameState.Players.Find(p => p.Name == packet.PlayerName); if (player == null) { + player = new Player + { + Name = packet.PlayerName, + Id = packet.PlayerGuid, + Position = new Vector2(512244, 5390), + Movement = new Vector2(0, 0) + }; ctx.GameState.Players.Add( - new Player - { - Name = packet.PlayerName, - Id = packet.PlayerGuid, - Position = new Vector2(512244, 5390), - Movement = new Vector2(0, 0) - } + player ); } } diff --git a/Mine2d/game/backend/interactor/ItemPhysics.cs b/Mine2d/game/backend/interactor/ItemPhysics.cs index 62d75f2..363c855 100644 --- a/Mine2d/game/backend/interactor/ItemPhysics.cs +++ b/Mine2d/game/backend/interactor/ItemPhysics.cs @@ -23,7 +23,7 @@ public class ItemPhysics itemEntity.Velocity += new Vector2(0, 0.1f); itemEntity.Velocity *= new Vector2(0.7f, 1f); var nextPos = itemEntity.Position + itemEntity.Velocity; - if (world.HasChunkAt(nextPos) && world.GetChunkAt(nextPos).HasTileAt(nextPos)) + if (world.HasChunkAt(nextPos) && world.GetChunkAt(nextPos).HasSolidTileAt(nextPos)) { itemEntity.Velocity = new Vector2(0, 0); continue; diff --git a/Mine2d/game/core/PlayerEntity.cs b/Mine2d/game/core/PlayerEntity.cs index 7e72be1..290e4ce 100644 --- a/Mine2d/game/core/PlayerEntity.cs +++ b/Mine2d/game/core/PlayerEntity.cs @@ -39,8 +39,8 @@ public class PlayerEntity var pL = p.Position + new Vector2(0, -8); var pL2 = p.Position + new Vector2(0, -24); hasCollision = - world.HasChunkAt(pL) && world.GetChunkAt(pL).HasTileAt(pL) - || world.HasChunkAt(pL2) && world.GetChunkAt(pL2).HasTileAt(pL2); + world.HasChunkAt(pL) && world.GetChunkAt(pL).HasSolidTileAt(pL) + || world.HasChunkAt(pL2) && world.GetChunkAt(pL2).HasSolidTileAt(pL2); if (hasCollision) { p.Movement = p.Movement with { X = 0 }; @@ -52,8 +52,8 @@ public class PlayerEntity var pR = p.Position + new Vector2(14, -8); var pR2 = p.Position + new Vector2(14, -24); hasCollision = - world.HasChunkAt(pR) && world.GetChunkAt(pR).HasTileAt(pR) - || world.HasChunkAt(pR2) && world.GetChunkAt(pR2).HasTileAt(pR2); + world.HasChunkAt(pR) && world.GetChunkAt(pR).HasSolidTileAt(pR) + || world.HasChunkAt(pR2) && world.GetChunkAt(pR2).HasSolidTileAt(pR2); if (hasCollision) { p.Movement = p.Movement with { X = 0 }; @@ -65,8 +65,8 @@ public class PlayerEntity var pL = p.Position + new Vector2(0, 0); var pR = p.Position + new Vector2(14, 0); hasCollision = - world.HasChunkAt(pL) && world.GetChunkAt(pL).HasTileAt(pL) - || world.HasChunkAt(pR) && world.GetChunkAt(pR).HasTileAt(pR); + world.HasChunkAt(pL) && world.GetChunkAt(pL).HasSolidTileAt(pL) + || world.HasChunkAt(pR) && world.GetChunkAt(pR).HasSolidTileAt(pR); if (hasCollision) { p.Movement = p.Movement with { Y = 0 }; @@ -78,8 +78,8 @@ public class PlayerEntity var pL = p.Position + new Vector2(0, -28); var pR = p.Position + new Vector2(14, -28); hasCollision = - world.HasChunkAt(pL) && world.GetChunkAt(pL).HasTileAt(pL) - || world.HasChunkAt(pR) && world.GetChunkAt(pR).HasTileAt(pR); + world.HasChunkAt(pL) && world.GetChunkAt(pL).HasSolidTileAt(pL) + || world.HasChunkAt(pR) && world.GetChunkAt(pR).HasSolidTileAt(pR); if (hasCollision) { p.Movement = p.Movement with { Y = 0 }; diff --git a/Mine2d/game/core/data/Chunk.cs b/Mine2d/game/core/data/Chunk.cs index 4467d29..f015b87 100644 --- a/Mine2d/game/core/data/Chunk.cs +++ b/Mine2d/game/core/data/Chunk.cs @@ -36,6 +36,20 @@ public class Chunk return this.HasTile(tileX, tileY); } + public bool HasSolidTileAt(Vector2 pos) + { + return this.HasSolidTileAt((int)pos.X, (int)pos.Y); + } + + public bool HasSolidTileAt(int x, int y) + { + var posInChunk = this.GetPositionInChunk(new Vector2(x, y)); + var tileX = (int)Math.Floor(posInChunk.X / Constants.TileSize); + var tileY = (int)Math.Floor(posInChunk.Y / Constants.TileSize); + if(!this.HasTile(tileX, tileY)) return false; + return Context.Get().TileRegistry.GetTile(this.GetTile(tileX, tileY).Id).IsSolid(); + } + public STile GetTileAt(Vector2 pos) { return this.GetTileAt((int)pos.X, (int)pos.Y); diff --git a/Mine2d/game/core/data/ItemId.cs b/Mine2d/game/core/data/ItemId.cs index 23ed545..824ec46 100644 --- a/Mine2d/game/core/data/ItemId.cs +++ b/Mine2d/game/core/data/ItemId.cs @@ -4,4 +4,5 @@ public enum ItemId { Air = 0, Stone = 1, + Workbench = 6, } diff --git a/Mine2d/game/core/data/ItemStack.cs b/Mine2d/game/core/data/ItemStack.cs index 7c0e2c8..bd2aeed 100644 --- a/Mine2d/game/core/data/ItemStack.cs +++ b/Mine2d/game/core/data/ItemStack.cs @@ -5,6 +5,16 @@ public class ItemStack public ItemId Id { get; set; } public int Count { get; set; } + public ItemStack() + { + } + + public ItemStack(ItemId id, int count) + { + this.Id = id; + this.Count = count; + } + public IntPtr GetTexture() { return Context.Get().ItemRegistry.GetItem(this.Id).GetTexture(); diff --git a/Mine2d/game/core/data/World.cs b/Mine2d/game/core/data/World.cs index ef09d6b..0da1387 100644 --- a/Mine2d/game/core/data/World.cs +++ b/Mine2d/game/core/data/World.cs @@ -1,8 +1,15 @@ namespace Mine2d.game.core.data; +public struct CrackQueueEntry +{ + public Vector2 Pos { get; set; } + public DateTime ResetTime { get; set; } +} + public class World { public Dictionary Chunks { get; set; } = new Dictionary(); + public Queue Cracks { get; set; } = new(); public void AddChunk(Chunk chunk) { @@ -79,4 +86,27 @@ public class World { return this.HasChunkAt(x, y) && this.GetChunkAt(x, y).HasTileAt(new Vector2(x, y)); } + + public void ProcessCrackQueue() + { + var now = DateTime.Now; + var needsReorder = false; + while (this.Cracks.Count > 0 && this.Cracks.Peek().ResetTime < now) + { + var head = this.Cracks.Dequeue(); + var stile = this.GetTileAt((int)head.Pos.X, (int)head.Pos.Y); + this.SetTileAt((int)head.Pos.X, (int)head.Pos.Y, stile with { Hits = stile.Hits - 1 }); + if (stile.Hits >= 1) + { + this.Cracks.Enqueue(new CrackQueueEntry { Pos = head.Pos, ResetTime = now.AddSeconds(1) }); + needsReorder = true; + } + } + if (needsReorder) + { + this.Cracks = new(this.Cracks.OrderBy(x => x.ResetTime)); + } + Console.WriteLine(this.Cracks.Count); + Console.WriteLine(this.Cracks.ToString()); + } } diff --git a/Mine2d/game/core/items/Item.cs b/Mine2d/game/core/items/Item.cs index c83c995..ae759a4 100644 --- a/Mine2d/game/core/items/Item.cs +++ b/Mine2d/game/core/items/Item.cs @@ -12,8 +12,7 @@ public class Item { this.Id = id; this.Name = name; - var texture = Context.Get().TextureFactory.CreateTexture(textureName); - this.texture = texture; + this.texture = Context.Get().TextureFactory.CreateTexture(textureName); } public void Render(Vector2 position) diff --git a/Mine2d/game/core/items/ItemRegistry.cs b/Mine2d/game/core/items/ItemRegistry.cs index a245407..9014042 100644 --- a/Mine2d/game/core/items/ItemRegistry.cs +++ b/Mine2d/game/core/items/ItemRegistry.cs @@ -9,6 +9,7 @@ public class ItemRegistry public void RegisterItems() { this.Register(ItemId.Stone, new Item(ItemId.Stone, "Stone", new[] { "stone" })); + this.Register(ItemId.Workbench, new Item(ItemId.Workbench, "Workbench", new[] { "workbench" })); } public void Register(ItemId id, Item item) diff --git a/Mine2d/game/core/tiles/Tile.cs b/Mine2d/game/core/tiles/Tile.cs index e4c06fc..257109c 100644 --- a/Mine2d/game/core/tiles/Tile.cs +++ b/Mine2d/game/core/tiles/Tile.cs @@ -19,7 +19,7 @@ public class Tile this.Drop = drop; var rl = Context.Get().ResourceLoader; - var (ptr, size) = rl.LoadToIntPtr("assets." + textureName + ".png"); + var (ptr, size) = rl.LoadToIntPtr("assets.blocks." + textureName + ".png"); var sdlBuffer = SDL_RWFromMem(ptr, size); var surface = IMG_Load_RW(sdlBuffer, 1); this.texture = Context.Get().Renderer.CreateTextureFromSurface(surface); @@ -92,4 +92,9 @@ public class Tile breakingTexture = Context.Get().Renderer.CreateTextureFromSurface(surface); SDL_FreeSurface(surface); } + + public virtual bool IsSolid() + { + return true; + } } diff --git a/Mine2d/game/core/tiles/TileRegistry.cs b/Mine2d/game/core/tiles/TileRegistry.cs index bd7a6ec..c6565c9 100644 --- a/Mine2d/game/core/tiles/TileRegistry.cs +++ b/Mine2d/game/core/tiles/TileRegistry.cs @@ -9,6 +9,7 @@ public enum Tiles Ore2 = 3, Ore3 = 4, Ore4 = 5, + Workbench = 6, } public class TileRegistry @@ -22,6 +23,7 @@ public class TileRegistry this.Tiles.Add(3, new OreTile("ore2", new[] { "stone", "ore2" }, 7)); this.Tiles.Add(4, new OreTile("ore3", new[] { "stone", "ore3" }, 8)); this.Tiles.Add(5, new OreTile("ore4", new[] { "stone", "ore4" }, 10)); + this.Tiles.Add(6, new Workbench("workbench", "workbench", 10)); } public Tile GetTile(int id) diff --git a/Mine2d/game/core/tiles/Workbench.cs b/Mine2d/game/core/tiles/Workbench.cs new file mode 100644 index 0000000..3127ea8 --- /dev/null +++ b/Mine2d/game/core/tiles/Workbench.cs @@ -0,0 +1,16 @@ +using Mine2d.game.core.data; + +namespace Mine2d.game.core.tiles +{ + public class Workbench : Tile + { + public Workbench(string name, string texturePath, int hardness) : base(name, texturePath, hardness, ItemId.Workbench) + { + } + + public override bool IsSolid() + { + return false; + } + } +} \ No newline at end of file diff --git a/Mine2d/game/core/world/ChunkGenerator.cs b/Mine2d/game/core/world/ChunkGenerator.cs index 56e4dec..b196c4c 100644 --- a/Mine2d/game/core/world/ChunkGenerator.cs +++ b/Mine2d/game/core/world/ChunkGenerator.cs @@ -74,7 +74,7 @@ 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; } } diff --git a/Mine2d/game/frontend/renderer/WorldRenderer.cs b/Mine2d/game/frontend/renderer/WorldRenderer.cs index 64b7880..e426e0c 100644 --- a/Mine2d/game/frontend/renderer/WorldRenderer.cs +++ b/Mine2d/game/frontend/renderer/WorldRenderer.cs @@ -52,7 +52,7 @@ public class WorldRenderer : IRenderer var chunkOffsetY = chunk.Y * Constants.TileSize * Constants.ChunkSize; var drawX = x * 16 + chunkOffsetX; var drawY = y * 16 + chunkOffsetY; - if (stile.Id == 0) + if (stile.Id == 0 || !tileRegistry.GetTile(stile.Id).IsSolid()) { Renderer.ProcessStatus(SDL_SetRenderTarget(ctx.Renderer.GetRaw(), this.overlay)); renderer.DrawTexture( @@ -62,11 +62,11 @@ public class WorldRenderer : IRenderer 96 * scale, 96 * scale ); - continue; } - else + Renderer.ProcessStatus(SDL_SetRenderTarget(ctx.Renderer.GetRaw(), IntPtr.Zero)); + if (stile.Id == 0) { - Renderer.ProcessStatus(SDL_SetRenderTarget(ctx.Renderer.GetRaw(), IntPtr.Zero)); + continue; } var tile = tileRegistry.GetTile(stile.Id);