From 6cd5852cd199e920fa4af8201a172e7195254a91 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Wed, 21 Dec 2022 16:26:07 +0100 Subject: [PATCH] added ores --- .../blocks/{tine-ore.png => tin-ore.png} | Bin Mine2d/assets/hud/workbench-inventory.png | Bin 0 -> 1252 bytes Mine2d/game/backend/interactor/Place.cs | 6 ++ Mine2d/game/core/data/ItemId.cs | 11 +++ Mine2d/game/core/data/World.cs | 2 +- Mine2d/game/core/items/Item.cs | 7 ++ Mine2d/game/core/items/ItemRegistry.cs | 11 +++ Mine2d/game/core/tiles/OreTile.cs | 4 + Mine2d/game/core/tiles/TileRegistry.cs | 22 ++++++ Mine2d/game/core/world/ChunkGenerator.cs | 22 +----- Mine2d/game/core/world/WorldGenerator.cs | 70 ++++++++++++++++-- Mine2d/game/frontend/events/Exit.cs | 8 +- Mine2d/game/frontend/events/InventoryInput.cs | 6 +- .../frontend/inventory/InventoryRegistry.cs | 1 + .../frontend/inventory/WorkbenchInventory.cs | 25 +++++++ Mine2d/game/state/FrontendGameState.cs | 3 +- 16 files changed, 166 insertions(+), 32 deletions(-) rename Mine2d/assets/blocks/{tine-ore.png => tin-ore.png} (100%) create mode 100644 Mine2d/assets/hud/workbench-inventory.png create mode 100644 Mine2d/game/frontend/inventory/WorkbenchInventory.cs diff --git a/Mine2d/assets/blocks/tine-ore.png b/Mine2d/assets/blocks/tin-ore.png similarity index 100% rename from Mine2d/assets/blocks/tine-ore.png rename to Mine2d/assets/blocks/tin-ore.png diff --git a/Mine2d/assets/hud/workbench-inventory.png b/Mine2d/assets/hud/workbench-inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd4c2803cdf4c6b30a9112945e47cd05e283757 GIT binary patch literal 1252 zcmVPx(o=HSORCt{2-Q8~7AP|OOQg!eDf_;!4S#=y68<>Ilc^|1#m8QGke0q!ihPV<99K z%7FQX8nMQh{HY;I1g~cZ*BTIdmKfXxq~*P?g3z)AX0+EJB>ssv z$2*zo`lLA^Ru7)^4a=)%Gw#OWEw8T;wzpUEjz6>5V_Bqjqp+3M(5Ut5)aUd0iZn!M z@#Yw1J2oN#v3k%Xmb$!oJD%RVpFqR)KI+kJ8C0q-~;V9ds?6;;5 zu~tuLr5a}DULaFly8>eQ0M*KN_iw%R*(a~o=K+#oj=H4ePInLDEhLu9+pF~kWlxxo zVaODW-Oy5#x690*{*Q*9NqdIXsXa0VV<)~?ab&o%`hy@8I5Tx0B=f}g$&6#e@&1hi zf?ryeomjq{FTqp~0vnzt^HCcA8)+&EJ(0f)h8_f{ARs^m0Rbuq2v9*lFl6=3U2Oye z-J*x16aoSTQ7-Y8LO_5j_d6>>-pKNiNWDiX^dLB?%_}m@InD?Onq&(JLo77Q6p~Qm zMK7#Bxi}I4i}e{1sxlsUTlv}&7R&YMrCuTHXUmy9?bvwKvhlZeS!PqMkhintP9xM2 zHix#dA;(Ny#X9NvinP|(to@$l32?*!JP8+&mHPurv0V0SAqlnhsK(iU70YGMvN2yN z0ecV)qhGyz_479k%6dp#K2Rmy4jTHGK|J`@rv3<9cl*Z@-w-YyC1X zv)tX{eoUGTH^WNU2+R$!?pPgiAvQMwDaGdlQS=bLEqNYfq@h~~g@rO;j^#Z_Z)1!8 z{oJrYJs`DS#Opp$$YXgAQqvj|PoZL%=EIbLNH_G=jmuLIF=kp1^0rY$YA_n*>8zP2n}ZDAR`T&a6rrSfY6xX$&wyKa$hI{2TjYKC~RriSF2(P24-;c$Sr}u z3T7thfJFoZs30Jduwk`NZss5n5DI_jL4XPZ0#wlDzrc6B0{{R3V*UYYsm6b-#T|73 O0000= 1) { - this.Cracks.Enqueue(new CrackQueueEntry { Pos = head.Pos, ResetTime = now.AddSeconds(1) }); + this.Cracks.Enqueue(new CrackQueueEntry { Pos = head.Pos, ResetTime = now.AddSeconds(0.5) }); needsReorder = true; } } diff --git a/Mine2d/game/core/items/Item.cs b/Mine2d/game/core/items/Item.cs index ae759a4..67a5fed 100644 --- a/Mine2d/game/core/items/Item.cs +++ b/Mine2d/game/core/items/Item.cs @@ -15,6 +15,13 @@ public class Item this.texture = Context.Get().TextureFactory.CreateTexture(textureName); } + public Item(ItemId id, string name, string textureName) + { + this.Id = id; + this.Name = name; + this.texture = Context.Get().TextureFactory.LoadTexture(textureName); + } + public void Render(Vector2 position) { var ctx = Context.Get(); diff --git a/Mine2d/game/core/items/ItemRegistry.cs b/Mine2d/game/core/items/ItemRegistry.cs index 9014042..737123d 100644 --- a/Mine2d/game/core/items/ItemRegistry.cs +++ b/Mine2d/game/core/items/ItemRegistry.cs @@ -10,6 +10,17 @@ public class ItemRegistry { this.Register(ItemId.Stone, new Item(ItemId.Stone, "Stone", new[] { "stone" })); this.Register(ItemId.Workbench, new Item(ItemId.Workbench, "Workbench", new[] { "workbench" })); + this.Register(ItemId.RawIron, new Item(ItemId.RawCobalt, "Raw Iron", "items.raw-iron" )); + this.Register(ItemId.RawCopper, new Item(ItemId.RawCopper, "Raw Copper", "items.raw-copper" )); + this.Register(ItemId.RawTin, new Item(ItemId.RawTin, "Raw Tin", "items.raw-tin" )); + this.Register(ItemId.RawSilver, new Item(ItemId.RawSilver, "Raw Silver", "items.raw-silver" )); + this.Register(ItemId.RawGold, new Item(ItemId.RawGold, "Raw Gold", "items.raw-gold" )); + this.Register(ItemId.RawLead, new Item(ItemId.RawLead, "Raw Lead", "items.raw-lead" )); + this.Register(ItemId.RawPlatinum, new Item(ItemId.RawPlatinum, "Raw Platinum", "items.raw-platinum" )); + this.Register(ItemId.RawCobalt, new Item(ItemId.RawCobalt, "Raw Cobalt", "items.raw-cobalt" )); + this.Register(ItemId.RawTungsten, new Item(ItemId.RawTungsten, "Raw Tungsten", "items.raw-tungsten" )); + this.Register(ItemId.RawUranium, new Item(ItemId.RawUranium, "Raw Uranium", "items.raw-uranium" )); + this.Register(ItemId.Diamond, new Item(ItemId.Diamond, "Diamond", "items.diamond" )); } public void Register(ItemId id, Item item) diff --git a/Mine2d/game/core/tiles/OreTile.cs b/Mine2d/game/core/tiles/OreTile.cs index 84dff0b..59922d0 100644 --- a/Mine2d/game/core/tiles/OreTile.cs +++ b/Mine2d/game/core/tiles/OreTile.cs @@ -7,4 +7,8 @@ public class OreTile : Tile public OreTile(string name, string[] texturePath, int hardness) : base(name, Context.Get().TextureFactory.CreateTexture(texturePath), hardness, ItemId.Air) { } + + public OreTile(string name, string[] texturePath, int hardness, ItemId drop) : base(name, Context.Get().TextureFactory.CreateTexture(texturePath), hardness, drop) + { + } } diff --git a/Mine2d/game/core/tiles/TileRegistry.cs b/Mine2d/game/core/tiles/TileRegistry.cs index c6565c9..d99b9aa 100644 --- a/Mine2d/game/core/tiles/TileRegistry.cs +++ b/Mine2d/game/core/tiles/TileRegistry.cs @@ -10,6 +10,17 @@ public enum Tiles Ore3 = 4, Ore4 = 5, Workbench = 6, + IronOre = 7, + CopperOre = 8, + TinOre = 9, + SilverOre = 10, + GoldOre = 11, + LeadOre = 12, + PlatinumOre = 13, + CobaltOre = 14, + TungstenOre = 15, + UraniumOre = 16, + DiamondOre = 17, } public class TileRegistry @@ -24,6 +35,17 @@ public class TileRegistry 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)); + this.Tiles.Add(7, new OreTile("iron-ore", new [] {"stone", "iron-ore"}, 6, ItemId.RawIron)); + this.Tiles.Add(8, new OreTile("copper-ore", new [] {"stone", "copper-ore"}, 6, ItemId.RawCopper)); + this.Tiles.Add(9, new OreTile("tin-ore", new [] {"stone", "tin-ore"}, 6, ItemId.RawTin)); + this.Tiles.Add(10, new OreTile("silver-ore", new [] {"stone", "silver-ore"}, 7, ItemId.RawSilver)); + this.Tiles.Add(11, new OreTile("gold-ore", new [] {"stone", "gold-ore"}, 8, ItemId.RawGold)); + this.Tiles.Add(12, new OreTile("lead-ore", new [] {"stone", "lead-ore"}, 9, ItemId.RawLead)); + this.Tiles.Add(13, new OreTile("platinum-ore", new [] {"stone", "platinum-ore"}, 10, ItemId.RawPlatinum)); + this.Tiles.Add(14, new OreTile("cobalt-ore", new [] {"stone", "cobalt-ore"}, 11, ItemId.RawCobalt)); + this.Tiles.Add(15, new OreTile("tungsten-ore", new [] {"stone", "tungsten-ore"}, 15, ItemId.RawTungsten)); + this.Tiles.Add(16, new OreTile("uranium-ore", new [] {"stone", "uranium-ore"}, 15, ItemId.RawUranium)); + this.Tiles.Add(17, new OreTile("diamond-ore", new [] {"stone", "diamond-ore"}, 10, ItemId.Diamond)); } public Tile GetTile(int id) diff --git a/Mine2d/game/core/world/ChunkGenerator.cs b/Mine2d/game/core/world/ChunkGenerator.cs index b196c4c..eae416b 100644 --- a/Mine2d/game/core/world/ChunkGenerator.cs +++ b/Mine2d/game/core/world/ChunkGenerator.cs @@ -5,6 +5,7 @@ namespace Mine2d.game.core.world; public class ChunkGenerator { + private static WorldGenerator wg = new WorldGenerator(); public static Chunk CreateFilledChunk(int x, int y, STile fill) { var chunk = new Chunk(x, y); @@ -29,26 +30,7 @@ public class ChunkGenerator { for (var j = 0; j < Constants.ChunkSize; j++) { - if (new Random().Next(0, 100) < 10) - { - fill.Id = (int)Tiles.Ore1; - } - else if (new Random().Next(0, 100) < 10) - { - fill.Id = (int)Tiles.Ore2; - } - else if (new Random().Next(0, 100) < 10) - { - fill.Id = (int)Tiles.Ore3; - } - else if (new Random().Next(0, 100) < 10) - { - fill.Id = (int)Tiles.Ore4; - } - else - { - fill.Id = (int)Tiles.Stone; - } + fill.Id = (int)wg.GetRandomOreAt(j + y); chunk.SetTile(i, j, fill); } } diff --git a/Mine2d/game/core/world/WorldGenerator.cs b/Mine2d/game/core/world/WorldGenerator.cs index 2f2a4c0..1864c1f 100644 --- a/Mine2d/game/core/world/WorldGenerator.cs +++ b/Mine2d/game/core/world/WorldGenerator.cs @@ -6,25 +6,85 @@ using Mine2d.game.core.tiles; namespace Mine2d.game.core.world; -public struct GenerationSettings { +public class GenerationSettings { public int xOffset { get; set; } public int yOffset { get; set; } public Tiles tile { get; set; } public int GetWeight(int height) { - return (int)((-Math.Pow(height - this.xOffset, 2)*0.01) + this.yOffset); + return (int)((-Math.Pow(height - this.xOffset, 2)*0.01) + this.yOffset + (32*10)); } } public class WorldGenerator { - List settings = new (); + private readonly List settings = new (); public WorldGenerator() { + this.settings.Add(new GenerationSettings { + xOffset = 10, + yOffset = 15, + tile = Tiles.IronOre + }); + this.settings.Add(new GenerationSettings { + xOffset = 15, + yOffset = 20, + tile = Tiles.CopperOre + }); + this.settings.Add(new GenerationSettings { + xOffset = 20, + yOffset = 10, + tile = Tiles.TinOre + }); + this.settings.Add(new GenerationSettings { + xOffset = 40, + yOffset = 3, + tile = Tiles.SilverOre + }); + this.settings.Add(new GenerationSettings { + xOffset = 40, + yOffset = 3, + tile = Tiles.GoldOre + }); this.settings.Add(new GenerationSettings { xOffset = 50, - yOffset = 16, - tile = Tiles.Stone + yOffset = 15, + tile = Tiles.LeadOre + }); + this.settings.Add(new GenerationSettings { + xOffset = 60, + yOffset = 2, + tile = Tiles.PlatinumOre + }); + this.settings.Add(new GenerationSettings { + xOffset = 60, + yOffset = 3, + tile = Tiles.CobaltOre + }); + this.settings.Add(new GenerationSettings { + xOffset = 65, + yOffset = 10, + tile = Tiles.TungstenOre + }); + this.settings.Add(new GenerationSettings { + xOffset = 90, + yOffset = 1, + tile = Tiles.DiamondOre + }); + this.settings.Add(new GenerationSettings { + xOffset = 94, + yOffset = 2, + tile = Tiles.UraniumOre }); } + + public Tiles GetRandomOreAt(int height) { + var random = new Random(); + var weight = random.Next(0, 4000); + var ore = this.settings.FirstOrDefault(x => x.GetWeight(height) > weight, null); + if(ore == null) { + return Tiles.Stone; + } + return ore.tile; + } } \ No newline at end of file diff --git a/Mine2d/game/frontend/events/Exit.cs b/Mine2d/game/frontend/events/Exit.cs index 4a84a10..5a109ee 100644 --- a/Mine2d/game/frontend/events/Exit.cs +++ b/Mine2d/game/frontend/events/Exit.cs @@ -14,9 +14,9 @@ public class Exit [EventListener(EventType.KeyDown)] public static void OnKeyDown(SDL_Event e) { - if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_ESCAPE) - { - Environment.Exit(0); - } + // if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_ESCAPE) + // { + // Environment.Exit(0); + // } } } diff --git a/Mine2d/game/frontend/events/InventoryInput.cs b/Mine2d/game/frontend/events/InventoryInput.cs index f54f1e2..43156d0 100644 --- a/Mine2d/game/frontend/events/InventoryInput.cs +++ b/Mine2d/game/frontend/events/InventoryInput.cs @@ -47,12 +47,16 @@ public class InventoryInput var frontendGameState = Context.Get().FrontendGameState; if(e.key.keysym.sym == SDL_Keycode.SDLK_TAB) { - if(frontendGameState.OpenInventory != InventoryKind.Player) { + if(frontendGameState.OpenInventory == InventoryKind.None) { frontendGameState.OpenInventory = InventoryKind.Player; } else { frontendGameState.OpenInventory = InventoryKind.None; } } + if(e.key.keysym.sym == SDL_Keycode.SDLK_ESCAPE) + { + frontendGameState.OpenInventory = InventoryKind.None; + } if(frontendGameState.OpenInventory != InventoryKind.None) { throw new CancelEventException(); diff --git a/Mine2d/game/frontend/inventory/InventoryRegistry.cs b/Mine2d/game/frontend/inventory/InventoryRegistry.cs index 1ed482e..0a68343 100644 --- a/Mine2d/game/frontend/inventory/InventoryRegistry.cs +++ b/Mine2d/game/frontend/inventory/InventoryRegistry.cs @@ -9,6 +9,7 @@ public class InventoryRegistry public InventoryRegistry() { this.inventoryRenderers.Add(InventoryKind.Player, new PlayerInventoryRenderer()); + this.inventoryRenderers.Add(InventoryKind.Workbench, new WorkbenchInventory()); } public Inventory GetInventory(InventoryKind inventory) diff --git a/Mine2d/game/frontend/inventory/WorkbenchInventory.cs b/Mine2d/game/frontend/inventory/WorkbenchInventory.cs new file mode 100644 index 0000000..a2a34bc --- /dev/null +++ b/Mine2d/game/frontend/inventory/WorkbenchInventory.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Mine2d.game.frontend.inventory; + +public class WorkbenchInventory : Inventory +{ + private IntPtr texture = IntPtr.Zero; + public override void Render() + { + var ctx = Context.Get(); + if (this.texture == IntPtr.Zero) + { + this.texture = ctx.TextureFactory.LoadTexture("hud.workbench-inventory"); + } + var (width, height) = ctx.Renderer.GetTextureSize(this.texture); + var (windowWidth, windowHeight) = (ctx.FrontendGameState.WindowWidth, ctx.FrontendGameState.WindowHeight); + var x = (windowWidth - width) / 2; + var y = (windowHeight - height) / 2; + var uiScale = ctx.FrontendGameState.Settings.UiScale; + ctx.Renderer.DrawTexture(this.texture, x, y, width * uiScale, height * uiScale); + } +} \ No newline at end of file diff --git a/Mine2d/game/state/FrontendGameState.cs b/Mine2d/game/state/FrontendGameState.cs index 06d30da..5bbb1ad 100644 --- a/Mine2d/game/state/FrontendGameState.cs +++ b/Mine2d/game/state/FrontendGameState.cs @@ -4,7 +4,8 @@ namespace Mine2d.game.state; public enum InventoryKind { None, - Player + Player, + Workbench } public class FrontendGameState