diff --git a/AlienAttack.sln b/AlienAttack.sln
new file mode 100644
index 0000000..f5ab669
--- /dev/null
+++ b/AlienAttack.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.14.36301.6 d17.14
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AlienAttack.MonoGame", "AlientAttack.MonoGame\AlienAttack.MonoGame.csproj", "{BC3CF028-D58E-4F16-AC13-E4630A2A5B47}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {BC3CF028-D58E-4F16-AC13-E4630A2A5B47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BC3CF028-D58E-4F16-AC13-E4630A2A5B47}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BC3CF028-D58E-4F16-AC13-E4630A2A5B47}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BC3CF028-D58E-4F16-AC13-E4630A2A5B47}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {DA3D7BFD-2DB6-4F8A-B9B8-9C563E931D2C}
+ EndGlobalSection
+EndGlobal
diff --git a/AlientAttack.MonoGame/.config/dotnet-tools.json b/AlientAttack.MonoGame/.config/dotnet-tools.json
new file mode 100644
index 0000000..fbedee1
--- /dev/null
+++ b/AlientAttack.MonoGame/.config/dotnet-tools.json
@@ -0,0 +1,36 @@
+{
+ "version": 1,
+ "isRoot": true,
+ "tools": {
+ "dotnet-mgcb": {
+ "version": "3.8.4",
+ "commands": [
+ "mgcb"
+ ]
+ },
+ "dotnet-mgcb-editor": {
+ "version": "3.8.4",
+ "commands": [
+ "mgcb-editor"
+ ]
+ },
+ "dotnet-mgcb-editor-linux": {
+ "version": "3.8.4",
+ "commands": [
+ "mgcb-editor-linux"
+ ]
+ },
+ "dotnet-mgcb-editor-windows": {
+ "version": "3.8.4",
+ "commands": [
+ "mgcb-editor-windows"
+ ]
+ },
+ "dotnet-mgcb-editor-mac": {
+ "version": "3.8.4",
+ "commands": [
+ "mgcb-editor-mac"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/.vscode/launch.json b/AlientAttack.MonoGame/.vscode/launch.json
new file mode 100644
index 0000000..d607e52
--- /dev/null
+++ b/AlientAttack.MonoGame/.vscode/launch.json
@@ -0,0 +1,14 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "C#: AlientAttack.MonoGame Debug",
+ "type": "dotnet",
+ "request": "launch",
+ "projectPath": "${workspaceFolder}/AlientAttack.MonoGame.csproj"
+ }
+ ],
+ }
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/AlienAttack.MonoGame.csproj b/AlientAttack.MonoGame/AlienAttack.MonoGame.csproj
new file mode 100644
index 0000000..9209ee9
--- /dev/null
+++ b/AlientAttack.MonoGame/AlienAttack.MonoGame.csproj
@@ -0,0 +1,33 @@
+
+
+ WinExe
+ net8.0
+ Major
+ false
+ false
+
+
+ app.manifest
+ Icon.ico
+
+
+
+
+
+
+
+ Icon.ico
+
+
+ Icon.bmp
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/AlienAttackGame.cs b/AlientAttack.MonoGame/AlienAttackGame.cs
new file mode 100644
index 0000000..31bfb96
--- /dev/null
+++ b/AlientAttack.MonoGame/AlienAttackGame.cs
@@ -0,0 +1,93 @@
+using AlienAttack.MonoGame.GameLoops;
+using AlienAttack.MonoGame.View;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Input;
+using System;
+using System.Runtime.InteropServices;
+
+namespace AlienAttack.MonoGame;
+
+public class AlienAttackGame : Game
+{
+ private readonly GraphicsDeviceManager _graphics;
+ private readonly ViewTransform _viewTransform;
+
+ private SpriteBatch _spriteBatch;
+ private GameLoop _gameLoop;
+
+ public SpriteBatch SpriteBatch => _spriteBatch;
+ public ViewTransform ViewTransform => _viewTransform;
+
+ private const string SDL = "SDL2.dll";
+
+ [DllImport(SDL, CallingConvention = CallingConvention.Cdecl)]
+ public static extern void SDL_MaximizeWindow(IntPtr window);
+
+ public AlienAttackGame()
+ {
+ _graphics = new GraphicsDeviceManager(this);
+ _viewTransform = new(this, _graphics);
+ Content.RootDirectory = "Content";
+ IsMouseVisible = true;
+ }
+
+ protected override void Initialize()
+ {
+ // TODO: Add your initialization logic here
+ ConfigureWindow();
+ SetResolution();
+
+ IsFixedTimeStep = true; //Force the game to update at fixed time intervals
+ TargetElapsedTime = TimeSpan.FromSeconds(1 / 120.0f); //Se
+
+ base.Initialize();
+
+ MaximizeWindow();
+ }
+
+ private void ConfigureWindow()
+ {
+ Window.AllowUserResizing = true;
+ }
+
+ private void SetResolution()
+ {
+ _graphics.PreferredBackBufferWidth = 1280;
+ _graphics.PreferredBackBufferHeight = 720;
+ _graphics.ApplyChanges();
+ }
+
+ private void MaximizeWindow()
+ {
+ SDL_MaximizeWindow(Window.Handle);
+ }
+
+ protected override void LoadContent()
+ {
+ _spriteBatch = new SpriteBatch(GraphicsDevice);
+ _gameLoop = new GameLoop(this);
+ // 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
+ _gameLoop.Update(gameTime);
+
+ base.Update(gameTime);
+ }
+
+ protected override void Draw(GameTime gameTime)
+ {
+ GraphicsDevice.Clear(Color.Black);
+
+ // TODO: Add your drawing code here
+ _gameLoop.Draw();
+
+ base.Draw(gameTime);
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Content/Background/PixelBackgroundSeamless.png b/AlientAttack.MonoGame/Content/Background/PixelBackgroundSeamless.png
new file mode 100644
index 0000000..3850166
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Background/PixelBackgroundSeamless.png differ
diff --git a/AlientAttack.MonoGame/Content/Background/PixelBackgroundSeamlessVertically.png b/AlientAttack.MonoGame/Content/Background/PixelBackgroundSeamlessVertically.png
new file mode 100644
index 0000000..0872d2a
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Background/PixelBackgroundSeamlessVertically.png differ
diff --git a/AlientAttack.MonoGame/Content/Content.mgcb b/AlientAttack.MonoGame/Content/Content.mgcb
new file mode 100644
index 0000000..0e5de6e
--- /dev/null
+++ b/AlientAttack.MonoGame/Content/Content.mgcb
@@ -0,0 +1,1275 @@
+
+#----------------------------- Global Properties ----------------------------#
+
+/outputDir:bin/$(Platform)
+/intermediateDir:obj/$(Platform)
+/platform:DesktopGL
+/config:
+/profile:Reach
+/compress:False
+
+#-------------------------------- References --------------------------------#
+
+
+#---------------------------------- Content ---------------------------------#
+
+#begin Background/PixelBackgroundSeamless.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:Background/PixelBackgroundSeamless.png
+
+#begin Background/PixelBackgroundSeamlessVertically.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:Background/PixelBackgroundSeamlessVertically.png
+
+#begin Sprites/Asteroid 01_png_processed.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:Sprites/Asteroid 01_png_processed.png
+
+#begin Sprites/Asteroid 02_png_processed.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:Sprites/Asteroid 02_png_processed.png
+
+#begin Sprites/Asteroid 03_png_processed.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:Sprites/Asteroid 03_png_processed.png
+
+#begin Sprites/Asteroid 04_png_processed.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:Sprites/Asteroid 04_png_processed.png
+
+#begin Sprites/Cover_Blue_png_processed.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:Sprites/Cover_Blue_png_processed.png
+
+#begin Sprites/Cover_Green_png_processed.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:Sprites/Cover_Green_png_processed.png
+
+#begin Sprites/Cover_Red_png_processed.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:Sprites/Cover_Red_png_processed.png
+
+#begin Sprites/Enemy01_Green_Frame_1_png_processed.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:Sprites/Enemy01_Green_Frame_1_png_processed.png
+
+#begin Sprites/Enemy01_Green_Frame_2_png_processed.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:Sprites/Enemy01_Green_Frame_2_png_processed.png
+
+#begin Sprites/Enemy01_Green_Frame_3_png_processed.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:Sprites/Enemy01_Green_Frame_3_png_processed.png
+
+#begin Sprites/Enemy01_Red_Frame_1_png_processed.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:Sprites/Enemy01_Red_Frame_1_png_processed.png
+
+#begin Sprites/Enemy01_Red_Frame_2_png_processed.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:Sprites/Enemy01_Red_Frame_2_png_processed.png
+
+#begin Sprites/Enemy01_Red_Frame_3_png_processed.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:Sprites/Enemy01_Red_Frame_3_png_processed.png
+
+#begin Sprites/Enemy01_Shadow_Frame_1_png_processed.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:Sprites/Enemy01_Shadow_Frame_1_png_processed.png
+
+#begin Sprites/Enemy01_Shadow_Frame_2_png_processed.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:Sprites/Enemy01_Shadow_Frame_2_png_processed.png
+
+#begin Sprites/Enemy01_Shadow_Frame_3_png_processed.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:Sprites/Enemy01_Shadow_Frame_3_png_processed.png
+
+#begin Sprites/Enemy01_Teal_Frame_1_png_processed.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:Sprites/Enemy01_Teal_Frame_1_png_processed.png
+
+#begin Sprites/Enemy01_Teal_Frame_2_png_processed.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:Sprites/Enemy01_Teal_Frame_2_png_processed.png
+
+#begin Sprites/Enemy01_Teal_Frame_3_png_processed.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:Sprites/Enemy01_Teal_Frame_3_png_processed.png
+
+#begin Sprites/Enemy02_Shadow_Frame_1_png_processed.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:Sprites/Enemy02_Shadow_Frame_1_png_processed.png
+
+#begin Sprites/Enemy02_Shadow_Frame_2_png_processed.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:Sprites/Enemy02_Shadow_Frame_2_png_processed.png
+
+#begin Sprites/Enemy02_Shadow_Frame_3_png_processed.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:Sprites/Enemy02_Shadow_Frame_3_png_processed.png
+
+#begin Sprites/Enemy02_Teal_Frame_1_png_processed.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:Sprites/Enemy02_Teal_Frame_1_png_processed.png
+
+#begin Sprites/Enemy02_Teal_Frame_2_png_processed.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:Sprites/Enemy02_Teal_Frame_2_png_processed.png
+
+#begin Sprites/Enemy02_Teal_Frame_3_png_processed.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:Sprites/Enemy02_Teal_Frame_3_png_processed.png
+
+#begin Sprites/Enemy02Green_Frame_1_png_processed.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:Sprites/Enemy02Green_Frame_1_png_processed.png
+
+#begin Sprites/Enemy02Green_Frame_2_png_processed.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:Sprites/Enemy02Green_Frame_2_png_processed.png
+
+#begin Sprites/Enemy02Green_Frame_3_png_processed.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:Sprites/Enemy02Green_Frame_3_png_processed.png
+
+#begin Sprites/Enemy02Red_Frame_1_png_processed.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:Sprites/Enemy02Red_Frame_1_png_processed.png
+
+#begin Sprites/Enemy02Red_Frame_2_png_processed.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:Sprites/Enemy02Red_Frame_2_png_processed.png
+
+#begin Sprites/Enemy02Red_Frame_3_png_processed.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:Sprites/Enemy02Red_Frame_3_png_processed.png
+
+#begin Sprites/Exhaust_Frame_01_png_processed.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:Sprites/Exhaust_Frame_01_png_processed.png
+
+#begin Sprites/Exhaust_Frame_02_png_processed.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:Sprites/Exhaust_Frame_02_png_processed.png
+
+#begin Sprites/Exhaust_Frame_03_png_processed.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:Sprites/Exhaust_Frame_03_png_processed.png
+
+#begin Sprites/Exhaust_Frame_04_png_processed.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:Sprites/Exhaust_Frame_04_png_processed.png
+
+#begin Sprites/Exhaust_Frame_05_png_processed.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:Sprites/Exhaust_Frame_05_png_processed.png
+
+#begin Sprites/Exhaust_Frame_06_png_processed.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:Sprites/Exhaust_Frame_06_png_processed.png
+
+#begin Sprites/Explosion01_Frame_01_png_processed.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:Sprites/Explosion01_Frame_01_png_processed.png
+
+#begin Sprites/Explosion01_Frame_02_png_processed.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:Sprites/Explosion01_Frame_02_png_processed.png
+
+#begin Sprites/Explosion01_Frame_03_png_processed.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:Sprites/Explosion01_Frame_03_png_processed.png
+
+#begin Sprites/Explosion01_Frame_04_png_processed.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:Sprites/Explosion01_Frame_04_png_processed.png
+
+#begin Sprites/Explosion01_Frame_05_png_processed.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:Sprites/Explosion01_Frame_05_png_processed.png
+
+#begin Sprites/Explosion01_Frame_06_png_processed.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:Sprites/Explosion01_Frame_06_png_processed.png
+
+#begin Sprites/Explosion01_Frame_07_png_processed.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:Sprites/Explosion01_Frame_07_png_processed.png
+
+#begin Sprites/Explosion01_Frame_08_png_processed.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:Sprites/Explosion01_Frame_08_png_processed.png
+
+#begin Sprites/Explosion01_Frame_09_png_processed.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:Sprites/Explosion01_Frame_09_png_processed.png
+
+#begin Sprites/Explosion02_Frame_01_png_processed.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:Sprites/Explosion02_Frame_01_png_processed.png
+
+#begin Sprites/Explosion02_Frame_02_png_processed.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:Sprites/Explosion02_Frame_02_png_processed.png
+
+#begin Sprites/Explosion02_Frame_03_png_processed.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:Sprites/Explosion02_Frame_03_png_processed.png
+
+#begin Sprites/Explosion02_Frame_04_png_processed.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:Sprites/Explosion02_Frame_04_png_processed.png
+
+#begin Sprites/Explosion02_Frame_05_png_processed.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:Sprites/Explosion02_Frame_05_png_processed.png
+
+#begin Sprites/Explosion02_Frame_06_png_processed.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:Sprites/Explosion02_Frame_06_png_processed.png
+
+#begin Sprites/Explosion02_Frame_07_png_processed.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:Sprites/Explosion02_Frame_07_png_processed.png
+
+#begin Sprites/Explosion02_Frame_08_png_processed.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:Sprites/Explosion02_Frame_08_png_processed.png
+
+#begin Sprites/Explosion02_Frame_09_png_processed.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:Sprites/Explosion02_Frame_09_png_processed.png
+
+#begin Sprites/GunTurret_ExampleGun_png_processed.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:Sprites/GunTurret_ExampleGun_png_processed.png
+
+#begin Sprites/GunTurret_Green_png_processed.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:Sprites/GunTurret_Green_png_processed.png
+
+#begin Sprites/GunTurret_Orange_png_processed.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:Sprites/GunTurret_Orange_png_processed.png
+
+#begin Sprites/GunTurret_Red_png_processed.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:Sprites/GunTurret_Red_png_processed.png
+
+#begin Sprites/GunTurret_Teal_png_processed.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:Sprites/GunTurret_Teal_png_processed.png
+
+#begin Sprites/GunTurretMount_png_processed.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:Sprites/GunTurretMount_png_processed.png
+
+#begin Sprites/Laser_Large_png_processed.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:Sprites/Laser_Large_png_processed.png
+
+#begin Sprites/Laser_Medium_png_processed.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:Sprites/Laser_Medium_png_processed.png
+
+#begin Sprites/Laser_Small_png_processed.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:Sprites/Laser_Small_png_processed.png
+
+#begin Sprites/Minigun_Large_png_processed.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:Sprites/Minigun_Large_png_processed.png;Sprites/Minigun_Large.png
+
+#begin Sprites/Minigun_Medium_png_processed.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:Sprites/Minigun_Medium_png_processed.png;Sprites/Minigun_Medium.png
+
+#begin Sprites/Minigun_Small_png_processed.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:Sprites/Minigun_Small_png_processed.png;Sprites/Minigun_Small.png
+
+#begin Sprites/Plasma_Large_png_processed.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:Sprites/Plasma_Large_png_processed.png
+
+#begin Sprites/Plasma_Medium_png_processed.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:Sprites/Plasma_Medium_png_processed.png
+
+#begin Sprites/Plasma_Small_png_processed.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:Sprites/Plasma_Small_png_processed.png
+
+#begin Sprites/Platform_01_png_processed.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:Sprites/Platform_01_png_processed.png
+
+#begin Sprites/Platform_02_png_processed.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:Sprites/Platform_02_png_processed.png
+
+#begin Sprites/Platform_03_png_processed.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:Sprites/Platform_03_png_processed.png
+
+#begin Sprites/Platform_04_png_processed.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:Sprites/Platform_04_png_processed.png
+
+#begin Sprites/Platform_Corner_NorthEast_png_processed.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:Sprites/Platform_Corner_NorthEast_png_processed.png
+
+#begin Sprites/Platform_Corner_NorthWest_png_processed.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:Sprites/Platform_Corner_NorthWest_png_processed.png
+
+#begin Sprites/Platform_Corner_png_processed.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:Sprites/Platform_Corner_png_processed.png
+
+#begin Sprites/Platform_Corner_SouthEast_png_processed.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:Sprites/Platform_Corner_SouthEast_png_processed.png
+
+#begin Sprites/Platform_Corner_SouthWest_png_processed.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:Sprites/Platform_Corner_SouthWest_png_processed.png
+
+#begin Sprites/Platform_Edge_png_processed.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:Sprites/Platform_Edge_png_processed.png
+
+#begin Sprites/PlatformCorner_NorthEast_png_processed.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:Sprites/PlatformCorner_NorthEast_png_processed.png
+
+#begin Sprites/PlatformCorner_NorthWest_png_processed.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:Sprites/PlatformCorner_NorthWest_png_processed.png
+
+#begin Sprites/PlatformCorner_SouthEast_png_processed.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:Sprites/PlatformCorner_SouthEast_png_processed.png
+
+#begin Sprites/PlatformCorner_SouthWest_png_processed.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:Sprites/PlatformCorner_SouthWest_png_processed.png
+
+#begin Sprites/PlayerBlue_Frame_01_png_processed.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:Sprites/PlayerBlue_Frame_01_png_processed.png;Sprites/PlayerBlue_Frame_01.png
+
+#begin Sprites/PlayerBlue_Frame_02_png_processed.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:Sprites/PlayerBlue_Frame_02_png_processed.png;Sprites/PlayerBlue_Frame_02.png
+
+#begin Sprites/PlayerBlue_Frame_03_png_processed.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:Sprites/PlayerBlue_Frame_03_png_processed.png;Sprites/PlayerBlue_Frame_03.png
+
+#begin Sprites/PlayerRed_Frame_01_png_processed.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:Sprites/PlayerRed_Frame_01_png_processed.png;Sprites/PlayerRed_Frame_01.png
+
+#begin Sprites/PlayerRed_Frame_02_png_processed.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:Sprites/PlayerRed_Frame_02_png_processed.png;Sprites/PlayerRed_Frame_02.png
+
+#begin Sprites/PlayerRed_Frame_03_png_processed.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:Sprites/PlayerRed_Frame_03_png_processed.png;Sprites/PlayerRed_Frame_03.png
+
+#begin Sprites/PlayerShadow_Frame_01_png_processed.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:Sprites/PlayerShadow_Frame_01_png_processed.png;Sprites/PlayerShadow_Frame_01.png
+
+#begin Sprites/PlayerShadow_Frame_02_png_processed.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:Sprites/PlayerShadow_Frame_02_png_processed.png;Sprites/PlayerShadow_Frame_02.png
+
+#begin Sprites/PlayerShadow_Frame_03_png_processed.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:Sprites/PlayerShadow_Frame_03_png_processed.png;Sprites/PlayerShadow_Frame_03.png
+
+#begin Sprites/Powerup_Ammo_png_processed.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:Sprites/Powerup_Ammo_png_processed.png;Sprites/Powerup_Ammo.png
+
+#begin Sprites/Powerup_Energy_png_processed.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:Sprites/Powerup_Energy_png_processed.png;Sprites/Powerup_Energy.png
+
+#begin Sprites/Powerup_Health_png_processed.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:Sprites/Powerup_Health_png_processed.png;Sprites/Powerup_Health.png
+
+#begin Sprites/Powerup_Rockets_png_processed.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:Sprites/Powerup_Rockets_png_processed.png;Sprites/Powerup_Rockets.png
+
+#begin Sprites/Powerup_Shadow_png_processed.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:Sprites/Powerup_Shadow_png_processed.png;Sprites/Powerup_Shadow.png
+
+#begin Sprites/Powerup_Shields_png_processed.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:Sprites/Powerup_Shields_png_processed.png;Sprites/Powerup_Shields.png
+
+#begin Sprites/Proton_Large_png_processed.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:Sprites/Proton_Large_png_processed.png
+
+#begin Sprites/Proton_Medium_png_processed.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:Sprites/Proton_Medium_png_processed.png
+
+#begin Sprites/Proton_Small_png_processed.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:Sprites/Proton_Small_png_processed.png
+
+#begin Sprites/Rotor_png_processed.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:Sprites/Rotor_png_processed.png
+
diff --git a/AlientAttack.MonoGame/Content/Sprites/Asteroid 01_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Asteroid 01_png_processed.png
new file mode 100644
index 0000000..9fd1246
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Asteroid 01_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Asteroid 02_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Asteroid 02_png_processed.png
new file mode 100644
index 0000000..97deca0
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Asteroid 02_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Asteroid 03_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Asteroid 03_png_processed.png
new file mode 100644
index 0000000..9195122
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Asteroid 03_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Asteroid 04_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Asteroid 04_png_processed.png
new file mode 100644
index 0000000..62a3de8
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Asteroid 04_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Cover_Blue_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Cover_Blue_png_processed.png
new file mode 100644
index 0000000..4f7edd4
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Cover_Blue_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Cover_Green_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Cover_Green_png_processed.png
new file mode 100644
index 0000000..aaac34b
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Cover_Green_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Cover_Red_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Cover_Red_png_processed.png
new file mode 100644
index 0000000..9d7ef36
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Cover_Red_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Green_Frame_1_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Green_Frame_1_png_processed.png
new file mode 100644
index 0000000..5149b1e
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Green_Frame_1_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Green_Frame_2_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Green_Frame_2_png_processed.png
new file mode 100644
index 0000000..46e79b6
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Green_Frame_2_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Green_Frame_3_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Green_Frame_3_png_processed.png
new file mode 100644
index 0000000..8095570
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Green_Frame_3_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Red_Frame_1_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Red_Frame_1_png_processed.png
new file mode 100644
index 0000000..1b6838c
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Red_Frame_1_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Red_Frame_2_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Red_Frame_2_png_processed.png
new file mode 100644
index 0000000..f3f006f
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Red_Frame_2_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Red_Frame_3_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Red_Frame_3_png_processed.png
new file mode 100644
index 0000000..8a71793
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Red_Frame_3_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Shadow_Frame_1_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Shadow_Frame_1_png_processed.png
new file mode 100644
index 0000000..bf32e52
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Shadow_Frame_1_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Shadow_Frame_2_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Shadow_Frame_2_png_processed.png
new file mode 100644
index 0000000..d51eb7d
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Shadow_Frame_2_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Shadow_Frame_3_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Shadow_Frame_3_png_processed.png
new file mode 100644
index 0000000..c038fe4
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Shadow_Frame_3_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Teal_Frame_1_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Teal_Frame_1_png_processed.png
new file mode 100644
index 0000000..7b84a1d
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Teal_Frame_1_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Teal_Frame_2_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Teal_Frame_2_png_processed.png
new file mode 100644
index 0000000..b2135ac
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Teal_Frame_2_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy01_Teal_Frame_3_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Teal_Frame_3_png_processed.png
new file mode 100644
index 0000000..ad8ad30
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy01_Teal_Frame_3_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02Green_Frame_1_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02Green_Frame_1_png_processed.png
new file mode 100644
index 0000000..488a3f5
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02Green_Frame_1_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02Green_Frame_2_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02Green_Frame_2_png_processed.png
new file mode 100644
index 0000000..c9f4c9d
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02Green_Frame_2_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02Green_Frame_3_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02Green_Frame_3_png_processed.png
new file mode 100644
index 0000000..6c0cc7f
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02Green_Frame_3_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02Red_Frame_1_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02Red_Frame_1_png_processed.png
new file mode 100644
index 0000000..8f08ea4
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02Red_Frame_1_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02Red_Frame_2_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02Red_Frame_2_png_processed.png
new file mode 100644
index 0000000..3b8d741
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02Red_Frame_2_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02Red_Frame_3_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02Red_Frame_3_png_processed.png
new file mode 100644
index 0000000..f0ddd6c
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02Red_Frame_3_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02_Shadow_Frame_1_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Shadow_Frame_1_png_processed.png
new file mode 100644
index 0000000..18e3e00
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Shadow_Frame_1_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02_Shadow_Frame_2_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Shadow_Frame_2_png_processed.png
new file mode 100644
index 0000000..f6ba535
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Shadow_Frame_2_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02_Shadow_Frame_3_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Shadow_Frame_3_png_processed.png
new file mode 100644
index 0000000..0b0f336
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Shadow_Frame_3_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02_Teal_Frame_1_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Teal_Frame_1_png_processed.png
new file mode 100644
index 0000000..848391a
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Teal_Frame_1_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02_Teal_Frame_2_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Teal_Frame_2_png_processed.png
new file mode 100644
index 0000000..353eb8c
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Teal_Frame_2_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Enemy02_Teal_Frame_3_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Teal_Frame_3_png_processed.png
new file mode 100644
index 0000000..f3b2ea9
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Enemy02_Teal_Frame_3_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_01_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_01_png_processed.png
new file mode 100644
index 0000000..7eb98b6
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_01_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_02_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_02_png_processed.png
new file mode 100644
index 0000000..97c7a40
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_02_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_03_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_03_png_processed.png
new file mode 100644
index 0000000..2803362
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_03_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_04_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_04_png_processed.png
new file mode 100644
index 0000000..d1fa409
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_04_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_05_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_05_png_processed.png
new file mode 100644
index 0000000..6c082bc
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_05_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_06_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_06_png_processed.png
new file mode 100644
index 0000000..e0fe990
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Exhaust_Frame_06_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_01_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_01_png_processed.png
new file mode 100644
index 0000000..5f69994
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_01_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_02_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_02_png_processed.png
new file mode 100644
index 0000000..190772f
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_02_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_03_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_03_png_processed.png
new file mode 100644
index 0000000..99f02e4
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_03_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_04_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_04_png_processed.png
new file mode 100644
index 0000000..3a2cada
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_04_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_05_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_05_png_processed.png
new file mode 100644
index 0000000..abf9a82
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_05_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_06_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_06_png_processed.png
new file mode 100644
index 0000000..cf8ebb1
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_06_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_07_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_07_png_processed.png
new file mode 100644
index 0000000..28ec59e
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_07_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_08_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_08_png_processed.png
new file mode 100644
index 0000000..f92856e
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_08_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_09_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_09_png_processed.png
new file mode 100644
index 0000000..a1cab72
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion01_Frame_09_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_01_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_01_png_processed.png
new file mode 100644
index 0000000..eaa0357
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_01_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_02_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_02_png_processed.png
new file mode 100644
index 0000000..77f4c27
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_02_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_03_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_03_png_processed.png
new file mode 100644
index 0000000..edadef5
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_03_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_04_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_04_png_processed.png
new file mode 100644
index 0000000..8183403
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_04_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_05_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_05_png_processed.png
new file mode 100644
index 0000000..73926f7
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_05_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_06_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_06_png_processed.png
new file mode 100644
index 0000000..b600788
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_06_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_07_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_07_png_processed.png
new file mode 100644
index 0000000..3462af3
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_07_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_08_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_08_png_processed.png
new file mode 100644
index 0000000..183eb97
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_08_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_09_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_09_png_processed.png
new file mode 100644
index 0000000..d5f0f6e
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Explosion02_Frame_09_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/GunTurretMount_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/GunTurretMount_png_processed.png
new file mode 100644
index 0000000..6f1a569
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/GunTurretMount_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/GunTurret_ExampleGun_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/GunTurret_ExampleGun_png_processed.png
new file mode 100644
index 0000000..80e37a7
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/GunTurret_ExampleGun_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/GunTurret_Green_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/GunTurret_Green_png_processed.png
new file mode 100644
index 0000000..d0598b2
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/GunTurret_Green_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/GunTurret_Orange_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/GunTurret_Orange_png_processed.png
new file mode 100644
index 0000000..2fcef8d
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/GunTurret_Orange_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/GunTurret_Red_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/GunTurret_Red_png_processed.png
new file mode 100644
index 0000000..1b4dabf
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/GunTurret_Red_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/GunTurret_Teal_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/GunTurret_Teal_png_processed.png
new file mode 100644
index 0000000..e26723d
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/GunTurret_Teal_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Laser_Large_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Laser_Large_png_processed.png
new file mode 100644
index 0000000..82b7775
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Laser_Large_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Laser_Medium_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Laser_Medium_png_processed.png
new file mode 100644
index 0000000..7534d3f
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Laser_Medium_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Laser_Small_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Laser_Small_png_processed.png
new file mode 100644
index 0000000..1e44768
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Laser_Small_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Minigun_Large_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Minigun_Large_png_processed.png
new file mode 100644
index 0000000..4ad9424
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Minigun_Large_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Minigun_Medium_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Minigun_Medium_png_processed.png
new file mode 100644
index 0000000..0e5130d
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Minigun_Medium_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Minigun_Small_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Minigun_Small_png_processed.png
new file mode 100644
index 0000000..3904f70
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Minigun_Small_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Plasma_Large_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Plasma_Large_png_processed.png
new file mode 100644
index 0000000..1445419
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Plasma_Large_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Plasma_Medium_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Plasma_Medium_png_processed.png
new file mode 100644
index 0000000..b99695d
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Plasma_Medium_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Plasma_Small_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Plasma_Small_png_processed.png
new file mode 100644
index 0000000..e54facb
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Plasma_Small_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_NorthEast_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_NorthEast_png_processed.png
new file mode 100644
index 0000000..bf33c9c
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_NorthEast_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_NorthWest_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_NorthWest_png_processed.png
new file mode 100644
index 0000000..61291a0
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_NorthWest_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_SouthEast_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_SouthEast_png_processed.png
new file mode 100644
index 0000000..343085c
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_SouthEast_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_SouthWest_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_SouthWest_png_processed.png
new file mode 100644
index 0000000..da77a18
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlatformCorner_SouthWest_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Platform_01_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Platform_01_png_processed.png
new file mode 100644
index 0000000..1b553be
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Platform_01_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Platform_02_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Platform_02_png_processed.png
new file mode 100644
index 0000000..a5505b2
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Platform_02_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Platform_03_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Platform_03_png_processed.png
new file mode 100644
index 0000000..9696e4f
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Platform_03_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Platform_04_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Platform_04_png_processed.png
new file mode 100644
index 0000000..f3104d9
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Platform_04_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_NorthEast_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_NorthEast_png_processed.png
new file mode 100644
index 0000000..6cbd110
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_NorthEast_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_NorthWest_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_NorthWest_png_processed.png
new file mode 100644
index 0000000..37edd96
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_NorthWest_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_SouthEast_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_SouthEast_png_processed.png
new file mode 100644
index 0000000..cf82fe3
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_SouthEast_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_SouthWest_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_SouthWest_png_processed.png
new file mode 100644
index 0000000..c54f915
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_SouthWest_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_png_processed.png
new file mode 100644
index 0000000..247ba12
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Platform_Corner_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Platform_Edge_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Platform_Edge_png_processed.png
new file mode 100644
index 0000000..058fcda
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Platform_Edge_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlayerBlue_Frame_01_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlayerBlue_Frame_01_png_processed.png
new file mode 100644
index 0000000..777b396
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlayerBlue_Frame_01_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlayerBlue_Frame_02_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlayerBlue_Frame_02_png_processed.png
new file mode 100644
index 0000000..0807e59
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlayerBlue_Frame_02_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlayerBlue_Frame_03_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlayerBlue_Frame_03_png_processed.png
new file mode 100644
index 0000000..c83cdb2
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlayerBlue_Frame_03_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlayerRed_Frame_01_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlayerRed_Frame_01_png_processed.png
new file mode 100644
index 0000000..2955536
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlayerRed_Frame_01_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlayerRed_Frame_02_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlayerRed_Frame_02_png_processed.png
new file mode 100644
index 0000000..a7d2e41
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlayerRed_Frame_02_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlayerRed_Frame_03_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlayerRed_Frame_03_png_processed.png
new file mode 100644
index 0000000..0d79762
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlayerRed_Frame_03_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlayerShadow_Frame_01_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlayerShadow_Frame_01_png_processed.png
new file mode 100644
index 0000000..6443bd4
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlayerShadow_Frame_01_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlayerShadow_Frame_02_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlayerShadow_Frame_02_png_processed.png
new file mode 100644
index 0000000..2b33091
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlayerShadow_Frame_02_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/PlayerShadow_Frame_03_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/PlayerShadow_Frame_03_png_processed.png
new file mode 100644
index 0000000..3d05ee6
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/PlayerShadow_Frame_03_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Powerup_Ammo_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Powerup_Ammo_png_processed.png
new file mode 100644
index 0000000..b217017
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Powerup_Ammo_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Powerup_Energy_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Powerup_Energy_png_processed.png
new file mode 100644
index 0000000..f4ac9c0
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Powerup_Energy_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Powerup_Health_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Powerup_Health_png_processed.png
new file mode 100644
index 0000000..578f1ca
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Powerup_Health_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Powerup_Rockets_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Powerup_Rockets_png_processed.png
new file mode 100644
index 0000000..19ee0ca
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Powerup_Rockets_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Powerup_Shadow_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Powerup_Shadow_png_processed.png
new file mode 100644
index 0000000..80de7a9
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Powerup_Shadow_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Powerup_Shields_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Powerup_Shields_png_processed.png
new file mode 100644
index 0000000..a3c9627
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Powerup_Shields_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Proton_Large_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Proton_Large_png_processed.png
new file mode 100644
index 0000000..7c69a33
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Proton_Large_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Proton_Medium_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Proton_Medium_png_processed.png
new file mode 100644
index 0000000..5a66196
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Proton_Medium_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Proton_Small_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Proton_Small_png_processed.png
new file mode 100644
index 0000000..41772d1
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Proton_Small_png_processed.png differ
diff --git a/AlientAttack.MonoGame/Content/Sprites/Rotor_png_processed.png b/AlientAttack.MonoGame/Content/Sprites/Rotor_png_processed.png
new file mode 100644
index 0000000..f58a80e
Binary files /dev/null and b/AlientAttack.MonoGame/Content/Sprites/Rotor_png_processed.png differ
diff --git a/AlientAttack.MonoGame/GameLoops/GameLoop.cs b/AlientAttack.MonoGame/GameLoops/GameLoop.cs
new file mode 100644
index 0000000..6f3d907
--- /dev/null
+++ b/AlientAttack.MonoGame/GameLoops/GameLoop.cs
@@ -0,0 +1,196 @@
+using AlienAttack.MonoGame.Things;
+using AlienAttack.MonoGame.Things.Enemies;
+using AlienAttack.MonoGame.Things.Stars;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace AlienAttack.MonoGame.GameLoops;
+
+internal class GameLoop : GameLoopBase
+{
+ private readonly List _spritesToAdd = [];
+ private readonly Random _random = new();
+
+ private int _spawnNewEnemyThreshold = 100;
+ private float _backgroundYOffset = 0;
+
+ private Starfield _starfield;
+ private Texture2D _pixel;
+
+ protected readonly List Sprites = [];
+
+ public GameLoop(AlienAttackGame game) : base(game)
+ {
+ InitializeStarField(game);
+ Sprites.Add(new Player(game.ViewTransform.ScreenWidth / 2 - 32, game.ViewTransform.ScreenHeight - 64));
+ }
+
+ private void InitializeStarField(AlienAttackGame game)
+ {
+ _starfield = new Starfield(seed: 42);
+
+ //// Far layer: many tiny, slow, faint
+ //_starfield.AddLayer(count: 450, speedPxPerSec: 20f, minSize: 1f, maxSize: 1.5f, minAlpha: 0.15f, maxAlpha: 0.35f);
+
+ //// Mid layer
+ //_starfield.AddLayer(count: 220, speedPxPerSec: 45f, minSize: 1.5f, maxSize: 2.2f, minAlpha: 0.25f, maxAlpha: 0.60f);
+
+ //// Near layer: fewer, bigger, faster, brighter
+ //_starfield.AddLayer(count: 90, speedPxPerSec: 85f, minSize: 2.0f, maxSize: 3.2f, minAlpha: 0.40f, maxAlpha: 0.90f);
+
+ _starfield.AddLayer(count: 450, velocityPxPerSec: new Vector2(+4f, 20f), minSize: 1f, maxSize: 1.5f, minAlpha: 0.15f, maxAlpha: 0.35f);
+ _starfield.AddLayer(count: 220, velocityPxPerSec: new Vector2(-10f, 45f), minSize: 1.5f, maxSize: 2.2f, minAlpha: 0.25f, maxAlpha: 0.60f);
+ _starfield.AddLayer(count: 90, velocityPxPerSec: new Vector2(+20f, 85f), minSize: 2.0f, maxSize: 3.2f, minAlpha: 0.40f, maxAlpha: 0.90f);
+
+
+ _pixel = new Texture2D(game.GraphicsDevice, 1, 1);
+ _pixel.SetData(new[] { Color.White });
+
+ _starfield.Initialize(ViewTransform.ScreenWidth, ViewTransform.ScreenHeight);
+ }
+
+ public override void OnDraw()
+ {
+ _starfield.Draw(SpriteBatch, _pixel);
+ //DrawBackground();
+ DrawSprites();
+ }
+
+ private void DrawBackground()
+ {
+ Texture2D backgroundTexture = Content.Load($@"Background\PixelBackgroundSeamlessVertically");
+ int blockCountY = (int)Math.Ceiling((decimal)ViewTransform.ScreenHeight / (decimal)backgroundTexture.Height);
+ int blockCountX = (int)Math.Ceiling((decimal)ViewTransform.ScreenWidth / (decimal)backgroundTexture.Width);
+
+ for (int y = 0; y < blockCountY; y++)
+ {
+ float startY = (y * backgroundTexture.Height) + _backgroundYOffset;
+ _backgroundYOffset = _backgroundYOffset + 0.25f;
+
+ if (_backgroundYOffset > ViewTransform.ScreenHeight)
+ {
+ _backgroundYOffset = 0;
+ }
+
+ for (int x = 0; x < blockCountX; x++)
+ {
+ int width = backgroundTexture.Width;
+
+ if (x * backgroundTexture.Width + backgroundTexture.Width > ViewTransform.ScreenWidth)
+ {
+ width = ViewTransform.ScreenWidth - (x * backgroundTexture.Width);
+ }
+
+ Vector2 position = new(x * backgroundTexture.Width, startY);
+ SpriteBatch.Draw(backgroundTexture, position, new Rectangle(new Point(x, y), new Point(width, backgroundTexture.Height)), Color.White);
+ }
+ }
+ }
+
+ private void DrawSprites()
+ {
+ SpriteDrawArgs args = new(Game);
+
+ foreach (Sprite sprite in Sprites)
+ {
+ sprite.Draw(args);
+ }
+ }
+
+ public override void OnUpdate(GameTime gameTime)
+ {
+ _starfield.Update(gameTime);
+ UpdateSprites(gameTime);
+ CheckSpriteCollisions();
+ ClearDeadSprites();
+ AddEnemySprites();
+ AddNewSprites();
+ }
+
+ private void UpdateSprites(GameTime gameTime)
+ {
+ SpriteUpdateContext args = new(Game)
+ {
+ Random = _random,
+ GameTime = gameTime,
+ SpawnSprite = _spritesToAdd.Add
+ };
+
+ foreach (Sprite sprite in Sprites)
+ {
+ sprite.Update(args);
+ }
+ }
+
+ private void CheckSpriteCollisions()
+ {
+ var collisionSprites = Sprites.Where(x => x.CanCollide).ToList();
+
+ foreach (var sprite in collisionSprites)
+ {
+ foreach (var otherSprite in collisionSprites.Where(x => x != sprite))
+ {
+ SpriteCollisionContext context = new(Game)
+ {
+ Sprite = otherSprite,
+ SpawnSprite = _spritesToAdd.Add
+ };
+
+ // TODO: If perfomed once; do not perform again
+ if (sprite.Intersects(otherSprite))
+ {
+ sprite.OnCollision(context);
+ }
+ }
+ }
+ }
+
+ private void ClearDeadSprites()
+ {
+ var deadSprites = Sprites.Where(x => x.IsDead).ToList();
+
+ foreach (var sprite in deadSprites)
+ {
+ Sprites.Remove(sprite);
+ }
+ }
+
+ private void AddNewSprites()
+ {
+ foreach (Sprite sprite in _spritesToAdd)
+ {
+ Sprites.Add(sprite);
+ }
+
+ _spritesToAdd.Clear();
+ }
+
+ private void AddEnemySprites()
+ {
+ if (_spawnNewEnemyThreshold > 0)
+ {
+ _spawnNewEnemyThreshold--;
+ }
+
+ if (_spawnNewEnemyThreshold == 0)
+ {
+ int randomNumber = _random.Next(0, 100);
+
+ if (randomNumber == 0)
+ {
+ Enemy enemy = new(_random.Next(0, ViewTransform.ScreenWidth - 64), -64);
+ Sprites.Add(enemy);
+ _spawnNewEnemyThreshold = 100 + _random.Next(0, 100);
+ }
+ else if (randomNumber == 1)
+ {
+ RedEnemy enemy = new(_random.Next(0, ViewTransform.ScreenWidth - 64), -64);
+ Sprites.Add(enemy);
+ _spawnNewEnemyThreshold = 100 + _random.Next(0, 100);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/GameLoops/GameLoopBase.cs b/AlientAttack.MonoGame/GameLoops/GameLoopBase.cs
new file mode 100644
index 0000000..44be08f
--- /dev/null
+++ b/AlientAttack.MonoGame/GameLoops/GameLoopBase.cs
@@ -0,0 +1,31 @@
+using AlienAttack.MonoGame.View;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Content;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace AlienAttack.MonoGame.GameLoops;
+
+internal abstract class GameLoopBase(AlienAttackGame game) : IGameLoop
+{
+ protected readonly AlienAttackGame Game = game;
+ protected readonly ContentManager Content = game.Content;
+ protected readonly SpriteBatch SpriteBatch = game.SpriteBatch;
+ protected readonly ViewTransform ViewTransform = game.ViewTransform;
+
+ public void Draw()
+ {
+ SpriteBatch.Begin(transformMatrix: ViewTransform.ViewMatrix);
+
+ OnDraw();
+
+ SpriteBatch.End();
+ }
+
+ public void Update(GameTime gameTime)
+ {
+ OnUpdate(gameTime);
+ }
+
+ public abstract void OnDraw();
+ public abstract void OnUpdate(GameTime gameTime);
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/GameLoops/IGameLoop.cs b/AlientAttack.MonoGame/GameLoops/IGameLoop.cs
new file mode 100644
index 0000000..a76ad85
--- /dev/null
+++ b/AlientAttack.MonoGame/GameLoops/IGameLoop.cs
@@ -0,0 +1,9 @@
+using Microsoft.Xna.Framework;
+
+namespace AlienAttack.MonoGame.GameLoops;
+
+internal interface IGameLoop
+{
+ void Draw();
+ void Update(GameTime gameTime);
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Icon.bmp b/AlientAttack.MonoGame/Icon.bmp
new file mode 100644
index 0000000..2b48165
Binary files /dev/null and b/AlientAttack.MonoGame/Icon.bmp differ
diff --git a/AlientAttack.MonoGame/Icon.ico b/AlientAttack.MonoGame/Icon.ico
new file mode 100644
index 0000000..7d9dec1
Binary files /dev/null and b/AlientAttack.MonoGame/Icon.ico differ
diff --git a/AlientAttack.MonoGame/Program.cs b/AlientAttack.MonoGame/Program.cs
new file mode 100644
index 0000000..c45e387
--- /dev/null
+++ b/AlientAttack.MonoGame/Program.cs
@@ -0,0 +1,2 @@
+using var game = new AlienAttack.MonoGame.AlienAttackGame();
+game.Run();
diff --git a/AlientAttack.MonoGame/Things/Bullets/Bullet.cs b/AlientAttack.MonoGame/Things/Bullets/Bullet.cs
new file mode 100644
index 0000000..f1e9446
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Bullets/Bullet.cs
@@ -0,0 +1,51 @@
+using AlienAttack.MonoGame.Things.Items;
+
+namespace AlienAttack.MonoGame.Things.Bullets;
+
+internal class Bullet(float x, float y, float xVel, float yVel, Sprite owner) : Sprite(x, y)
+{
+ protected float XVelocity = xVel;
+ protected float YVelocity = yVel;
+ public Sprite Owner { get; protected set; } = owner;
+ public int Damage { get; protected set; } = 0;
+
+ public override void Draw(SpriteDrawArgs args)
+ {
+ base.Draw(args);
+ }
+
+ public override void Update(SpriteUpdateContext context)
+ {
+ XPosition += XVelocity;
+ YPosition += YVelocity;
+
+ if (XPosition + BoundBox.Width < 0
+ || XPosition > context.ViewTransform.ScreenWidth
+ || YPosition + BoundBox.Height < 0
+ || YPosition > context.ViewTransform.ScreenHeight)
+ {
+ IsDead = true;
+ }
+
+ base.Update(context);
+ }
+
+ public override void OnCollision(SpriteCollisionContext context)
+ {
+ if (context.Sprite is Bullet || context.Sprite == Owner || context.Sprite is Item)
+ return;
+
+ IsDead = true;
+
+ float xVel = 0;
+ float yVel = 0;
+
+ if (context.Sprite is MoveableSprite moveableSprite)
+ {
+ xVel = moveableSprite.XVelocity;
+ yVel = moveableSprite.YVelocity;
+ }
+
+ context.SpawnSprite(new MiniExplosion((int)XPosition, (int)YPosition, xVel, yVel));
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Bullets/MinigunBulletSmall.cs b/AlientAttack.MonoGame/Things/Bullets/MinigunBulletSmall.cs
new file mode 100644
index 0000000..62e3164
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Bullets/MinigunBulletSmall.cs
@@ -0,0 +1,26 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+
+namespace AlienAttack.MonoGame.Things.Bullets;
+
+internal class MinigunBulletSmall : Bullet
+{
+ public MinigunBulletSmall(float x, float y, float xVel, float yVel, Sprite owner) : base(x, y, xVel, yVel, owner)
+ {
+ XVelocity = xVel;
+ YVelocity = yVel;
+ Owner = owner;
+ Damage = 1;
+ }
+
+ public override void Draw(SpriteDrawArgs args)
+ {
+ Texture2D texture = args.Content.Load(@$"Sprites\Minigun_Small");
+
+ float rotation = MathF.Atan2(YVelocity, XVelocity) + MathF.PI / 2f;
+ Vector2 origin = new(texture.Width / 2f, texture.Height / 2f);
+
+ args.SpriteBatch.Draw(texture, Position, null, DrawColor, rotation, origin, 1f, SpriteEffects.None, 1);
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Enemies/Enemy.cs b/AlientAttack.MonoGame/Things/Enemies/Enemy.cs
new file mode 100644
index 0000000..5af8591
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Enemies/Enemy.cs
@@ -0,0 +1,117 @@
+using AlienAttack.MonoGame.Things.Bullets;
+using AlienAttack.MonoGame.Things.Items;
+using AlienAttack.MonoGame.Things.Weapons;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Input;
+using System;
+using System.Collections.Generic;
+
+namespace AlienAttack.MonoGame.Things.Enemies;
+
+internal class Enemy : MoveableSprite
+{
+ //Enemy01_Green_Frame_1_png_processed
+
+ protected ICollection ActiveWeapons = [];
+ protected int FireThreshold => 20;
+ protected int CurrentFireThreshold { get; set; } = 20;
+ protected int Health { get; set; } = 5;
+
+ public Enemy(int x, int y) : base(x, y)
+ {
+ BoundBox = new Rectangle(0, 0, 64, 64);
+ YVelocity = 1;
+ ActiveWeapons.Add(new Minigun());
+ //ActiveWeapons.Add(new FastMinigun());
+ }
+
+ public override void Draw(SpriteDrawArgs args)
+ {
+ Texture2D texture = args.Content.Load(@$"Sprites\Enemy01_Green_Frame_1_png_processed");
+ SpriteEffects spriteEffects = SpriteEffects.None;
+
+ args.SpriteBatch.Draw(texture, Position, null, DrawColor, 0, new Vector2(0, 0), 1, spriteEffects, 1);
+
+ base.Draw(args);
+ }
+
+ public override void Update(SpriteUpdateContext context)
+ {
+ //YPosition += 1;
+
+ if (Health <= 0)
+ {
+ IsDead = true;
+ context.SpawnSprite(new Explosion((int)XPosition, (int)YPosition, XVelocity, YVelocity));
+
+ switch (context.Random.Next(0, 4))
+ {
+ case 0:
+ context.SpawnSprite(new Health((int)XPosition, (int)YPosition));
+ break;
+ case 1:
+ context.SpawnSprite(new Shields((int)XPosition, (int)YPosition));
+ break;
+ case 2:
+ context.SpawnSprite(new Ammo((int)XPosition, (int)YPosition));
+ break;
+ case 3:
+ context.SpawnSprite(new Energy((int)XPosition, (int)YPosition));
+ break;
+ case 4:
+ context.SpawnSprite(new Rockets((int)XPosition, (int)YPosition));
+ break;
+ }
+
+ return;
+ }
+
+ if (YPosition > context.ViewTransform.ScreenHeight)
+ {
+ IsDead = true;
+ return;
+ }
+
+ if (CurrentFireThreshold > 0)
+ {
+ CurrentFireThreshold--;
+ }
+
+ if (CurrentFireThreshold == 0 && context.Random.Next(0, 100) == 1)
+ {
+ float originX = XPosition + (BoundBox.Width / 2) - (7 / 2);
+
+ context.SpawnSprite(new MinigunBulletSmall(originX - 9, YPosition + BoundBox.Height - 12, 0, 2 + YVelocity, this));
+ context.SpawnSprite(new MinigunBulletSmall(originX + 14, YPosition + BoundBox.Height - 12, 0, 2 + YVelocity, this));
+
+ CurrentFireThreshold = FireThreshold;
+ }
+
+ //CheckMove(context);
+ CheckFire(context);
+
+ base.Update(context);
+ }
+
+ private void CheckFire(SpriteUpdateContext context)
+ {
+ //foreach (IWeapon weapon in ActiveWeapons)
+ //{
+ // weapon.UpdateFireThreshold();
+ //}
+
+ //foreach (IWeapon weapon in ActiveWeapons)
+ //{
+ // weapon.TryFire(this, context);
+ //}
+ }
+
+ public override void OnCollision(SpriteCollisionContext context)
+ {
+ if (context.Sprite is Bullet bullet && bullet.Owner is Player)
+ {
+ Health -= bullet.Damage;
+ }
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Enemies/RedEnemy.cs b/AlientAttack.MonoGame/Things/Enemies/RedEnemy.cs
new file mode 100644
index 0000000..f0adefd
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Enemies/RedEnemy.cs
@@ -0,0 +1,76 @@
+using AlienAttack.MonoGame.Things.Bullets;
+using AlienAttack.MonoGame.Things.Weapons;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Input;
+
+namespace AlienAttack.MonoGame.Things.Enemies;
+
+internal class RedEnemy : MoveableSprite
+{
+ //Enemy01_Green_Frame_1_png_processed
+
+ protected int Health { get; set; } = 10;
+
+ public RedEnemy(int x, int y) : base(x, y)
+ {
+ BoundBox = new Rectangle(0, 0, 64, 64);
+ YVelocity = 2;
+ //ActiveWeapons.Add(new Minigun());
+ //ActiveWeapons.Add(new FastMinigun());
+ }
+
+ public override void Draw(SpriteDrawArgs args)
+ {
+ Texture2D texture = args.Content.Load(@$"Sprites\Enemy01_Red_Frame_1_png_processed");
+ SpriteEffects spriteEffects = SpriteEffects.None;
+
+ args.SpriteBatch.Draw(texture, Position, null, DrawColor, 0, new Vector2(0, 0), 1, spriteEffects, 1);
+
+ base.Draw(args);
+ }
+
+ public override void Update(SpriteUpdateContext context)
+ {
+ //YPosition += 2;
+
+ if (Health <= 0)
+ {
+ IsDead = true;
+ context.SpawnSprite(new Explosion((int)XPosition, (int)YPosition, XVelocity, YVelocity));
+ return;
+ }
+
+ if (YPosition > context.ViewTransform.ScreenHeight)
+ {
+ IsDead = true;
+ return;
+ }
+
+ //CheckMove(context);
+ CheckFire(context);
+
+ base.Update(context);
+ }
+
+ private void CheckFire(SpriteUpdateContext context)
+ {
+ //foreach (IWeapon weapon in ActiveWeapons)
+ //{
+ // weapon.UpdateFireThreshold();
+ //}
+
+ //foreach (IWeapon weapon in ActiveWeapons)
+ //{
+ // weapon.TryFire(this, context);
+ //}
+ }
+
+ public override void OnCollision(SpriteCollisionContext context)
+ {
+ if (context.Sprite is Bullet bullet && bullet.Owner is Player)
+ {
+ Health -= bullet.Damage;
+ }
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Explosion.cs b/AlientAttack.MonoGame/Things/Explosion.cs
new file mode 100644
index 0000000..620f906
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Explosion.cs
@@ -0,0 +1,44 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace AlienAttack.MonoGame.Things;
+
+internal class Explosion(int x, int y, float xVel, float yVel) : Sprite(x, y)
+{
+ protected int CurrentFrame { get; private set; } = 1;
+ protected int MaxFrames => 9;
+ protected int AnimationThreshold => 3; //5;
+ protected int CurrentThreshold { get; private set; } = 5;
+
+ public override void Draw(SpriteDrawArgs args)
+ {
+ Texture2D texture = args.Content.Load(@$"Sprites\Explosion01_Frame_0{CurrentFrame}_png_processed");
+ args.SpriteBatch.Draw(texture, Position, null, DrawColor, 0, new Vector2(0, 0), 1f, SpriteEffects.None, 1);
+
+ base.Draw(args);
+ }
+
+ public override void Update(SpriteUpdateContext context)
+ {
+ base.Update(context);
+
+ XPosition += xVel;
+ YPosition += yVel;
+
+ if (CurrentThreshold > 0)
+ {
+ CurrentThreshold--;
+ }
+ else
+ {
+ if (CurrentFrame == MaxFrames)
+ {
+ IsDead = true;
+ return;
+ }
+
+ CurrentFrame++;
+ CurrentThreshold = AnimationThreshold;
+ }
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Items/Ammo.cs b/AlientAttack.MonoGame/Things/Items/Ammo.cs
new file mode 100644
index 0000000..5e6cab9
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Items/Ammo.cs
@@ -0,0 +1,14 @@
+namespace AlienAttack.MonoGame.Things.Items;
+
+internal class Ammo : Item
+{
+ public Ammo(int x, int y) : base(x, y)
+ {
+ TextureName = @$"Sprites\Powerup_Ammo";
+ }
+
+ protected override void ApplyEffect(Player player)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Items/Energy.cs b/AlientAttack.MonoGame/Things/Items/Energy.cs
new file mode 100644
index 0000000..9a922e8
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Items/Energy.cs
@@ -0,0 +1,14 @@
+namespace AlienAttack.MonoGame.Things.Items;
+
+internal class Energy : Item
+{
+ public Energy(int x, int y) : base(x, y)
+ {
+ TextureName = @$"Sprites\Powerup_Energy";
+ }
+
+ protected override void ApplyEffect(Player player)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Items/Health.cs b/AlientAttack.MonoGame/Things/Items/Health.cs
new file mode 100644
index 0000000..8d42d23
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Items/Health.cs
@@ -0,0 +1,14 @@
+namespace AlienAttack.MonoGame.Things.Items;
+
+internal class Health : Item
+{
+ public Health(int x, int y) : base(x, y)
+ {
+ TextureName = @$"Sprites\Powerup_Health";
+ }
+
+ protected override void ApplyEffect(Player player)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Items/Item.cs b/AlientAttack.MonoGame/Things/Items/Item.cs
new file mode 100644
index 0000000..51a377f
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Items/Item.cs
@@ -0,0 +1,68 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+
+namespace AlienAttack.MonoGame.Things.Items;
+
+internal abstract class Item : MoveableSprite
+{
+ private Vector2 _anchor; // the "center" the item orbits around
+ private float _t; // radians
+ private float _radius = 6f; // pixels (small circle)
+ private float _omega = 2.2f; // radians/sec (speed of orbit)
+ private float _scale = 1f;
+
+ protected string? TextureName;
+
+ public Item(int x, int y) : base(x, y)
+ {
+ YVelocity = .5f;
+ BoundBox = new Rectangle(0, 0, 48, 29);
+
+ _anchor = new Vector2(x, y);
+ }
+
+ public override void Draw(SpriteDrawArgs args)
+ {
+ if (TextureName is null)
+ return;
+
+ Texture2D texture = args.Content.Load(TextureName);
+
+ args.SpriteBatch.Draw(texture, Position, null, DrawColor, 0, new Vector2(0, 0), _scale, SpriteEffects.None, 1);
+ }
+
+ public override void Update(SpriteUpdateContext context)
+ {
+ // Move the anchor using your normal velocities (downward drift)
+ _anchor.Y += YVelocity;
+ _anchor.X += XVelocity;
+
+ // Advance time smoothly (use dt; if you don't have it yet, see note below)
+ float dt = (float)context.GameTime.ElapsedGameTime.TotalSeconds;
+ _t += _omega * dt;
+
+ // Apply circular offset around the anchor
+ XPosition = _anchor.X + MathF.Cos(_t) * _radius;
+ YPosition = _anchor.Y + MathF.Sin(_t) * _radius;
+
+ if (YPosition > context.ViewTransform.ScreenHeight)
+ {
+ IsDead = true;
+ return;
+ }
+
+ base.Update(context);
+ }
+
+ public override void OnCollision(SpriteCollisionContext context)
+ {
+ if (context.Sprite is Player player)
+ {
+ IsDead = true;
+ ApplyEffect(player);
+ }
+ }
+
+ protected abstract void ApplyEffect(Player player);
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Items/Rockets.cs b/AlientAttack.MonoGame/Things/Items/Rockets.cs
new file mode 100644
index 0000000..194d558
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Items/Rockets.cs
@@ -0,0 +1,14 @@
+namespace AlienAttack.MonoGame.Things.Items;
+
+internal class Rockets : Item
+{
+ public Rockets(int x, int y) : base(x, y)
+ {
+ TextureName = @$"Sprites\Powerup_Rockets";
+ }
+
+ protected override void ApplyEffect(Player player)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Items/Shields.cs b/AlientAttack.MonoGame/Things/Items/Shields.cs
new file mode 100644
index 0000000..6a6d5c2
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Items/Shields.cs
@@ -0,0 +1,14 @@
+namespace AlienAttack.MonoGame.Things.Items;
+
+internal class Shields : Item
+{
+ public Shields(int x, int y) : base(x, y)
+ {
+ TextureName = @$"Sprites\Powerup_Shields";
+ }
+
+ protected override void ApplyEffect(Player player)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/MiniExplosion.cs b/AlientAttack.MonoGame/Things/MiniExplosion.cs
new file mode 100644
index 0000000..3e94f01
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/MiniExplosion.cs
@@ -0,0 +1,44 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace AlienAttack.MonoGame.Things;
+
+internal class MiniExplosion(int x, int y, float xVel, float yVel) : Sprite(x, y)
+{
+ protected int CurrentFrame { get; private set; } = 1;
+ protected int MaxFrames => 9;
+ protected int AnimationThreshold => 3; //5;
+ protected int CurrentThreshold { get; private set; } = 5;
+
+ public override void Draw(SpriteDrawArgs args)
+ {
+ Texture2D texture = args.Content.Load(@$"Sprites\Explosion01_Frame_0{CurrentFrame}_png_processed");
+ args.SpriteBatch.Draw(texture, Position, null, DrawColor, 0, new Vector2(0, 0), .25f, SpriteEffects.None, 1);
+
+ base.Draw(args);
+ }
+
+ public override void Update(SpriteUpdateContext context)
+ {
+ base.Update(context);
+
+ XPosition += xVel;
+ YPosition += yVel;
+
+ if (CurrentThreshold > 0)
+ {
+ CurrentThreshold--;
+ }
+ else
+ {
+ if (CurrentFrame == MaxFrames)
+ {
+ IsDead = true;
+ return;
+ }
+
+ CurrentFrame++;
+ CurrentThreshold = AnimationThreshold;
+ }
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/MoveableSprite.cs b/AlientAttack.MonoGame/Things/MoveableSprite.cs
new file mode 100644
index 0000000..514e18c
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/MoveableSprite.cs
@@ -0,0 +1,15 @@
+namespace AlienAttack.MonoGame.Things;
+
+public class MoveableSprite(int x, int y) : Sprite(x, y)
+{
+ public float XVelocity { get; protected set; } = 0;
+ public float YVelocity { get; protected set; } = 0;
+
+ public override void Update(SpriteUpdateContext context)
+ {
+ XPosition += XVelocity;
+ YPosition += YVelocity;
+
+ base.Update(context);
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Player.cs b/AlientAttack.MonoGame/Things/Player.cs
new file mode 100644
index 0000000..c8a4c96
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Player.cs
@@ -0,0 +1,272 @@
+using AlienAttack.MonoGame.Things.Weapons;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Input;
+using System;
+using System.Collections.Generic;
+
+namespace AlienAttack.MonoGame.Things;
+
+internal enum PlayerHorizontalMoveState
+{
+ None,
+ Left,
+ Right
+}
+
+[Flags]
+internal enum MoveFlag
+{
+ None = 0,
+ Left = 1,
+ Right = 2,
+ Up = 4,
+ Down = 8
+}
+
+public class DrwaState
+{
+
+}
+
+internal class Player : MoveableSprite
+{
+ protected PlayerHorizontalMoveState MoveState = PlayerHorizontalMoveState.None;
+ protected MoveFlag MoveFlags;
+ protected ulong MoveThreshold = 0;
+ //protected ulong FireThreshold = 0;
+ protected ICollection ActiveWeapons = [];
+
+ protected int CurrentExhaustFrame = 1;
+ protected int MaxExhaustFrames = 6;
+ protected int ExhaustAnimationThreshold = 30;
+ protected int CurrentExhaustAnimationThreshold = 10;
+ protected int CurrentExhaustDirection = 1;
+
+ public Player(int x, int y) : base(x, y)
+ {
+ BoundBox = new Rectangle(0, 0, 64, 64);
+ ActiveWeapons.Add(new Minigun());
+ ActiveWeapons.Add(new FastMinigun());
+ }
+
+ //Texture2D texture = Game
+ public override void Draw(SpriteDrawArgs args)
+ {
+ //DrawExhaust(args);
+
+ string frameNumber = MoveState == PlayerHorizontalMoveState.None ? "01" :
+ MoveThreshold < 30 ? "02" : "03";
+ SpriteEffects spriteEffects = MoveState == PlayerHorizontalMoveState.Right ? SpriteEffects.FlipHorizontally : SpriteEffects.None;
+
+ Texture2D texture = args.Content.Load(@$"Sprites\PlayerRed_Frame_{frameNumber}");
+ //args.SpriteBatch.Draw(texture, Position, DrawColor);
+ args.SpriteBatch.Draw(texture, Position, null, DrawColor, 0, new Vector2(0, 0), 1, spriteEffects, 1);
+ }
+
+ private void DrawExhaust(SpriteDrawArgs args)
+ {
+ Texture2D texture = args.Content.Load(@$"Sprites\Exhaust_Frame_0{CurrentExhaustFrame}_png_processed");
+ args.SpriteBatch.Draw(texture, Position, null, DrawColor, 0, new Vector2(0, 0), 1, SpriteEffects.None, 1);
+ }
+
+ private string GetPlayerTextureName()
+ {
+ switch (MoveState)
+ {
+ case PlayerHorizontalMoveState.Left:
+ return "PlayerRed_Frame_02";
+ case PlayerHorizontalMoveState.Right:
+ return "PlayerRed_Frame_03";
+ case PlayerHorizontalMoveState.None:
+ default:
+ return "PlayerRed_Frame_01";
+ }
+ }
+
+ public override void Update(SpriteUpdateContext context)
+ {
+ //UpdateExhaustAnimationThreshold();
+ CheckMove(context);
+ CheckFire(context);
+
+ base.Update(context);
+ }
+
+ private void UpdateExhaustAnimationThreshold()
+ {
+ if (CurrentExhaustAnimationThreshold > 0)
+ {
+ CurrentExhaustAnimationThreshold--;
+ }
+ else
+ {
+ if (CurrentExhaustFrame == MaxExhaustFrames)
+ {
+ CurrentExhaustDirection = -1;
+ }
+ else if (CurrentExhaustFrame == 1)
+ {
+ CurrentExhaustDirection = 1;
+ }
+
+ CurrentExhaustFrame += CurrentExhaustDirection;
+
+ CurrentExhaustAnimationThreshold = ExhaustAnimationThreshold;
+ }
+ }
+
+ private void CheckMove(SpriteUpdateContext context)
+ {
+ UpdateMoveFlag();
+
+ if (MoveFlags.HasFlag(MoveFlag.Up))
+ {
+ //YPosition -= 4;
+ YVelocity = -4;
+ }
+ else if (MoveFlags.HasFlag(MoveFlag.Down))
+ {
+ //YPosition += 4;
+ YVelocity = 4;
+ }
+ else
+ {
+ YVelocity = 0;
+ }
+
+ if (MoveFlags.HasFlag(MoveFlag.Left))
+ {
+ //XPosition -= 4;
+ XVelocity = -4;
+
+ if (MoveState != PlayerHorizontalMoveState.Left)
+ {
+ MoveThreshold = 0;
+ }
+ else
+ {
+ MoveThreshold++;
+
+ if (MoveThreshold > 30)
+ {
+ MoveThreshold = 30;
+ }
+ }
+
+ MoveState = PlayerHorizontalMoveState.Left;
+ }
+ else if (MoveFlags.HasFlag(MoveFlag.Right))
+ {
+ //XPosition += 4;
+ XVelocity = 4;
+
+ if (MoveState != PlayerHorizontalMoveState.Right)
+ {
+ MoveThreshold = 0;
+ }
+ else
+ {
+ MoveThreshold++;
+
+ if (MoveThreshold > 30)
+ {
+ MoveThreshold = 30;
+ }
+ }
+
+ MoveState = PlayerHorizontalMoveState.Right;
+ }
+ else
+ {
+ XVelocity = 0;
+ MoveState = PlayerHorizontalMoveState.None;
+ MoveThreshold = 0;
+ }
+
+ if (XPosition < 0)
+ {
+ XPosition = 0;
+ }
+
+ if (XPosition + BoundBox.Width > context.ViewTransform.ScreenWidth)
+ {
+ XPosition = context.ViewTransform.ScreenWidth - BoundBox.Width;
+ }
+
+ if (YPosition < 0)
+ {
+ YPosition = 0;
+ }
+
+ if (YPosition + BoundBox.Height > context.ViewTransform.ScreenHeight)
+ {
+ YPosition = context.ViewTransform.ScreenHeight - BoundBox.Height;
+ }
+ }
+
+ private void UpdateMoveFlag()
+ {
+ MoveFlags = MoveFlag.None;
+
+ KeyboardState keyState = Keyboard.GetState();
+ GamePadState gamepadState = GamePad.GetState(0);
+
+ if (keyState.IsKeyDown(Keys.Up) || keyState.IsKeyDown(Keys.W) || gamepadState.ThumbSticks.Left.Y > 0)
+ {
+ MoveFlags |= MoveFlag.Up;
+ }
+ else if (keyState.IsKeyDown(Keys.Down) || keyState.IsKeyDown(Keys.S) || gamepadState.ThumbSticks.Left.Y < 0)
+ {
+ MoveFlags |= MoveFlag.Down;
+ }
+
+ if (keyState.IsKeyDown(Keys.Left) || keyState.IsKeyDown(Keys.A) || gamepadState.ThumbSticks.Left.X < 0)
+ {
+ MoveFlags |= MoveFlag.Left;
+ }
+ else if (keyState.IsKeyDown(Keys.Right) || keyState.IsKeyDown(Keys.D) || gamepadState.ThumbSticks.Left.X > 0)
+ {
+ MoveFlags |= MoveFlag.Right;
+ }
+ }
+
+ private void CheckFire(SpriteUpdateContext context)
+ {
+ //if (FireThreshold > 0)
+ //{
+ // FireThreshold--;
+ // return;
+ //}
+
+ foreach (IWeapon weapon in ActiveWeapons)
+ {
+ weapon.UpdateFireThreshold();
+ }
+
+ if (IsFireButtonPressed() == false)
+ return;
+
+ foreach (IWeapon weapon in ActiveWeapons)
+ {
+ weapon.TryFire(this, context);
+ }
+
+ //MinigunBulletSmall bullet1 = new((int)Position.X + 12, (int)Position.Y + 6, 0, -4, this);
+ //MinigunBulletSmall bullet2 = new((int)Position.X + BoundBox.Width - 20, (int)Position.Y + 6, 0, -4, this);
+
+ //context.SpawnSprite(bullet1);
+ //context.SpawnSprite(bullet2);
+
+ //FireThreshold = 15;
+ }
+
+ private static bool IsFireButtonPressed()
+ {
+ KeyboardState keyState = Keyboard.GetState();
+ MouseState mouseState = Mouse.GetState();
+ GamePadState gamePadState = GamePad.GetState(0);
+
+ return keyState.IsKeyDown(Keys.Space) || mouseState.LeftButton == ButtonState.Pressed || gamePadState.Buttons.A == ButtonState.Pressed;
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Sprite.cs b/AlientAttack.MonoGame/Things/Sprite.cs
new file mode 100644
index 0000000..2acc9fd
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Sprite.cs
@@ -0,0 +1,38 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace AlienAttack.MonoGame.Things;
+
+public class Sprite(float x, float y)
+{
+ public float XPosition { get; protected set; } = x;
+ public float YPosition { get; protected set; } = y;
+ public Vector2 Position => new(XPosition, YPosition);
+ public Rectangle BoundBox { get; protected set; }
+
+ protected Rectangle CollisionBox;
+ protected Color DrawColor = Color.White;
+
+ public bool CanCollide { get; protected set; } = true;
+ public bool IsDead { get; protected set; }
+
+ public virtual void Update(SpriteUpdateContext context)
+ {
+ CollisionBox = new Rectangle((int)XPosition + BoundBox.X, (int)YPosition + BoundBox.Y, BoundBox.Width, BoundBox.Height);
+ }
+
+ public bool Intersects(Sprite sprite)
+ {
+ return CollisionBox.Intersects(sprite.CollisionBox);
+ }
+
+ public virtual void Draw(SpriteDrawArgs args)
+ {
+ //spriteBatch.Draw(Texture, Position, DrawColor);
+ }
+
+ public virtual void OnCollision(SpriteCollisionContext context)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/SpriteDrawArgs.cs b/AlientAttack.MonoGame/Things/SpriteDrawArgs.cs
new file mode 100644
index 0000000..4afb710
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/SpriteDrawArgs.cs
@@ -0,0 +1,11 @@
+using Microsoft.Xna.Framework.Content;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+
+namespace AlienAttack.MonoGame.Things;
+
+public class SpriteDrawArgs(AlienAttackGame game)
+{
+ public SpriteBatch SpriteBatch => game.SpriteBatch;
+ public ContentManager Content => game.Content;
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/SpriteUpdateContext.cs b/AlientAttack.MonoGame/Things/SpriteUpdateContext.cs
new file mode 100644
index 0000000..a204670
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/SpriteUpdateContext.cs
@@ -0,0 +1,20 @@
+using AlienAttack.MonoGame.View;
+using Microsoft.Xna.Framework;
+using System;
+
+namespace AlienAttack.MonoGame.Things;
+
+public class SpriteUpdateContext(AlienAttackGame game)
+{
+ public ViewTransform ViewTransform => game.ViewTransform;
+ public required Action SpawnSprite { get; init; }
+ public required Random Random { get; init; }
+ public required GameTime GameTime { get; init; }
+}
+
+public class SpriteCollisionContext(AlienAttackGame game)
+{
+ public ViewTransform ViewTransform => game.ViewTransform;
+ public required Sprite Sprite { get; init; }
+ public required Action SpawnSprite { get; init; }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Stars/Starfield.cs b/AlientAttack.MonoGame/Things/Stars/Starfield.cs
new file mode 100644
index 0000000..bd4ac61
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Stars/Starfield.cs
@@ -0,0 +1,190 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AlienAttack.MonoGame.Things.Stars
+{
+ using Microsoft.Xna.Framework;
+ using Microsoft.Xna.Framework.Graphics;
+ using System;
+ using System.Collections.Generic;
+
+ public sealed class Starfield
+ {
+ private readonly List _layers = new();
+ private readonly Random _rng;
+
+ public Starfield(int seed = 12345) => _rng = new Random(seed);
+
+ public void AddLayer(int count, Vector2 velocityPxPerSec, float minSize, float maxSize, float minAlpha, float maxAlpha)
+ {
+ _layers.Add(new StarLayer(_rng, count, velocityPxPerSec, minSize, maxSize, minAlpha, maxAlpha));
+ }
+
+ public void Initialize(int screenWidth, int screenHeight)
+ {
+ foreach (var layer in _layers)
+ layer.Initialize(screenWidth, screenHeight);
+ }
+
+ public void OnResize(int screenWidth, int screenHeight)
+ {
+ foreach (var layer in _layers)
+ layer.OnResize(screenWidth, screenHeight);
+ }
+
+ public void Update(GameTime gameTime)
+ {
+ float dt = (float)gameTime.ElapsedGameTime.TotalSeconds;
+ foreach (var layer in _layers)
+ layer.Update(dt);
+ }
+
+ public void Draw(SpriteBatch spriteBatch, Texture2D pixel)
+ {
+ foreach (var layer in _layers)
+ layer.Draw(spriteBatch, pixel);
+ }
+
+ private sealed class StarLayer
+ {
+ private readonly Random _rng;
+ private readonly int _count;
+ //private readonly float _speed;
+ private readonly Vector2 _velocity; // pixels/sec
+ private readonly float _minSize, _maxSize;
+ private readonly float _minAlpha, _maxAlpha;
+
+ private int _w, _h;
+ private readonly Star[] _stars;
+
+ public StarLayer(Random rng, int count, Vector2 velocityPxPerSec, float minSize, float maxSize, float minAlpha, float maxAlpha)
+ {
+ _rng = rng;
+ _count = count;
+ //_speed = speedPxPerSec;
+ _velocity = velocityPxPerSec;
+ _minSize = minSize;
+ _maxSize = maxSize;
+ _minAlpha = minAlpha;
+ _maxAlpha = maxAlpha;
+
+ _stars = new Star[_count];
+ }
+
+ public void Initialize(int screenWidth, int screenHeight)
+ {
+ _w = screenWidth;
+ _h = screenHeight;
+
+ for (int i = 0; i < _stars.Length; i++)
+ _stars[i] = CreateStar(randomY: true);
+ }
+
+ public void OnResize(int screenWidth, int screenHeight)
+ {
+ // Keep existing stars but clamp/wrap them into the new bounds.
+ _w = screenWidth;
+ _h = screenHeight;
+
+ for (int i = 0; i < _stars.Length; i++)
+ {
+ var s = _stars[i];
+ s.Pos.X = Wrap(s.Pos.X, _w);
+ s.Pos.Y = Wrap(s.Pos.Y, _h);
+ _stars[i] = s;
+ }
+ }
+
+ public void Update(float dt)
+ {
+ for (int i = 0; i < _stars.Length; i++)
+ {
+ var s = _stars[i];
+
+ // Move down (positive Y). Add slight horizontal drift if you want:
+ // s.Pos.X += s.DriftX * dt;
+
+ //s.Pos.Y += _speed * dt;
+ s.Pos += _velocity * dt;
+
+ // Wrap X continuously so diagonal drift never runs out of stars
+ if (s.Pos.X < -s.Size) s.Pos.X = _w + s.Size;
+ if (s.Pos.X > _w + s.Size) s.Pos.X = -s.Size;
+
+ if (s.Pos.Y >= _h + s.Size)
+ {
+ // Respawn at top; keep it entering from above
+ s = CreateStar(randomY: false);
+ s.Pos.Y = -s.Size;
+ }
+
+ // Optional subtle twinkle:
+ s.TwinkleT += dt * s.TwinkleSpeed;
+
+ _stars[i] = s;
+ }
+ }
+
+ public void Draw(SpriteBatch sb, Texture2D pixel)
+ {
+ for (int i = 0; i < _stars.Length; i++)
+ {
+ var s = _stars[i];
+
+ float twinkle = 1f;
+ if (s.TwinkleSpeed > 0f)
+ twinkle = 0.85f + 0.15f * (float)Math.Sin(s.TwinkleT);
+
+ var color = Color.White * (s.Alpha * twinkle);
+
+ // Draw as a scaled 1x1 pixel (super fast)
+ sb.Draw(pixel, s.Pos, null, color, 0f, Vector2.Zero, s.Size, SpriteEffects.None, 0f);
+ }
+ }
+
+ private Star CreateStar(bool randomY)
+ {
+ float x = (float)_rng.NextDouble() * _w;
+ float y = randomY ? (float)_rng.NextDouble() * _h : 0f;
+
+ float size = Lerp(_minSize, _maxSize, (float)_rng.NextDouble());
+ float alpha = Lerp(_minAlpha, _maxAlpha, (float)_rng.NextDouble());
+
+ // Twinkle: keep it more common on “near” layers by setting a nonzero speed range
+ float twinkleSpeed = Lerp(0f, 6f, (float)_rng.NextDouble()) * 0.4f; // tweak or set 0 for none
+
+ return new Star
+ {
+ Pos = new Vector2(x, y),
+ Size = size,
+ Alpha = alpha,
+ TwinkleSpeed = twinkleSpeed,
+ TwinkleT = (float)_rng.NextDouble() * MathF.PI * 2f
+ };
+ }
+
+ private static float Wrap(float v, float max)
+ {
+ if (max <= 0) return 0;
+ v %= max;
+ if (v < 0) v += max;
+ return v;
+ }
+
+ private static float Lerp(float a, float b, float t) => a + (b - a) * t;
+
+ private struct Star
+ {
+ public Vector2 Pos;
+ public float Size;
+ public float Alpha;
+
+ public float TwinkleSpeed;
+ public float TwinkleT;
+ }
+ }
+ }
+}
diff --git a/AlientAttack.MonoGame/Things/Weapons/IWeapon.cs b/AlientAttack.MonoGame/Things/Weapons/IWeapon.cs
new file mode 100644
index 0000000..d2f1e7d
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Weapons/IWeapon.cs
@@ -0,0 +1,8 @@
+namespace AlienAttack.MonoGame.Things.Weapons;
+
+public interface IWeapon
+{
+ int FireThreshold { get; }
+ void UpdateFireThreshold();
+ bool TryFire(Sprite owner, SpriteUpdateContext context);
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Weapons/Minigun.cs b/AlientAttack.MonoGame/Things/Weapons/Minigun.cs
new file mode 100644
index 0000000..e4aeec9
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Weapons/Minigun.cs
@@ -0,0 +1,43 @@
+using AlienAttack.MonoGame.Things.Bullets;
+using Microsoft.Xna.Framework;
+
+namespace AlienAttack.MonoGame.Things.Weapons;
+
+public class Minigun : Weapon
+{
+ public override int FireThreshold => 15;
+
+ public override void Fire(Sprite owner, SpriteUpdateContext context)
+ {
+ // Calculate bullet spawn positions relative to the player's bounding box
+ int x1 = (int)owner.XPosition + 12;
+ int x2 = (int)owner.XPosition + owner.BoundBox.Width - 20;
+ int y = (int)owner.YPosition + 6;
+
+ // Create bullets with velocity (0, -4)
+ MinigunBulletSmall bullet1 = new(x1, y, 0, -6, owner);
+ MinigunBulletSmall bullet2 = new(x2, y, 0, -6, owner);
+
+ // Queue the bullets for spawning
+ context.SpawnSprite(bullet1);
+ context.SpawnSprite(bullet2);
+ }
+}
+
+public class FastMinigun : Weapon
+{
+ public override int FireThreshold => 10;
+
+ public override void Fire(Sprite owner, SpriteUpdateContext context)
+ {
+ // Calculate bullet spawn positions relative to the player's bounding box
+ float x = (owner.Position.X - (7/2) + owner.BoundBox.Width / 2);
+ float y = owner.YPosition - 16;
+
+ // Create bullets with velocity (0, -4)
+ MinigunBulletSmall bullet = new(x, y, 0, -6, owner);
+
+ // Queue the bullets for spawning
+ context.SpawnSprite(bullet);
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/Things/Weapons/Weapon.cs b/AlientAttack.MonoGame/Things/Weapons/Weapon.cs
new file mode 100644
index 0000000..6ed6a53
--- /dev/null
+++ b/AlientAttack.MonoGame/Things/Weapons/Weapon.cs
@@ -0,0 +1,26 @@
+namespace AlienAttack.MonoGame.Things.Weapons;
+
+public abstract class Weapon : IWeapon
+{
+ public abstract int FireThreshold { get; }
+ public int CurrentFireThreshold { get; private set; }
+
+ public void UpdateFireThreshold()
+ {
+ if (CurrentFireThreshold > 0)
+ CurrentFireThreshold--;
+ }
+
+ public bool TryFire(Sprite owner, SpriteUpdateContext context)
+ {
+ if (CurrentFireThreshold > 0)
+ return false;
+
+ Fire(owner, context);
+ CurrentFireThreshold = FireThreshold;
+
+ return true;
+ }
+
+ public abstract void Fire(Sprite owner, SpriteUpdateContext context);
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/View/ViewTransform.cs b/AlientAttack.MonoGame/View/ViewTransform.cs
new file mode 100644
index 0000000..17acba2
--- /dev/null
+++ b/AlientAttack.MonoGame/View/ViewTransform.cs
@@ -0,0 +1,70 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Content;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace AlienAttack.MonoGame.View;
+
+public class ViewTransform(Game game, GraphicsDeviceManager graphics)
+{
+ public readonly GameWindow Window = game.Window;
+ public readonly ContentManager Content = game.Content;
+ public readonly GraphicsDeviceManager Graphics = graphics;
+ public readonly GraphicsDevice GraphicsDevice = game.GraphicsDevice;
+ public readonly SpriteBatch SpriteBatch;
+
+ public float ScaleX => (float)WindowWidth / Graphics.PreferredBackBufferWidth;
+ public float ScaleY => (float)WindowHeight / Graphics.PreferredBackBufferHeight;
+ public float ScaleMin => MathHelper.Min(ScaleX, ScaleY);
+
+ public float OffsetX => KeepAspectRatio ? MathHelper.Max(ScaleX - ScaleY, 0) * ScreenWidth : 0;
+ public float OffsetY => KeepAspectRatio ? MathHelper.Max(ScaleY - ScaleX, 0) * ScreenHeight : 0;
+
+ public bool KeepAspectRatio = true;
+
+ public int ScreenWidth
+ {
+ get
+ {
+ return Graphics.PreferredBackBufferWidth;
+ }
+ }
+
+ public int ScreenHeight
+ {
+ get
+ {
+ return Graphics.PreferredBackBufferHeight;
+ }
+ }
+
+ public int WindowWidth
+ {
+ get
+ {
+ return Window.ClientBounds.Width;
+ }
+ }
+
+ public int WindowHeight
+ {
+ get
+ {
+ return Window.ClientBounds.Height;
+ }
+ }
+
+ public Matrix ViewMatrix
+ {
+ get
+ {
+ if (KeepAspectRatio)
+ {
+ return Matrix.CreateScale(ScaleMin, ScaleMin, 1.0f) * Matrix.CreateTranslation(OffsetX / 2, OffsetY / 2, 0);
+ }
+ else
+ {
+ return Matrix.CreateScale(ScaleX, ScaleY, 1.0f);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AlientAttack.MonoGame/app.manifest b/AlientAttack.MonoGame/app.manifest
new file mode 100644
index 0000000..03837ea
--- /dev/null
+++ b/AlientAttack.MonoGame/app.manifest
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true/pm
+ permonitorv2,permonitor
+
+
+
+