SadConsole 10.0.0-alpha3
See the version list below for details.
dotnet add package SadConsole --version 10.0.0-alpha3
NuGet\Install-Package SadConsole -Version 10.0.0-alpha3
<PackageReference Include="SadConsole" Version="10.0.0-alpha3" />
paket add SadConsole --version 10.0.0-alpha3
#r "nuget: SadConsole, 10.0.0-alpha3"
// Install SadConsole as a Cake Addin #addin nuget:?package=SadConsole&version=10.0.0-alpha3&prerelease // Install SadConsole as a Cake Tool #tool nuget:?package=SadConsole&version=10.0.0-alpha3&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
ICellSurface
interface to theISurface
interface.Console
,IScreenSurface
, andICellSurface
, all implement this new interface. This means you can now use the editing extensions directly on those objects. - [Core] Because
Console
no longer implementsICellSurface
, and instead implementsISurface
, some properties have been moved to theSurface
property, such asmyConsole.TimesShiftedUp
is nowmyConsole.Surface.TimesShiftedUp
. - [Core] Themes have been removed. Each control draws itself.
- [Core]
IScreenObject
no longer implementsIEnumerable
to access the children. Use the.Children
collection property instead. - [Core]
Update
andRender
no longer check forIsEnabled
andIsVisible
, 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.LayeredSurface
component. Add this component to aScreenSurface
to enable multiple surface layers. Use theLayeredSurface
to manage the layers. - [UI] New control,
NumberBox
. TheIsNumeric
system was removed from theTextBox
and 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]
IFont
now defines glyph definitions. - [Core] Various
SadFont
properties and methods are now settable/callable. - [Core] Extensions methods added to hosts to allow manipulation of font textures.
- [Core]
Settings.CreateStartingConsole
setting added to avoid creating theStartingConsole
. - [Core] Cursor now has the property
DisablePrintAutomaticLineFeed
which, when true, prevents the cursor from moving to the next line if printing a character at the end of the current line. - [Core]
Ansi.AnsiWriter
handles sauce now by ignoring the rest of a document once character 26 (CTRL-Z) is encountered. - [Core]
Ansi.AnsiWriter
has always used a cursor to print, it now setsUseLinuxLineEndings = true
andDisablePrintAutomaticLineFeed = true
. - [Core] Added
SadConsole.SplashScreens.Ansi1
splashscreen, the new SadConsole logo, for use with games. - [Core] Added
ScreenSurface.QuietSurfaceHandling
property. Whentrue
, this property prevents the.Surface
property from raising events and calling virtual methods when the instance changes. This is useful forAnimatedScreenSurface
instances that have fast moving animations. - [Core]
Entities.Renderer
renamedEntities.EntityRenderer
. - [Core] The
Entity
type 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]
AsciiKey
used by the keyboard system now detects capslock and shifted state to produce capital or lowercase letters. - [Core]
AsciiKey
exposes a bunch of static dictionaries that help with remapping keys and characters. - [Core]
ColoredGlyph.IsVisible
now setsColoredGlyph.IsDirty
to true when its value changes. - [Core]
Surface.RenderSteps
moved to the renderer. - [Core]
RenderSteps
is now aList
and you must callRenderSteps.Sort(SadConsole.Renderers.RenderStepComparer.Instance)
when the collection is changed. - [Core]
Instructions.DrawString
usesSystem.TimeSpan
now, and is more accurate. - [Core] Effects have a
RunEffectOnApply
property that will run theeffect.Update
method once, with a duration of zero, when the effect is added to a manager. - [Core]
EffectsManager
will 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]
Cursor
has some new methods for erasing:Erase
,EraseUp
,EraseDown
,EraseLeft
,EraseRight
,EraseColumn
,EraseRow
. - [Core] Mouse state object now tracks
*ButtonDownDuration
times. 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
ToLayersComponent
toToCellSurface
. - [Core] Rework
Timer
withStart/Stop/Restart
methods. - [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]
TextBox
rewritten. TheIsNumeric
system was removed and added to a new control:NumberBox
. TheTextBox
no longer has an editing mode and simply starts editing as it's focused and stops editing once it loses focus. - [UI]
ControlBase.IsDirty
property now calls the protectedOnIsDirtyChanged
method which then raises theIsDirtyChanged
event. - [UI]
Panel
control usesCompositeControl
as a base class. Control can draw a border. - [UI]
ProgressBar
is easier to customize. - [ExtendedLib] Border control uses view size now instead of full size of wrapping object.
- [ExtendedLib]
Border.AddToSurface/Window
has been renamed toBorder.CreateForSurface/Window
. - [ExtendedLib]
Entities.EntityManager
renamedEntities.EntityManagerZoned
.
Removed
- [Core]
Algorithms.Line\Circle\Ellipse
have been removed. The latest primitives library provides these methods. - [Core]
Shapes
namespace 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.Configuration
object 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. |
-
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 (7)
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 XNA. Create your own text roguelike (or other) games!
|
Version | Downloads | Last updated | |
---|---|---|---|
10.4.2 | 193 | 10/24/2024 | |
10.4.2-debug | 66 | 10/24/2024 | |
10.4.1 | 1,137 | 6/13/2024 | |
10.4.1-debug | 148 | 6/13/2024 | |
10.4.0 | 1,208 | 3/31/2024 | |
10.4.0-debug | 202 | 3/31/2024 | |
10.0.3 | 460 | 3/14/2024 | |
10.0.3-debug | 257 | 3/14/2024 | |
10.0.2 | 1,564 | 11/10/2023 | |
10.0.2-debug | 875 | 11/10/2023 | |
10.0.1 | 750 | 11/10/2023 | |
10.0.1-debug | 720 | 11/10/2023 | |
10.0.0 | 1,788 | 10/29/2023 | |
10.0.0-debug | 987 | 10/29/2023 | |
10.0.0-beta3-debug | 1,100 | 10/14/2023 | |
10.0.0-beta3 | 1,066 | 10/14/2023 | |
10.0.0-beta2-debug | 1,049 | 10/11/2023 | |
10.0.0-beta2 | 1,070 | 10/11/2023 | |
10.0.0-beta1-debug | 1,077 | 10/11/2023 | |
10.0.0-beta1 | 1,116 | 10/11/2023 | |
10.0.0-alpha4-debug | 1,367 | 8/26/2023 | |
10.0.0-alpha4 | 1,300 | 8/26/2023 | |
10.0.0-alpha3-debug | 1,211 | 8/26/2023 | |
10.0.0-alpha3 | 1,228 | 8/26/2023 | |
10.0.0-alpha2-debug | 1,595 | 6/18/2023 | |
10.0.0-alpha2 | 1,389 | 6/18/2023 | |
10.0.0-alpha1-debug | 1,489 | 6/4/2023 | |
9.2.2 | 5,053 | 1/22/2022 | |
9.2.2-debug | 1,186 | 1/22/2022 | |
9.2.1 | 2,444 | 1/4/2022 | |
9.2.0 | 3,308 | 12/31/2021 | |
9.2.0-debug | 1,078 | 12/31/2021 | |
9.1.1 | 5,394 | 8/7/2021 | |
9.1.1-debug | 1,269 | 8/7/2021 | |
9.1.0 | 2,131 | 7/6/2021 | |
9.1.0-debug | 1,257 | 7/6/2021 | |
9.0.0 | 4,625 | 6/6/2021 | |
9.0.0-debug | 1,241 | 6/6/2021 | |
9.0.0-beta4 | 1,945 | 1/15/2021 | |
9.0.0-beta3 | 2,053 | 12/19/2020 | |
9.0.0-beta2 | 1,573 | 10/9/2020 | |
9.0.0-beta1 | 1,694 | 8/1/2020 | |
9.0.0-alpha9 | 1,705 | 7/25/2020 | |
9.0.0-alpha8 | 1,395 | 7/13/2020 | |
9.0.0-alpha7 | 1,733 | 7/11/2020 | |
9.0.0-alpha6 | 1,748 | 5/28/2020 | |
9.0.0-alpha5 | 1,561 | 5/26/2020 | |
9.0.0-alpha4 | 1,407 | 5/1/2020 | |
9.0.0-alpha3 | 1,603 | 5/1/2020 | |
9.0.0-alpha2 | 1,496 | 3/14/2020 | |
9.0.0-alpha1 | 1,916 | 1/26/2020 | |
8.99.3 | 3,701 | 8/15/2020 | |
8.99.3-debug | 1,449 | 8/15/2020 | |
8.99.2 | 1,774 | 7/14/2020 | |
8.99.2-debug | 1,409 | 7/14/2020 | |
8.99.1 | 2,426 | 4/11/2020 | |
8.99.1-debug | 1,410 | 4/11/2020 | |
8.99.0 | 2,461 | 11/27/2019 | |
8.99.0-debug | 1,404 | 11/27/2019 | |
8.9.1 | 3,829 | 11/5/2019 | |
8.9.1-debug | 1,413 | 11/5/2019 | |
8.9.0 | 2,172 | 9/7/2019 | |
8.9.0-debug | 1,598 | 9/7/2019 | |
8.8.1 | 3,036 | 7/28/2019 | |
8.8.1-debug | 1,576 | 7/28/2019 | |
8.8.0 | 2,353 | 7/27/2019 | |
8.8.0-debug | 1,516 | 7/27/2019 | |
8.7.1 | 1,908 | 6/22/2019 | |
8.7.1-debug | 1,578 | 6/22/2019 | |
8.7.0 | 1,757 | 6/22/2019 | |
8.7.0-debug | 1,597 | 6/22/2019 | |
8.6.0 | 2,036 | 4/14/2019 | |
8.6.0-debug | 1,603 | 4/14/2019 | |
8.5.0 | 1,930 | 4/2/2019 | |
8.5.0-debug | 1,625 | 4/2/2019 | |
8.4.1 | 1,884 | 3/19/2019 | |
8.4.1-debug | 1,664 | 3/19/2019 | |
8.4.0 | 1,751 | 3/17/2019 | |
8.4.0-debug | 1,597 | 3/17/2019 | |
8.3.0 | 1,857 | 3/10/2019 | |
8.3.0-debug | 1,588 | 3/10/2019 | |
8.2.0 | 1,894 | 3/2/2019 | |
8.2.0-debug | 1,668 | 3/2/2019 | |
8.1.0 | 1,853 | 2/28/2019 | |
8.1.0-debug | 1,588 | 2/28/2019 | |
8.0.0 | 1,953 | 2/24/2019 | |
8.0.0-pre5 | 1,640 | 2/19/2019 | |
8.0.0-pre4 | 1,671 | 1/31/2019 | |
8.0.0-pre2 | 1,721 | 12/30/2018 | |
8.0.0-pre1 | 1,688 | 12/30/2018 | |
7.3.0 | 2,015 | 12/29/2018 | |
7.2.0 | 2,107 | 11/20/2018 | |
7.1.0 | 2,140 | 10/19/2018 | |
7.0.4 | 2,087 | 9/8/2018 | |
7.0.3 | 1,948 | 9/8/2018 | |
7.0.2 | 2,304 | 8/31/2018 | |
7.0.0 | 2,067 | 8/29/2018 | |
7.0.0-pre1 | 1,779 | 8/22/2018 | |
6.5.0 | 2,258 | 6/12/2018 | |
6.4.11 | 2,306 | 4/13/2018 | |
6.4.11-pre1 | 2,100 | 4/6/2018 | |
6.4.10 | 2,262 | 3/18/2018 | |
6.4.9 | 2,219 | 3/18/2018 | |
6.4.8 | 2,186 | 3/18/2018 | |
6.4.7 | 2,268 | 3/16/2018 | |
6.4.6 | 2,467 | 2/14/2018 | |
6.4.5 | 2,285 | 2/3/2018 | |
6.4.3 | 2,265 | 11/14/2017 | |
6.4.2 | 2,348 | 8/11/2017 | |
6.4.1 | 2,171 | 8/10/2017 | |
6.4.0 | 2,248 | 7/25/2017 | |
6.3.0 | 2,268 | 6/9/2017 | |
6.2.2 | 2,276 | 5/20/2017 | |
6.2.1 | 2,387 | 4/23/2017 | |
6.2.0 | 2,193 | 4/22/2017 | |
6.1.4 | 2,190 | 4/17/2017 | |
6.1.3 | 2,886 | 4/3/2017 | |
6.1.2 | 2,158 | 4/1/2017 | |
6.1.1 | 2,121 | 4/1/2017 | |
6.1.0 | 2,143 | 3/31/2017 | |
6.0.1 | 2,263 | 3/19/2017 | |
6.0.0 | 2,064 | 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.