diff --git a/.gitignore b/.gitignore
index fa6f4c7..fea8d3f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
.config/
.vscode/
-**/bin/
-**/obj/
\ No newline at end of file
+src/bin
+src/**/obj
\ No newline at end of file
diff --git a/Content/Content.mgcb b/Content/Content.mgcb
deleted file mode 100644
index 15f5d4e..0000000
--- a/Content/Content.mgcb
+++ /dev/null
@@ -1,30 +0,0 @@
-
-#----------------------------- Global Properties ----------------------------#
-
-/outputDir:bin/$(Platform)
-/intermediateDir:obj/$(Platform)
-/platform:DesktopGL
-/config:
-/profile:Reach
-/compress:False
-
-#-------------------------------- References --------------------------------#
-
-
-#---------------------------------- Content ---------------------------------#
-
-#begin images/atlas-definition.xml
-/copy:images/atlas-definition.xml
-
-#begin images/atlas.png
-/importer:TextureImporter
-/processor:TextureProcessor
-/processorParam:ColorKeyColor=255,0,255,255
-/processorParam:ColorKeyEnabled=True
-/processorParam:GenerateMipmaps=False
-/processorParam:PremultiplyAlpha=True
-/processorParam:ResizeToPowerOfTwo=False
-/processorParam:MakeSquare=False
-/processorParam:TextureFormat=Color
-/build:images/atlas.png
-
diff --git a/Content/images/atlas-definition.xml b/Content/images/atlas-definition.xml
deleted file mode 100755
index 4002841..0000000
--- a/Content/images/atlas-definition.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
- images/atlas
-
-
-
-
diff --git a/Content/images/atlas.kra b/Content/images/atlas.kra
deleted file mode 100644
index 32e204d..0000000
Binary files a/Content/images/atlas.kra and /dev/null differ
diff --git a/Content/images/atlas.png b/Content/images/atlas.png
deleted file mode 100644
index 02346da..0000000
Binary files a/Content/images/atlas.png and /dev/null differ
diff --git a/Game1.cs b/Game1.cs
deleted file mode 100644
index 2715c9e..0000000
--- a/Game1.cs
+++ /dev/null
@@ -1,140 +0,0 @@
-using System;
-using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Graphics;
-using Microsoft.Xna.Framework.Input;
-
-using MonoGameLibrary;
-using MonoGameLibrary.Graphics;
-
-// using tunnet.World;
-
-namespace tunnet;
-
-public class Game1 : Core
-{
- // private World.Map _world;
- // private Texture2D _logo;
-
- public Game1() : base("Tunnet but not", 1280, 720, fullScreen: false)
- {
- // Content.RootDirectory = "Content";
- // IsMouseVisible = true;
- }
-
- protected override void Initialize()
- {
- // TODO: Add your initialization logic here
- // _world = new World.Map(mapId: 0);
- // _world.LoadMap();
- //
-
- base.Initialize();
- }
-
- private Sprite _404;
- // private AnimatedSprite _animatedSprite;
- protected override void LoadContent()
- {
- TextureAtlas atlas = TextureAtlas.FromFile(Content, "images/atlas-definition.xml");
-
- _404 = atlas.CreateSprite("404");
- // _animatedSprite = atlas.CreateAnimatedSprite("404");
- }
-
- private const int _CAMERA_SPEED = 5;
- Viewport _cameraPosition;
- Point _mousePosition;
- protected override void Update(GameTime gameTime)
- {
- if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
- Exit();
-
- // TODO: Add your update logic here
-
- // Animations
- // _animatedSprite.Update(gameTime);
-
- // Inputs
- // https://docs.monogame.net/articles/tutorials/building_2d_games/10_handling_input/
-
- if (_cameraPosition.Equals(new Viewport())) _cameraPosition = GraphicsDevice.Viewport;
-
- CheckKeyboardInput();
- CheckMouseInput();
-
- base.Update(gameTime);
- }
- private void CheckKeyboardInput()
- {
- // Get the state of keyboard input
- KeyboardState keyboardState = Keyboard.GetState();
-
- // If the space key is held down, the movement speed increases by 1.5
- int speed = _CAMERA_SPEED;
- if (keyboardState.IsKeyDown(Keys.Space))
- {
- speed = (int)Math.Floor(speed * 1.5);
- }
- if (keyboardState.IsKeyDown(Keys.W) || keyboardState.IsKeyDown(Keys.Up))
- {
- _cameraPosition.Y += speed;
- }
- if (keyboardState.IsKeyDown(Keys.S) || keyboardState.IsKeyDown(Keys.Down))
- {
- _cameraPosition.Y -= speed;
- }
- if (keyboardState.IsKeyDown(Keys.A) || keyboardState.IsKeyDown(Keys.Left))
- {
- _cameraPosition.X += speed;
- }
- if (keyboardState.IsKeyDown(Keys.D) || keyboardState.IsKeyDown(Keys.Right))
- {
- _cameraPosition.X -= speed;
- }
- //
- GraphicsDevice.Viewport = _cameraPosition;
- }
- private void CheckMouseInput()
- {
- // Get the state of mouse input
- MouseState mouseState = Mouse.GetState();
-
- //Move camera with right mouse button
- if (mouseState.RightButton == ButtonState.Pressed)
- {
- _mousePosition -= mouseState.Position; // delta
-
- _cameraPosition!.X = _cameraPosition.X - _mousePosition.X;
- _cameraPosition.Y = _cameraPosition.Y - _mousePosition.Y;
- }
- //
- GraphicsDevice.Viewport = _cameraPosition;
- _mousePosition = mouseState.Position; // here because of wasd breaking it
- }
-
- protected override void Draw(GameTime gameTime)
- {
- GraphicsDevice.Clear(Color.CornflowerBlue);
-
- SpriteBatch.Begin(sortMode: SpriteSortMode.Deferred);
-
- // World.Map.Draw draw = new World.Map.Draw(in _spriteBatch); //TODO: fix
- // _spriteBatch.Draw(_world._defaultTile, _world._defaultTile.Bounds.Center.ToVector2(), Color.White); //TODO: fix
-
- /// TODO: Draw
- /// 1. floor
- /// 2. wires
- /// 3. buildings
- /// 4. entities
- /// 5. walls
- ///
- /// MINIMIZE texture swaps
- /// MAXIMIZE drawRectangle usage per texture
-
- _404.Draw(SpriteBatch, Vector2.Zero);
-
- SpriteBatch.End();
- //
- base.Draw(gameTime);
- }
-}
diff --git a/World/World.cs b/World/World.cs
deleted file mode 100644
index 693b544..0000000
--- a/World/World.cs
+++ /dev/null
@@ -1,210 +0,0 @@
-// using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using Microsoft.Xna.Framework;
-// using Microsoft.Xna.Framework.Content;
-using Microsoft.Xna.Framework.Graphics;
-
-namespace tunnet.World;
-
-struct World
-{
- private class Tile // TODO: sprite, buildings[]
- {
- public int Id { get; }
- public Point point { get; }
-
- public Tile(int id) => Id = id;
- public static Tile FromId(int id)
- {
- return new Tile(id);
- }
- }
- private class Chunk
- {
- public const int Width = 32;
- public const int Height = 32;
- internal Tile[,] Tiles { get; private set; }
-
- public Chunk()
- {
- Tiles = new Tile[Width, Height];
- }
- }
- private static class ChunkStorage
- {
- ///
- /// Saves the given chunk to disk in a compact binary format:
- /// Width×Height consecutive Int32 tile IDs.
- ///
- public static void Save(string filePath, Chunk chunk)
- {
- if (chunk == null)
- throw new System.ArgumentNullException(nameof(chunk));
-
- Directory.CreateDirectory(Path.GetDirectoryName(filePath) ?? ".");
- using var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
- using var writer = new BinaryWriter(fs);
-
- for (int x = 0; x < Chunk.Width; x++)
- {
- for (int y = 0; y < Chunk.Height; y++)
- {
- // write each tile’s ID
- writer.Write(chunk.Tiles[x, y]?.Id ?? 0);
- }
- }
- }
- public static void Save(int chunkX, int chunkY, Chunk chunk)
- {
- Save($"{chunkX}_{chunkY}.chunk", chunk);
- }
-
- ///
- /// Loads a chunk from the binary file format produced by Save().
- ///
- public static Chunk Load(string filePath)
- {
- if (!File.Exists(filePath))
- throw new FileNotFoundException("Chunk file not found", filePath);
- //TODO generate chunk instead
-
- var chunk = new Chunk();
- using var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
- using var reader = new BinaryReader(fs);
-
- for (int x = 0; x < Chunk.Width; x++)
- for (int y = 0; y < Chunk.Height; y++)
- {
- int id = reader.ReadInt32();
- chunk.Tiles[x, y] = Tile.FromId(id);
- }
-
- return chunk;
- }
- public static Chunk Load(Point location)
- {
- var filePath = $"{location.X}_{location.Y}.chunk";
- if (File.Exists(filePath))
- return Load(filePath);
- return null;
- }
- }
- public class Map
- {
- private readonly Dictionary _loadedChunks = new Dictionary();
- private IReadOnlyDictionary Chunks => _loadedChunks;
- private Mutex _loadWait = new();
- private readonly int id;
- // private readonly int TileSize;
- // public Texture2D _defaultTile;
-
- public Map(int mapId)
- {
- id = mapId;
- // TileSize = 32;
- }
-
- // Load the map by ID
- public void LoadMap()
- {
- //TODO: Load map by ID
- }
-
- // Generate a new map
- private void GenerateMap()
- {
- //TODO: Implement map generation
- }
-
- // Get a chunk (load if not in memory)
- private Chunk GetChunk(Point location)
- {
- // var key = new Point(chunkX, chunkY);
- if (!_loadedChunks.TryGetValue(location, out Chunk chunk))
- {
- chunk = ChunkStorage.Load(location);// LoadChunkFromDisk(chunkX, chunkY); // Or generate
- _loadedChunks[location] = chunk;
- }
- return chunk;
- }
-
- // Access a specific tile
- private Tile GetTile(int worldX, int worldY)
- {
- int chunkX = worldX / Chunk.Width;
- int chunkY = worldY / Chunk.Height;
- int tileX = worldX % Chunk.Width;
- int tileY = worldY % Chunk.Height;
-
- // Handle negative coordinates
- if (tileX < 0) tileX += Chunk.Width;
- if (tileY < 0) tileY += Chunk.Height;
-
- return GetChunk(new Point(chunkX, chunkY)).Tiles[tileX, tileY];
- }
-
- // Unload distant chunks (memory management)
- public void UnloadChunks(Point currentChunk, int keepRadius)
- {
- var keysToRemove = new List();
- foreach (var key in _loadedChunks.Keys)
- {
- if (System.Math.Abs(key.X - currentChunk.X) > keepRadius ||
- System.Math.Abs(key.Y - currentChunk.Y) > keepRadius)
- {
- ChunkStorage.Save(key.X, key.Y, _loadedChunks[key]); // Persist if needed
- keysToRemove.Add(key);
- }
- }
- keysToRemove.ForEach(k => _loadedChunks.Remove(k));
- }
-
- /*public class Draw(in SpriteBatch spriteBatch)
- {
- private SpriteBatch spriteBatch = spriteBatch;
- }*/
-
- // private ref struct Draw
- // {
- // private ref SpriteBatch _spriteBatch;
- // public Draw(ref SpriteBatch spriteBatch)
- // {
- // _spriteBatch = ref spriteBatch;
- // }
- // }
-
- // private readonly IReadOnlyDictionary _chunks;
-
- /*public void Draw()
- {
- if (_chunks.Count == 0)
- {
- Console.WriteLine("No chunks loaded");
- return;
- }
- foreach (var kvp in _chunks)
- {
- Point chunkCoord = kvp.Key;
- // var chunk = kvp.Value;
-
- for (int cx = 0; cx < Chunk.Width; cx++)
- {
- for (int cy = 0; cy < Chunk.Height; cy++)
- {
- // world‐space position in pixels
- Vector2 pos = new Vector2(
- (chunkCoord.X * Chunk.Width + cx) * TileSize,
- (chunkCoord.Y * Chunk.Height + cy) * TileSize
- );
-
- // draw the default tile for now
- Console.WriteLine("Sprite location: ", pos);
- _spriteBatch.Draw(_defaultTile, pos, Color.White);
- }
- }
- }
- }*/
- }
-}
diff --git a/run.sh b/run.sh
index 47c536a..ef64ddd 100755
--- a/run.sh
+++ b/run.sh
@@ -1,4 +1,4 @@
#!/usr/bin/env bash
echo "Running..."
-exec dotnet run --no-build
+exec dotnet run --no-build --project src/
diff --git a/src/Content/Content.mgcb b/src/Content/Content.mgcb
new file mode 100644
index 0000000..ddc4c36
--- /dev/null
+++ b/src/Content/Content.mgcb
@@ -0,0 +1,15 @@
+
+#----------------------------- Global Properties ----------------------------#
+
+/outputDir:bin/$(Platform)
+/intermediateDir:obj/$(Platform)
+/platform:DesktopGL
+/config:
+/profile:Reach
+/compress:False
+
+#-------------------------------- References --------------------------------#
+
+
+#---------------------------------- Content ---------------------------------#
+
diff --git a/src/Game1.cs b/src/Game1.cs
new file mode 100644
index 0000000..061b2b7
--- /dev/null
+++ b/src/Game1.cs
@@ -0,0 +1,51 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Input;
+
+namespace tunnet;
+
+public class Game1 : Game
+{
+ private GraphicsDeviceManager _graphics;
+ private SpriteBatch _spriteBatch;
+
+ public Game1()
+ {
+ _graphics = new GraphicsDeviceManager(this);
+ Content.RootDirectory = "Content";
+ IsMouseVisible = true;
+ }
+
+ protected override void Initialize()
+ {
+ // TODO: Add your initialization logic here
+
+ base.Initialize();
+ }
+
+ protected override void LoadContent()
+ {
+ _spriteBatch = new SpriteBatch(GraphicsDevice);
+
+ // TODO: use this.Content to load your game content here
+ }
+
+ protected override void Update(GameTime gameTime)
+ {
+ if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
+ Exit();
+
+ // TODO: Add your update logic here
+
+ base.Update(gameTime);
+ }
+
+ protected override void Draw(GameTime gameTime)
+ {
+ GraphicsDevice.Clear(Color.CornflowerBlue);
+
+ // TODO: Add your drawing code here
+
+ base.Draw(gameTime);
+ }
+}
diff --git a/Icon.bmp b/src/Icon.bmp
similarity index 100%
rename from Icon.bmp
rename to src/Icon.bmp
diff --git a/Icon.ico b/src/Icon.ico
similarity index 100%
rename from Icon.ico
rename to src/Icon.ico
diff --git a/Program.cs b/src/Program.cs
similarity index 100%
rename from Program.cs
rename to src/Program.cs
diff --git a/app.manifest b/src/app.manifest
similarity index 100%
rename from app.manifest
rename to src/app.manifest
diff --git a/tunnet.csproj b/src/tunnet.csproj
similarity index 90%
rename from tunnet.csproj
rename to src/tunnet.csproj
index 3a77701..06680d2 100644
--- a/tunnet.csproj
+++ b/src/tunnet.csproj
@@ -5,7 +5,6 @@
Major
false
false
-
app.manifest
@@ -27,9 +26,6 @@
-
-
-
diff --git a/test b/test
new file mode 100644
index 0000000..9daeafb
--- /dev/null
+++ b/test
@@ -0,0 +1 @@
+test
diff --git a/tunnet.code-workspace b/tunnet.code-workspace
deleted file mode 100644
index de141ec..0000000
--- a/tunnet.code-workspace
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "folders": [
- {
- "path": "."
- },
- {
- "path": "../lib-bird"
- }
- ],
- "settings": {}
-}
\ No newline at end of file
diff --git a/tunnet.sln b/tunnet.sln
index e3c59bc..aa36c25 100644
--- a/tunnet.sln
+++ b/tunnet.sln
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tunnet", "tunnet.csproj", "{728D0B55-232F-4C2B-A31F-04EA4BFF4209}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tunnet", "src/tunnet.csproj", "{728D0B55-232F-4C2B-A31F-04EA4BFF4209}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution