<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://snmetamorph.github.io/posts</id>
    <title>SNMetamorph's Blog Blog</title>
    <updated>2025-12-28T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://snmetamorph.github.io/posts"/>
    <subtitle>SNMetamorph's Blog Blog</subtitle>
    <icon>https://snmetamorph.github.io/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Xash3D FWGS Status Update - December 2025]]></title>
        <id>https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025</id>
        <link href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025"/>
        <updated>2025-12-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Detailed overview of changes that were made during development of Xash3D FWGS engine in 2025 year.]]></summary>
        <content type="html"><![CDATA[<p>This is a detailed overview of the changes that were made during the development of Xash3D FWGS engine in this year. I would also recommend checking out the previous development overviews that were made for <a href="https://velaron.github.io/xash3d-fwgs-november-2022.html" target="_blank" rel="noopener noreferrer">2022</a>, <a href="https://velaron.github.io/xash3d-fwgs-november-2023.html" target="_blank" rel="noopener noreferrer">2023</a> and <a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024">2024</a> years.</p>
<h1>Consider Donating</h1>
<ul>
<li><a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a> - initial Xash3D SDL2/Linux port author, Xash3D FWGS engine maintainer, creator of non-commercial Flying With Gauss organization<!-- -->
<ul>
<li><a href="https://boosty.to/a1ba" target="_blank" rel="noopener noreferrer">Boosty page</a></li>
</ul>
</li>
<li><a href="https://github.com/nekonomicon" target="_blank" rel="noopener noreferrer"><strong>nekonomicon</strong></a> - maintainer of <a href="https://github.com/FWGS/hlsdk-portable" target="_blank" rel="noopener noreferrer">hlsdk-portable</a>, <a href="https://github.com/FWGS/xash3d-fwgs/tree/master/utils/mdldec" target="_blank" rel="noopener noreferrer">mdldec</a>, <a href="https://github.com/FWGS/xash3d-fwgs/blob/master/Documentation/opensource-mods.md" target="_blank" rel="noopener noreferrer">opensource-mods.md</a> and Xash3D FWGS <a href="https://github.com/FWGS/xash3d-fwgs/commits?author=nekonomicon" target="_blank" rel="noopener noreferrer">contributor</a> (*BSD/clang port, PNG support, etc)<!-- -->
<ul>
<li><a href="https://boosty.to/nekonomicon" target="_blank" rel="noopener noreferrer">Boosty page</a></li>
</ul>
</li>
<li><a href="https://github.com/Velaron" target="_blank" rel="noopener noreferrer"><strong>Velaron</strong></a> - maintainer of <a href="https://github.com/Velaron/cs16-client" target="_blank" rel="noopener noreferrer">cs16-client</a> &amp; <a href="https://github.com/Velaron/tf15-client" target="_blank" rel="noopener noreferrer">tf15-client</a> and Xash3D FWGS <a href="https://github.com/FWGS/xash3d-fwgs/commits?author=Velaron" target="_blank" rel="noopener noreferrer">contributor</a> (Android port, voice chat, etc)<!-- -->
<ul>
<li><a href="https://www.buymeacoffee.com/velaron" target="_blank" rel="noopener noreferrer">Buy Me A Coffee page</a></li>
</ul>
</li>
<li><a href="https://github.com/SNMetamorph" target="_blank" rel="noopener noreferrer"><strong>SNMetamorph</strong></a> - maintainer of <a href="https://github.com/SNMetamorph/PrimeXT" target="_blank" rel="noopener noreferrer">PrimeXT</a> &amp; <a href="https://github.com/SNMetamorph/goldsrc-monitor" target="_blank" rel="noopener noreferrer">GoldSrc Monitor</a> and Xash3D FWGS <a href="https://github.com/FWGS/xash3d-fwgs/commits?author=SNMetamorph" target="_blank" rel="noopener noreferrer">contributor</a> (Windows port, voice chat, etc)<!-- -->
<ul>
<li><a href="https://boosty.to/snmetamorph" target="_blank" rel="noopener noreferrer">Boosty page</a></li>
<li><a href="https://snmetamorph.github.io/donate">Other donation methods</a></li>
</ul>
</li>
<li><a href="https://github.com/Vladislav4KZ" target="_blank" rel="noopener noreferrer"><strong>$_Vladislav</strong></a> - tester of Xash3D FWGS, <a href="https://github.com/yapb" target="_blank" rel="noopener noreferrer">YaPB Project</a> member, editor of the <a href="https://github.com/yapb/docs" target="_blank" rel="noopener noreferrer">Official YaPB Documentation</a> (in English and Russian), curator of the <a href="https://github.com/yapb/graph" target="_blank" rel="noopener noreferrer">YaPB Graph Database</a> and author of <a href="https://gamebanana.com/mods/40087" target="_blank" rel="noopener noreferrer">YaPB Waypoint/Graph Pack</a>. Also does the Russian localization of text, images (gfx/shell), as well as additional menu buttons in English used in Xash3D FWGS for various mods.<!-- -->
<ul>
<li><a href="https://boosty.to/rasstaman1337" target="_blank" rel="noopener noreferrer">Boosty page</a></li>
</ul>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="diffusion-the-first-large-scale-standalone-game-released-on-xash3d-fwgs">Diffusion: the first large-scale standalone game released on Xash3D FWGS<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#diffusion-the-first-large-scale-standalone-game-released-on-xash3d-fwgs" class="hash-link" aria-label="Direct link to Diffusion: the first large-scale standalone game released on Xash3D FWGS" title="Direct link to Diffusion: the first large-scale standalone game released on Xash3D FWGS">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-aynekko">by <a href="https://github.com/Aynekko" target="_blank" rel="noopener noreferrer"><strong>Aynekko</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-aynekko" class="hash-link" aria-label="Direct link to by-aynekko" title="Direct link to by-aynekko">​</a></h5>
<p>At November 22, Diffusion mod was finally released after almost 10 year of development. This is the most large and detailed mod with unique lore and setting, and the first standalone game released on Xash3D FWGS.</p>
<p>Highly recommend to check at this mod on <a href="https://www.moddb.com/mods/diffusion" target="_blank" rel="noopener noreferrer">ModDB page</a>, if you didn't yet. Also, this mod took 2nd place at <a href="https://www.moddb.com/groups/2025-mod-of-the-year-awards/features/players-choice-mod-of-the-year-2025" target="_blank" rel="noopener noreferrer">Mod of the Year 2025 Awards on ModDB</a>!</p>
<p><img decoding="async" loading="lazy" alt="Diffusion main menu" src="https://snmetamorph.github.io/assets/images/diffusion-main-menu-3deab14041f8096465a436815cf8e376.jpg" width="1920" height="1080" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ps-vita-port-improvements">PS Vita port improvements<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#ps-vita-port-improvements" class="hash-link" aria-label="Direct link to PS Vita port improvements" title="Direct link to PS Vita port improvements">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-snmetamorph">by <a href="https://github.com/SNMetamorph" target="_blank" rel="noopener noreferrer"><strong>SNMetamorph</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-snmetamorph" class="hash-link" aria-label="Direct link to by-snmetamorph" title="Direct link to by-snmetamorph">​</a></h5>
<p>This year, cs16client was ported to PS Vita, attracting a lot of people attention, especially on Reddit. But just compiling it for PS Vita was not enough, to make it playable a bunch of things were changed: touch settings fine-tuned, voice chat was enabled by default, brand-new touch controls layout for PS Vita &amp; Nintendo Switch was made, documentation for touch controls was written too.</p>
<p>In addition, the acquisition of a unique Console ID (CID) for the PS Vita platform has been implemented to generate a unique XashID to avoid ID collisions between different clients playing on the same platform.</p>
<p><img decoding="async" loading="lazy" alt="cs16client running on PS Vita" src="https://snmetamorph.github.io/assets/images/cs-vita-port-938ccc5dc6138b7d25b570834d9b8e7c.jpg" width="2560" height="1240" class="img_ev3q"></p>
<div style="width:100%;height:100%"></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="metamod-fwgs-cross-platform-metamod-r-fork">Metamod-FWGS: cross-platform Metamod-R fork<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#metamod-fwgs-cross-platform-metamod-r-fork" class="hash-link" aria-label="Direct link to Metamod-FWGS: cross-platform Metamod-R fork" title="Direct link to Metamod-FWGS: cross-platform Metamod-R fork">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-snmetamorph-1">by <a href="https://github.com/SNMetamorph" target="_blank" rel="noopener noreferrer"><strong>SNMetamorph</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-snmetamorph-1" class="hash-link" aria-label="Direct link to by-snmetamorph-1" title="Direct link to by-snmetamorph-1">​</a></h5>
<p>Xash3D FWGS and most of mods (thankfully to <a href="https://github.com/FWGS/hlsdk-portable" target="_blank" rel="noopener noreferrer">hlsdk-portable</a>) supports LP64-compatible architectures for years. But other important server-side tools such as Metamod and AMX Mod X does not support anything but x86 architecture.</p>
<p>Also, Metamod-R contains a lot of x86 JIT optimizations, patching hacks, constrained by binary compatibility with ReHLDS and legacy game libraries, and not flexible enough to be compatible with wide variety of compilers/toolchains and architectures. This is why we decided to do our cross-platform Metamod fork which has priority to work with Xash3D-related things in first place.</p>
<p><a href="https://github.com/nodemod/nodemod-goldsrc" target="_blank" rel="noopener noreferrer">Nodemod</a> is the first plugin that works with 64-bit Metamod, also it implements all functionality from basic AMX Mod X plugins such as administrative functions, map voting, localization, fun features and so on. It uses JavaScript and TypeScript languages for plugins, instead of Pawn, which makes possible to bring wider audience for making new plugins.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="goldsrc-voice-chat-support">GoldSrc voice chat support<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#goldsrc-voice-chat-support" class="hash-link" aria-label="Direct link to GoldSrc voice chat support" title="Direct link to GoldSrc voice chat support">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-pwd491">by <a href="https://github.com/pwd491" target="_blank" rel="noopener noreferrer"><strong>pwd491</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-pwd491" class="hash-link" aria-label="Direct link to by-pwd491" title="Direct link to by-pwd491">​</a></h5>
<p>Users running Xash3D can now hear and talk to GoldSrc players, as long as those GoldSrc players are running the latest Steam version of the game. The Silk voice codec isn`t supported yet.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="goldsrc-spray-customization-support">GoldSrc spray customization support<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#goldsrc-spray-customization-support" class="hash-link" aria-label="Direct link to GoldSrc spray customization support" title="Direct link to GoldSrc spray customization support">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-pwd491-1">by <a href="https://github.com/pwd491" target="_blank" rel="noopener noreferrer"><strong>pwd491</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-pwd491-1" class="hash-link" aria-label="Direct link to by-pwd491-1" title="Direct link to by-pwd491-1">​</a></h5>
<p>As for now, GoldSrc users can see sprays of Xash3D users, and this works in opposite way too. Moreover, UX are significantly improved comparing how it was in GoldSrc: you don't need to mess with <code>tempdecal.wad</code> manually anymore, just select desired image in menu and engine will automatically resize, generate transparency mask and properly generate WAD texture for you.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="goldsrc-compatibility-improvements">GoldSrc compatibility improvements<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#goldsrc-compatibility-improvements" class="hash-link" aria-label="Direct link to GoldSrc compatibility improvements" title="Direct link to GoldSrc compatibility improvements">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-flying-with-gauss">by <a href="https://github.com/FWGS" target="_blank" rel="noopener noreferrer"><strong>Flying with Gauss</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-flying-with-gauss" class="hash-link" aria-label="Direct link to by-flying-with-gauss" title="Direct link to by-flying-with-gauss">​</a></h5>
<ul>
<li>Disabled autogenerating gameinfo.txt (<a href="https://github.com/FWGS/xash3d-fwgs/pull/1947" target="_blank" rel="noopener noreferrer">PR #1947</a>)</li>
<li>Added support for sprites with less than 256 colors in palette</li>
<li>Fixed <code>TE_BLOODSPRITE</code> tempentity behaviour to match GoldSrc</li>
<li>Fixed <code>status</code> client-side command behavior to match GoldSrc</li>
<li>Enabled applying <code>texgamma</code> for sprites/studiomodels textures during loading</li>
<li>Added support for playing/recording demos in GoldSrc format</li>
<li>Added support for GoldSrc masterserver protocol</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="microsecond-sleep-support-for-some-platforms">Microsecond sleep support for some platforms<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#microsecond-sleep-support-for-some-platforms" class="hash-link" aria-label="Direct link to Microsecond sleep support for some platforms" title="Direct link to Microsecond sleep support for some platforms">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-a1batross" class="hash-link" aria-label="Direct link to by-a1batross" title="Direct link to by-a1batross">​</a></h5>
<p>Microsecond sleep makes possible to suspend game loop in time period between two game frames, instead of using busy-wait loop like in GoldSrc and vanilla Xash3D. This results in fewer CPU usage, lower temperatures &amp; energy consumption. Instead of wasting CPU cycles inside busy-wait loop, now these cycles could be properly managed by OS scheduler and spend on useful tasks for other processes.</p>
<p>If you want check how this feature works on your setup, you could use <code>host_sleeptime_debug</code> console variable.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="support-for-vfs-mount-of-compressed-zip-archives">Support for VFS mount of compressed ZIP archives<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#support-for-vfs-mount-of-compressed-zip-archives" class="hash-link" aria-label="Direct link to Support for VFS mount of compressed ZIP archives" title="Direct link to Support for VFS mount of compressed ZIP archives">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross-1">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-a1batross-1" class="hash-link" aria-label="Direct link to by-a1batross-1" title="Direct link to by-a1batross-1">​</a></h5>
<p>Now it's possible to load files from compressed ZIP archives in same way as it was with <code>.pak</code>, <code>.pk3</code> and <code>.pk3dir</code> formats. Though, this is not preferable option, because compression makes perceivable performance overhead.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-ios-port">New iOS port<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#new-ios-port" class="hash-link" aria-label="Direct link to New iOS port" title="Direct link to New iOS port">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-ksagameng2">by <a href="https://github.com/ksagameng2" target="_blank" rel="noopener noreferrer"><strong>ksagameng2</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-ksagameng2" class="hash-link" aria-label="Direct link to by-ksagameng2" title="Direct link to by-ksagameng2">​</a></h5>
<p>A new iOS port of Xash3D FWGS is now available, featuring updated platform support and improved compatibility with modern iOS devices.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ffmpeg-based-video-playback">FFmpeg-based video playback<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#ffmpeg-based-video-playback" class="hash-link" aria-label="Direct link to FFmpeg-based video playback" title="Direct link to FFmpeg-based video playback">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross-2">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-a1batross-2" class="hash-link" aria-label="Direct link to by-a1batross-2" title="Direct link to by-a1batross-2">​</a></h5>
<p>Xash3D FWGS now fully supports videos playback using FFmpeg library, replacing the legacy "Video for Windows" backend. This means intro videos are no longer limited to the 32-bit Windows build and Cinepak codec, they can now be played on other platforms too. The update also adds support for the WebM videos introduced in the Half-Life 25th Anniversary Update. Supported video formats is <code>.mp4</code> with H264 codec, <code>.webm</code> with VP9 codec and <code>.avi</code> with Cinepak codec.</p>
<p>On Android and other non-desktop platforms FFmpeg libraries is not included in the builds by default in order to keep the engine builds lightweight.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="support-for-loading-maps-in-bsp2-format-at-runtime">Support for loading maps in BSP2 format at runtime<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#support-for-loading-maps-in-bsp2-format-at-runtime" class="hash-link" aria-label="Direct link to Support for loading maps in BSP2 format at runtime" title="Direct link to Support for loading maps in BSP2 format at runtime">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross-3">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-a1batross-3" class="hash-link" aria-label="Direct link to by-a1batross-3" title="Direct link to by-a1batross-3">​</a></h5>
<p>BSP2 is the different version of BSP format for maps that have expanded some data types from 16 to 32 bits, consequently expanding some of limits related to maps format.</p>
<p>Back in the days, it was impossible to load BSP2 maps in runtime, because engine should be recompiled to be able to load these maps and also this was breaking compatibility with classic BSP format which was a serious concern. Now engine supports both of formats without special build options.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="mounting-hd-addon-localization-and-low-violence-directories">Mounting HD, Addon, Localization and Low Violence directories<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#mounting-hd-addon-localization-and-low-violence-directories" class="hash-link" aria-label="Direct link to Mounting HD, Addon, Localization and Low Violence directories" title="Direct link to Mounting HD, Addon, Localization and Low Violence directories">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross-4">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-a1batross-4" class="hash-link" aria-label="Direct link to by-a1batross-4" title="Direct link to by-a1batross-4">​</a></h5>
<p>Now engine can load content from the folders <code>gamedir_hd</code>, <code>gamedir_language</code>, <code>gamedir_addon</code>, and <code>gamedir_lv</code>, where  <strong>gamedir</strong> means the name of the game directory, such as <code>valve</code>, <code>gearbox</code>, <code>cstrike</code>. For example, this feature makes possible to do proper localization of mods and standalone games, or making HD packs for existing mods. Documentation regarding to localization feature will made later, but as an example you could check how it was done in Diffusion mod.</p>
<p>List of cvars for mounting directories:</p>
<ul>
<li><code>fs_mount_hd</code> – mounts the directory with HD models</li>
<li><code>fs_mount_l10n</code> – mounts the directory containing localization files</li>
<li><code>fs_mount_addon</code> – mounts the directory with custom content (similar to the <em><code>custom</code></em> folder inside the game directory)</li>
<li><code>fs_mount_lv</code> – mounts the directory with low-violence content</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="drop-of-legacy-xash3d-fwgs-protocol">Drop of legacy Xash3D FWGS protocol<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#drop-of-legacy-xash3d-fwgs-protocol" class="hash-link" aria-label="Direct link to Drop of legacy Xash3D FWGS protocol" title="Direct link to Drop of legacy Xash3D FWGS protocol">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-flying-with-gauss-1">by <a href="https://github.com/FWGS" target="_blank" rel="noopener noreferrer"><strong>Flying with Gauss</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-flying-with-gauss-1" class="hash-link" aria-label="Direct link to by-flying-with-gauss-1" title="Direct link to by-flying-with-gauss-1">​</a></h5>
<p>As of December 1, 2025, support for legacy Xash3D protocol 48 from mid-2010s era has been dropped, and players on the new engine will no longer be able to connect to servers running on the old engine. Also, servers running on deprecated protocol won't show up on public servers list anymore.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tui-main-menu">TUI Main Menu<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#tui-main-menu" class="hash-link" aria-label="Direct link to TUI Main Menu" title="Direct link to TUI Main Menu">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-numas13">by <a href="https://github.com/numas13" target="_blank" rel="noopener noreferrer"><strong>numas13</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-numas13" class="hash-link" aria-label="Direct link to by-numas13" title="Direct link to by-numas13">​</a></h5>
<p>A new text-based experimental menu written in Rust arrived this year. Nothing special to say here, it was made just for fun.</p>
<p><img decoding="async" loading="lazy" alt="Main Menu" src="https://snmetamorph.github.io/assets/images/maintui-1-bd09f6137b6f6f0760b2979cbd13bf2b.png" width="1920" height="1080" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Settings" src="https://snmetamorph.github.io/assets/images/maintui-2-6763efaffaf3b52af996c537469aad05.png" width="1920" height="1080" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Multiplayer Settings" src="https://snmetamorph.github.io/assets/images/maintui-3-2ed37fb2fe0e7391dbc2dc55f91b96c3.png" width="1920" height="1080" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="luma-texture-support-in-half-life">Luma texture support in Half-Life<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#luma-texture-support-in-half-life" class="hash-link" aria-label="Direct link to Luma texture support in Half-Life" title="Direct link to Luma texture support in Half-Life">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross-5">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-a1batross-5" class="hash-link" aria-label="Direct link to by-a1batross-5" title="Direct link to by-a1batross-5">​</a></h5>
<p>Engine now supports fullbright/luma textures, identified by the <code>~</code> prefix in the texture name. This feature initially inherited from Quake, but at some point it was broken in GoldSrc and nobody noticed. But finally somebody did.
Feature is disabled by default, but can be enabled by setting the <code>r_allow_wad3_luma</code> console variable to <code>1</code>.</p>
<p><img decoding="async" loading="lazy" alt="Luma Disabled 1" src="https://snmetamorph.github.io/assets/images/luma-off-1-c3adf57cfc367bd544d7790294734e55.png" width="1600" height="900" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Luma Enabled 1" src="https://snmetamorph.github.io/assets/images/luma-on-1-83d1221843804fbf12c032ab87a045a4.png" width="1600" height="900" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Luma Disabled 2" src="https://snmetamorph.github.io/assets/images/luma-off-2-160d13b2cb3baa075639a900b6c8d1b2.png" width="1600" height="900" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Luma Enabled 2" src="https://snmetamorph.github.io/assets/images/luma-on-2-16e9f01b1814f1ac886e775cb30b045a.png" width="1600" height="900" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="fullscreen-mode-fixes">Fullscreen mode fixes<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#fullscreen-mode-fixes" class="hash-link" aria-label="Direct link to Fullscreen mode fixes" title="Direct link to Fullscreen mode fixes">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross-6">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-a1batross-6" class="hash-link" aria-label="Direct link to by-a1batross-6" title="Direct link to by-a1batross-6">​</a></h5>
<p>In recent engine updates, several issues related to fullscreen mode have been fixed. Previously, when users enabled fullscreen, the game could actually remain in a window or start with an incorrect screen resolution. This issue was fixed in commit <a href="https://github.com/FWGS/xash3d-fwgs/commit/4a16ca8" target="_blank" rel="noopener noreferrer"><code>4a16ca8</code></a>.</p>
<p>Another issue caused the engine to get confused about the window state when exiting fullscreen. After switching to windowed mode, the window could have an incorrect size or behave as if it was still maximized. This was fixed in commit <a href="https://github.com/FWGS/xash3d-fwgs/commit/ad01be8" target="_blank" rel="noopener noreferrer"><code>ad01be8</code></a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-minor-changes--bug-fixes">Other minor changes &amp; bug fixes<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#other-minor-changes--bug-fixes" class="hash-link" aria-label="Direct link to Other minor changes &amp; bug fixes" title="Direct link to Other minor changes &amp; bug fixes">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-flying-with-gauss-2">by <a href="https://github.com/FWGS" target="_blank" rel="noopener noreferrer"><strong>Flying with Gauss</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2025#by-flying-with-gauss-2" class="hash-link" aria-label="Direct link to by-flying-with-gauss-2" title="Direct link to by-flying-with-gauss-2">​</a></h5>
<ul>
<li>Fixed incorrect XashID generation on Windows due to uninitialized string</li>
<li>Improved compatibility with GoldSrc-based clients behavior (thanks <a href="https://github.com/Garey27" target="_blank" rel="noopener noreferrer"><strong>@Garey27</strong></a>)</li>
<li>Fixed loading of DDS with volume textures</li>
<li>Attempt to automatically create .nomedia file in directory where games are located on Android</li>
<li>Fixed erasing physinfo on client connect, when it was already set by game logic on save restore</li>
<li>Fixed SQB in event playback function</li>
<li>Fixed crash if server sends new movevars before entities were created</li>
<li>Fixed command line window popping on Windows when starting engine</li>
<li>Fixed mitigations of speedhack and other input commands spoofing hacks</li>
<li>Fixed some of exploits that were made possible to crash servers</li>
<li>Fixed bug when engine couldn't start on Windows in case if file path contains non-latin symbols</li>
<li>Fixed restoring player view entity after save restore (fixes trigger_camera usage)</li>
</ul>]]></content>
        <category label="xash3d" term="xash3d"/>
        <category label="fwgs" term="fwgs"/>
        <category label="half-life" term="half-life"/>
        <category label="modding" term="modding"/>
        <category label="linux" term="linux"/>
        <category label="valve" term="valve"/>
        <category label="gamedev" term="gamedev"/>
        <category label="android" term="android"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Xash3D FWGS Status Update - December 2024]]></title>
        <id>https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024</id>
        <link href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024"/>
        <updated>2024-12-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Detailed overview of changes that were made during development of Xash3D FWGS engine in 2024 year.]]></summary>
        <content type="html"><![CDATA[<p>This is a detailed overview of the changes that were made during the development of Xash3D FWGS engine in the year 2024. I would also recommend checking out the previous development overviews that were
made for <a href="https://velaron.github.io/xash3d-fwgs-november-2022.html" target="_blank" rel="noopener noreferrer">2022</a> and <a href="https://velaron.github.io/xash3d-fwgs-november-2023.html" target="_blank" rel="noopener noreferrer">2023</a> years.</p>
<h1>Consider Donating</h1>
<ul>
<li><a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a> - initial Xash3D SDL2/Linux port author, Xash3D FWGS engine maintainer, creator of non-commercial Flying With Gauss organization<!-- -->
<ul>
<li><a href="https://boosty.to/a1ba" target="_blank" rel="noopener noreferrer">Boosty page</a></li>
</ul>
</li>
<li><a href="https://github.com/nekonomicon" target="_blank" rel="noopener noreferrer"><strong>nekonomicon</strong></a> - maintainer of <a href="https://github.com/FWGS/hlsdk-portable" target="_blank" rel="noopener noreferrer">hlsdk-portable</a>, <a href="https://github.com/FWGS/xash3d-fwgs/tree/master/utils/mdldec" target="_blank" rel="noopener noreferrer">mdldec</a>, <a href="https://github.com/FWGS/xash3d-fwgs/blob/master/Documentation/opensource-mods.md" target="_blank" rel="noopener noreferrer">opensource-mods.md</a> and Xash3D FWGS <a href="https://github.com/FWGS/xash3d-fwgs/commits?author=nekonomicon" target="_blank" rel="noopener noreferrer">contributor</a> (*BSD/clang port, PNG support, etc)<!-- -->
<ul>
<li><a href="https://boosty.to/nekonomicon" target="_blank" rel="noopener noreferrer">Boosty page</a></li>
</ul>
</li>
<li><a href="https://github.com/Velaron" target="_blank" rel="noopener noreferrer"><strong>Velaron</strong></a> - maintainer of <a href="https://github.com/Velaron/cs16-client" target="_blank" rel="noopener noreferrer">cs16-client</a> &amp; <a href="https://github.com/Velaron/tf15-client" target="_blank" rel="noopener noreferrer">tf15-client</a> and Xash3D FWGS <a href="https://github.com/FWGS/xash3d-fwgs/commits?author=Velaron" target="_blank" rel="noopener noreferrer">contributor</a> (Android port, voice chat, etc)<!-- -->
<ul>
<li><a href="https://www.buymeacoffee.com/velaron" target="_blank" rel="noopener noreferrer">Buy Me A Coffee page</a></li>
</ul>
</li>
<li><a href="https://github.com/SNMetamorph" target="_blank" rel="noopener noreferrer"><strong>SNMetamorph</strong></a> - maintainer of <a href="https://github.com/SNMetamorph/PrimeXT" target="_blank" rel="noopener noreferrer">PrimeXT</a> &amp; <a href="https://github.com/SNMetamorph/goldsrc-monitor" target="_blank" rel="noopener noreferrer">GoldSrc Monitor</a> and Xash3D FWGS <a href="https://github.com/FWGS/xash3d-fwgs/commits?author=SNMetamorph" target="_blank" rel="noopener noreferrer">contributor</a> (Windows port, voice chat, etc)<!-- -->
<ul>
<li><a href="https://boosty.to/snmetamorph" target="_blank" rel="noopener noreferrer">Boosty page</a></li>
<li><a href="https://snmetamorph.github.io/donate">Other donation methods</a></li>
</ul>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="goldsrc-network-protocol-support">GoldSrc network protocol support<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#goldsrc-network-protocol-support" class="hash-link" aria-label="Direct link to GoldSrc network protocol support" title="Direct link to GoldSrc network protocol support">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-a1batross" class="hash-link" aria-label="Direct link to by-a1batross" title="Direct link to by-a1batross">​</a></h5>
<p>Since this autumn, GoldSrc protocol support is in the mainline engine and available for testing for anybody.
This feature is still a work-in-progress, but anyway it is good enough to be called playable.
We appreciate any bug reports and contributions according to it.</p>
<p>For connecting to GoldSrc-based servers, you can use the console command: <code>connect &lt;ip&gt; gs</code>.
Also, GoldSrc servers can be added to the favorites list - just don't forget to choose the proper protocol when adding it.</p>
<p>There is short footage of playing Counter-Strike 1.6 on some GoldSrc-based server.</p>
<div style="width:100%;height:100%"></div>
<p>But keep in mind, there are requirement for server to be able to accept connections from Xash3D-based clients: it should use Reunion or Dproto. Without this requirement, you will just get "Steam validation rejected" error on connecting.
That is because proper authorization with Steam API is not implemented in engine yet. There is a list of things that are still unfinished:</p>
<ul>
<li>Authorization using Steam API (first priority)</li>
<li>Voice chat on GoldSrc-based servers</li>
<li>Player sprays on GoldSrc-based servers</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>To avoid misunderstandings: please note that this feature isn't made to circumvent Valve's DRM. It doesn't make it possible to connect to official Steam-based servers without
having purchased <a href="https://steamcommunity.com/app/70" target="_blank" rel="noopener noreferrer">Half-Life copy</a> on your Steam account. Piracy is highly illegal and Xash3D FWGS developers always encourage everyone to get Half-Life from the Steam store.</p></div></div>
<p>Also, we encountered that some GoldSrc-based servers are recognizing Xash3D clients as "fake clients" and banning/kicking them.
Maybe this problem will be solved along with better compatibility with GoldSrc behavior, but maybe not - we don't know the logic behind this useless "fake client" check.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="voice-chat-improvements">Voice chat improvements<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#voice-chat-improvements" class="hash-link" aria-label="Direct link to Voice chat improvements" title="Direct link to Voice chat improvements">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-snmetamorph-and-a1batross">by <a href="https://github.com/SNMetamorph" target="_blank" rel="noopener noreferrer"><strong>SNMetamorph</strong></a> and <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-snmetamorph-and-a1batross" class="hash-link" aria-label="Direct link to by-snmetamorph-and-a1batross" title="Direct link to by-snmetamorph-and-a1batross">​</a></h5>
<p>Fixed an issue when voice chat sound would become completely distorted when multiple players spoke simultaneously.
Also, some settings related to voice chat were added to the multiplayer settings menu. Voice chat button was added
to touch configuration for Android port.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAGAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMH/8QAIRAAAQQBBAMBAAAAAAAAAAAAAQIDBBEABRMhIgYSMZH/xAAUAQEAAAAAAAAAAAAAAAAAAAAD/8QAHREBAAEDBQAAAAAAAAAAAAAAAQIAA0EEESOxwf/aAAwDAQACEQMRAD8Axfx1bcnW2Y0tsPLUnbj2AlKF1YUoAdhwf3JjRpEgB73ZG53oWAL5+VjGHbeRMbHbRambGEUcvlf/2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1597" height="882"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/vc-settings.a76b691.1597.jpg" srcset="/assets/ideal-img/vc-settings.a76b691.1597.jpg 1597w" width="1597" height="882"></noscript></div>
<p>There is short video with demonstration of working voice chat in multiplayer.</p>
<div style="width:100%;height:100%"></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="server-browser-improvements">Server browser improvements<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#server-browser-improvements" class="hash-link" aria-label="Direct link to Server browser improvements" title="Direct link to Server browser improvements">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-flying-with-gauss">by <a href="https://github.com/FWGS" target="_blank" rel="noopener noreferrer"><strong>Flying With Gauss</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-flying-with-gauss" class="hash-link" aria-label="Direct link to by-flying-with-gauss" title="Direct link to by-flying-with-gauss">​</a></h5>
<p>Added tabs with favorites and recent servers, basic server filtering was added (in the bottom).</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAGAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMH/8QAHxAAAQQCAgMAAAAAAAAAAAAAAQADBBECIQUTIjFB/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/xAAbEQACAgMBAAAAAAAAAAAAAAABAgDwAyExQf/aAAwDAQACEQMRAD8AwiK9KlTYsfEs2M6bOTeIAIH2hsaVBxz74Dp6Lc8tWPe0RRXTkC9hysQoN8n/2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1599" height="885"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/server-browser-1.c293484.1599.jpg" srcset="/assets/ideal-img/server-browser-1.c293484.1599.jpg 1599w" width="1599" height="885"></noscript></div>
<p>Also, an entirely new menu for viewing server detailed information was added.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAGAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQH/8QAIBAAAQMEAgMAAAAAAAAAAAAAAQIDBAASITEFERNBUf/EABUBAQEAAAAAAAAAAAAAAAAAAAID/8QAHBEBAAIBBQAAAAAAAAAAAAAAAQACAzJRYcHR/9oADAMBAAIRAxEAPwDB4apU3l4TCHUBwGxu5tISOs5AGde6oRw0qQhLxdZHkF/zeddUpUqa047Yc1kqJv5P/9k=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1589" height="876"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/server-browser-2.ba70c61.1589.jpg" srcset="/assets/ideal-img/server-browser-2.ba70c61.1589.jpg 1589w" width="1589" height="876"></noscript></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="support-for-ogg-vorbis-and-ogg-opus-audio-formats">Support for Ogg Vorbis and Ogg Opus audio formats<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#support-for-ogg-vorbis-and-ogg-opus-audio-formats" class="hash-link" aria-label="Direct link to Support for Ogg Vorbis and Ogg Opus audio formats" title="Direct link to Support for Ogg Vorbis and Ogg Opus audio formats">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-snmetamorph">by <a href="https://github.com/SNMetamorph" target="_blank" rel="noopener noreferrer"><strong>SNMetamorph</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-snmetamorph" class="hash-link" aria-label="Direct link to by-snmetamorph" title="Direct link to by-snmetamorph">​</a></h5>
<p>We've needed some kind of MP3 alternative for a long time. Since being invented back in 1993, nowadays MP3 is far inferior to its modern alternatives in both compression efficiency and audio quality. At the same time, also the best lossy audio compression codec Opus is open-source and free, and we're already using it for voice chat - why don't use it for audio files too? Also, some of the mods using really a lot of sounds, and at some point audio compression efficiency can save several gigabytes of disk space.</p>
<p>What about Vorbis codec? It's still better than MP3, but from practical point of view it can be useful in terms of backward compatibility with existing content (because, obviously, if you have lossy-compressed audio - it's better to not recompress it to another format, because this will lead to "generation loss"). Ogg Vorbis is pretty wide-spread audio format, also other idTech-based game engines supports it.</p>
<p>The sound looping feature, which was already <a href="https://github.com/FWGS/xash3d-fwgs/blob/master/Documentation/extensions/mp3-loops.md" target="_blank" rel="noopener noreferrer">supported in MP3</a>, now also supported in both these formats too.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If you not yet familiar: for Ogg Vorbis sounds file extension <code>.ogg</code> is used. For Ogg Opus sounds used <code>.opus</code> file extension respectively.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="video-playback-support">Video playback support<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#video-playback-support" class="hash-link" aria-label="Direct link to Video playback support" title="Direct link to Video playback support">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross-1">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-a1batross-1" class="hash-link" aria-label="Direct link to by-a1batross-1" title="Direct link to by-a1batross-1">​</a></h5>
<p>This is from that rare kind of feature, that had already been in the engine for a long time, but could not be used for technical reasons.
Originally, video playback was dependent on the platform-specific "Video For Windows" framework and the ancient Cinepak codec.
For proper working, it should be installed system-wide and also it's available for use only for 32-bit processes and exclusively for Windows.
Because of that, users were having a lot of troubles while trying to get things working, and with some circumstances it was not possible at all.</p>
<p>In engine and some of the mods, we support (and use) 64-bit builds for a long time already. Also, we do care about other platforms rather than only Windows.
This is why we decided to completely get rid of VFW-related code and instead use ffmpeg for video playback.
Also, we decided that video playback support should be an optional feature - ffmpeg libraries are bulky; also, most mods don't use videos anyway.
So, anybody who has plans to distribute mods along with the engine, or just want to free up some disk space will be able to just remove those libraries.</p>
<p>Here is a short demonstation of the video playback feature within PrimeXT. The original <code>valve.avi</code> intro video was used for it.</p>
<div style="width:100%;height:100%"></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="port-for-sega-dreamcast-wip">Port for Sega Dreamcast (WIP)<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#port-for-sega-dreamcast-wip" class="hash-link" aria-label="Direct link to Port for Sega Dreamcast (WIP)" title="Direct link to Port for Sega Dreamcast (WIP)">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-maximqaxd-and-megavolt85">by <a href="https://github.com/maximqaxd/xash3d-fwgs_dc/" target="_blank" rel="noopener noreferrer"><strong>maximqaxd</strong></a> and <strong>megavolt85</strong><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-maximqaxd-and-megavolt85" class="hash-link" aria-label="Direct link to by-maximqaxd-and-megavolt85" title="Direct link to by-maximqaxd-and-megavolt85">​</a></h5>
<p>This is still in progress, but it already works on actual hardware. Port can load
content that was originally made for Dreamcast port, because it supports all of that platform-specific content
formats such as PVR with VQ compression and ADPCM WAV sounds. Multiplayer works too.</p>
<p><img decoding="async" loading="lazy" src="https://snmetamorph.github.io/assets/images/dreamcast-port-1-1ff2be010523a0eb1606b0b5c8bf378e.jpg" width="4080" height="3072" class="img_ev3q"></p>
<div style="width:100%;height:360px"></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="macos-port-rehabilitated">MacOS port rehabilitated<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#macos-port-rehabilitated" class="hash-link" aria-label="Direct link to MacOS port rehabilitated" title="Direct link to MacOS port rehabilitated">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-sofakng">by <a href="https://github.com/sofakng" target="_blank" rel="noopener noreferrer"><strong>sofakng</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-sofakng" class="hash-link" aria-label="Direct link to by-sofakng" title="Direct link to by-sofakng">​</a></h5>
<p>Project building issues on MacOS were resolved, and automatic builds for MacOS were added to CI. But this port isn't well-tested anyway, and it is possible
to catch some MacOS-specific bugs: in this case, feel free to report it on <a href="https://github.com/FWGS/xash3d-fwgs/issues" target="_blank" rel="noopener noreferrer">GitHub</a>.
But our capabilities with the MacOS port are limited, since nobody from the developers has any relevant hardware, and because of it we're looking for a proper maintainer.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="compatibility-with-goldsrc-improved-further">Compatibility with GoldSrc improved further<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#compatibility-with-goldsrc-improved-further" class="hash-link" aria-label="Direct link to Compatibility with GoldSrc improved further" title="Direct link to Compatibility with GoldSrc improved further">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-flying-with-gauss-1">by <a href="https://github.com/FWGS" target="_blank" rel="noopener noreferrer"><strong>Flying With Gauss</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-flying-with-gauss-1" class="hash-link" aria-label="Direct link to by-flying-with-gauss-1" title="Direct link to by-flying-with-gauss-1">​</a></h5>
<p>There isn't much to describe here, as it involves plenty of minor changes that are hard to track down retrospectively.
In some cases, incompatibility was caused by differences in console variables. Sometimes, it was caused by differences in internal logic between GoldSrc and Xash3D.</p>
<ul>
<li>Implemented PHS/PAS generating; this helped to fix <a href="https://github.com/FWGS/xash3d-fwgs/issues/619" target="_blank" rel="noopener noreferrer">issue #619</a></li>
<li>Added <code>room_off</code> console variable; after this Sven Co-op 4.8 client started working with Xash3D FWGS</li>
<li>Added <code>gl_overbright</code> from early GoldSrc versions, also some changes with gamma were made for better matching with GoldSrc looking</li>
<li>Added <code>gl_fog</code> console variable for toggling OpenGL's built-in fog implementation. Some of GoldSrc servers anticheats were checking this value</li>
<li>Added <code>fps_override</code> console variable for overriding framerate soft limit</li>
<li>Reverted ancient GoldSrc shadows, this feature was reintroduced to GoldSrc at the HL25 anniversary update - as of today, we support it too. It could
be enabled with <code>r_shadows</code> console variable</li>
<li>Fixed broken physics behavior on high FPS: it was caused by rounding error in a physics code</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="complete-ipv6-support-in-multiplayer">Complete IPv6 support in multiplayer<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#complete-ipv6-support-in-multiplayer" class="hash-link" aria-label="Direct link to Complete IPv6 support in multiplayer" title="Direct link to Complete IPv6 support in multiplayer">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-flying-with-gauss-2">by <a href="https://github.com/FWGS" target="_blank" rel="noopener noreferrer"><strong>Flying With Gauss</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-flying-with-gauss-2" class="hash-link" aria-label="Direct link to by-flying-with-gauss-2" title="Direct link to by-flying-with-gauss-2">​</a></h5>
<p>As of today, engine and masterserver both support IPv6. And we have some masterservers running on the Internet through IPv6.
This means anybody could set up their Xash3D FWGS server on the Internet with IPv6, and it will be presented for other clients who also have IPv6 address.
Also, it is well tested, and we didn't discover any issues with it.</p>
<p>If you, for some reason, need to run a dedicated server exclusively on IPv6, you can use the <code>-noip</code> startup parameter, which completely disables IPv4 networking.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="published-docker-image-of-up-to-date-xashds">Published Docker image of up-to-date XashDS<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#published-docker-image-of-up-to-date-xashds" class="hash-link" aria-label="Direct link to Published Docker image of up-to-date XashDS" title="Direct link to Published Docker image of up-to-date XashDS">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-snmetamorph-1">by <a href="https://github.com/SNMetamorph" target="_blank" rel="noopener noreferrer"><strong>SNMetamorph</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-snmetamorph-1" class="hash-link" aria-label="Direct link to by-snmetamorph-1" title="Direct link to by-snmetamorph-1">​</a></h5>
<p>If you have some VDS or PC with an installed Linux distro, now it's possible to set up a Half-Life dedicated server
based on the up-to-date Xash3D FWGS engine build in a couple of actions! Also, this Docker image has pre-installed Metamod, AMX Mod X, and
bots using jk_botti Metamod plugin.</p>
<p>For now, a pre-built Docker image is only available for Half-Life, but in the future we hope to build images for other mods too (such as Counter-Strike 1.6).</p>
<p>Here is Docker Compose file example. You can read more information at <a href="https://github.com/FWGS/xashds-docker" target="_blank" rel="noopener noreferrer">GitHub repository</a>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">xashds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> snmetamorph/xashds</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hldm</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> xashds</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hldm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> always</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> +map crossfire</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'27015:27015/udp'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="hardcoded-sounds-overriding-through-soundslst">Hardcoded sounds overriding through sounds.lst<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#hardcoded-sounds-overriding-through-soundslst" class="hash-link" aria-label="Direct link to Hardcoded sounds overriding through sounds.lst" title="Direct link to Hardcoded sounds overriding through sounds.lst">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross-2">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-a1batross-2" class="hash-link" aria-label="Direct link to by-a1batross-2" title="Direct link to by-a1batross-2">​</a></h5>
<p>This brand new feature can be used to override some of the hardcoded sounds in temp entities and server physics.
You can read a more detailed description in the <a href="https://github.com/FWGS/xash3d-fwgs/blob/master/Documentation/extensions/sounds.lst.md" target="_blank" rel="noopener noreferrer">documentation</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="support-for-external-textures">Support for external textures<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#support-for-external-textures" class="hash-link" aria-label="Direct link to Support for external textures" title="Direct link to Support for external textures">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-a1batross-3">by <a href="https://github.com/a1batross" target="_blank" rel="noopener noreferrer"><strong>a1batross</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-a1batross-3" class="hash-link" aria-label="Direct link to by-a1batross-3" title="Direct link to by-a1batross-3">​</a></h5>
<p>This feature allows you to create HD texture packs for classic mods without involving any code changes.
Initially, this feature was presented in some of the old vanilla Xash3D versions, but was removed by Uncle Mike at some point, and
now it's back here again. You can read a more detailed description in the <a href="https://github.com/FWGS/xash3d-fwgs/blob/master/Documentation/hd-textures.md" target="_blank" rel="noopener noreferrer">documentation</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-minor-changes">Other minor changes<a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#other-minor-changes" class="hash-link" aria-label="Direct link to Other minor changes" title="Direct link to Other minor changes">​</a></h2>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="by-flying-with-gauss-3">by <a href="https://github.com/FWGS" target="_blank" rel="noopener noreferrer"><strong>Flying With Gauss</strong></a><a href="https://snmetamorph.github.io/posts/xash3d-fwgs-dec-2024#by-flying-with-gauss-3" class="hash-link" aria-label="Direct link to by-flying-with-gauss-3" title="Direct link to by-flying-with-gauss-3">​</a></h5>
<ul>
<li>Added SIGTERM signal handling for XashDS, it's needed for the graceful shutdown of the dedicated server inside Docker container</li>
<li>Enabled engine binaries signing for the Windows platform, this helped a lot with false-positive antivirus detections</li>
<li>Added console variable <code>cl_logomaxdim</code> for setting maximal dimension for player sprays, default is 96 units</li>
<li>Added more information to logs: engine build number, VCS branch name &amp; commit hash, platform and architecture name, game startup parameters</li>
<li>FastDL improvements: support for chunked transfer encoding and gzip compression</li>
<li>Android port improvements: some platform-specific bugs were fixed</li>
<li>Reduced connection time to the servers: for now, you can connect to the server in less than 5 seconds (except time spent on content downloading, if it was required)</li>
<li>Entities state interpolation fixes: leaded to much more smooth and better multiplayer experience</li>
</ul>]]></content>
        <category label="xash3d" term="xash3d"/>
        <category label="fwgs" term="fwgs"/>
        <category label="half-life" term="half-life"/>
        <category label="modding" term="modding"/>
        <category label="linux" term="linux"/>
        <category label="valve" term="valve"/>
        <category label="gamedev" term="gamedev"/>
        <category label="android" term="android"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Breaking down Toshiba 00DN901 customer display]]></title>
        <id>https://snmetamorph.github.io/posts/vfd-toshiba-00dn901</id>
        <link href="https://snmetamorph.github.io/posts/vfd-toshiba-00dn901"/>
        <updated>2023-09-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Investigating about how works Toshiba 00DN901 vacuum-fluorescent display (VFD) with 2x20 characters. Display is controllable through RS-232-like interface with 9600/8-N-1 configuration, and uses it's proprietary protocol.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="https://snmetamorph.github.io/posts/vfd-toshiba-00dn901#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2>
<p>Recently I found such an interesting piece of hardware at local store - vacuum-fluorescent display (VFD) with 2x20 characters. So I decided to buy two of them for future investigations since they're relatively cheap.</p>
<p>Originally, display distributed with pole and cable. I got rid of pole since I don't need it, anyway you can find how it looks without any problems. Cable has familiar DB9 male connector on one side, but on other side there is some strange connector that vaguely looks like 8P8C, and I've never seen it before anywhere.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Note that althrough DB9 connector is used, display is not compatible with common serial port, don't try to plug it in PC, it won't work and can even damage your port.</p></div></div>
<table><thead><tr><th style="text-align:center"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQG/8QAIBAAAgEDBAMAAAAAAAAAAAAAAQIDAAQRBQYTYSExkf/EABUBAQEAAAAAAAAAAAAAAAAAAAIE/8QAGREBAAMBAQAAAAAAAAAAAAAAAgADUQES/9oADAMBAAIRAxEAPwDCaNFHdxypc297HMrGEcCBwsuDhWz31Vw2xraAK9zAWXwTxez9pSrFWeErYBYvaOT/2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1405" height="1145"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/connector.cfcac80.1405.jpg" srcset="/assets/ideal-img/connector.cfcac80.1405.jpg 1405w" width="1405" height="1145"></noscript></div></th></tr></thead><tbody><tr><td style="text-align:center"><em>Proprietary connector on display cable</em></td></tr></tbody></table>
<p>This is how display without pole looks like:</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAHAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQG/8QAHxAAAgEEAgMAAAAAAAAAAAAAAQIDAAQFIQYREjFR/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAwDAQACEQMRAD8Ax+K4Tlr7H3lzb554YYgHKCBSEBOhs91EOPzoAsl0kjrpnMQHkfvulKvDj//Z&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="8160" height="5722"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/front.44d4029.8160.jpg" srcset="/assets/ideal-img/front.44d4029.8160.jpg 8160w" width="8160" height="5722"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAb/xAAhEAABAwQBBQAAAAAAAAAAAAACAQMEAAUGESEiMWFxsv/EABQBAQAAAAAAAAAAAAAAAAAAAAP/xAAYEQEBAAMAAAAAAAAAAAAAAAABAAIRIf/aAAwDAQACEQMRAD8An87zqU1c3xudtcNHSUhdjudJe9j38VHFlcJSVUhSNLzyQ7+aUowE3Jlxv//Z&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="8160" height="6120"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/down.a472847.8160.jpg" srcset="/assets/ideal-img/down.a472847.8160.jpg 8160w" width="8160" height="6120"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAEG/8QAIRAAAQMEAQUAAAAAAAAAAAAAAQACAwQGEiEFJDFCcaH/xAAUAQEAAAAAAAAAAAAAAAAAAAAD/8QAFxEBAAMAAAAAAAAAAAAAAAAAAQARQf/aAAwDAQACEQMRAD8At8XpXDkZoZGVmfk8Uwe13ogbWKdc8mR6eY77mAgn4iIinIqVs//Z&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="8160" height="6120"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/back.c436967.8160.jpg" srcset="/assets/ideal-img/back.c436967.8160.jpg 8160w" width="8160" height="6120"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMG/8QAIRAAAQMDBAMAAAAAAAAAAAAAAQACBAMGMRESEyEiMlH/xAAUAQEAAAAAAAAAAAAAAAAAAAAD/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAAv/aAAwDAQACEQMRAD8Alft+zYc8tkQ3VuUbhWY3xP3JysWb1LiSY7tT36oiIBLk7ozf/9k=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="8160" height="6120"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/up.b808ec4.8160.jpg" srcset="/assets/ideal-img/up.b808ec4.8160.jpg 8160w" width="8160" height="6120"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAP/xAAfEAACAQQCAwAAAAAAAAAAAAABAgMABAYRBSESQVH/xAAUAQEAAAAAAAAAAAAAAAAAAAAD/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAECEf/aAAwDAQACEQMRAD8ArmeMZlPYNbLbuELL1pfEqPR13VoMU4hII1msIVkVQGVxsg67BP2lKFvRpnD/2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="7364" height="6119"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/side.1108509.7364.jpg" srcset="/assets/ideal-img/side.1108509.7364.jpg 7364w" width="7364" height="6119"></noscript></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="dismantling-the-display">Dismantling the display<a href="https://snmetamorph.github.io/posts/vfd-toshiba-00dn901#dismantling-the-display" class="hash-link" aria-label="Direct link to Dismantling the display" title="Direct link to Dismantling the display">​</a></h2>
<p>Let's try to detach front panel: that can be done with bare hands, you just need to pull front panel both down and away from the display.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Front panel has dimming filter in it, and it is not glued or welded and can be easily pulled away, in case if you want to polish or clean this filter.</p></div></div>
<p>This is how front panel looks like on the back side:</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAFAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAED/8QAIBAAAQQCAQUAAAAAAAAAAAAAAQACAwQREgUGEzFBwf/EABQBAQAAAAAAAAAAAAAAAAAAAAP/xAAYEQEAAwEAAAAAAAAAAAAAAAABAAIRMf/aAAwDAQACEQMRAD8AvXFKW/zM4s3rTpXSEufv5OT6+LGCs+KGOPu7aNDclgJOAiIx2Jaocn//2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="8160" height="4349"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/front_panel.67667a2.8160.jpg" srcset="/assets/ideal-img/front_panel.67667a2.8160.jpg 8160w" width="8160" height="4349"></noscript></div>
<p>Next, you need to remove three screws on both sides:</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAb/xAAhEAABAwQBBQAAAAAAAAAAAAABAAIDBAUGESETFEKBgv/EABUBAQEAAAAAAAAAAAAAAAAAAAID/8QAGREAAgMBAAAAAAAAAAAAAAAAAAECEVFh/9oADAMBAAIRAxEAPwCcyDLLn3Bjq4at82yX9GlYWfJ3zwpt17uhcSKR2ifKA79oimqwbj1n/9k=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="8160" height="6120"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/vial.c4a14e2.8160.jpg" srcset="/assets/ideal-img/vial.c4a14e2.8160.jpg 8160w" width="8160" height="6120"></noscript></div>
<table><thead><tr><th style="text-align:center"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAGAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMF/8QAHhAAAQMFAQEAAAAAAAAAAAAAAQACBAMFERIhMUH/xAAVAQEBAAAAAAAAAAAAAAAAAAAABP/EABYRAQEBAAAAAAAAAAAAAAAAAAABQf/aAAwDAQACEQMRAD8AlZLZIkWWZVM2oHM10GedPcrCfBqB7gaucH0/URWU1//Z&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="8160" height="4936"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/case_backside.f6e49fb.8160.jpg" srcset="/assets/ideal-img/case_backside.f6e49fb.8160.jpg 8160w" width="8160" height="4936"></noscript></div></th></tr></thead><tbody><tr><td style="text-align:center"><em>Display case without PCB, it has a lot of free space, even when PCB attached</em></td></tr></tbody></table>
<table><thead><tr><th style="text-align:center"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAUG/8QAHxAAAQIHAQEAAAAAAAAAAAAAAgABAwQFEiExQRRh/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/xAAZEQACAwEAAAAAAAAAAAAAAAAAARETUpH/2gAMAwEAAhEDEQA/AI1frJekmeUiGBHbeIFj7jmlmDnorGTPKxd9B0RRgNT0+n//2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="8160" height="6120"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/pcb1.29c69bf.8160.jpg" srcset="/assets/ideal-img/pcb1.29c69bf.8160.jpg 8160w" width="8160" height="6120"></noscript></div></th></tr></thead><tbody><tr><td style="text-align:center"><em>PCB extracted from display case</em></td></tr></tbody></table>
<p>First thing we see, is that display based on Futaba M202MD10C board. From this information I found out that display more likely uses UART with 9600-8N1 configuration (but also with inverted logic levels). I will test it in future steps.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="determining-pinout">Determining pinout<a href="https://snmetamorph.github.io/posts/vfd-toshiba-00dn901#determining-pinout" class="hash-link" aria-label="Direct link to Determining pinout" title="Direct link to Determining pinout">​</a></h2>
<p>But let's assume that we're at time point when all of needed information is not available yet. Next step we should do is determine display pinout. Probably, since display has only four pins, it shouldn't be that hard. I easily found GND pin and two VCC pins. Therefore, last remaining pin is used for transfer data from microcontroller to display. As a result, we got such scheme:</p>
<table><thead><tr><th>Pin number (left to right)</th><th>Description</th></tr></thead><tbody><tr><td>1</td><td>GND</td></tr><tr><td>2</td><td>DATA</td></tr><tr><td>3</td><td>VCC</td></tr><tr><td>4</td><td>VCC</td></tr></tbody></table>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQG/8QAIRAAAgEDAwUAAAAAAAAAAAAAAQMAAgQFBxExBjREgdH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAA//EABgRAQADAQAAAAAAAAAAAAAAAAEAAhEh/9oADAMBAAIRAxEAPwDLdE6a2b10vvrzENXUN+6O9PoDmUM0ysAyoB+L5PkH5ESeQ0XOs//Z&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1600" height="1200"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/pinout.9095fe1.1600.jpg" srcset="/assets/ideal-img/pinout.9095fe1.1600.jpg 1600w" width="1600" height="1200"></noscript></div>
<p>We got pinout scheme and obviously next step will be applying voltage to display. But what exact voltage we should use? I guess that 5 Volts will not enough. Then I'll try 9 and 12 Volts. As it turned out later, 9 Volts also not enough. But with 12 Volts it worked - display showed underscore at first row.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="connecting-display-to-mcu">Connecting display to MCU<a href="https://snmetamorph.github.io/posts/vfd-toshiba-00dn901#connecting-display-to-mcu" class="hash-link" aria-label="Direct link to Connecting display to MCU" title="Direct link to Connecting display to MCU">​</a></h2>
<p>It is time to bring other hardware to this journey - I will use Arduino Uno and try to send some information to display and check what will happen. For this we need pretty simple code snippet:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;Arduino.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;SoftwareSerial.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// display DATA should be connected to pin #3, pin #2 will be unused</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// "true" as third argument means that logic levels will be inverted</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SoftwareSerial </span><span class="token function" style="color:#d73a49">softSerial</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">setup</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// sets proper baudrate according to information obtained earlier</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    softSerial</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">begin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">9600</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// send some ASCII text to check is it even works</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    softSerial</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Wake up, Neo..."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loop</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>And it worked without any problems!</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAFAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAUH/8QAIBAAAQQBBAMAAAAAAAAAAAAAAQACAxEFBBMUFSFSYv/EABUBAQEAAAAAAAAAAAAAAAAAAAAD/8QAGREAAgMBAAAAAAAAAAAAAAAAAhEAAQMS/9oADAMBAAIRAxEAPwDATlsd1u27B6czNaGmYTSAk+1XQKg8hx8ixf0URDvpOTwGhan/2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1901" height="1043"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/final.f87d927.1901.jpg" srcset="/assets/ideal-img/final.f87d927.1901.jpg 1901w" width="1901" height="1043"></noscript></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://snmetamorph.github.io/posts/vfd-toshiba-00dn901#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>This post in theory can be much longer, I didn't covered determining other functions of display protocol, such as controlling cursor position, dimming, etc. But there is nothing interesting it in, really. It's just sending random bytes to serial stream and see what happened. For narrow down the number of possible bytes combinations I checked datasheets for similar displays from Futaba corporation. Also, some russian guy with nickname <code>abomin</code> helps me with code pages and custom character defining feature a lot. And one by one, I determined all things that this display can do.</p>
<p>And result of all this investigations was <a href="https://www.arduinolibraries.info/libraries/futaba-vfd-m202-md10-c" target="_blank" rel="noopener noreferrer">library for working with Futaba M202MD10C board on Arduino framework</a>. This library exposes in it's API all possible functionality of displays based on this board. Library is well documented and contains bunch of code examples that covers different library functions. Therefore, this shouldn't be a problem to create your own library that works with this display, in case if you want to use display with something else rather than Arduino or just don't want to depends on any kind of frameworks.</p>
<p>After some time I got an idea to make thing like meteostation based on this display. It shows current air temperature, relative humidity, atmospheric pressure &amp; carbon dioxide concentration on display, and periodically sends all of that information to Home Assistant through MQTT. This device based on ESP8266 microcontroller, sensors BME280 and MH-Z14A used inside it. Energy consumption of this device is around 6 Watts, a most of this bugdet used by VFD. This is how this device looks:</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAGAAoDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAX/xAAgEAABAwQDAQEAAAAAAAAAAAABAgMEAAURIQYSEzEy/8QAFAEBAAAAAAAAAAAAAAAAAAAAAf/EABgRAQEBAQEAAAAAAAAAAAAAAAECACEx/9oADAMBAAIRAxEAPwCfxeRzyXaTJg3e3BpwrWQ83srJGT+DrdJdrvbEp5rFqd81qR6Od+y8HGTr6aUobqXjkiX03//Z&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1762" height="1045"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/device.fc9fe20.1762.jpg" srcset="/assets/ideal-img/device.fc9fe20.1762.jpg 1762w" width="1762" height="1045"></noscript></div>]]></content>
        <category label="vfd" term="vfd"/>
        <category label="arduino" term="arduino"/>
        <category label="electronics" term="electronics"/>
        <category label="00dn901" term="00dn901"/>
        <category label="m202md10c" term="m202md10c"/>
        <category label="41d0160" term="41d0160"/>
        <category label="customer display" term="customer display"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Compiling Half-Life 1 maps on Android TV-box]]></title>
        <id>https://snmetamorph.github.io/posts/compiling-hl1-maps</id>
        <link href="https://snmetamorph.github.io/posts/compiling-hl1-maps"/>
        <updated>2023-01-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[I have been modding the legendary Half-Life 1 for these years, and somehow quite spontaneously I thought:  how interesting it would be to try to compile maps on some platform other than the usual x86 and amd64...  Then I remembered that I have an Android TV box at home that, in theory, could be used for this purpose.]]></summary>
        <content type="html"><![CDATA[<p>I have been modding the legendary Half-Life 1 for these years, and somehow quite spontaneously I thought:
how interesting it would be to try to compile maps on some platform other than the usual x86 and amd64...
Then I remembered that I have an Android TV box at home that, in theory, could be used for this purpose.
So, why don't try it? This is how all of this were started.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-we-have">What's we have?<a href="https://snmetamorph.github.io/posts/compiling-hl1-maps#whats-we-have" class="hash-link" aria-label="Direct link to What's we have?" title="Direct link to What's we have?">​</a></h2>
<p>In stock, I had a GoldMaster I-905 TV set-top box, which is completely unremarkable.
It has 16 gigabytes of internal memory, 2 gigabytes of RAM. Based on the Allwinner H313 processor.
From interfaces: has two USB 2.0 ports, composite video output, HDMI port.
Network access can be provided both via Wi-Fi and via an Ethernet port, but I used a wired connection.</p>
<table><thead><tr><th style="text-align:center"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAUI/8QAHRAAAgICAwEAAAAAAAAAAAAAAQIEEQADBSEiUf/EABQBAQAAAAAAAAAAAAAAAAAAAAH/xAAWEQEBAQAAAAAAAAAAAAAAAAABABH/2gAMAwEAAhEDEQA/AM7S5XFPxsdY8ciUioNl6wAxr13d/MjMVLEhUAvoYxgQGX//2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1280" height="960"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/neofetch.11e02c2.1280.jpg" srcset="/assets/ideal-img/neofetch.11e02c2.1280.jpg 1280w" width="1280" height="960"></noscript></div></th></tr></thead><tbody><tr><td style="text-align:center"><em>Main information about TV-box system, shown by neofetch</em></td></tr></tbody></table>
<p>Also, we need map compiler sources. For almost 30 years of the existence of the game, quite a few of their
variations have appeared: the original compilers from Valve, ZHLT, VHLT, P2ST, etc. I will use the map compilers
from my PrimeXT project: they are the most up-to-date at the moment, they will be the easiest to build and run
under some exotic platform, unlike all other variations. The game itself, as well as all related utilities,
including map compilers, are written in C/C++. PrimeXT uses the CMake build system.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="preparing">Preparing<a href="https://snmetamorph.github.io/posts/compiling-hl1-maps#preparing" class="hash-link" aria-label="Direct link to Preparing" title="Direct link to Preparing">​</a></h2>
<p>After a short search for information, I found out that in order to build C++ projects straight on Android, I need <a href="https://termux.dev/en/" target="_blank" rel="noopener noreferrer">Termux</a>.
It should be downloaded from the <a href="https://f-droid.org/ru/packages/com.termux/" target="_blank" rel="noopener noreferrer">F-Droid repository</a>, as the version
published on Google Play <a href="https://www.reddit.com/r/termux/comments/pkujfa/important_deprecation_notice_for_google_play/" target="_blank" rel="noopener noreferrer">has been deprecated</a> and is no longer supported.</p>
<p>After installing Termux, just in case, update the installed packages:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pkg upgrade</span><br></span></code></pre></div></div>
<p>Now let's install the packages that we actually need:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pkg install cmake git openssh pkg-config ninja</span><br></span></code></pre></div></div>
<p>For more convenient work, I decided to run an SSH server on the TV-box and connect to it from my computer. For this I used a KiTTY and WinSCP. Of course, you can use any other software instead. And you can do without an SSH server at all - just write all the necessary commands into Termux manually on the device. But I will use WinSCP for convenient work with files on a remote device.</p>
<p>Now you need to start the SSH server: the procedure is quite trivial. At first, we need to set a password to connect to the server, and then start the corresponding service.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">passwd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sshd</span><br></span></code></pre></div></div>
<p>After that, you can try to connect from the computer to the server. Please note that Termux uses port <strong>8022</strong> for the
SSH server, not the usual 22. You can enter any username, but you need to enter the password
specified earlier. If the connection is successful, a shell will be displayed.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAANCAYAAACQN/8FAAAACXBIWXMAAAsTAAALEwEAmpwYAAABV0lEQVR4nF2RyY7bMBBE+f8fk0uOcw8yE8ewI2uxR/tia7FkUdJYA0TyC5q+DNIAQXazyOqqVrvdlsulpKkbhkGjtaZrW9q25Xq9Mo4jYRiizuczcRxzn2eCIMC2Hbbb3ziOg+PYJEmCH/io9tqSpRnT9IHneWx+bfB9n67raJqGPM9Nruq6pshztB5MIYwigjAkjhPe/YCqqvBcF3W73Tgdj5RlxfvpiHvYE/tHiiREtw29HswDJRRBEDLoHusU8+015vuu4sXTvDgdPy2fH5v9kzrPcsZhpLiUzCvozwf6c0XPC7v9H95e31BigzQ9zzNVXSPxeDzMvq4raZpgWRZKLkXZOE5Iv1/j77Lwcb8TRRFKFB0OtjFYzP4ay7IwDIPxVzm2bYAiSor/A8dpek7GdV1kCVCEpWlGURQmlxFKO+ZHMVRo+7435so4s+wJlnNZlvhBwD9Z1OGeE2hZIgAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="452" height="601"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/kitty-shell-1.e22d9ad.452.png" srcset="/assets/ideal-img/kitty-shell-1.e22d9ad.452.png 452w" width="452" height="601"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAeUlEQVR4nI2NQQoDIRRD/1fn29KKUAqdozheQV2oh/H4KbWUoXQWXTwISUiolIKcM2qtaK190XtHSgljDJBSCkR0yCcLIYAWs0BrDWPMDyIyizHGfZH5DTGDXpoYSul98e9r59w0rLXw/gxz85D7Cas8cJHrLG5hwxOGY0p/6Eo7WAAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="661" height="418"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/kitty-shell-2.bf7fd46.661.png" srcset="/assets/ideal-img/kitty-shell-2.bf7fd46.661.png 661w" width="661" height="418"></noscript></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="building-map-compilers">Building map compilers<a href="https://snmetamorph.github.io/posts/compiling-hl1-maps#building-map-compilers" class="hash-link" aria-label="Direct link to Building map compilers" title="Direct link to Building map compilers">​</a></h2>
<p>After completing all the preparatory procedures, you can go directly to the build procedure. The first step is cloning the sources into your home directory:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cd ~</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git clone --recursive https://github.com/SNMetamorph/PrimeXT.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd PrimeXT</span><br></span></code></pre></div></div>
<p>Next, you need to bootstrap vcpkg package manager. You can be warned about missing packages - in this case you need to install them.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">export VCPKG_FORCE_SYSTEM_BINARIES=1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">external/vcpkg/bootstrap-vcpkg.sh</span><br></span></code></pre></div></div>
<p>Then, you need to create and prepare the directory in which the assembly will take place.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cmake -E make_directory ./build</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd build</span><br></span></code></pre></div></div>
<p>And now it's time to generate the CMake cache and run the build. Since I'm only interested in map compilers,
I disabled building game libraries, launcher, and other unrelated utilities. Also, to make the compilation of the project faster, I will set the build to 4 threads.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cmake .. --preset utils-termux-debug</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cmake --build . --parallel 4</span><br></span></code></pre></div></div>
<table><thead><tr><th style="text-align:center"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAt0lEQVR4nEWMPW6DQBgFPwjghWy8fzhBODg3QRQ0UCFwZHMRrj9WtkkxxUhvnqzbxv3+y77vPB8PnvvOtm0sy8K6rszzzHEcSPVeURQ5WZ5RFAUiQpIkkTRNo/d9j1y/r3S3Duc99aWOhBBwzhGCj/E0TYi1Fuct1hq8cxhj0FqjToqyquLjOI7IX900DcF7lFK8pSl5lpOdMlRZ/g/bnxbzZbGfjjqcKZsa3Z65fXR47ZFEGIaBFyaEUHs06nDKAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="661" height="418"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/cmake-cache-generated.c01eb70.661.png" srcset="/assets/ideal-img/cmake-cache-generated.c01eb70.661.png 661w" width="661" height="418"></noscript></div></th></tr></thead><tbody><tr><td style="text-align:center"><em>CMake cache was successfully generated</em></td></tr></tbody></table>
<p>After executing the two commands described above, the build process will start.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAtElEQVR4nEWNzU7CQACEZ7e7bbG0kKUUgZu8Bw1q4gE0uuVS4nvowXf/CC2Jhy+ZSeZHn5fIe//BVx+JfUf87oiXka4/czyf+Pn7Rb5IUSqU3HH/2jqLJPaHPaq2M5KVxy08rva4R4+7+caTNhmaiMPbM5ouSxQMChYzN2hpUW0xwZLUbnhoX1qUhxxVQqVBmYYFPYzY6Xjdvrao2a1wpSNfTJhvC/xTINsVrOsNVZgN5VvwCg5fTgQ80hbMAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="661" height="418"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/build-process-1.dc16eb8.661.png" srcset="/assets/ideal-img/build-process-1.dc16eb8.661.png 661w" width="661" height="418"></noscript></div>
<p>If the build succeeds, it will look like this. If any errors occur, it is better to restart the build process
in one thread, so it will be easier to find out where exactly the compilation error occurred. By the way,
on this TV-box, project building with 4 threads tooks about four minutes, taking into account the
fact that an IPTV player was running in the background and occupying some of CPU resources.</p>
<table><thead><tr><th style="text-align:center"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAwElEQVR4nC3MSU7DMACG0d82ELtJmqEE1UkQIHGJJnTBmkEkDEJiUYYT0PtLH4uyeNunl/dX7j8eedpNTLuZ6Wdm+p6ZPmfmr2fu3h7Y/+5RVueo1EEutPpXCVtZJDFsBtTEhvQ8I73ISc48JzEh6QNJ5/FtQF5sb7eoqAv8KhCaBS5zmKXDFg67dLji6DCOAyqbEhMdWht0alBnULQoCts5FMR4M6L1VSTEBUVfUvUpx5cV/jqjbVryeomM2IwDf8VmT13zPpsPAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="661" height="418"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/build-process-finished.31e9753.661.png" srcset="/assets/ideal-img/build-process-finished.31e9753.661.png 661w" width="661" height="418"></noscript></div></th></tr></thead><tbody><tr><td style="text-align:center"><em>Map compilers build successfully finished</em></td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="compiling-map">Compiling map<a href="https://snmetamorph.github.io/posts/compiling-hl1-maps#compiling-map" class="hash-link" aria-label="Direct link to Compiling map" title="Direct link to Compiling map">​</a></h2>
<p>For the final step, you need to prepare a working directory that will contain WAD files with textures, a <code>.rad</code> file, and a map source. In my case, this directory will be called <code>gameres</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mkdir ~/gameres</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd ~/gameres</span><br></span></code></pre></div></div>
<p>Then, inside this directory, you need to create a <code>gameinfo.txt</code> file with the following content:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">basedir ""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gamedir "gameres"</span><br></span></code></pre></div></div>
<p>Important tip: in this file, the value of the <code>gamedir</code> parameter must match the name of the working directory. Next, you need to put the used WAD files in the working directory, create a subdirectory called <code>maps</code> inside it, and put the <code>.rad</code> file and the map source in the form of a <code>.map</code> file into this subdirectory.</p>
<p>All the necessary files that I used are available at <a href="https://snmetamorph.github.io/assets/files/crossfire_mirror_sources-fcca301f00664a4bf0922c049fe99459.7z" target="_blank">this link</a>.</p>
<p>Now you can try to compile the map, and all that remains is just wait.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cd ~/PrimeXT/build/Release/primext/devkit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./pxcsg ~/gameres/maps/crossfire_double1_v2.map</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./pxbsp ~/gameres/maps/crossfire_double1_v2.bsp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./pxvis ~/gameres/maps/crossfire_double1_v2.bsp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./pxrad ~/gameres/maps/crossfire_double1_v2.bsp</span><br></span></code></pre></div></div>
<p>The map compilation process consists of four steps. At the end of each stage, the time spent on it will be displayed.
If there are any problems during the compilation of the map, you can look at the log file in the <code>maps</code> subdirectory.
Also, you can add the <code>-dev 5</code> startup option to compilers to display the process in more details.</p>
<table><thead><tr><th style="text-align:center"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAHCAYAAAAxrNxjAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAxElEQVR4nFWMu0rEQBhGJ5d/LpmY7AiiIEiwWWxFq8VAEnZ9yy1ikyIhVZ7viKMELA6nOd+nrteRcfxiWRbWdY2e53lnmia2bUMliSfLNCI5Sql/pGka3bYtqiju8L6mriucszjndnxZxvByOaO0DljrY2iMQUR2rLUxHIYBZcwt1nmqv0fRGmMNWnQc/oR936PyPOCLihAOlGVFYQw6F5IsQbTEsOs61PPxheo+8Hh84vW9IXy8EU4PfB7ONDfN72PX8w2yiGVPfo2aqQAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="661" height="434"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/map-compiled.6dc6828.661.png" srcset="/assets/ideal-img/map-compiled.6dc6828.661.png 661w" width="661" height="434"></noscript></div></th></tr></thead><tbody><tr><td style="text-align:center"><em>Last map compiling stage was finished</em></td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="checking-the-results">Checking the results<a href="https://snmetamorph.github.io/posts/compiling-hl1-maps#checking-the-results" class="hash-link" aria-label="Direct link to Checking the results" title="Direct link to Checking the results">​</a></h2>
<p>After the map successfully compiled on the TV-box, I decided to rebuild the same map on my computer
and then compare these two maps. Ideally, there shouldn't be any visible differences. I will test this whole thing
in the PrimeXT mod, which is based on the Xash3D FWGS engine.</p>
<table><thead><tr><th style="text-align:center"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAACCAYAAABhYU3QAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAS0lEQVR4nGOQV3X6r6Dm8l9cyf+/uLL/f15V//+8KqH/RZUC/4spBvwXUwr4L6wQ/J8BJCCiGPyfTy76P69cDBjzyMX+50XGsrH/AcRRHn2NzN7ZAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1005" height="153"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/maps-list.1386617.1005.png" srcset="/assets/ideal-img/maps-list.1386617.1005.png 1005w" width="1005" height="153"></noscript></div></th></tr></thead><tbody><tr><td style="text-align:center"><em>Maps built on different architectures and platforms</em></td></tr></tbody></table>
<p>The engine has a <code>mapstats</code> console command that allows you to display various internal information about the map. For our situation, this is exactly what we need.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stats-of-map-compiled-on-tv-box">Stats of map compiled on TV-box<a href="https://snmetamorph.github.io/posts/compiling-hl1-maps#stats-of-map-compiled-on-tv-box" class="hash-link" aria-label="Direct link to Stats of map compiled on TV-box" title="Direct link to Stats of map compiled on TV-box">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Object names  Objects/Maxobjs  Memory / Maxmem  Fullness</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">------------  ---------------  ---------------  --------</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">entities         [variable]       64780/1048576   ( 6.2%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">planes           2179/65536       43580/1310720   ( 3.3%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">textures         [variable]        4976/33554432  ( 0.0%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vertexes        11219/65535      134628/786420    (17.1%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">visibility       [variable]      199238/16777216  ( 1.2%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nodes            5031/32767      120744/786408    (15.4%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">texinfo          1383/65535       55320/2621400   ( 2.1%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">faces            8467/65535      169340/1310700   (12.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lightmaps        [variable]     1745778/33554432  ( 5.2%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">clipnodes       12686/32767      101488/262136    (38.7%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">leafs            3260/32767       91280/917476    ( 9.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">markfaces       11552/65535       23104/131070    (17.6%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">edges           20150/1048576     80600/4194304   ( 1.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">surfedges       40037/2097152    160148/8388608   ( 1.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">models            142/1024         9088/65536     (13.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">deluxmaps        [variable]     1745778/33554432  ( 5.2%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">=== Total BSP file data space used: 4.53 Mb ===</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">World size ( 5120 5824 3920 ) units</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Supports transparency world water: No</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Lighting: colored</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">World total leafs: 2318</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">original name: maps/crossfire_double1_v2_arm.bsp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">internal name: desert</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">map compiler: PrimeXT Tools v.0.90 (Dec 15 2022 / 1397a04 / armv7l / android)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">map editor: J.A.C.K. 1.1.2800 (vpHalfLife)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stats-of-map-compiled-on-my-pc">Stats of map compiled on my PC<a href="https://snmetamorph.github.io/posts/compiling-hl1-maps#stats-of-map-compiled-on-my-pc" class="hash-link" aria-label="Direct link to Stats of map compiled on my PC" title="Direct link to Stats of map compiled on my PC">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Object names  Objects/Maxobjs  Memory / Maxmem  Fullness</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">------------  ---------------  ---------------  --------</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">entities         [variable]       64777/1048576   ( 6.2%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">planes           2179/65536       43580/1310720   ( 3.3%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">textures         [variable]        4976/33554432  ( 0.0%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vertexes        11210/65535      134520/786420    (17.1%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">visibility       [variable]      198643/16777216  ( 1.2%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nodes            5031/32767      120744/786408    (15.4%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">texinfo          1383/65535       55320/2621400   ( 2.1%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">faces            8465/65535      169300/1310700   (12.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lightmaps        [variable]     1744599/33554432  ( 5.2%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">clipnodes       12747/32767      101976/262136    (38.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">leafs            3258/32767       91224/917476    ( 9.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">markfaces       11512/65535       23024/131070    (17.6%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">edges           20138/1048576     80552/4194304   ( 1.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">surfedges       40013/2097152    160052/8388608   ( 1.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">models            142/1024         9088/65536     (13.9%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">deluxmaps        [variable]     1744599/33554432  ( 5.2%) </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">=== Total BSP file data space used: 4.53 Mb ===</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">World size ( 5120 5824 3920 ) units</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Supports transparency world water: No</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Lighting: colored</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">World total leafs: 2316</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">original name: maps/crossfire_double1_v2.bsp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">internal name: desert</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">map compiler: PrimeXT Tools v.0.90 (Dec 16 2022 / 1397a04 / amd64 / win32)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">map editor: J.A.C.K. 1.1.2800 (vpHalfLife)</span><br></span></code></pre></div></div>
<p>As you can see, there are still minimal differences in stats. It is difficult to say what exactly is the reason for
these differences, but most likely they are completely uncritical.
Next, it makes sense to compare if there are any visual differences on the map itself.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="screenshots-of-map-compiled-on-my-pc">Screenshots of map compiled on my PC<a href="https://snmetamorph.github.io/posts/compiling-hl1-maps#screenshots-of-map-compiled-on-my-pc" class="hash-link" aria-label="Direct link to Screenshots of map compiled on my PC" title="Direct link to Screenshots of map compiled on my PC">​</a></h2>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAk0lEQVR4nF3POwvCQBAE4Mvuzu7lUagkKMHOQtRKRKz9/z9q5C4+wGJgio+BSU3TsERFCWS6t4zo6d7RLCgKwpSpoJQSI7c8nu/czge23apCNacqqIIfBMDr7cnT5cH1ZseIgYagWoG2wBIR4TjOnKY9+2H9XbS6+gcNuQYWS39DKVD1c0Zolglv66kCAGd4EDC+AFA+QUwwo+NzAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1560" height="877"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/ground-truth-1.9a2bd22.1560.png" srcset="/assets/ideal-img/ground-truth-1.9a2bd22.1560.png 1560w" width="1560" height="877"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAArUlEQVR4nB2MS27DIBQAOUGxIQ8eP+M6oFqp5Ebd9P4nmypZzWJGY8a8KLkTboo4JfiIsw7xSu0PtuP5ptFyomVgFyGGjaQ73kXWVenjl/v5R90vTEgDLZMUM5onQQ+czyy+0vbrHb6uJuaBhMb3fJDqFyIbXirWZZxstM8ftJ6YqJ3lw7NYIbeT2k5Wl3C+4F0ipUHKE1NDIkrjyHdm6OwvaQW1N3QVemwUUf4ByaJO2iUFwsoAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1560" height="877"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/ground-truth-2.88bae06.1560.png" srcset="/assets/ideal-img/ground-truth-2.88bae06.1560.png 1560w" width="1560" height="877"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAr0lEQVR4nB3PS27CQBBFUY8Cxu6u6v8Pk5AICSExyyz7X9eN7PnRfXqTuoo1DlmFUQajXanlimjBhYHGwW6m87zycVoIoVNTJ4VCLRuiFZ821DfMDq14fLqxfb0JaePx/D1K1jXEd6xv2B3GWMn9Qb+9yP2H5/vvAKtk5kUxWrDSmM4XJdf7MSWSGP0bayPiKosJGIkYSUyX04yxnhIrdlWCC3yOOzk21v2kzxgN/AN5h0o2xZxpKgAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1560" height="877"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/ground-truth-3.677ef73.1560.png" srcset="/assets/ideal-img/ground-truth-3.677ef73.1560.png 1560w" width="1560" height="877"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAmUlEQVR4nD2MwQrCMBAFd9PdJCYxTdPqwdIWRaNURaGKCF70/z9KctDh3eYxAIAAiCgQEX4QszE++hqyyA8QRVHFZT/sD8fHNL3T9uJdDUyKSFLBRLLr0/32uZ5fp/G57sfyr5U0cxcBhHNhGFLbbrp2Z2YBiBTnaecqa0utrPexrJqmWVkTQEtFxLnOKoSFZC0EMbOzNvj4BZhZCgo+MZ4HAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1600" height="900"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/ground-truth-4.af8853c.1600.png" srcset="/assets/ideal-img/ground-truth-4.af8853c.1600.png 1600w" width="1600" height="900"></noscript></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="screenshots-of-map-compiled-on-tv-box">Screenshots of map compiled on TV-box<a href="https://snmetamorph.github.io/posts/compiling-hl1-maps#screenshots-of-map-compiled-on-tv-box" class="hash-link" aria-label="Direct link to Screenshots of map compiled on TV-box" title="Direct link to Screenshots of map compiled on TV-box">​</a></h2>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAkElEQVR4nFXPwQrCQAwE0Oxmkm1rD7agFfGoIIp48CT+/3eNZFsLHoZcHsNEUkqM5Jxp1tC9ZSkbuncECrOCBqUEEhEC4OX64nQ8s+u2FSqcqkZVzDAlqY2P54e3+5vDeGBpesIKFUbNK5wzDhP3uxP7flgbsbT+wdgUOyOwZoWxU1R/zyzQ2wpVnWbO4nGNXzJdQRgxeDZ1AAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1560" height="877"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/tvbox-map-1.e45c600.1560.png" srcset="/assets/ideal-img/tvbox-map-1.e45c600.1560.png 1560w" width="1560" height="877"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAsElEQVR4nAXBW1bEIBBAwazAEAjQzSMkBsboeGb0+KH739i1ahq3Jzk1wqp4JwQXsbPFO6W2D+r5TWl3JikXkjvGeCQ2VA6cFZZFaf2Hfv1R9wdT0I6mGxozkgdRT6xLGFeox4N+/bKdX0ySOj5UPscdLW8E31h9wdiEDRv19YnUiylKw7ysmNmT6zulXixWsWvGWSWlQUo3phqU6Df2PBhh57CJNHt0XpHF02Qje+Ef5hxPFQMp/A4AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1560" height="877"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/tvbox-map-2.40bbd7c.1560.png" srcset="/assets/ideal-img/tvbox-map-2.40bbd7c.1560.png 1560w" width="1560" height="877"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAsElEQVR4nB3Ly07DMBBA0awKaWrP+BF7nNhREZFaIdiw5v9/6yJ1fXSmEAyVhDil205vA6sd0ULIA10HMRnT+9VxuczEaFjZKbli9UDUiHkgqeFDY3I+ENeDcf8m5875+CWkHa+Gpg0fGxI3ppwbtT/Yji/qfvL8+XuB08K8KD4YXoxpXgK1fSJaUa30/eTmEhKMm8s4n19pur7NiE/U3PCLkjRzHx+UdePmAhILXhL/lDpKa7irYNEAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1560" height="877"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/tvbox-map-3.c0db540.1560.png" srcset="/assets/ideal-img/tvbox-map-3.c0db540.1560.png 1560w" width="1560" height="877"></noscript></div>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAsElEQVR4nD2NzUrDQBhFv/k3M8mMkxQEYxsUq1YLXbQLBRf6/g91JKO4ONzL5cAVEcWKUhql1i7/eOdJMVPzhDShyYI2hjresFteOLy9c7588bw/UfoJsTZgrcca3/Ju+8Tl/M3p+Mnx8MH98kruxz/ReLzvGNZBFH0q7JY98/zAdn4kduVXdI0r+lRJqRBCYsiVUjdspltSvEaCCxjjMFq365xHnAtobbHWErtIGSo/H3dFnvuyTFUAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="1560" height="877"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/tvbox-map-4.1f86681.1560.png" srcset="/assets/ideal-img/tvbox-map-4.1f86681.1560.png 1560w" width="1560" height="877"></noscript></div>
<p>Personally, I didn’t notice any visual differences in lighting or geometry at all, which of course is good.
The experiment can be considered successful.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="resume">Resume<a href="https://snmetamorph.github.io/posts/compiling-hl1-maps#resume" class="hash-link" aria-label="Direct link to Resume" title="Direct link to Resume">​</a></h2>
<p>Using the procedures described above, it is quite possible to compile maps for Half-Life 1 on almost any device that
is based on the Android or Linux OS. Unless, on too large and detailed maps, the device may not have enough RAM
for compiling.</p>
<p>Despite the fact that all this was not initially intended as something useful, it is possible to find some use cases: for example, if for some reason you don’t want to load the PC, or there are no devices other than a smartphone at all (unfortunately it's pretty common nowadays, PCs stand back in favour of smartphones), but you need to compile the map somehow.</p>]]></content>
        <category label="gamedev" term="gamedev"/>
        <category label="half-life" term="half-life"/>
        <category label="xash3d" term="xash3d"/>
        <category label="primext" term="primext"/>
        <category label="android" term="android"/>
        <category label="linux" term="linux"/>
        <category label="modding" term="modding"/>
        <category label="mapping" term="mapping"/>
        <category label="termux" term="termux"/>
        <category label="vhlt" term="vhlt"/>
        <category label="zhlt" term="zhlt"/>
        <category label="p2st" term="p2st"/>
        <category label="valve" term="valve"/>
        <category label="cmake" term="cmake"/>
        <category label="crossplatform" term="crossplatform"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Windows typical exception codes cheatsheet]]></title>
        <id>https://snmetamorph.github.io/posts/exceptions-win32</id>
        <link href="https://snmetamorph.github.io/posts/exceptions-win32"/>
        <updated>2022-11-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[For somehow strange reason, there is no handy list of common Windows application exception codes list on the entire Internet. At least, I can't find it in Google. So I decided to make this one here.]]></summary>
        <content type="html"><![CDATA[<p>For somehow strange reason, there is no handy list of common Windows application exception codes list on the
entire Internet. At least, I can't find it in Google. So I decided to make this one here. Also I think in future this list can be extended with more info.</p>
<table><thead><tr><th>Exception code</th><th>Name</th><th>Cause of exception</th></tr></thead><tbody><tr><td>0xC0000005</td><td>STATUS_ACCESS_VIOLATION</td><td>Reading or writing to an inaccessible memory location</td></tr><tr><td>0x80000003</td><td>STATUS_BREAKPOINT</td><td>Encountering a hardware-defined breakpoint; used only by debuggers</td></tr><tr><td>0x80000002</td><td>STATUS_DATATYPE_MISALIGNMENT</td><td>Reading or writing to data at an address that is not properly aligned; for example, 16-bit entities must be aligned on 2-byte boundaries (Not applicable to Intel 80x86 processors)</td></tr><tr><td>0xC000008E</td><td>STATUS_FLOAT_DIVIDE_BY_ZERO</td><td>Dividing floating-point type by 0.0</td></tr><tr><td>0xC0000091</td><td>STATUS_FLOAT_OVERFLOW</td><td>Exceeding maximum positive exponent of floating-point type</td></tr><tr><td>0xC0000093</td><td>STATUS_FLOAT_UNDERFLOW</td><td>Exceeding magnitude of lowest negative exponent of floating-point type</td></tr><tr><td>0xC000001D</td><td>STATUS_ILLEGAL_INSTRUCTION</td><td>Attempting to execute an instruction code not defined by the processor</td></tr><tr><td>0xC0000096</td><td>STATUS_PRIVILEGED_INSTRUCTION</td><td>Executing an instruction not allowed in current machine mode</td></tr><tr><td>0xC0000094</td><td>STATUS_INTEGER_DIVIDE_BY_ZERO</td><td>Dividing an integer type by 0</td></tr><tr><td>0xC0000095</td><td>STATUS_INTEGER_OVERFLOW</td><td>Attempting an operation that exceeds the range of the integer</td></tr><tr><td>0x80000004</td><td>STATUS_SINGLE_STEP</td><td>Executing one instruction in single-step mode; used only by debuggers</td></tr></tbody></table>]]></content>
        <category label="winapi" term="winapi"/>
        <category label="windows" term="windows"/>
        <category label="win32" term="win32"/>
        <category label="exception" term="exception"/>
        <category label="cheatsheet" term="cheatsheet"/>
        <category label="return code" term="return code"/>
        <category label="STATUS_ACCESS_VIOLATION" term="STATUS_ACCESS_VIOLATION"/>
    </entry>
</feed>