{"id":17261270,"url":"https://github.com/aybe/twisted","last_synced_at":"2025-07-30T02:33:38.529Z","repository":{"id":84878653,"uuid":"453986084","full_name":"aybe/Twisted","owner":"aybe","description":"Twisted Metal reverse-engineering","archived":false,"fork":false,"pushed_at":"2022-05-19T15:27:00.000Z","size":2662,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"develop","last_synced_at":"2025-04-06T00:22:52.798Z","etag":null,"topics":["playstation","twisted-metal","unity3d"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aybe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-31T11:51:07.000Z","updated_at":"2025-04-01T17:53:46.000Z","dependencies_parsed_at":"2023-03-02T18:16:16.564Z","dependency_job_id":null,"html_url":"https://github.com/aybe/Twisted","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/aybe/Twisted","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aybe%2FTwisted","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aybe%2FTwisted/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aybe%2FTwisted/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aybe%2FTwisted/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aybe","download_url":"https://codeload.github.com/aybe/Twisted/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aybe%2FTwisted/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267798625,"owners_count":24145727,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-30T02:00:09.044Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["playstation","twisted-metal","unity3d"],"created_at":"2024-10-15T07:50:36.697Z","updated_at":"2025-07-30T02:33:37.679Z","avatar_url":"https://github.com/aybe.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Twisted\n\nReverse-engineering of Twisted Metal, a game released on the PlayStation in 1995.\n\n# Table of Contents\n\n- [Twisted](#twisted)\n- [Table of Contents](#table-of-contents)\n- [Getting started](#getting-started)\n- [Using the database viewer](#using-the-database-viewer)\n  - [The toolbar](#the-toolbar)\n  - [The database view](#the-database-view)\n  - [The database columns](#the-database-columns)\n- [Reverse-engineering](#reverse-engineering)\n  - [The database](#the-database)\n  - [The symbols](#the-symbols)\n  - [Tips and tricks](#tips-and-tricks)\n- [Known issues](#known-issues)\n  - [Unity](#unity)\n  - [Project](#project)\n- [Gallery](#gallery)\n\n# Getting started\n\nTo use this project, you will need the following:\n\n- [Unity 2022.1.0b16](https://unity3d.com/beta/2022.1b#downloads) or later as the project uses the latest UI elements\n\n- Twisted Metal, you can use demo files from [*UK PlayStation Magazine 4 CD*](https://github.com/aybe/Twisted/releases/tag/twisted)\n\n# Using the database viewer\n\nThe database viewer allows you to explore levels of the game, you can launch it from the _Twisted_ menu.\n\n![](README01.png)\n\n## The toolbar\n\n***Open an existing database:***\n\nEvery database has an associated texture atlas, make sure that both are in the same directory.\n\n***Enable polygon-level generation:***\n\nGenerates one game object per polygon, this is quite slow but allows for a detailed inspection.\n\n***Enable texture:***\n\nObjects without texture will most likely need to have vertex color enabled to look as intended.\n\n***Enable transparency:***\n\nObjects with transparency will most likely need to have this setting enabled to look as intended.\n\n***Enable vertex color:***\n\nPretty much all objects in the game will require this setting to be enabled to look as intended.\n\n***Enable polygon color:***\n\nTints every polygon family with a distinct color, useful to highlight usage of a specific polygon family.\n\n***Enable hierarchy filtering:***\n\nFilters out the generated hierarchy, only including objects tagged as being part of the environment.\n\n***Enable search filtering:***\n\nFilters out the nodes shown in the list while searching the database, only including distinct nodes.\n\n***Enable selection framing:***\n\nEnabling this setting will automatically frame the generated hierarchy of objects in the scene view.\n\n***Number of visible nodes:***\n\nIndicates how many nodes are currently shown in the tree or in the filtered list during a search.\n\n***Search field:***\n\nFilters out the database to show nodes containing entered text, regular expressions are supported.\n\n## The database view\n\nThe content is shown as a tree view that switches to a list view while performing a search.\n\nMulti-column sort can be done by holding \u003ckbd\u003eCtrl\u003c/kbd\u003e or \u003ckbd\u003eShift\u003c/kbd\u003e key to add or remove a column.\n\nDatabase nodes have a context menu from which you can perform some actions on them.\n\n## The database columns\n\n***Name:***\n\nThe name of the class that implements the node.\n\n***Kind:***\n\nThe major type for the node, categorizes nodes by their purpose in the database.\n\n***Role:***\n\nThe minor type for the node, categorizes nodes by their purpose in the scene.\n\n***Position:***\n\nThe position of the node in the database file.\n\n***Length:***\n\nThe length of the node in the database file.\n\n***Category:***\n\nThis is a human-friendly representation of the *Role* column, indicates major role in scene.\n\n***Description:***\n\nThis is a human-friendly representation of the *Role* column, indicates minor role in scene.\n\n***Polygons:***\n\nIndicates what family of polygons are referenced by the database node.\n\n# Reverse-engineering\n\n## The database\n\nThe DMD format is a hierarchical data structure that consists of nodes with different kind and role.\n\nIt appears to be a rough variation of the HMD format that can be found in the official PlayStation SDK.\n\nEverything in the database is referred to by an offset to a base pointer specified at the top of the file.\n\nThe nodes themselves are intertwined with model data throughout the file and in no particular order.\n\n## The symbols\n\nThese can be found in the PSX.SYM file and they do match against the executable SIPS_600.07.\n\nObviously, knowing this information is extremely useful in further understanding the game!\n\nGhidra and IDA users can generate a script to perform batch renaming using [dumpsym](https://github.com/aybe/dumpsym).\n\n## Tips and tricks\n\nFrom the *Twisted* menu, you can batch extract the nodes and polygons for an easier analysis.\n\nYou are likely to hack onto the game at some point, try [no$psx](https://problemkaputt.de/psx.htm) with its amazing debugger.\n\nYou may also like [nocash-GPU-command-prettifier](https://github.com/aybe/nocash-GPU-command-prettifier) and [nocash-GPU-texture-calculator](https://github.com/aybe/nocash-GPU-texture-calculator).\n\nHere are a couple of useful patches to apply to the game:\n\nAddress|Value|Result\n-|-|-\n8011A270|(DWORD)(0)|Suppresses enemy movement\n801196FC|(DWORD)(0)|Suppresses enemy weaponry\n800FF634|(DWORD)(0)|Suppresses head-up display\n\n# Known issues\n\n## Unity\n\n**Progress bars may occasionally not reach 100%:**\n\nThis is because Unity progress bar are incredibly slow at catching updates.\n\n**Focused control may occasionally lose focus after typing:**\n\nThis happens throughout Unity when there are UI elements at play.\n\n**Tree view is partially redrawn after clicking a column header:**\n\nThis is a bug in Unity's tree view.\n\n**Recursively expanding a tree view item using selects the item:**\n\nThis is a bug in Unity's tree view.\n\n**Tree view items cannot be fully revealed using keyboard navigation:**\n\nThis is a bug in Unity's tree view.\n\n## Project\n\n**Wrong colors in some regions:**\n\nExtra lighting is involved in the game but it hasn't been figured out yet.\n\n**Wrong sprites:**\n\nThese require a special type of node that isn't implemented at the moment.\n\n**Wrong textures if rendering a database in its entirety:**\n\nThere is colliding texture information in the game data.\n\n**Wrong textures in some regions:**\n\nThere is incorrect texture information in some of the polygons.\n\n**Wrong transforms for some objects:**\n\nThe game performs extra transformations at runtime.\n\n**Wrong transparency for some objects:**\n\nCorrect transparency among families of polygons isn't implemented at the moment.\n\n**Z-fighting:**\n\nEither some objects are at the same position or required ordering tables are missing.\n\n# Gallery\n\n![](README02.png)\n\n![](README03.png)\n\n![](README04.png)\n\n![](README05.png)\n\n![](README06.png)\n\n![](README07.png)\n\n![](README08.png)\n\n![](README09.png)\n\n![](README10.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faybe%2Ftwisted","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faybe%2Ftwisted","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faybe%2Ftwisted/lists"}