Rules to detect game engines and other technologies based on Steam depot file lists

Overview

SteamDB File Detection Rule Sets

This is a set of scripts that are used by SteamDB to make educated guesses about the engine(s) & technology used to build various games.

It makes educated guesses, but they are just that, guesses.
It is not perfect.
It will never be perfect.
Do not expect it to be perfect.

You can browse the result of this here: https://steamdb.info/tech/

Overview

Every app on Steam is associated with a number of file depots. For each app on Steam, SteamDB will run these scripts over all the filenames in all of its depots. Note that it is filenames, not files. These scripts only scan the names of the files, not the data they contain. Note that there are over 100 million files on SteamDB, so scanning filenames alone is already a pretty big task.

These detections rely on SteamDB being able to access the file lists. Use SteamDB's token dumper program if you can to improve the coverage!

Pattern-matching rules

rules.ini defines a set of regular expressions which are run against every filename in the Steam Database. A PHP script uses the resulting matches to make educated guesses about what the most likely technology could be.

The ini file defines multiple sections, each with its own sub-patterns:

  • Engine
  • Evidence
  • Container
  • Emulator
  • AntiCheat
  • SDK

Here's an example of some rule patterns:

[Engine]
AdobeAIR = (?:^|/)Adobe AIR(?:$|/)
AdventureGameStudio = (?:^|/)(?:AGSteam\.dll|acsetup\.cfg)$
XNA[] = (?:^|/|\.)XNA(?:$|/|\.)
XNA[] = (?:^|/)xnafx31_redist\.msi$
FNA = (?:^|/)fna\.dll$

This snippet defines a section named "Engine." On SteamDB pattern names are prefixed with the section name. So that becomes "Engine.AdobeAIR", "Engine.AdventureGameStudio", "Engine.XNA", and so on.

Let's look at that first line which mentions AdobeAIR: AdobeAIR = (?:^|/)Adobe AIR(?:$|/). This regular expression assigns the pattern value of Engine.AdobeAIR to any file or directory that has the exact name "Adobe AIR", or contains that exact phrase as a parent directory in its path. We highly recommend the site regexr.com to test your regular expressions.

Some things to note:

  • All rules are case INsensitive
  • You can assign multiple rules to a single definition, and any of them will cause a match. Just use the [] after the pattern name as shown in the above example for XNA.
  • The regex pattern runs on the full file path as it appears in the depot, e.g. game/bin/win64/dota2.exe, not just dota2.exe
  • File paths will always use / (forward slash) as the path separator
  • The regex generator uses ~ as the boundary, so there is no need to escape /
  • Detections that work only for a single game are generally unwanted

Engine means game/software engines. The definition for this is pretty fuzzy and invites endless debate but basically if it is a big library or toolkit that many people use to make games and software we call that an engine.

Evidence are patterns that get fed to the script on a second pass to help identify things that weren't identified on the first pass.

Container is a category to refer to things like Electron, a common wrapper for HTML5 games. This is because games that use Electron often have some other technology they're using that they would consider their actual engine, such as PixiJS, Phaser, OpenFL, Heaps, etc.

Emulator is for identifying packed-in emulation technology. For instance, many DOS games come packaged with DOSBOX, and so we note those files with Emulator.DOSBOX.

AntiCheat is for anti-cheat files like BattlEye, EasyAntiCheat, and PunkBuster.

SDK are all other libraries and software development kits that an app might be using.

How it works

A two-pass script runs over every file. On the first pass it tries to make a "slam dunk" identification based on a strong signal from any file. Engine patterns are primarily used here, looking for obvious things like Unity, Unreal, MonoGame, RPGMaker, XNA/FNA, AdobeAIR, etc. These game engines often have very clear signatures — ie "UnityEngine.dll". An "Engine" pattern should be strong enough to confidently match against a particular engine based on one single positive match against any file in the depot.

Evidence patterns are meant for building up "hints" about what kind of engine or technology might be in use when a slam-dunk identification is not possible from a single pattern match. Once all the obvious tests have been made, if a particular app has no clear identification it will do a second pass in FileDetector.php by calling the TryDeduceEngine() function. For instance, GameMaker games are hard to identify based on any single file, but they have a common pattern: an "options.ini" file, a "data.win" file, and an audio file matching the pattern snd_.ogg. The problem is that these are pretty generic filenames that often occur outside of GameMaker games. However, once we have already ruled out most of the other engines from our first logic pass if we find two or more of these three file patterns chances are very good we're looking at a GameMaker game.

Tests

If you have PHP installed locally, you can run the tests from the root directory by typing php tests/Test.php.

Contributing

See CONTRIBUTING.md file.

How SteamDB uses this information

SteamDB makes two sets of identifications — the technology the file likely represents, and the technology the app makes use of. Each file will match against at most one rule in a section. Therefore the order of the rules and the two-pass tests matters, but an app can have multiple rulings applied to it.

It is even possible for an app to have multiple game engines — this happens when an app represents a multi-game compilation, or uses one technology for its launcher app and one for the game itself, or whatever.

False negatives and positives

Report false classifications here

It is inevitable when working at this scale that we will have both false negatives and false positives.

False negatives are when a game is made with a certain technology and we fail to identify it as such. For many engines, there is nothing we can do about this because there simply isn't enough information left by the filenames alone to reliably detect them. Some engines leave no reliable trace of their identity whatsoever (particularly HTML5 game engines), others like GameMaker and Godot leave subtle patterns that allow us to make educated guesses, and others are super obvious.

We try to err on the side of avoiding false positives, even if that causes us to have more false negatives.

That said, this is all fuzzy at best and all we can do is try to select for the best tradeoffs. Don't expect this tool to be an omniscient oracle, it's operations are quite simple.

Absence of evidence is not evidence of absence

Something to emphasize is we are certainly undercounting engines/technology in three main ways:

  1. We can't detect things we don't yet have rules for
  2. False negatives will keep us from detecting every instance of a particular technology, even if we have rules for it
  3. Some engines are fundamentally undetectable or extremely difficult to identify

For instance, the HaxeFlixel game engine likely represents a large percentage of Lime/OpenFL games on Steam. However, HaxeFlixel does not leave a particular signature that easily distinguishes games made with it from conventional Lime/OpenFL games. We can't even distinguish between games made in Lime (a low level framework) and games made in OpenFL (a high level framework based on Lime). This pattern likely repeats with many other game engines and technologies.

So please note these limitations any time you use this data for anything important.

One game can match multiple engines

Sometimes games will include extra software like a level editor, a launcher, or configuration tool and that will be written in an engine other than what was used to build the game itself. Therefore it is not uncommon to find games that match multiple engines. The script is not able to disentangle this information, so an appid matching for multiple engines is simply saying that it found files matching the signatures of all of those engines within the depots associated with that appid. Nothing more, nothing less.

For a practical example: The Witcher: Enhanced Edition contains a digital comic book that is displayed in a standalone app created with the Unity Engine. The game itself was written in the Aurora engine.

Comments
  • Many games after recent Godot changes

    Many games after recent Godot changes

    SteamDB link to the game

    From pastebin that @larsiusprime sent me, all these have wrongly been removed from matching Godot. They have a pattern that we can properly match.

    App 1041180 - Removed Engine.Godot
    App 1269540 - Removed Engine.Godot
    App 1389030 - Removed Engine.Godot
    App 1412500 - Removed Engine.Godot
    App 1429120 - Removed Engine.Godot
    App 1507970 - Removed Engine.Godot
    App 1539630 - Removed Engine.Godot
    App 1561390 - Removed Engine.Godot
    App 1660050 - Removed Engine.Godot
    App 1684810 - Removed Engine.Godot
    App 388490 - Removed Engine.Godot
    App 498310 - Removed Engine.Godot
    App 863330 - Removed Engine.Godot
    

    What should it be detected as?

    Godot

    False negative 
    opened by akien-mga 27
  • Godot games with multiple PCK files

    Godot games with multiple PCK files

    SteamDB link to the game

    https://steamdb.info/app/498310/info/ https://steamdb.info/app/1079290/info/

    What should it be detected as?

    Godot

    Additional information

    These should be detected as Godot, but we currently exclude these knowingly as we fear a high number of false positives due to old games using .pck extensions for their multiple asset packs (data.pck, sounds.pck, etc.).

    I do think that after the last few days' improvements to the Godot heuristics, we should be able to include them provided that they pass the other Godot 3.0+ criteria, i.e. there must be a mygame.pck that matches mygame.exe, mygame.x86_64, mygame.x86 or mygame.

    I don't think that there is any pre-Godot 3.0 game using multiple PCKs, so it should be OK to keep excluding data.pck + other PCKs, as this is the case that would lead to most false positives.

    Before pushing a potential fix for this, I would recommend sharing a list of what would be the new additions, so that I can review it and ensure that there aren't any false negatives.

    False negative 
    opened by akien-mga 13
  • Add CRIWARE

    Add CRIWARE

    opened by M00nG 10
  • Update detection for Cocos engine

    Update detection for Cocos engine

    SteamDB app page links to a few games using this

    Brief explanation of the change

    Update detection for Cocos engine, including Cocos2d-x(v1, v2, v3, v4) and Cocos Creator (v1, v2, v3)

    Type: Engine 
    opened by dumganhar 9
  • Add Missing Descriptions

    Add Missing Descriptions

    Brief explanation of the change

    Added missing descriptions For now it's a draft until i finish doing missing ones and maybe change the ones i really don't like.

    Type: Engine Type: SDK 
    opened by Lifeismana 8
  • Add Photon as Sdk

    Add Photon as Sdk

    SteamDB app page links to a few games using this

    https://steamdb.info/app/1124300/ https://steamdb.info/app/1557740/ https://steamdb.info/app/823130/

    Brief explanation of the change

    Add Photon as an Sdk Simply called it Photon, (because the company is called Photon) should i add networking to it ? closes #81

    Type: SDK 
    opened by Lifeismana 7
  • Photon networking

    Photon networking

    Some reference to the SDK, such as the developer site or a wikipedia article.

    https://www.photonengine.com/ used in many popular games for networking/multiplayer

    SteamDB links

    https://steamdb.info/app/1124300/ https://steamdb.info/app/761890/ https://steamdb.info/app/794260/ https://steamdb.info/app/471710/ https://steamdb.info/app/1557740/ https://steamdb.info/app/823130/subs/

    Possible way to detect it

    Photon3Unity3D.dll Photon3DotNet.dll PhotonLoadbalancingApi.dll PhotonRealtime.dll PhotonChat.dll PhotonUnityNetworking.dll PhotonUnityNetworking.Utilities.dll

    Type: Engine 
    opened by LaserYGD 7
  • Borderlands 2 wrongly detected as XNA

    Borderlands 2 wrongly detected as XNA

    SteamDB link to the game

    https://steamdb.info/app/49520/

    What is it being detected as and what should it be detected as? Any other information?

    Borderlands 2 is being wrongly detected as XNA. It should be detected as Unreal Engine.

    False positive 
    opened by LaserYGD 7
  • Engines/frostbite

    Engines/frostbite

    SteamDB app page links to a few games using this

    https://steamdb.info/depot/1222731/ https://steamdb.info/depot/1262541/ https://steamdb.info/depot/1262601/ https://steamdb.info/depot/1313861/ https://steamdb.info/depot/1238811/

    Brief explanation of the change

    Added Frostbite Engine.

    Type: Engine 
    opened by Suvitruf 7
  • Add NScripter

    Add NScripter

    SteamDB app page links to a few games using this

    https://steamdb.info/app/264380 https://steamdb.info/app/406550 https://steamdb.info/app/639490 https://steamdb.info/app/1162560

    Brief explanation of the change

    Yes, another VN engine from me 😅 This is an older Japanese one. The engine itself is no longer updated, but still sees some use, including on Steam.

    Type: Engine 
    opened by andOlga 6
  • Add Visual Novel Maker

    Add Visual Novel Maker

    SteamDB app page links to a few games using this

    https://steamdb.info/app/1014580 https://steamdb.info/app/1118910 https://steamdb.info/app/1116660 https://steamdb.info/app/949670 ...and basically everything listed on this board, and then some.

    Brief explanation of the change

    This adds the Visual Novel Maker engine (official website, Steam store page), which is, as the name implies, an engine for creating visual novels. It's from the same company that made RPG Maker.

    Type: Engine 
    opened by andOlga 6
  • Improve GoldSource detection

    Improve GoldSource detection

    SteamDB app page links to a few games using this

    https://store.steampowered.com/app/261980/HalfLife_Before/ https://store.steampowered.com/app/1283930/HalfLife_Restored/

    Brief explanation of the change

    Checking for hltv.exe is not a reliable method, while liblist.gam is mandatory for GoldSrc mods.

    Type: Engine 
    opened by Velaron 2
  • Add Python

    Add Python

    SteamDB app page links to a few games using this

    https://steamdb.info/app/3900 https://steamdb.info/app/1840 https://steamdb.info/app/375910 https://steamdb.info/app/916440

    Brief explanation of the change

    Add Python as an SDK

    this regex is mostly horrible but it matchs most of the dlls, i wonder if there's a way i can make it less horrible

    Type: SDK 
    opened by Lifeismana 0
  • Add detection for Unity IL2CPP

    Add detection for Unity IL2CPP

    Some reference to the SDK, such as the developer site or a wikipedia article.

    https://docs.unity3d.com/Manual/IL2CPP.html

    SteamDB links

    https://steamdb.info/app/1449850/ https://steamdb.info/app/1468810/ https://steamdb.info/app/1203220/ https://steamdb.info/app/1604030/ https://steamdb.info/app/1782210/ https://steamdb.info/app/1611910

    Possible way to detect it

    It would probably be enough to just check by GameAssembly\.dll, or also for the il2cpp_data folder if needed, but I don't think any other technology uses that specific filename.

    Type: Engine 
    opened by Yardanico 3
  • Godot Detection (multiple pck, and bundles)

    Godot Detection (multiple pck, and bundles)

    Some reference to the engine, such as the developer site or a wikipedia article.

    https://docs.godotengine.org/en/stable/about/index.html

    SteamDB links

    https://steamdb.info/app/1003860/ https://steamdb.info/app/1003860/ https://steamdb.info/app/1031790/ https://steamdb.info/app/1845050/ https://steamdb.info/app/1204080/

    Possible way to detect it

    First: The default Godot export will ALWAYS have the same binary if the dev used no engine modules, so you can do an md5 check on that. This can solve games with multiple pcks, as godot can support that with no modifications.

    Second: To detect games that bundle the pck, this kind of tool could be used to separate the bundle, then either check the binary or check if the PCK is valid for godot. https://github.com/rfht/pck-extract https://github.com/hhyyrylainen/GodotPckTool

    Might work for more customized versions based on this: https://gamebanana.com/tuts/14362

    If all else fails, open an issue on the Godot Github, they will support you as it means that more godot games become visible. https://github.com/godotengine

    Type: Engine 
    opened by Frontrider 0
  • Rewired for Unity

    Rewired for Unity

    Some reference to the SDK, such as the developer site or a wikipedia article.

    https://guavaman.com/projects/rewired/ https://assetstore.unity.com/packages/tools/utilities/rewired-21676

    SteamDB links

    https://steamdb.info/app/632360/ https://steamdb.info/app/900270/ https://steamdb.info/app/1393420/

    Possible way to detect it

    • Usually a .dll resides in a sub-folder of Unity game, like Managed\, Plugins\, Plugins\x86, Plugins\x86_64\ etc.
    • Can contain one or several files with names:
    Rewired_Core.dll
    Rewired_CSharp.dll
    Rewired_DirectInput.dll
    Rewired_Linux.dll
    Rewired_OSX.dll
    Rewired_Windows.dll
    Rewired_Windows_Lib.dll
    
    Type: Engine 
    opened by liandris 1
  • NetEase NeoX

    NetEase NeoX

    Some reference to the engine, such as the developer site or a wikipedia article.

    NetEase Proprietary Engine.

    Only mentioned in passing describing EVE Echoes in press releases.

    https://www.neteasegames.com/news/game/20191113/30576_848390.html https://www.neteasegames.com/news/game/20190807/30576_826962.html

    SteamDB links

    • https://steamdb.info/app/1755920/
    • https://steamdb.info/app/1368910/
    • https://steamdb.info/app/551170/

    Possible way to detect it

    any of (optionally)

    • npk.dll
    • nxmalloc.dll
    • nxapp.dll
    • nxasset.dll
    • nxcore.dll

    always has at least one file that has an .npk extension.

    Type: Engine 
    opened by yretenai 2
Owner
Steam Database
🚰 We occasionally make the pipes leak
Steam Database
Dépôt pour les cours et TP de BSN 1 en PHP

Introduction au WEB - Back Applications à télécharger et installer : Visual Studio Code : lien MAMP (serveur) : lien Ngrok : lien Base Après la config

Dan 5 Jan 31, 2022
Phpcs-magento-rules - A set of PHPCS rules used by made.com when hacking Magento

Made.com PHPCS Magento Rules A set of PHPCS rules used by made.com when hacking Magento. Pre-Requisites PHPCS Installation Short Version Clone this re

Made.com Tech Team 26 Jun 3, 2020
Easy management of Virtualization technologies including KVM, Xen, OpenVZ, Virtuozzo, and LXC/LXD including unified commands, monitoring, template management, and many more features.

ProVirted About Easy management of Virtualization technologies including KVM, Xen, OpenVZ, Virtuozzo, and LXC/LXD including unified commands, monitori

null 2 Aug 22, 2022
A collection of command-line utilities to aid in debugging browser engines.

Browser debug utilities This project contains several scripts that make the process of debugging browser engines much easier (some special cases excep

Clay Freeman 5 May 29, 2023
Php-file-iterator - FilterIterator implementation that filters files based on a list of suffixes, prefixes, and other exclusion criteria.

php-file-iterator Installation You can add this library as a local, per-project dependency to your project using Composer: composer require phpunit/ph

Sebastian Bergmann 7.1k Jan 3, 2023
Mobile detect change theme and redirect based on device type. Magento 2 module.

Magento 2 Mobile Detect Theme Change Magento 2 Mobile detect system can be used to load different themes base on the client device (desktop, tablet, m

EAdesign 27 Jul 5, 2022
A text-based, persistent browser-based strategy game (PBBG) in a fantasy war setting

Note: OpenDominion is still in development. Some features of the game have not been implemented yet. Introduction OpenDominion is a free and open-sour

null 180 Dec 28, 2022
This library can be used, among other things, to retrieve the classes, interfaces, traits, enums, functions and constants declared in a file

marijnvanwezel/reflection-file Library that allows reflection of files. This library can be used, among other things, to retrieve the classes, interfa

Marijn van Wezel 5 Apr 17, 2022
Library for PHP 7.4+ to detect Browsers and Devices

This library requires PHP 7.4+. Also a PSR-3 compatible logger and a PSR-16 compatible cache are required. In

Thomas Müller 37 Oct 2, 2022
Library allows to detect emoji, remove emoji, encode emoji and decode emoji in string.

It allows to detect emoji, remove emoji, encode emoji and decode emoji in string. Installation composer require anisimov/emoji How to use Encode and

Aleksey Anisimov 9 Nov 8, 2022
Helps detect the user's browser and platform at the PHP level via the user agent

cbschuld/browser.php Helps detect the user's browser and platform at the PHP level via the user agent Installation You can add this library as a local

Chris Schuld 574 Dec 16, 2022
Core functionality for Legend of the Green Dragon, a text-based RPG game.

Legend of the Green Dragon (Core) Legend of the Green Dragon is a text-based RPG originally developed by Eric Stevens and JT Traub as a remake of and

Legend of the Green Dragon 135 Dec 28, 2022
A Finite State Machine System based on Chapter 3.1 of Game Programming Gems 1 by Eric Dybsand

A Finite State Machine System based on Chapter 3.1 of Game Programming Gems 1 by Eric Dybsand,Written by Roberto Cezar Bianchini, July 2010 ported to php by MrFerrys.

null 4 Apr 18, 2022
Detect flaws in your architecture, before they drag you down into the depths of dependency hell ...

Detect flaws in your architecture before they drag you down into the depths of dependency hell ... What it does System Requirements Installation Phive

Michael Haeuslmann 507 Dec 27, 2022
Tool to detect assumptions

PHP Assumptions Setup $ composer require --dev rskuipers/php-assumptions Introduction PHP Assumptions is the result of a proof of concept inspired by

Rick Kuipers 153 Dec 8, 2022
The main scope of this extension is to help phpstan to detect the type of object after the Assert\Assertion validation.

PHPStan beberlei/assert extension PHPStan beberlei/assert Description The main scope of this extension is to help phpstan to detect the type of object

PHPStan 33 Jan 2, 2023
Banana detect adblock :Detects ad blockers (AdBlock, ublock, ...)

banana detect adblock :Detects ad blockers (AdBlock, ublock, ...)

banana 24 Dec 28, 2022
Detect the position of a face in an image.

Face Detector PHP GD 를 이용해 이미지의 얼굴 위치를 식별합니다. mauricesvay/php-facedetection 프로젝트를 기반으로 만들었습니다. js 로 포팅하며 개선한 사항들을 적용하여 error_reporting = E_ALL safe 하게

Song Hyo Jin 4 Jul 27, 2022
Test and enforce architectural rules in your Laravel applications. Keep your app's architecture clean and consistent!

Laravel Arkitect Laravel Arkitect lets you test and enforce your architectural rules in your Laravel applications, and it's a PHPArkitect wrapper for

SMorteza Ebadi 55 Dec 17, 2022