SadConsole 10.0.0-alpha4
See the version list below for details.
dotnet add package SadConsole --version 10.0.0-alpha4
NuGet\Install-Package SadConsole -Version 10.0.0-alpha4
<PackageReference Include="SadConsole" Version="10.0.0-alpha4" />
<PackageVersion Include="SadConsole" Version="10.0.0-alpha4" />
<PackageReference Include="SadConsole" />
paket add SadConsole --version 10.0.0-alpha4
#r "nuget: SadConsole, 10.0.0-alpha4"
#:package SadConsole@10.0.0-alpha4
#addin nuget:?package=SadConsole&version=10.0.0-alpha4&prerelease
#tool nuget:?package=SadConsole&version=10.0.0-alpha4&prerelease

SadConsole is a generic library that emulates old-school console game systems. It provides command prompt-style graphics where one or more tile textures are used to represent an ASCII character set. Console's are made up of a grid of cells, each of which can have its own foreground, background, glyph, and special effect applied to it.
While SadConsole is a generic library that doesn't provide any rendering capabilities, "host" libraries are provided that add renderers to SadConsole. The two hosts provided by this library are for MonoGame and SFML.
SadConsole currently targets .NET 6 and .NET 7
For the latest changes in this release, see the notes below
Features
Here are some of the features SadConsole supports:
- Show any number of consoles.
- Uses graphical tile-based images to build out an ASCII-character font with support for more than 256 characters.
- Use more than one font file. However, each console is restricted to a single font.
- Independently controlled entities for game objects.
- Keyboard and Mouse support.
- Text UI control framework with windowing support.
- Importers for DOS ANSI files, TheDraw text fonts, RexPaint, and Playscii.
- Animated consoles.
- Translating images to text-blocks.
- Highly customizable framework.
String display and parsing

GUI library

Scrolling

Dependencies
SadConsole uses NuGet for its .NET dependencies:
- Newtonsoft.Json (>= 13.0.3)
- TheSadRogue.Primitives (>= 1.6.0)
Example startup code
using SadConsole;
Settings.WindowTitle = "SadConsole Examples";
Game.Configuration gameStartup = new Game.Configuration()
.SetScreenSize(90, 30)
.OnStart(onStart)
.IsStartingScreenFocused(false)
.ConfigureFonts((f) => f.UseBuiltinFontExtended())
;
Game.Create(gameStartup);
Game.Instance.Run();
Game.Instance.Dispose();
void onStart()
{
ColoredGlyph boxBorder = new ColoredGlyph(Color.White, Color.Black, 178);
ColoredGlyph boxFill = new ColoredGlyph(Color.White, Color.Black);
Game.Instance.StartingConsole.FillWithRandomGarbage(255);
Game.Instance.StartingConsole.DrawBox(new Rectangle(2, 2, 26, 5), ShapeParameters.CreateFilled(boxBorder, boxFill));
Game.Instance.StartingConsole.Print(4, 4, "Welcome to SadConsole!");
}
Latest changes v10.0.0 Alpha 3 (XX/XX/2023)
Major changes (possibly breaking)
- [Core] The editor functions that changed glyphs and printed on consoles have moved from being extension methods for the
ICellSurfaceinterface to theISurfaceinterface.Console,IScreenSurface, andICellSurface, all implement this new interface. This means you can now use the editing extensions directly on those objects. - [Core] Because
Consoleno longer implementsICellSurface, and instead implementsISurface, some properties have been moved to theSurfaceproperty, such asmyConsole.TimesShiftedUpis nowmyConsole.Surface.TimesShiftedUp. - [Core] Themes have been removed. Each control draws itself.
- [Core]
IScreenObjectno longer implementsIEnumerableto access the children. Use the.Childrencollection property instead. - [Core]
UpdateandRenderno longer check forIsEnabledandIsVisible, respectively. When those methods run, the properties are checked on the children before calling the respective method. This moves the check outside of the object itself, and relies on the parent object to do it. This eliminates the need for an object to check itself, and allows you to bypass the check when you want.
New features
- [Core] Added
Componenets.LayeredSurfacecomponent. Add this component to aScreenSurfaceto enable multiple surface layers. Use theLayeredSurfaceto manage the layers. - [UI] New control,
NumberBox. TheIsNumericsystem was removed from theTextBoxand put into its own control. - [UI] New control,
TabControl. Contributed by arxae. - [ExtendedLib.UI] New control,
Table. Contributed by Ven0maus.
Normal changes
- Target .NET 6+ exclusively. Core library is nullable aware.
- [Core] Splash screen printing wasn't being shown because of cursor changes.
- [Core]
IFontnow defines glyph definitions. - [Core] Various
SadFontproperties and methods are now settable/callable. - [Core] Extensions methods added to hosts to allow manipulation of font textures.
- [Core]
Settings.CreateStartingConsolesetting added to avoid creating theStartingConsole. - [Core] Cursor now has the property
DisablePrintAutomaticLineFeedwhich, when true, prevents the cursor from moving to the next line if printing a character at the end of the current line. - [Core]
Ansi.AnsiWriterhandles sauce now by ignoring the rest of a document once character 26 (CTRL-Z) is encountered. - [Core]
Ansi.AnsiWriterhas always used a cursor to print, it now setsUseLinuxLineEndings = trueandDisablePrintAutomaticLineFeed = true. - [Core] Added
SadConsole.SplashScreens.Ansi1splashscreen, the new SadConsole logo, for use with games. - [Core] Added
ScreenSurface.QuietSurfaceHandlingproperty. Whentrue, this property prevents the.Surfaceproperty from raising events and calling virtual methods when the instance changes. This is useful forAnimatedScreenSurfaceinstances that have fast moving animations. - [Core]
Entities.RendererrenamedEntities.EntityRenderer. - [Core] The
Entitytype now supports animated surfaces. When creating an entity, you must specify it as a single cell entity or animated surface entity. - [Core] The effects system had a bug where if you added the same effect with the same cell twice, and the effect should restore the cell state, it wouldn't.
- [Core]
AsciiKeyused by the keyboard system now detects capslock and shifted state to produce capital or lowercase letters. - [Core]
AsciiKeyexposes a bunch of static dictionaries that help with remapping keys and characters. - [Core]
ColoredGlyph.IsVisiblenow setsColoredGlyph.IsDirtyto true when its value changes. - [Core]
Surface.RenderStepsmoved to the renderer. - [Core]
RenderStepsis now aListand you must callRenderSteps.Sort(SadConsole.Renderers.RenderStepComparer.Instance)when the collection is changed. - [Core]
Instructions.DrawStringusesSystem.TimeSpannow, and is more accurate. - [Core] Effects have a
RunEffectOnApplyproperty that will run theeffect.Updatemethod once, with a duration of zero, when the effect is added to a manager. - [Core]
EffectsManagerwill apply the active effect to a cell right when the cell is added to the effect. This was happening on the next render frame. - [Core] Surface shifting is much more performant (Thanks Chris3606)
- [Core]
Cursorhas some new methods for erasing:Erase,EraseUp,EraseDown,EraseLeft,EraseRight,EraseColumn,EraseRow. - [Core] Mouse state object now tracks
*ButtonDownDurationtimes. When the button is down and the time is zero, this indicates the button was just pressed. Otherwise, you can detect how long the button has been held down. - [Core] Rename RexPaint
ToLayersComponenttoToCellSurface. - [Core] Rework
TimerwithStart/Stop/Restartmethods. - [UI] Scroll bar with a size of 3 now disables the middle area, and you can use a size of 2 now.
- [UI] Scroll bar supports a thickness other than 1.
- [UI] Control host would get stuck when tabbing to a control that was disabled. Now it skips the control.
- [UI]
TextBoxrewritten. TheIsNumericsystem was removed and added to a new control:NumberBox. TheTextBoxno longer has an editing mode and simply starts editing as it's focused and stops editing once it loses focus. - [UI]
ControlBase.IsDirtyproperty now calls the protectedOnIsDirtyChangedmethod which then raises theIsDirtyChangedevent. - [UI]
Panelcontrol usesCompositeControlas a base class. Control can draw a border. - [UI]
ProgressBaris easier to customize. - [ExtendedLib] Border control uses view size now instead of full size of wrapping object.
- [ExtendedLib]
Border.AddToSurface/Windowhas been renamed toBorder.CreateForSurface/Window. - [ExtendedLib]
Entities.EntityManagerrenamedEntities.EntityManagerZoned.
Removed
- [Core]
Algorithms.Line\Circle\Ellipsehave been removed. The latest primitives library provides these methods. - [Core]
Shapesnamespace removed. The latest primitives library release that SadConsole uses, provides these.
Host changes
- [MonoGame] NuGet package has a -windows framework target that targets DirectX and adds support for WPF.
- [MonoGame] Fix conversion of Mirror to SpriteEffects.
- [MonoGame\SFML] Surface renderers now skip the glyph if the glyph is 0.
- [MonoGame\SFML] New SurfaceDirtyCells renderer added which only draws cells that are marked dirty.
- [MonoGame\SFML] New
Game.Configurationobject used for creating a SadConsole game.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net6.0
- Newtonsoft.Json (>= 13.0.3)
- TheSadRogue.Primitives (>= 1.6.0-rc3-debug)
-
net7.0
- Newtonsoft.Json (>= 13.0.3)
- TheSadRogue.Primitives (>= 1.6.0-rc3-debug)
NuGet packages (8)
Showing the top 5 NuGet packages that depend on SadConsole:
| Package | Downloads |
|---|---|
|
SadConsole.Extended
A library of common classes that extend SadConsole with new controls, windows, and more. |
|
|
SadConsole.Host.MonoGame
A graphics hosting library for SadConsole that targets MonoGame. |
|
|
SadConsole.Host.SFML
A graphics hosting library for SadConsole that targets SFML. |
|
|
SadConsole.GoRogueHelpers
A helper library for SadConsole games built with GoRogue. |
|
|
TheSadRogue.Integration
An official integration library for using GoRogue and SadConsole together to create a roguelike. |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on SadConsole:
| Repository | Stars |
|---|---|
|
Thraka/SadConsole
A .NET ascii/ansi console engine written in C# for MonoGame and SFML. Create your own text roguelike (or other) games!
|
| Version | Downloads | Last Updated | |
|---|---|---|---|
| 10.6.0 | 733 | 8/9/2025 | |
| 10.6.0-debug | 207 | 8/9/2025 | |
| 10.5.0 | 2,395 | 12/7/2024 | |
| 10.5.0-debug | 235 | 12/7/2024 | |
| 10.4.2 | 364 | 10/24/2024 | |
| 10.4.2-debug | 164 | 10/24/2024 | |
| 10.4.1 | 1,535 | 6/13/2024 | |
| 10.4.1-debug | 264 | 6/13/2024 | |
| 10.4.0 | 1,577 | 3/31/2024 | |
| 10.4.0-debug | 299 | 3/31/2024 | |
| 10.0.3 | 756 | 3/14/2024 | |
| 10.0.3-debug | 371 | 3/14/2024 | |
| 10.0.2 | 1,741 | 11/10/2023 | |
| 10.0.2-debug | 962 | 11/10/2023 | |
| 10.0.1 | 826 | 11/10/2023 | |
| 10.0.1-debug | 788 | 11/10/2023 | |
| 10.0.0 | 1,942 | 10/29/2023 | |
| 10.0.0-debug | 1,083 | 10/29/2023 | |
| 10.0.0-beta3-debug | 1,212 | 10/14/2023 | |
| 10.0.0-beta3 | 1,163 | 10/14/2023 | |
| 10.0.0-beta2-debug | 1,164 | 10/11/2023 | |
| 10.0.0-beta2 | 1,193 | 10/11/2023 | |
| 10.0.0-beta1-debug | 1,197 | 10/11/2023 | |
| 10.0.0-beta1 | 1,227 | 10/11/2023 | |
| 10.0.0-alpha4-debug | 1,483 | 8/26/2023 | |
| 10.0.0-alpha4 | 1,433 | 8/26/2023 | |
| 10.0.0-alpha3-debug | 1,348 | 8/26/2023 | |
| 10.0.0-alpha3 | 1,349 | 8/26/2023 | |
| 10.0.0-alpha2-debug | 1,742 | 6/18/2023 | |
| 10.0.0-alpha2 | 1,537 | 6/18/2023 | |
| 10.0.0-alpha1-debug | 1,694 | 6/4/2023 | |
| 9.2.2 | 5,515 | 1/22/2022 | |
| 9.2.2-debug | 1,353 | 1/22/2022 | |
| 9.2.1 | 2,649 | 1/4/2022 | |
| 9.2.0 | 3,580 | 12/31/2021 | |
| 9.2.0-debug | 1,219 | 12/31/2021 | |
| 9.1.1 | 6,188 | 8/7/2021 | |
| 9.1.1-debug | 1,412 | 8/7/2021 | |
| 9.1.0 | 2,335 | 7/6/2021 | |
| 9.1.0-debug | 1,398 | 7/6/2021 | |
| 9.0.0 | 5,023 | 6/6/2021 | |
| 9.0.0-debug | 1,404 | 6/6/2021 | |
| 9.0.0-beta4 | 2,170 | 1/15/2021 | |
| 9.0.0-beta3 | 2,352 | 12/19/2020 | |
| 9.0.0-beta2 | 1,761 | 10/9/2020 | |
| 9.0.0-beta1 | 1,874 | 8/1/2020 | |
| 9.0.0-alpha9 | 1,907 | 7/25/2020 | |
| 9.0.0-alpha8 | 1,559 | 7/13/2020 | |
| 9.0.0-alpha7 | 2,000 | 7/11/2020 | |
| 9.0.0-alpha6 | 1,981 | 5/28/2020 | |
| 9.0.0-alpha5 | 1,760 | 5/26/2020 | |
| 9.0.0-alpha4 | 1,573 | 5/1/2020 | |
| 9.0.0-alpha3 | 1,781 | 5/1/2020 | |
| 9.0.0-alpha2 | 1,689 | 3/14/2020 | |
| 9.0.0-alpha1 | 2,174 | 1/26/2020 | |
| 8.99.3 | 3,925 | 8/15/2020 | |
| 8.99.3-debug | 1,609 | 8/15/2020 | |
| 8.99.2 | 1,946 | 7/14/2020 | |
| 8.99.2-debug | 1,564 | 7/14/2020 | |
| 8.99.1 | 2,641 | 4/11/2020 | |
| 8.99.1-debug | 1,587 | 4/11/2020 | |
| 8.99.0 | 2,686 | 11/27/2019 | |
| 8.99.0-debug | 1,578 | 11/27/2019 | |
| 8.9.1 | 4,136 | 11/5/2019 | |
| 8.9.1-debug | 1,582 | 11/5/2019 | |
| 8.9.0 | 2,460 | 9/7/2019 | |
| 8.9.0-debug | 1,884 | 9/7/2019 | |
| 8.8.1 | 3,387 | 7/28/2019 | |
| 8.8.1-debug | 1,823 | 7/28/2019 | |
| 8.8.0 | 2,648 | 7/27/2019 | |
| 8.8.0-debug | 1,757 | 7/27/2019 | |
| 8.7.1 | 2,195 | 6/22/2019 | |
| 8.7.1-debug | 1,822 | 6/22/2019 | |
| 8.7.0 | 2,034 | 6/22/2019 | |
| 8.7.0-debug | 1,865 | 6/22/2019 | |
| 8.6.0 | 2,291 | 4/14/2019 | |
| 8.6.0-debug | 1,876 | 4/14/2019 | |
| 8.5.0 | 2,185 | 4/2/2019 | |
| 8.5.0-debug | 1,900 | 4/2/2019 | |
| 8.4.1 | 2,149 | 3/19/2019 | |
| 8.4.1-debug | 1,910 | 3/19/2019 | |
| 8.4.0 | 2,029 | 3/17/2019 | |
| 8.4.0-debug | 1,896 | 3/17/2019 | |
| 8.3.0 | 2,123 | 3/10/2019 | |
| 8.3.0-debug | 1,848 | 3/10/2019 | |
| 8.2.0 | 2,159 | 3/2/2019 | |
| 8.2.0-debug | 1,952 | 3/2/2019 | |
| 8.1.0 | 2,122 | 2/28/2019 | |
| 8.1.0-debug | 1,837 | 2/28/2019 | |
| 8.0.0 | 2,242 | 2/24/2019 | |
| 8.0.0-pre5 | 1,919 | 2/19/2019 | |
| 8.0.0-pre4 | 1,940 | 1/31/2019 | |
| 8.0.0-pre2 | 1,977 | 12/30/2018 | |
| 8.0.0-pre1 | 1,931 | 12/30/2018 | |
| 7.3.0 | 2,190 | 12/29/2018 | |
| 7.2.0 | 2,383 | 11/20/2018 | |
| 7.1.0 | 2,429 | 10/19/2018 | |
| 7.0.4 | 2,379 | 9/8/2018 | |
| 7.0.3 | 2,218 | 9/8/2018 | |
| 7.0.2 | 2,607 | 8/31/2018 | |
| 7.0.0 | 2,269 | 8/29/2018 | |
| 7.0.0-pre1 | 2,060 | 8/22/2018 | |
| 6.5.0 | 2,697 | 6/12/2018 | |
| 6.4.11 | 2,819 | 4/13/2018 | |
| 6.4.11-pre1 | 2,594 | 4/6/2018 | |
| 6.4.10 | 2,778 | 3/18/2018 | |
| 6.4.9 | 2,749 | 3/18/2018 | |
| 6.4.8 | 2,718 | 3/18/2018 | |
| 6.4.7 | 2,785 | 3/16/2018 | |
| 6.4.6 | 3,018 | 2/14/2018 | |
| 6.4.5 | 2,827 | 2/3/2018 | |
| 6.4.3 | 2,675 | 11/14/2017 | |
| 6.4.2 | 2,767 | 8/11/2017 | |
| 6.4.1 | 2,585 | 8/10/2017 | |
| 6.4.0 | 2,663 | 7/25/2017 | |
| 6.3.0 | 2,680 | 6/9/2017 | |
| 6.2.2 | 2,689 | 5/20/2017 | |
| 6.2.1 | 2,782 | 4/23/2017 | |
| 6.2.0 | 2,616 | 4/22/2017 | |
| 6.1.4 | 2,604 | 4/17/2017 | |
| 6.1.3 | 3,277 | 4/3/2017 | |
| 6.1.2 | 2,588 | 4/1/2017 | |
| 6.1.1 | 2,537 | 4/1/2017 | |
| 6.1.0 | 2,546 | 3/31/2017 | |
| 6.0.1 | 2,679 | 3/19/2017 | |
| 6.0.0 | 2,394 | 3/18/2017 |
- Themes have been removed. Each control draws itself.
- IScreenObject no longer implements IEnumerable to access the children. Use the .Children collection property instead.
- Update and Render no longer check for IsEnabled and IsVisible, respectively. When those methods run, the properties are checked on the children before calling the respective method. This moves the check outside of the object itself, and relies on the parent object to do it. This eliminates the need for an object to check itself, and allows you to bypass the check when you want.
- Added Table and Tab controls.
- Entities.Renderer renamed Entities.EntityRenderer.