diff --git a/apps/wolf_3d_cli/lib/cli_game_loop.dart b/apps/wolf_3d_cli/lib/cli_game_loop.dart index 2a6df2e..cc09591 100644 --- a/apps/wolf_3d_cli/lib/cli_game_loop.dart +++ b/apps/wolf_3d_cli/lib/cli_game_loop.dart @@ -25,10 +25,10 @@ class CliGameLoop { 'CliGameLoop requires a CliInput instance.', ), - primaryRenderer = AsciiRenderer( + primaryRenderer = SixelRenderer(), + secondaryRenderer = AsciiRenderer( mode: AsciiRendererMode.terminalAnsi, - ), - secondaryRenderer = SixelRenderer() { + ) { _renderer = primaryRenderer; } @@ -44,6 +44,7 @@ class CliGameLoop { StreamSubscription>? _stdinSubscription; Timer? _timer; bool _isRunning = false; + bool _isSixelAvailable = false; Duration _lastTick = Duration.zero; /// Starts terminal probing, enters raw input mode, and begins the frame timer. @@ -57,6 +58,11 @@ class CliGameLoop { sixel.isSixelSupported = await SixelRenderer.checkTerminalSixelSupport( inputStream: _stdinStream, ); + _isSixelAvailable = sixel.isSixelSupported; + _renderer = _isSixelAvailable ? primaryRenderer : secondaryRenderer; + } else { + _isSixelAvailable = false; + _renderer = secondaryRenderer; } if (stdin.hasTerminal) { @@ -118,6 +124,9 @@ class CliGameLoop { } if (input.matchesRendererToggleShortcut(bytes)) { + if (!_isSixelAvailable) { + return; + } // Allow dynamic renderer-switch bindings configured on the CLI input. _renderer = identical(_renderer, secondaryRenderer) ? primaryRenderer @@ -204,6 +213,9 @@ class CliGameLoop { final int safeCols = cols > 1 ? cols - 1 : cols; final String hint = _buildShortcutHintText(); + if (hint.isEmpty) { + return; + } final String visible = hint.length > safeCols ? hint.substring(0, safeCols) : hint; @@ -214,6 +226,14 @@ class CliGameLoop { } String _buildShortcutHintText() { + if (!_isSixelAvailable) { + if (_renderer is AsciiRenderer) { + final AsciiRenderer ascii = _renderer as AsciiRenderer; + return '<${input.asciiThemeCycleKeyLabel}> ${ascii.activeTheme.name}'; + } + return ''; + } + final String rendererMode = _renderer is SixelRenderer ? 'sixel' : 'ascii'; final String rendererHint = '<${input.rendererToggleKeyLabel}> $rendererMode'; diff --git a/packages/wolf_3d_dart/lib/src/rendering/ascii_renderer.dart b/packages/wolf_3d_dart/lib/src/rendering/ascii_renderer.dart index 5d99c9b..7ffc4bf 100644 --- a/packages/wolf_3d_dart/lib/src/rendering/ascii_renderer.dart +++ b/packages/wolf_3d_dart/lib/src/rendering/ascii_renderer.dart @@ -1327,7 +1327,7 @@ class AsciiRenderer extends CliRendererBackend { } // 1. Pull Retro Colors - final int vgaStatusBarBlue = ColorPalette.vga32Bit[153]; + final int hudBackground = ColorPalette.vga32Bit[0]; final int vgaPanelDark = ColorPalette.vga32Bit[0]; final int white = ColorPalette.vga32Bit[15]; final int yellow = ColorPalette.vga32Bit[11]; @@ -1364,7 +1364,7 @@ class AsciiRenderer extends CliRendererBackend { viewHeight * 2, projectionWidth, hudRows * 2, - vgaStatusBarBlue, + hudBackground, ); _fillTerminalRect( projectionOffsetX, @@ -1380,7 +1380,7 @@ class AsciiRenderer extends CliRendererBackend { width, height - viewHeight, ' ', - vgaStatusBarBlue, + hudBackground, ); _writeString(0, viewHeight, "═" * width, white); } @@ -1481,7 +1481,7 @@ class AsciiRenderer extends CliRendererBackend { } void _drawMinimalHud(WolfEngine engine) { - final int vgaStatusBarBlue = ColorPalette.vga32Bit[153]; + final int hudBackground = ColorPalette.vga32Bit[0]; final int white = ColorPalette.vga32Bit[15]; final int red = ColorPalette.vga32Bit[4]; @@ -1492,7 +1492,7 @@ class AsciiRenderer extends CliRendererBackend { viewHeight * 2, projectionWidth, hudRows * 2, - vgaStatusBarBlue, + hudBackground, ); _fillTerminalRect( projectionOffsetX, @@ -1502,7 +1502,7 @@ class AsciiRenderer extends CliRendererBackend { white, ); } else { - _fillRect(0, viewHeight, width, hudRows, ' ', vgaStatusBarBlue); + _fillRect(0, viewHeight, width, hudRows, ' ', hudBackground); _writeString(0, viewHeight, "═" * width, white); } @@ -1527,7 +1527,7 @@ class AsciiRenderer extends CliRendererBackend { } final int startX = drawStartX + ((drawWidth - clipped.length) ~/ 2); - _writeString(startX, lineY, clipped, healthColor, vgaStatusBarBlue); + _writeString(startX, lineY, clipped, healthColor, hudBackground); } void _drawFullVgaHud(WolfEngine engine) { diff --git a/packages/wolf_3d_dart/lib/src/rendering/sixel_renderer.dart b/packages/wolf_3d_dart/lib/src/rendering/sixel_renderer.dart index a33f0b5..1f028f0 100644 --- a/packages/wolf_3d_dart/lib/src/rendering/sixel_renderer.dart +++ b/packages/wolf_3d_dart/lib/src/rendering/sixel_renderer.dart @@ -34,7 +34,6 @@ class SixelRenderer extends CliRendererBackend { static const int _maxRenderHeight = 240; static const int _menuFooterBottomMargin = 1; static const int _headerHeadingY = 24; - static const String _terminalTealBackground = '\x1b[48;2;0;150;136m'; late Uint8List _screen; List? _mainMenuBandFirstColumn; @@ -877,9 +876,7 @@ class SixelRenderer extends CliRendererBackend { return _renderNotSupportedMessage(); } - final String clearPrefix = _needsBackgroundClear - ? '$_terminalTealBackground\x1b[2J\x1b[0m' - : ''; + final String clearPrefix = _needsBackgroundClear ? '\x1b[0m\x1b[2J' : ''; _needsBackgroundClear = false; return '$clearPrefix\x1b[${_offsetRows + 1};${_offsetColumns + 1}H${toSixelString()}'; }