lomholdt / SeeSharpSnake

Self-contained C# game in 8 kB

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

A self-contained C# game in 8 kB

This repo is a complement to my article on building an 8 kB self-contained game in C#. By self-contained I mean this 8 kB C# game binary doesn't need a .NET runtime to work. See the article on how that's done.

The project files and scripts in this repo build the same game (Snake clone) in several different configurations, each with a different size of the output.

Snake game

Building

To build the 65 MB version of the game

dotnet publish -r win-x64 -c Release

To build the 25 MB version of the game

dotnet publish -r win-x64 -c Release /p:PublishTrimmed=true

⚠️ WARNING: additional requirements needed for the below configuration

Make sure you have Visual Studio 2019 installed (Community edition is free) and include C/C++ development tools with Windows SDK (we need a tiny fraction of that - the platform linker and Win32 import libraries).

To build the 4.7 MB version of the game

dotnet publish -r win-x64 -c Release /p:Mode=CoreRT

To build the 4.3 MB version of the game

dotnet publish -r win-x64 -c Release /p:Mode=CoreRT-Moderate

To build the 3.0 MB version of the game

dotnet publish -r win-x64 -c Release /p:Mode=CoreRT-High

To build the 1.2 MB version of the game

dotnet publish -r win-x64 -c Release /p:Mode=CoreRT-ReflectionFree

To build the 8 kB version of the game

  1. Open "x64 Native Tools Command Prompt for VS 2019" (it's in your Start menu)
  2. CD into the repo root directory
csc.exe /debug /O /noconfig /nostdlib /runtimemetadataversion:v4.0.30319 MiniRuntime.cs MiniBCL.cs Game\FrameBuffer.cs Game\Random.cs Game\Game.cs Game\Snake.cs Pal\Thread.Windows.cs Pal\Environment.Windows.cs Pal\Console.Windows.cs /out:zerosnake.ilexe /langversion:latest /unsafe

Find ilc.exe (the CoreRT ahead of time compiler) on your machine. If you completed any of the above steps that produce outputs <= 4.7 MB, ilc.exe will be in your NuGet package cache (somewhere like %USERPROFILE%\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\1.0.0-alpha-27402–01\tools).

[PATH_TO_ILC_EXE]\ilc.exe zerosnake.ilexe -o zerosnake.obj --systemmodule zerosnake --Os -g
link.exe /debug:full /subsystem:console zerosnake.obj /entry:__managed__Main kernel32.lib ucrt.lib /merge:.modules=.rdata /merge:.pdata=.rdata /incremental:no /DYNAMICBASE:NO /filealign:16 /align:16

Contributing

Contributions are welcome, but I would like to keep the game simple and small. If you would like to add features like levels or achievements, you might want to just fork this repo.

In general, I welcome:

  • Making the 8 kB version of the game run on Linux and macOS (the bigger versions of the game should work just fine on Unixes, but the tiny version that p/invokes into the platform APIs is OS specific)
  • Adding a configuration that builds the game as an EFI boot application so that it can run without an OS
  • Bug fixes
  • Making the CSPROJ also handle the 8 kB case so that we don't need to mess with the command prompt
  • Small experience improvements (e.g. handling ESC key to exit the game)

About

Self-contained C# game in 8 kB


Languages

Language:C# 100.0%