Skip to content
CAI
Software that uses CAICheck a score

ForNeVeR/O21

63.5

Adequate · 3 October 2026

4.6k

lines of production code

F#

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

O21 is a .NET-based remake of the 1995 game U95, providing a complete gameplay experience with level rendering, physics, and entity animations. It features a cross-platform command-line interface for launching the game and exporting resources, alongside a robust engine handling input, collision detection, and asynchronous asset loading. The system supports multi-language localization and includes comprehensive unit tests and CI automation to ensure reliability across Linux, macOS, and Windows.

Features

Add U95 game data loading and resource management

The U95 game module now includes the infrastructure to load game assets, including sprites, sounds, levels, and help documentation. This change introduces modules for parsing level data from .DAT files, loading bitmap resources from .DLL and .EXE files, and managing sprite textures using Raylib\_CSharp. It also adds support for loading WAV sound effects and MIDI music, as well as help content from .HLP files or Markdown. The U95Data module orchestrates this loading process, providing a unified interface for accessing game data.

O21.Game/U95 · high confidence

Automated CI workflows and verification scripts

The project now uses a generated CI definition (Scripts/github-actions.fsx) to automate builds, tests, and releases across Linux, macOS, and Windows. This includes new verification scripts: Get-Version.ps1 determines the version from git tags or project files, Test-Encoding.ps1 checks for UTF-8 BOM and CRLF line endings, and Verify-Translations.ps1 ensures translation files match the default language keys.

Scripts · high confidence

Initial game engine, HUD, and content loading implementation

The O21.Game module now provides the core runtime for the game, including a main loop, scene management (Main Menu, Play, Game Over, Help), and a Heads-Up Display (HUD) that renders score, lives, oxygen, and level progress. On-screen touch controls are implemented for mobile or controller-free input, while keyboard input (WASD/Arrows, Space, F2/F3) is supported for desktop. The game loads local UI assets (fonts, textures) and asynchronously downloads and unpacks the primary U-95 game data from a remote archive, verifying integrity via SHA-256. Audio is handled via MeltySynth for MIDI playback, and rendering is powered by Raylib\_CSharp with camera scaling and scissor mode for proper viewport handling.

O21.Game · high confidence

Initial localization support for English, Russian, and Ukrainian

The game now includes translation files for English, Russian, and Ukrainian, covering UI labels (such as Play, Back, Help), loading states, and the legal disclaimer regarding the original U-95 assets. This allows users to interact with the game interface and legal notices in their preferred language.

O21.Game/Localization/Translations · high confidence

Initial release of O21 v0.1.0 with core gameplay and localization

This entry documents the initial release of O21, a remake of the 1995 game U95. The release includes level rendering, a fully working UI and main menu, music, graphics, bonuses, and a functional help system using the original help file. It supports Russian, English, and Ukrainian localization. The project is now distributed under the MIT license with REUSE specification compliance, and the solution structure has been updated to include the game, command-line tool, tests, and documentation.

(repo-wide) · high confidence

Introduce O21 command-line interface with start, export, and help commands

A new command-line interface is added for O21, allowing users to start the game, export resources, and parse WinHelp files. The CLI supports a --no-logo option to suppress the startup banner, defaults to a platform-specific data directory (e.g., %LOCALAPPDATA%\\ForNeVeR\\O21\\data on Windows, \~/.local/share/ForNeVeR/O21/data on Linux), and validates inputs such as screen size dimensions and file paths. Help requests are handled automatically by the underlying library and reported to the error stream.

O21.CommandLine · high confidence

Introduces core game engine with player, enemy, and physics systems

The O21.Game/Engine module now provides the foundational game loop and simulation logic. This includes a Player entity with movement, shooting, lives, score, and a new oxygen system that depletes over time. Enemy behavior is implemented for Fish (with wall-sticking and pathfinding) and Bombs. The engine handles collision detection against bricks, objects, and boundaries, manages bullet lifetimes and explosive variants, and processes bonus collection. A TickEngine wrapper controls time flow, allowing the game to be paused or unparsed, while a ReproducibleRandom generator ensures deterministic gameplay across runs.

O21.Game/Engine · high confidence

New UI components and scene implementations for menus, help, and game-over states

This change introduces the core UI infrastructure and several new game scenes. It adds a reusable Button component with hover/click states and localization support, along with a MinimizeButton for window controls. New scenes include MainMenuScene (with Play, Help, Game Over, and Language switching), HelpScene (with vertical scrolling and bold text support), GameOverScene (with an Ok button to return to the main menu), and PlayScene (the main gameplay loop with HUD, input processing, and level rendering). A WindowRenderer module provides a consistent window frame style used by the Game Over scene.

O21.Game/Scenes · high confidence

New animation system for game entities

The game now uses a dedicated animation system to render entities with proper frame-based visuals. This includes animated movement for the player submarine (adjusting speed and direction), swimming fish, idle bombs, and lifebuoys. Additionally, a new 'OnDying' animation is triggered when enemies are destroyed, and the player submarine displays an explosion effect upon death. The system supports forward and backward playback, looping, and finite count-based animations.

O21.Game/Animations · high confidence

Behavioural changes

Dynamic language discovery and JSON-based localization

The localization system now dynamically discovers available languages by scanning the translations folder for JSON files, rather than relying on hardcoded language lists. It supports loading translations from JSON files and distinguishes between Markdown and WinHelp file types for help content based on the language name (e.g., Russian uses WinHelp). A default language (English) is automatically selected if available.

O21.Game/Localization · high confidence

Help system now supports images in Markdown and WinHelp formats

The Help module has been refactored to render images embedded in both WinHelp (.hlp) files and Markdown help content. New files define a \DocumentFragment\ type that includes an \Image\ variant, and the \HlpFile\ and \MarkdownHelp\ modules now parse bitmap resources from WinHelp archives and Markdown image links respectively, converting them into \Raylib\_CSharp\ textures for display. This change also migrates the underlying library from \Raylib\_CsLo\ to \Raylib\_CSharp\ and adopts \JetBrains.Lifetimes\ for resource management.

O21.Game/Help · high confidence

New asynchronous loading pipeline with disclaimer and download steps

The game now uses a new asynchronous loading architecture in the Loading module, replacing the previous synchronous approach. Users will now see a dedicated loading screen that displays progress status and a percentage, followed by a mandatory legal disclaimer screen where they must explicitly accept or reject terms before proceeding. If content is missing, a new download scene handles data retrieval with progress reporting. This pipeline is orchestrated by a new loading loop that manages the sequence of preloading, disclaimer, downloading, and final loading stages, ensuring proper resource lifetime management and UI updates during these background tasks.

O21.Game/Loading · high confidence

Test coverage

Added unit tests for command-line argument parsing; Added unit tests for game engine, animations, and utilities.

Dependencies

Add .NET global tool configuration for SVG.Skia.Converter

The project now includes a .NET global tools manifest (.config/dotnet-tools.json) that installs the svg.skia.converter tool at version 5.2.3, enabling command-line SVG-to-PNG conversion via the Svg.Skia.Converter command. A corresponding license file (.config/dotnet-tools.json.license) has been added to declare the MIT license for this tool configuration, ensuring REUSE compliance.

.config · high confidence

Initial project structure and dependency setup for .NET 10

This change introduces the foundational project structure for the O21 application, establishing four new project files: the main game library (O21.Game), the command-line interface (O21.CommandLine), and their respective test projects (O21.Tests and O21.CommandLine.Tests). All projects target .NET 10.0 and integrate a specific set of dependencies, including Raylib-CSharp for graphics, MeltySynth for audio, FSharp.Data and FSharp.Formatting for data handling and documentation, and various FVNever.Oddities libraries for legacy file parsing. The test projects are configured with xUnit and Microsoft.NET.Test.Sdk to support unit testing of the game engine and command-line parser.

(dependencies) · high confidence

Housekeeping

Added license files for bundled resources

License files have been added for the Inter font (OFL-1.1), the microGM SoundFont (WTFPL), and the pause sprite (MIT) to ensure REUSE compliance and proper attribution for third-party assets.

O21.Game/Resources · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 64 → 63 (-0.5)
  • Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.

Lenses

  • Code Health 96 → 96 (+0.0)
  • Architecture 100 → 100 (+0.0)
  • Maturity 47 → 47 (-0.1)
  • Readiness 68 → 68 (+0.0)
  • Security 83 → 80 (-3.3)

Resolved (1)

  • Off-boarding risk: anonymized user #1

New (2)

  • Documentation: no project overview (README.md)
  • Off-boarding risk: anonymized user #1

Changes since last survey

  • 2 commits — 2 feature/other, 0 fixes

By area

  • .github/workflows — 1 commit
  • O21.Game/O21.Game.fsproj — 1 commit

Notable commits

  • change: Update dependency JetBrains.Lifetimes to 2026.3.1
  • change: Update dependency ubuntu to v26

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

ForNeVeR/O21 was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 261af22a98a46ed03dc6ea50a9a5f9906b2d0acd — the exact code this score is about.
  • Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-4f4226d619ea.