├── .vscode ├── ltex.dictionary.en-US.txt ├── settings.json ├── launch.json └── tasks.json ├── docs ├── articles │ ├── dev │ │ ├── tutorial.md │ │ ├── features │ │ │ └── audio.md │ │ └── toc.yml │ ├── specs │ │ ├── audio │ │ │ └── vab.md │ │ └── toc.yml │ └── changelog.md ├── images │ ├── favicon.png │ ├── logo_48.png │ └── logo_128.png ├── api │ └── .gitignore ├── .gitignore ├── template │ └── public │ │ ├── main.js │ │ └── main.css ├── toc.yml ├── docfx.json └── index.md ├── .prettierrc.yaml ├── GitVersion.yml ├── src ├── Hinox.Utils │ ├── Program.cs │ └── Hinox.Utils.csproj ├── Directory.Packages.props ├── Tests.runsettings ├── Hinox │ └── Hinox.csproj ├── Hinox.Tests │ └── Hinox.Tests.csproj ├── Directory.Build.props └── Hinox.sln ├── .gitignore ├── .github ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── pull_request_template.md └── workflows │ ├── build-and-release.yml │ ├── build.yml │ └── deploy.yml ├── SECURITY.md ├── .config └── dotnet-tools.json ├── LICENSE ├── GitReleaseManager.yaml ├── CODE_OF_CONDUCT.md ├── README.md ├── CONTRIBUTING.md └── .editorconfig /.vscode/ltex.dictionary.en-US.txt: -------------------------------------------------------------------------------- 1 | Hinox 2 | SceneGate 3 | -------------------------------------------------------------------------------- /docs/articles/dev/tutorial.md: -------------------------------------------------------------------------------- 1 | # Getting started guide 2 | 3 | TODO 4 | -------------------------------------------------------------------------------- /docs/articles/dev/features/audio.md: -------------------------------------------------------------------------------- 1 | # PS1 audio converters 2 | 3 | TODO 4 | -------------------------------------------------------------------------------- /docs/articles/specs/audio/vab.md: -------------------------------------------------------------------------------- 1 | # VAB: Very Audio Binary 2 | 3 | TODO 4 | -------------------------------------------------------------------------------- /docs/articles/changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | To be filled on preview builds. 4 | -------------------------------------------------------------------------------- /docs/articles/specs/toc.yml: -------------------------------------------------------------------------------- 1 | - name: 🔉 audio 2 | - name: 🚧 VAB 3 | href: audio/vab.md 4 | -------------------------------------------------------------------------------- /.prettierrc.yaml: -------------------------------------------------------------------------------- 1 | overrides: 2 | - files: "*.md" 3 | options: 4 | proseWrap: always 5 | -------------------------------------------------------------------------------- /docs/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SceneGate/Hinox/main/docs/images/favicon.png -------------------------------------------------------------------------------- /docs/images/logo_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SceneGate/Hinox/main/docs/images/logo_48.png -------------------------------------------------------------------------------- /docs/api/.gitignore: -------------------------------------------------------------------------------- 1 | ############### 2 | # temp file # 3 | ############### 4 | *.yml 5 | .manifest 6 | -------------------------------------------------------------------------------- /docs/images/logo_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SceneGate/Hinox/main/docs/images/logo_128.png -------------------------------------------------------------------------------- /GitVersion.yml: -------------------------------------------------------------------------------- 1 | mode: ContinuousDeployment 2 | branches: 3 | main: 4 | tag: preview 5 | increment: Patch 6 | -------------------------------------------------------------------------------- /src/Hinox.Utils/Program.cs: -------------------------------------------------------------------------------- 1 | string consoleVersion = typeof(Program).Assembly.GetName()?.Version?.ToString() ?? "0.0.1"; 2 | Console.WriteLine($"Console version: {consoleVersion}"); 3 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | ############### 2 | # folder # 3 | ############### 4 | /**/DROP/ 5 | /**/TEMP/ 6 | /**/packages/ 7 | /**/bin/ 8 | /**/obj/ 9 | _site 10 | 11 | # DrawIO 12 | .$*.drawio* 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build outputs 2 | obj/ 3 | bin/ 4 | build/artifacts/ 5 | build/temp/ 6 | /CHANGELOG.md 7 | /CHANGELOG.NEXT.md 8 | 9 | # IDEs 10 | .vs/ 11 | *.csproj.user 12 | *.DotSettings.user 13 | launchSettings.json 14 | -------------------------------------------------------------------------------- /docs/template/public/main.js: -------------------------------------------------------------------------------- 1 | export default { 2 | iconLinks: [ 3 | { 4 | icon: "github", 5 | href: "https://github.com/SceneGate/Hinox", 6 | title: "GitHub", 7 | }, 8 | ], 9 | }; 10 | -------------------------------------------------------------------------------- /docs/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Dev guides 2 | href: articles/dev/ 3 | 4 | - name: Format specs 5 | href: articles/specs/ 6 | 7 | - name: Changelog 8 | href: articles/changelog.md 9 | 10 | - name: GitHub 11 | href: https://github.com/SceneGate/Hinox 12 | -------------------------------------------------------------------------------- /docs/articles/dev/toc.yml: -------------------------------------------------------------------------------- 1 | - name: ✨ Getting started 2 | - name: Introduction 3 | href: ../../index.md 4 | - name: 🚧 Getting started guide 5 | href: tutorial.md 6 | 7 | - name: ♻️ Converters 8 | - name: 🚧 Audio 9 | href: features/audio.md 10 | 11 | # - name: 📃 API docs 12 | # - name: Namespaces 13 | # href: ../../api/toc.yml 14 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.rulers": [ 3 | 80, 4 | 120 5 | ], 6 | "editor.renderWhitespace": "boundary", 7 | "editor.defaultFormatter": "esbenp.prettier-vscode", 8 | "[markdown]": { 9 | "editor.formatOnSave": true, 10 | }, 11 | "[csharp]": { 12 | "editor.defaultFormatter": "ms-dotnettools.csharp", 13 | "editor.formatOnType": true 14 | }, 15 | "cSpell.words": [ 16 | "Hinox" 17 | ], 18 | } -------------------------------------------------------------------------------- /src/Directory.Packages.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "" 5 | labels: "" 6 | assignees: "" 7 | --- 8 | 9 | ## Goal 10 | 11 | TODO: describe with user stories or a short text the goal of the feature. 12 | 13 | ## Description 14 | 15 | TODO: describe the motivation behind of the idea and what it should do. 16 | 17 | ## Proposed solution 18 | 19 | TODO: add any ideas for the implementation or how it should look like. 20 | 21 | ## Acceptance criteria 22 | 23 | TODO: list of expectations it should pass to close the request. 24 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Only the latest stable version is actively supported with critical bug fixed and 6 | security issues. 7 | 8 | ## Reporting a Vulnerability 9 | 10 | Vulnerabilities can be reported to my personal email address (you can check it 11 | from my [GitHub profile](https://github.com/pleonex)). 12 | 13 | All the security issues will be analyzed and a reply will be given in two 14 | working days. Once the issue is accepted it will be fixed in the current 15 | development branch and for the latest version. A new version would be released. 16 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "" 5 | labels: "" 6 | assignees: "" 7 | --- 8 | 9 | ## Description 10 | 11 | TODO: describe the issue 12 | 13 | ## Reproducer 14 | 15 | TODO: steps to reproduce the behavior. 16 | 17 | ## Expected behavior 18 | 19 | TODO: description of the expected behavior. 20 | 21 | ## Report info 22 | 23 | TODO: if applicable, the full exception stacktrace that you get. 24 | 25 | TODO: if applicable, add screenshots to help explain your problem. 26 | 27 | TODO: describe your environment like OS, app/lib version 28 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | TODO: description of the PR work. 2 | 3 | This PR closes # 4 | 5 | ## Quality check list 6 | 7 | - [ ] Related code has been tested automatically or manually 8 | - [ ] Related documentation is updated 9 | - [ ] I acknowledge I have read and filled this checklist and accept the 10 | [developer certificate of origin](https://developercertificate.org/) 11 | 12 | ## Acceptance criteria 13 | 14 | TODO: list of expectations it has passed from the related issue. 15 | 16 | ## Follow-up work 17 | 18 | TODO: describe any missing or future required work. 19 | 20 | ## Example 21 | 22 | TODO: small code-snippet or screenshot of the work 23 | -------------------------------------------------------------------------------- /src/Tests.runsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cobertura 10 | [.*UnitTest]*,[.*IntegrationTest]* 11 | GeneratedCodeAttribute,ExcludeFromCodeCoverageAttribute 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Hinox/Hinox.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SceneGate.Hinox 5 | Library for PSX (PS1) console standard file formats. 6 | true 7 | 8 | net8.0;net9.0 9 | 10 | SceneGate.Hinox 11 | enable 12 | enable 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Run utils", 9 | "type": "coreclr", 10 | "request": "launch", 11 | "preLaunchTask": "Build", 12 | "program": "${workspaceFolder}/src/Hinox.Utils/bin/Debug/net8.0/HinoxUtils.dll", 13 | "args": [], 14 | "cwd": "${workspaceFolder}", 15 | "stopAtEntry": false, 16 | "console": "internalConsole" 17 | }, 18 | { 19 | "name": ".NET Attach", 20 | "type": "coreclr", 21 | "request": "attach", 22 | "processId": "${command:pickProcess}" 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "gitversion.tool": { 6 | "version": "5.12.0", 7 | "commands": [ 8 | "dotnet-gitversion" 9 | ], 10 | "rollForward": false 11 | }, 12 | "thirdlicense": { 13 | "version": "1.3.1", 14 | "commands": [ 15 | "thirdlicense" 16 | ], 17 | "rollForward": false 18 | }, 19 | "dotnet-reportgenerator-globaltool": { 20 | "version": "5.2.0", 21 | "commands": [ 22 | "reportgenerator" 23 | ], 24 | "rollForward": false 25 | }, 26 | "docfx": { 27 | "version": "2.78.2", 28 | "commands": [ 29 | "docfx" 30 | ], 31 | "rollForward": false 32 | }, 33 | "gitreleasemanager.tool": { 34 | "version": "0.16.0", 35 | "commands": [ 36 | "dotnet-gitreleasemanager" 37 | ], 38 | "rollForward": false 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /src/Hinox.Tests/Hinox.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SceneGate.Hinox.Tests 5 | Tests for Hinox. 6 | 7 | net8.0;net9.0 8 | 9 | SceneGate.Hinox.Tests 10 | false 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "process", 6 | "command": "dotnet", 7 | "args": [ 8 | "run", 9 | "--project", 10 | "build/orchestrator/", 11 | ], 12 | "group": { 13 | "kind": "build", 14 | "isDefault": true 15 | }, 16 | "problemMatcher": ["$msCompile"], 17 | "label": "Build" 18 | }, 19 | { 20 | "type": "process", 21 | "command": "dotnet", 22 | "args": [ 23 | "run", 24 | "--project", 25 | "build/orchestrator/", 26 | "--", 27 | "--target=Bundle" 28 | ], 29 | "group": { 30 | "kind": "build", 31 | }, 32 | "problemMatcher": ["$msCompile"], 33 | "label": "Bundle" 34 | }, 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /docs/template/public/main.css: -------------------------------------------------------------------------------- 1 | /* Changing the site font */ 2 | @import url("https://fonts.googleapis.com/css2?family=Nunito:wght@100;400;700&display=swap"); 3 | @import url("https://fonts.googleapis.com/css2?family=Fira Code&display=swap"); 4 | 5 | :root { 6 | --bs-font-sans-serif: "Nunito"; 7 | --bs-font-monospace: "Fira Code"; 8 | } 9 | 10 | /* Hide breadcrum bar on large screen as it only links to itself */ 11 | @media (min-width: 768px) { 12 | .actionbar { 13 | display: none !important; 14 | } 15 | } 16 | 17 | /* Give more space for section separation in a doc */ 18 | h2 { 19 | margin-top: 2rem !important; 20 | } 21 | 22 | /* Improve TOC with a line for categories (entries without link) */ 23 | .toc span.name-only { 24 | border-bottom-color: var(--bs-tertiary-color) !important; 25 | border-bottom-width: 2px !important; 26 | border-bottom-style: solid !important; 27 | margin-bottom: 0 !important; 28 | margin-top: 0.6rem !important; 29 | } 30 | 31 | .toc span.name-only:first() { 32 | margin-top: 0.4rem !important; 33 | } 34 | -------------------------------------------------------------------------------- /.github/workflows/build-and-release.yml: -------------------------------------------------------------------------------- 1 | name: Build and release 2 | 3 | on: 4 | # Dev 5 | workflow_dispatch: 6 | pull_request: 7 | push: 8 | # Preview 9 | branches: [ main ] 10 | # Stable 11 | tags: [ "v*" ] 12 | 13 | jobs: 14 | build: 15 | name: "Build" 16 | uses: ./.github/workflows/build.yml 17 | with: 18 | dotnet_version: '9.0.101' 19 | 20 | # Preview release on push to main only 21 | # Stable release on version tag push only 22 | deploy: 23 | name: "Deploy" 24 | if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') 25 | needs: build 26 | uses: ./.github/workflows/deploy.yml 27 | with: 28 | dotnet_version: '9.0.101' 29 | azure_nuget_feed: 'https://pkgs.dev.azure.com/SceneGate/SceneGate/_packaging/SceneGate-Preview/nuget/v3/index.json' 30 | secrets: 31 | nuget_preview_token: "az" # Dummy values as we use Azure DevOps only 32 | nuget_stable_token: ${{ secrets.NUGET_FEED_TOKEN }} 33 | azure_nuget_token: ${{ secrets.ADO_NUGET_FEED_TOKEN }} 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 SceneGate 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/Hinox.Utils/Hinox.Utils.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | HinoxUtils 5 | Exe 6 | true 7 | 8 | net8.0 9 | 10 | 11 | SceneGate.Hinox.Utils 12 | true 13 | hinox-utils 14 | 15 | SceneGate.Hinox.Utils 16 | enable 17 | enable 18 | false 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /GitReleaseManager.yaml: -------------------------------------------------------------------------------- 1 | # Configuration values used when creating new releases 2 | create: 3 | include-footer: false 4 | include-sha-section: false 5 | allow-update-to-published: false 6 | 7 | # Configuration values used when exporting release notes 8 | export: 9 | include-created-date-in-title: true 10 | created-date-string-format: MMMM dd, yyyy 11 | perform-regex-removal: false 12 | 13 | # Configuration values used when closing a milestone 14 | close: 15 | use-issue-comments: false 16 | # issue-comment: |- 17 | # :tada: This issue has been resolved in version {milestone} :tada: 18 | # 19 | # The release is available on: 20 | # 21 | # - [GitHub release](https://github.com/{owner}/{repository}/releases/tag/{milestone}) 22 | # 23 | # Your **[GitReleaseManager](https://github.com/GitTools/GitReleaseManager)** bot :package::rocket: 24 | 25 | # The labels that will be used to include issues in release notes. 26 | issue-labels-include: 27 | - Breaking 28 | - Bug 29 | - Duplicate 30 | - Documentation 31 | - Enhancement 32 | - Feature 33 | - Improvement 34 | - Question 35 | 36 | # The labels that will NOT be used when including issues in release notes. 37 | issue-labels-exclude: 38 | - Internal Refactoring 39 | 40 | # Overrides default pluralization and header names for specific labels. 41 | issue-labels-alias: 42 | - name: Documentation 43 | header: Documentation 44 | plural: Documentation 45 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: "Build" 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | dotnet_version: 7 | required: true 8 | type: string 9 | 10 | jobs: 11 | build: 12 | strategy: 13 | matrix: 14 | os: [ ubuntu-latest, macos-latest, windows-latest ] 15 | include: 16 | # By default they are no "main build" but if it matches "os" then yes. 17 | - os: ubuntu-latest 18 | is_main_build: true 19 | name: "${{ matrix.os }}" 20 | runs-on: ${{ matrix.os }} 21 | steps: 22 | - name: "Checkout" 23 | uses: actions/checkout@v4 24 | with: 25 | fetch-depth: 0 # We need full history for version number 26 | 27 | - name: "Setup .NET SDK" 28 | uses: actions/setup-dotnet@v4 29 | with: 30 | dotnet-version: ${{ inputs.dotnet_version }} 31 | 32 | - name: "Build and test" 33 | run: dotnet run --project build/orchestrator -- --target=Default --dotnet-configuration=Release 34 | env: 35 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 36 | 37 | - name: "Bundle" 38 | if: ${{ matrix.is_main_build }} 39 | run: dotnet run --project build/orchestrator -- --target=Bundle --dotnet-configuration=Release 40 | env: 41 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 42 | 43 | - name: "Publish artifacts to CI" 44 | if: ${{ matrix.is_main_build }} 45 | uses: actions/upload-artifact@v4 46 | with: 47 | name: "Artifacts" 48 | retention-days: 7 49 | path: | 50 | build/artifacts/ 51 | !build/artifacts/docs 52 | 53 | - name: Publish docs artifact to CI 54 | if: ${{ matrix.is_main_build }} 55 | uses: actions/upload-pages-artifact@v3 56 | with: 57 | path: build/artifacts/docs 58 | -------------------------------------------------------------------------------- /docs/docfx.json: -------------------------------------------------------------------------------- 1 | { 2 | // "metadata": [ 3 | // { 4 | // "src": [ 5 | // { 6 | // "files": [ 7 | // "Hinox/*.csproj" 8 | // ], 9 | // "src": "../src" 10 | // } 11 | // ], 12 | // "dest": "api", 13 | // "includePrivateMembers": false, 14 | // "disableGitFeatures": false, 15 | // "disableDefaultFilter": false, 16 | // "noRestore": false, 17 | // "namespaceLayout": "flattened", 18 | // "memberLayout": "samePage", 19 | // "EnumSortOrder": "alphabetic", 20 | // "allowCompilationErrors": false 21 | // } 22 | // ], 23 | "build": { 24 | "content": [ 25 | { 26 | "files": [ 27 | "api/**.yml", 28 | "api/index.md" 29 | ] 30 | }, 31 | { "files": "**/*.{md,yml}", "src": "articles", "dest": "docs" }, 32 | { "files": [ "toc.yml", "*.md" ] } 33 | ], 34 | "resource": [ 35 | { 36 | "files": [ "**/images/**", "**/resources/**" ], 37 | "exclude": [ "_site/**", "obj/**" ] 38 | } 39 | ], 40 | "output": "_site", 41 | "globalMetadata": { 42 | "_appTitle": "SceneGate Hinox", 43 | "_appName": "Hinox", 44 | "_appFooter": "Copyright (c) 2025 SceneGate. Docs made with docfx", 45 | "_appLogoPath": "images/logo_48.png", 46 | "_appFaviconPath": "images/favicon.png", 47 | "_enableSearch": true, 48 | "_enableNewTab": true, 49 | "_lang": "en" 50 | }, 51 | "fileMetadataFiles": [], 52 | "template": [ 53 | "default", 54 | "modern", 55 | "template" 56 | ], 57 | "postProcessors": [], 58 | "keepFileLink": false, 59 | "disableGitFeatures": false, 60 | "sitemap": { 61 | "baseUrl": "https://scenegate.github.io/Hinox", 62 | "priority": 0.5, 63 | "changefreq": "monthly" 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | # Hinox [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://choosealicense.com/licenses/mit/) 2 | 3 | _Hinox_ is a library part of the [_SceneGate_](https://github.com/SceneGate) 4 | framework that provides support for _PS1_ (PSX) file formats. 5 | 6 | ## Supported formats 7 | 8 | 🚧 Project in an early development phase. No formats are supported yet. 9 | 10 | ## Usage 11 | 12 | The project provides the following .NET libraries (NuGet packages in nuget.org). 13 | The libraries work on supported versions of .NET. 14 | 15 | - [![SceneGate.Hinox](https://img.shields.io/nuget/v/SceneGate.Hinox?label=SceneGate.Hinox&logo=nuget)](https://www.nuget.org/packages/SceneGate.Hinox) 16 | 🚧 **not ready yet** 17 | - `SceneGate.Hinox.Audio`: audio codecs. 18 | 19 | ### Preview release 20 | 21 | Preview releases can be found in this 22 | [Azure DevOps package repository](https://dev.azure.com/SceneGate/SceneGate/_packaging?_a=feed&feed=SceneGate-Preview). 23 | To use a preview release, create a file `nuget.config` in the same directory of 24 | your solution file (.sln) with the following content: 25 | 26 | ```xml 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | ``` 44 | 45 | ## Special thanks 46 | 47 | The standard file formats were based on the amazing reverse engineering work of 48 | Martin Korth at [PSX Spex](http://problemkaputt.de/psx-spx.htm). 49 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: "Deploy" 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | dotnet_version: 7 | required: true 8 | type: string 9 | azure_nuget_feed: 10 | required: false 11 | type: string 12 | secrets: 13 | nuget_preview_token: 14 | required: false 15 | nuget_stable_token: 16 | required: false 17 | azure_nuget_token: 18 | required: false 19 | 20 | jobs: 21 | upload_doc: 22 | name: "Documentation" 23 | runs-on: "ubuntu-latest" 24 | # Grant GITHUB_TOKEN the permissions required to make a Pages deployment 25 | permissions: 26 | pages: write # to deploy to Pages 27 | id-token: write # to verify the deployment originates from an appropriate source 28 | # Deploy to the github-pages environment 29 | environment: 30 | name: github-pages 31 | url: ${{ steps.deployment.outputs.page_url }} 32 | steps: 33 | - name: Deploy to GitHub Pages 34 | id: deployment 35 | uses: actions/deploy-pages@v4 36 | 37 | push_artifacts: 38 | name: "Artifacts" 39 | runs-on: "ubuntu-latest" 40 | steps: 41 | - name: "Checkout" 42 | uses: actions/checkout@v4 43 | with: 44 | fetch-depth: 0 # We need full history for version number 45 | 46 | - name: "Download artifacts" 47 | uses: actions/download-artifact@v4 48 | with: 49 | name: "Artifacts" 50 | path: "./build/artifacts/" 51 | 52 | - name: "Setup .NET SDK" 53 | uses: actions/setup-dotnet@v4 54 | with: 55 | dotnet-version: ${{ inputs.dotnet_version }} 56 | 57 | # Weird way to authenticate in Azure DevOps Artifacts 58 | # Then, we need to setup VSS_NUGET_EXTERNAL_FEED_ENDPOINTS 59 | - name: "Install Azure Artifacts Credential Provider" 60 | run: wget -qO- https://aka.ms/install-artifacts-credprovider.sh | bash 61 | 62 | - name: "Deploy artifacts" 63 | run: dotnet run --project build/orchestrator -- --target=Deploy 64 | env: 65 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 66 | STABLE_NUGET_FEED_TOKEN: ${{ secrets.nuget_stable_token }} 67 | PREVIEW_NUGET_FEED_TOKEN: ${{ secrets.nuget_preview_token }} 68 | VSS_NUGET_EXTERNAL_FEED_ENDPOINTS: '{"endpointCredentials": [{"endpoint":"${{ inputs.azure_nuget_feed }}", "username":"", "password":"${{ secrets.azure_nuget_token }}"}]}' 69 | -------------------------------------------------------------------------------- /src/Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | SceneGate 4 | scenegate 5 | None 6 | Copyright (C) 2025 SceneGate 7 | 8 | true 9 | 10 | 12 | false 13 | 14 | 15 | 16 | MIT 17 | https://scenegate.github.io/Hinox 18 | https://github.com/SceneGate/Hinox 19 | icon.png 20 | reverse-engineering;romhacking;rom-hacking;ps1;psx; 21 | README.md 22 | 23 | 24 | 25 | 26 | 27 | true 28 | 29 | 30 | true 31 | 32 | 38 | embedded 39 | 40 | 41 | true 42 | true 43 | 44 | 45 | 46 | 47 | true 48 | true 49 | latest 50 | true 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at . The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hinox 2 | 3 | 4 |

5 | 6 | Stable version 7 | 8 |   9 | 10 | GitHub commits since latest release (by SemVer) 11 | 12 |   13 | 14 | Build and release 15 | 16 |   17 | 18 | MIT License 19 | 20 |   21 |

22 | 23 | _Hinox_ is a library part of the [_SceneGate_](https://github.com/SceneGate) 24 | framework that provides support for **PS1 (PSX) file formats.** 25 | 26 | ## Supported formats 27 | 28 | 🚧 Project in an early development phase. No formats are supported yet. 29 | 30 | ## Usage 31 | 32 | The project provides the following .NET libraries (NuGet packages in nuget.org). 33 | The libraries work on supported versions of .NET. 34 | 35 | - [![SceneGate.Hinox](https://img.shields.io/nuget/v/SceneGate.Hinox?label=SceneGate.Hinox&logo=nuget)](https://www.nuget.org/packages/SceneGate.Hinox) 36 | 🚧 **not ready yet** 37 | - `SceneGate.Hinox.Audio`: audio codecs. 38 | 39 | Preview releases can be found in this 40 | [Azure DevOps package repository](https://dev.azure.com/SceneGate/SceneGate/_packaging?_a=feed&feed=SceneGate-Preview). 41 | To use a preview release, create a file `nuget.config` in the same directory of 42 | your solution file (.sln) with the following content: 43 | 44 | ```xml 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | ``` 62 | 63 | ## Documentation 64 | 65 | Documentation is not yet available, but it will be published in the 66 | [project website](https://scenegate.github.io/Hinox). 67 | 68 | Don't hesitate to ask questions in the 69 | [project Discussion site!](https://github.com/SceneGate/Hinox/discussions) 70 | 71 | ## Build 72 | 73 | The project requires .NET 9.0 SDK to build. 74 | 75 | To build, test and generate artifacts run: 76 | 77 | ```sh 78 | # Build and run tests 79 | dotnet run --project build/orchestrator 80 | 81 | # (Optional) Create bundles (nuget, zips, docs) 82 | dotnet run --project build/orchestrator -- --target=Bundle 83 | ``` 84 | 85 | To build the documentation only, run: 86 | 87 | ```sh 88 | dotnet docfx docs/docfx.json --serve 89 | ``` 90 | 91 | ## Special thanks 92 | 93 | The standard file formats were based on the amazing reverse engineering work of 94 | Martin Korth at [PSX Spex](http://problemkaputt.de/psx-spx.htm). 95 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing guidelines 2 | 3 | Thanks for taking the time to contribute! :sparkles: 4 | 5 | In this document you will find all the information you need to make sure that 6 | the projects continues to be consistent and with great quality! 7 | 8 | > [!NOTE] 9 | > By contributing in this repository you accept the 10 | > [developer certificate of origin](https://developercertificate.org/). 11 | 12 | ## Reporting features and issues 13 | 14 | ### Issues 15 | 16 | When reporting a problem, be as specific as possible. Ideally, you should 17 | provide an small snippet of code that reproduces the issue. 18 | 19 | Please fill the default template so we can have all the required information to 20 | address the issue. 21 | 22 | ### Features 23 | 24 | Features are requested and handled as GitHub _issues_. 25 | 26 | If you want to ask for a new feature, first make sure it hasn't been reported 27 | yet by using the search box in the issue tab. Make sure that the feature aligns 28 | with the direction of the project. 29 | 30 | ## Pull Request 31 | 32 | Before starting a pull request, create an issue 33 | [requesting the feature](#features) you would like to see and implement. If you 34 | are fixing a bug, create also an issue to be able to track the problem. 35 | 36 | In the issue or feature request specify that that you would like to work on it. 37 | The team will reply as soon as possible to discuss the proposal. This guarantee 38 | the Pull Request implementation match the direction the project is going. 39 | 40 | In general, the process to create a pull request is: 41 | 42 | 1. Create an issue describing the bug or feature and state you would like to 43 | work on that. 44 | 2. The team will cheer you and/or discuss with you the issue. 45 | 3. Fork the project (if not done already). 46 | 4. Clone your forked project and create a git branch. 47 | 5. Make the necessary code changes in as many commits as you want. The commit 48 | message should follow this convention: 49 | 50 | ```plain 51 | :emoji: Short description #IssueID 52 | 53 | Long description if needed. 54 | ``` 55 | 56 | 6. Create a pull request. After reviewing your changes and making any new 57 | commits if needed, the team will approve and merge it. 58 | 59 | For a complete list of emoji description see 60 | [this repository](https://github.com/slashsBin/styleguide-git-commit-message#suggested-emojis). 61 | 62 | ## Code Guidelines 63 | 64 | The project includes a `.editorconfig` file that ensures the code style is 65 | consistent. It is supported in any modern IDE. 66 | 67 | In general, we follow the following standard guidelines with custom changes: 68 | 69 | - [Mono Code Guidelines](https://raw.githubusercontent.com/mono/website/gh-pages/community/contributing/coding-guidelines.md). 70 | - [Microsoft Framework Design Guidelines](https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/) 71 | - [Microsoft C# Coding Convetions](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/inside-a-program/coding-conventions). 72 | 73 | And as the 74 | [mono team says](https://www.mono-project.com/community/contributing/coding-guidelines/#performance-and-readability): 75 | 76 | - It is more important to be correct than to be fast. 77 | - It is more important to be maintainable than to be fast. 78 | - Fast code that is difficult to maintain is likely going to be looked down 79 | upon. 80 | 81 | Make sure to follow these tips: 82 | 83 | - :heavy_check_mark: **DO** write documentation for any public type and method. 84 | - :heavy_check_mark: **DO** write a test for all the possible code branches of 85 | your methods. Use a TDD approach. 86 | - :heavy_check_mark: **DO** seek for the maximum test coverage. 87 | - :heavy_check_mark: **DO** clean compiler warning. 88 | -------------------------------------------------------------------------------- /src/Hinox.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.26124.0 5 | MinimumVisualStudioVersion = 15.0.26124.0 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hinox", "Hinox\Hinox.csproj", "{07E6EBB9-380D-4813-AFCD-E5856501929A}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hinox.Utils", "Hinox.Utils/Hinox.Utils.csproj", "{CB7B12D4-90B6-4564-8ECC-B6954E61A11F}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hinox.Tests", "Hinox.Tests\Hinox.Tests.csproj", "{276997DA-06FC-4C8A-AA82-92C3373C69A3}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|Any CPU = Debug|Any CPU 15 | Debug|x64 = Debug|x64 16 | Debug|x86 = Debug|x86 17 | Release|Any CPU = Release|Any CPU 18 | Release|x64 = Release|x64 19 | Release|x86 = Release|x86 20 | EndGlobalSection 21 | GlobalSection(SolutionProperties) = preSolution 22 | HideSolutionNode = FALSE 23 | EndGlobalSection 24 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 25 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 26 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Debug|Any CPU.Build.0 = Debug|Any CPU 27 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Debug|x64.ActiveCfg = Debug|Any CPU 28 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Debug|x64.Build.0 = Debug|Any CPU 29 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Debug|x86.ActiveCfg = Debug|Any CPU 30 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Debug|x86.Build.0 = Debug|Any CPU 31 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Release|Any CPU.ActiveCfg = Release|Any CPU 32 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Release|Any CPU.Build.0 = Release|Any CPU 33 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Release|x64.ActiveCfg = Release|Any CPU 34 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Release|x64.Build.0 = Release|Any CPU 35 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Release|x86.ActiveCfg = Release|Any CPU 36 | {07E6EBB9-380D-4813-AFCD-E5856501929A}.Release|x86.Build.0 = Release|Any CPU 37 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 38 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Debug|Any CPU.Build.0 = Debug|Any CPU 39 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Debug|x64.ActiveCfg = Debug|Any CPU 40 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Debug|x64.Build.0 = Debug|Any CPU 41 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Debug|x86.ActiveCfg = Debug|Any CPU 42 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Debug|x86.Build.0 = Debug|Any CPU 43 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Release|Any CPU.ActiveCfg = Release|Any CPU 44 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Release|Any CPU.Build.0 = Release|Any CPU 45 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Release|x64.ActiveCfg = Release|Any CPU 46 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Release|x64.Build.0 = Release|Any CPU 47 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Release|x86.ActiveCfg = Release|Any CPU 48 | {CB7B12D4-90B6-4564-8ECC-B6954E61A11F}.Release|x86.Build.0 = Release|Any CPU 49 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 50 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Debug|Any CPU.Build.0 = Debug|Any CPU 51 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Debug|x64.ActiveCfg = Debug|Any CPU 52 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Debug|x64.Build.0 = Debug|Any CPU 53 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Debug|x86.ActiveCfg = Debug|Any CPU 54 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Debug|x86.Build.0 = Debug|Any CPU 55 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Release|Any CPU.ActiveCfg = Release|Any CPU 56 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Release|Any CPU.Build.0 = Release|Any CPU 57 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Release|x64.ActiveCfg = Release|Any CPU 58 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Release|x64.Build.0 = Release|Any CPU 59 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Release|x86.ActiveCfg = Release|Any CPU 60 | {276997DA-06FC-4C8A-AA82-92C3373C69A3}.Release|x86.Build.0 = Release|Any CPU 61 | EndGlobalSection 62 | EndGlobal 63 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Top-level config file 2 | root = true 3 | 4 | # All files 5 | [*] 6 | indent_style = space 7 | 8 | [*.yml] 9 | indent_size = 2 10 | 11 | [*.md] 12 | charset = utf-8 13 | insert_final_newline = true 14 | end_of_line = unset # Leave it to git 15 | indent_style = space 16 | indent_size = 2 17 | max_line_length = 80 18 | 19 | # XML project files 20 | [*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}] 21 | indent_size = 2 22 | 23 | # XML config files 24 | [*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}] 25 | indent_size = 2 26 | 27 | # Generic C# files 28 | [*.{cs,vb}] 29 | 30 | ## Generic options 31 | charset = utf-8-bom 32 | indent_size = 4 33 | indent_style = space 34 | tab_width = 8 35 | trim_trailing_whitespace = true 36 | end_of_line = unset # Leave it to git 37 | insert_final_newline = true 38 | 39 | ## .NET style rules 40 | ### Organize usings 41 | dotnet_separate_import_directive_groups = false 42 | dotnet_sort_system_directives_first = true 43 | file_header_template = unset # too long to set here 44 | 45 | ### this. and Me. qualifiers 46 | dotnet_style_qualification_for_field = false:silent 47 | dotnet_style_qualification_for_property = false:silent 48 | dotnet_style_qualification_for_method = false:silent 49 | dotnet_style_qualification_for_event = false:silent 50 | 51 | ### Language keywords instead of framework type names for type references 52 | dotnet_style_predefined_type_for_locals_parameters_members = true:warning 53 | dotnet_style_predefined_type_for_member_access = true:warning 54 | 55 | ### Modifier preferences 56 | dotnet_style_require_accessibility_modifiers = for_non_interface_members:warning 57 | dotnet_diagnostic.SA1400.severity = warning # it doesn't follow the above value 58 | dotnet_style_readonly_field = true:warning 59 | 60 | ### Parentheses preferences 61 | dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning 62 | dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning 63 | dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning 64 | dotnet_style_parentheses_in_other_operators = never_if_unnecessary:warning 65 | 66 | ### Expression-level preferences 67 | dotnet_style_object_initializer = true:suggestion 68 | dotnet_style_collection_initializer = true:warning 69 | dotnet_style_explicit_tuple_names = true:warning 70 | dotnet_style_prefer_inferred_tuple_names = true:suggestion 71 | dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion 72 | dotnet_style_prefer_auto_properties = true:suggestion 73 | dotnet_style_prefer_conditional_expression_over_assignment = true:warning 74 | dotnet_style_prefer_conditional_expression_over_return = true:warning 75 | dotnet_style_prefer_compound_assignment = true:suggestion 76 | dotnet_style_prefer_simplified_interpolation = true:warning 77 | dotnet_style_prefer_simplified_boolean_expressions = true:warning 78 | dotnet_style_operator_placement_when_wrapping = end_of_line 79 | 80 | ### Null-checking preferences 81 | dotnet_style_coalesce_expression = true:suggestion 82 | dotnet_style_null_propagation = true:warning 83 | dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning 84 | 85 | ### Unnecessary code rules 86 | dotnet_code_quality_unused_parameters = all:warning 87 | dotnet_remove_unnecessary_suppression_exclusions = none 88 | 89 | ## C# style rules 90 | ### var preferences 91 | csharp_style_var_for_built_in_types = false:warning 92 | csharp_style_var_when_type_is_apparent = true:suggestion 93 | csharp_style_var_elsewhere = false:suggestion 94 | dotnet_diagnostic.IDE0008.severity = suggestion # Doesn't follow above values 95 | 96 | ### Expression-bodied members 97 | csharp_style_expression_bodied_methods = false 98 | csharp_style_expression_bodied_constructors = false:suggestion 99 | csharp_style_expression_bodied_operators = true:suggestion 100 | csharp_style_expression_bodied_properties = when_on_single_line:suggestion 101 | csharp_style_expression_bodied_indexers = when_on_single_line:suggestion 102 | csharp_style_expression_bodied_accessors = when_on_single_line:suggestion 103 | csharp_style_expression_bodied_lambdas = when_on_single_line:suggestion 104 | csharp_style_expression_bodied_local_functions = when_on_single_line:suggestion 105 | 106 | ### Pattern matching preferences 107 | csharp_style_pattern_matching_over_is_with_cast_check = true:warning 108 | csharp_style_pattern_matching_over_as_with_null_check = true:warning 109 | csharp_style_prefer_switch_expression = true:suggestion 110 | csharp_style_prefer_pattern_matching = true:suggestion 111 | csharp_style_prefer_not_pattern = true:warning 112 | csharp_style_prefer_null_check_over_type_check = true:suggestion 113 | 114 | ### Expression-level preferences 115 | csharp_style_inlined_variable_declaration = true:warning 116 | csharp_prefer_simple_default_expression = true:suggestion 117 | csharp_style_pattern_local_over_anonymous_function = true:warning 118 | csharp_style_deconstructed_variable_declaration = true:suggestion 119 | csharp_style_prefer_index_operator = true:warning 120 | csharp_style_prefer_range_operator = true:warning 121 | csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion 122 | csharp_style_unused_value_assignment_preference = discard_variable:warning 123 | csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion 124 | csharp_style_prefer_method_group_conversion = true:suggestion 125 | csharp_style_prefer_local_over_anonymous_function = true:suggestion 126 | 127 | ### Null-checking preferences 128 | csharp_style_throw_expression = true:warning 129 | csharp_style_conditional_delegate_call = true:warning 130 | 131 | ### Code-block preferences 132 | csharp_prefer_braces = true:warning 133 | dotnet_diagnostic.SA1503.severity = warning # Doesn't follow above value 134 | csharp_prefer_simple_using_statement = true:suggestion 135 | csharp_style_prefer_tuple_swap = true:suggestion 136 | 137 | ### 'using' directive preferences 138 | csharp_using_directive_placement = inside_namespace:warning 139 | dotnet_diagnostic.SA1200.severity = warning # Doesn't follow above value 140 | 141 | ### Modifier preferences 142 | csharp_prefer_static_local_function = true:warning 143 | csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:warning 144 | 145 | ### New C# features 146 | csharp_style_prefer_primary_constructors = true:suggestion 147 | csharp_style_prefer_utf8_string_literals = true:suggestion 148 | csharp_style_prefer_readonly_struct = true:suggestion 149 | csharp_style_prefer_readonly_struct_member = true:suggestion 150 | 151 | ## C# formatting rules 152 | ### New line preferences 153 | csharp_new_line_before_open_brace = methods,types 154 | csharp_new_line_before_else = false 155 | csharp_new_line_before_catch = false 156 | csharp_new_line_before_finally = false 157 | csharp_new_line_before_members_in_object_initializers = true 158 | csharp_new_line_before_members_in_anonymous_types = true 159 | csharp_new_line_between_query_expression_clauses = true 160 | 161 | ### Indentation preferences 162 | csharp_indent_case_contents = true 163 | csharp_indent_switch_labels = true 164 | csharp_indent_labels = one_less_than_current 165 | csharp_indent_block_contents = true 166 | csharp_indent_braces = false 167 | csharp_indent_case_contents_when_block = false 168 | csharp_style_namespace_declarations = file_scoped 169 | 170 | ### Spacing preferences 171 | csharp_space_after_cast = false 172 | csharp_space_after_keywords_in_control_flow_statements = true 173 | csharp_space_between_parentheses = false 174 | csharp_space_before_colon_in_inheritance_clause = true 175 | csharp_space_after_colon_in_inheritance_clause = true 176 | csharp_space_around_binary_operators = before_and_after 177 | csharp_space_between_method_declaration_parameter_list_parentheses = false 178 | csharp_space_between_method_declaration_empty_parameter_list_parentheses = false 179 | csharp_space_between_method_declaration_name_and_open_parenthesis = false 180 | csharp_space_between_method_call_parameter_list_parentheses = false 181 | csharp_space_between_method_call_empty_parameter_list_parentheses = false 182 | csharp_space_between_method_call_name_and_opening_parenthesis = false 183 | csharp_space_after_comma = true 184 | csharp_space_before_comma = false 185 | csharp_space_after_dot = false 186 | csharp_space_before_dot = false 187 | csharp_space_after_semicolon_in_for_statement = true 188 | csharp_space_before_semicolon_in_for_statement = false 189 | csharp_space_around_declaration_statements = false 190 | csharp_space_before_open_square_brackets = false 191 | csharp_space_between_empty_square_brackets = false 192 | csharp_space_between_square_brackets = false 193 | 194 | ### Wrapping preferences 195 | csharp_preserve_single_line_statements = false 196 | csharp_preserve_single_line_blocks = true 197 | 198 | ### Top level statement 199 | csharp_style_prefer_top_level_statements = true:silent 200 | 201 | ## Naming styles rules 202 | dotnet_style_namespace_match_folder = true:warning 203 | dotnet_diagnostic.IDE1006.severity = warning 204 | 205 | dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning 206 | dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface 207 | dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i 208 | dotnet_naming_style.begins_with_i.required_prefix = I 209 | dotnet_naming_style.begins_with_i.required_suffix = 210 | dotnet_naming_style.begins_with_i.word_separator = 211 | dotnet_naming_style.begins_with_i.capitalization = pascal_case 212 | 213 | dotnet_naming_rule.types_should_be_pascal_case.severity = warning 214 | dotnet_naming_rule.types_should_be_pascal_case.symbols = types 215 | dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case 216 | dotnet_naming_style.pascal_case.required_prefix = 217 | dotnet_naming_style.pascal_case.required_suffix = 218 | dotnet_naming_style.pascal_case.word_separator = 219 | dotnet_naming_style.pascal_case.capitalization = pascal_case 220 | 221 | dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning 222 | dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members 223 | dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case 224 | 225 | ### Symbol specifications 226 | dotnet_naming_symbols.interface.applicable_kinds = interface 227 | dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected 228 | dotnet_naming_symbols.interface.required_modifiers = 229 | 230 | dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum 231 | dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected 232 | dotnet_naming_symbols.types.required_modifiers = 233 | 234 | dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method 235 | dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected 236 | dotnet_naming_symbols.non_field_members.required_modifiers = 237 | 238 | ## Code analyzers 239 | ### .NET SDK 240 | dotnet_diagnostic.CA1303.severity = none # We don't translate exception and log messages from English 241 | dotnet_diagnostic.SA1025.severity = none # Allow spaces in comments to structure info 242 | dotnet_diagnostic.IDE0045.severity = suggestion # Simplify ifs 243 | dotnet_diagnostic.IDE0046.severity = suggestion # Simplify ifs 244 | dotnet_diagnostic.IDE0057.severity = suggestion # Slice can be simplified 245 | 246 | ### StyleCop 247 | dotnet_diagnostic.SA1101.severity = none # Do not force to prefix local calls with 'this' 248 | dotnet_diagnostic.SA1204.severity = suggestion # Static methods should be before non-static 249 | dotnet_diagnostic.SA1500.severity = none # Allow inline braces 250 | dotnet_diagnostic.SA1633.severity = none # No XML-format header in source files 251 | 252 | ### SonarAnalyzer 253 | dotnet_diagnostic.S1133.severity = suggestion # Remove deprecated code -.-' I know, some day 254 | dotnet_diagnostic.S1135.severity = suggestion # It's almost inevitable to have TODO but add bug ID 255 | 256 | # Special rules for test projects 257 | [src/*Tests/**] 258 | dotnet_diagnostic.CS1591.severity = none # Disable documentation 259 | dotnet_diagnostic.CA1001.severity = none # No need to implement IDisposable in test classes with cleanup. 260 | dotnet_diagnostic.CA1034.severity = none # Public types in test classes for testing implementations 261 | dotnet_diagnostic.CA1040.severity = none # Empty interfaces for testing 262 | dotnet_diagnostic.CA1062.severity = none # No need to validate args in test methods 263 | dotnet_diagnostic.CA1305.severity = none # No culture method for quick test code 264 | dotnet_diagnostic.CA1307.severity = none # No culture method for quick test code 265 | dotnet_diagnostic.SA0001.severity = none # Disable documentation 266 | dotnet_diagnostic.SA1600.severity = none # Disable documentation 267 | dotnet_diagnostic.SA1601.severity = none # Disable documentation 268 | dotnet_diagnostic.SA1602.severity = none # Disable documentation 269 | dotnet_diagnostic.SA1201.severity = none # Allow enums inside classes 270 | dotnet_diagnostic.S1144.severity = none # Remove unused setter 271 | dotnet_diagnostic.S2094.severity = none # Remove empty class 272 | dotnet_diagnostic.S2699.severity = none # Assert may be in helper methods 273 | dotnet_diagnostic.S3966.severity = none # Dispose twice to test implementation 274 | dotnet_code_quality_unused_parameters = all:none # Some test methods may not use all the source args 275 | --------------------------------------------------------------------------------