International Union of Pure & Applied Gaming:
"By Gamers, For Gamers: Committed to the Organization, Preservation, & Development of Romhacks" !!!
⏪ History: IUPAG was born to address the lack of a standard naming convention for romhacks, specifically, with respect to "naming collisions" (where different hacks have the same name): This mostly occurs with (1) Translations & (2) Sports games that update rosters to "current year" (i.e. Tecmo, NHL, etc). However, these "naming collisions" also occur with other hacks: When two different hacks have the same "branding" (name).
⏩ Philosophy: The goal is to provide a "Parent Specification" that is easily customizable according to individual preferences, as well as promote other standards, like good, sane patching practices (like "auto-patching").
For a more in-depth review of our History & Philosophy, feel free to join our Discord: https://discord.gg/kEe3aUzJ5D
IUPAG nomenclature was inspired by "A Guide to IUPAC Nomenclature of Organic Compounds".
The format should look like this:
Title <sep> Subtitle (@Dev, Pub)-(#Region)-(vDate)-(revX.Y.Z)-(T-Lang) [flag]-{Attributes}-(MetaInfo).ext
Where <sep>
is the "seperator" that is used between the Title & Subtitle: For Parents, the seperator is a dash (-
). For Clones, the seperator is a dash-semicolon (-;
). For Translations, the seperator is semicolon-equals (;=
). And for Romhacks, the seperator is the tilde (~
). The seperator is used even if the Subtitle is null/empty/blank.
Also, notice that the above "Tags" are "named tags" with a prefix attached (@
,#
,v
,rev
,T-
) that make them easier to parse.
The default ordering of Tags can be read as:
"by @Author, for #Region, on vDate, as Revision, in Text/Language, Flagged, with Attributes, and MetaInfo".
The following are the formal rules & guidelines for the IUPAG naming convention.
However, if you'd rather just see an example to get the "gist" of it, go HERE
And if you wanna take it for a "test drive", here's an SNES DAT file, HERE
Note
Please note that altho IUPAG was developed specifically for romhacks, the naming specification actually extends to Parents & Clones as well: Which allows for easy integration of romhacks & translations as well as "auto-patching" functionality and "1g1r" functionality, both with less computational strain at runtime.
Only 7 Bit ASCII (Low ASCII) characters are allowed:
a-z A-Z 0-9 SPACE $ ! # % ' ( ) + , - . ; = @ [ ] ^ _ { } ~
The following characters are not allowed as valid filename characters on the Windows Operating System, and hence, forbidden from use: / \ ? : * " < > | \n \t
The most common substitution are replacing a colon (:
) with a semi-colon (;
), and replacing any double-quotes ("
) with single-quotes ('
). Fractions, like one-half (½
), that contain a division symbol (slash /
) can be replaced with an exclamation point (!
) and represented as 1!2
.
First, construct the Title & Subtitle with an appropriate seperator and file extension.1
For romhacks, the Title is the same as the Parent/Baserom while the Subtitle is the Hack Name, which can also be prefixed with a "qualifier" of difficulty, patchtype, &/or Holiday Theme, etc.
Next, add the (@Developer, Publisher)
Tag.
The developer can be omitted if there's only one Publisher across regions. However, developer is required if each region has their own publisher. Altho, the names can be shortened (by omitting "Co.", "Ltd.", etc) and abbreviated. However, any abbreviations should still be unique.
Next, add the (#Region)
Tag: And since most development studios are assumed to be targeting hardware devices on the planet Earth, the default region (if unknown) is (#World)
. Otherwise, attach an appropriate Planet (or Region on Earth). Please use the fully qualified name, not an abbreviation, as at this time, there are no offical ISO designations for the other Planets. However, this is subject to change (if Elon gets us to Mars).
For Romhacks, attach the "dash revision" that was used as the Parent/Baserom: i.e. (#USA-11)
. For Hacks that change the "Region" (NTSC/PAL), please retain the original region and note the change in the (MetaInfo)
Tag (see below).
Next, attach a (vDate)
Tag, in the format: (vYYYY-MM-DD)
, where "Unix Time Zero" is null/unknown: (v1970-01-01)
.
Next, construct an appropriate revision tag. Where 00
means Proto, 01
thru 09
mean Alpha/Beta/Demo/Sample. And 10
(or greater) means an official release for retail sales, while 20
(or greater) means an Aftermarket re-release.
For Romhacks & Translations, this "revision" is simply whatever their "Version Sring" is (which can be absolutely anything). However, if it's a "Date String", then just convert to an ordinal system, where 00
is the 1st prototype, 01
is the first beta, and 10
is the first non-beta "release". For Translations, a "percent completetion" is acceptable: (rev90%)
.
Next, construct a Language Tag, which is a comma seperated list: e.g. (T-En,Fr,De,Es,It,Nl,Sv)
2
Next, attach a "dump info flag" (even if empty):
[d][cr][f][h][m][n][p][t][tr][o][u][v][b][i][x][s][a][!][$]
:
🏁 | Status | Description |
---|---|---|
[a] |
Alt | Alternate re-release w/ unknown version (deprecated). |
[b] |
Bad | Bad Dump &/or damaged image. |
[cr] |
Cracked | Copy Protection removed. |
[d] |
Diff | Small "GP" patch file (in any format) |
[f] |
Fixed | Hacked with improvement &/or "fix" (deprecated). |
[h] |
Hacked | Intentional Hack but not verifed as [$] (good). |
[i] |
Incomplete | Not fully translated (deprecated). |
[m] |
Modified | Unintentional modification: i.e. Has a save file. |
[n] |
re-Named | Filename is different from Parent (translated) (deprecated). |
[o] |
Overdump | The image is damaged (too much data). |
[p] |
Pirate | Violates international IP (deprecated). |
[s] |
Sample | i.e. Alpha,Beta,Proto,Demo,Sample (proposal only). |
[t] |
Trained | Adds cheats &/or cheat menu. |
[tr] |
Translated | Translated, but not verifed as [$] (good). |
[u] |
Underdump | The image is damaged (missing data). |
[v] |
Virus | Infected with a virus. |
[x] |
Bad | Bad Checksum or Alternative Checksum Routine. |
[!] |
Good | Verified Good Dump. |
[$] |
Good | Verified Good Hack (or Translation). |
[] |
Unknown | Nothing is known about the dump. |
Next, construct an "attributes" tag.
For Parents/Clones, the attributes tag generally lists {<Number of Players>;<Genre1,Genre2>;<Controller Support>}
.3
Romhacks inherit all these attributes, by default, and instead list any extra patches that were applied (if any). A null list is denoted with a double-dash via [$]-{--}.ext
: This is the clean, base hack without any optional or external patches applied to it.
These genres & gametypes are expressed in L33TC0D3
to be unique, easier to parse, and more easily transformable to other systems:
{G3NR3} |
Description |
---|---|
{B34T} |
Beat'em up. |
{PL4T} |
"1-dimensional" Platformer with Linear Progression (on a single "axis" left-to-right). |
{1A} |
(1)-dimensional Platformer with Adventure & requiring exploration to progress. |
{2A} |
(2)-dimensional Action Adventure with an Overhead, Birds-eye view. |
{3A} |
(3)-dimmenional Action Adventure with a 3D (Dungeon Crawler) view. |
{4A} |
(A)ction or (H)ybrid Adventure with multiple game-modes. |
{5A} |
(S)trategy Adventure: e.g. (Starflight). |
{6A} |
(S)pace Adventure (with alt-gravity &/or alt-physics). |
{7A} |
(T)ext-based Adventure: e.g. (Erika to Satoru no Yume Bouken). |
{8A} |
(B)eat'em up view / isometric perspective Action Adventure: e.g. (Time Lord). |
{9A} |
(P)ower-Pad (A)dventure game: e.g. (Street Cop - Manhattan Police). |
{1RPG} |
(1)-dimensional Platformer with RPG elements (like xp & level-ups). |
{2RPG} |
(2)-dimensional RPG with an Overhead, Birds-eye view: Traditional JRPGs. |
{3RPG} |
(3)-dimensional RPG with a 3D (Dungeon Crawler) view. |
{4RPG} |
(A)ction (H)ybrid RPG with multiple game-modes, like 1/2 or 2/3 (for example). |
{5RPG} |
(S)trategy RPG (Turn Based Strategy): e.g. (Shining Force). |
{5RTS} |
(S)trategy RTS (Real Time Strategy): e.g. (Command & Conquer). |
{1S&P} |
(1)-dimensional (S)trategy (&) (P)uzzle: e.g. (A Boy & His Blob). |
{2S&P} |
(2)-dimensional (S)trategy (&) (P)uzzle: e.g. (Quinty)/(Mendel Palace). |
{3S&P} |
(3)-dimensional (S)trategy (&) (P)uzzle: e.g. (Portal). |
{4S&P} |
(A)ction (H)ybrid (S)trategy (&) (P)uzzle: e.g. (Spy vs Spy). |
{S1M} |
Simulation: e.g. (SimCity),(The Sims),(Flight Simulators), etc. |
{$SIM} |
Strategy Simulation: e.g. (Koei Historical Warfare games). |
{QZ} |
Quiz Game: e.g. (King of Kings by Wisdom Tree). |
Next, construct the (MetaInfo)
Tag, which is a semi-colon seperated List used for a variety of information, like:
For Parents/Clones:
(Unl; Aftermarket; Steam, Itch, GOG; Windows, Mac, Linux; Alpha).ext
4
For Romhacks:
- The number of Exits in a Super Mario World romhack:
(Exits=100).sfc
- The number of Stars in a Super Mario 64 romhack:
(Stars=120).z64
- The Mapper number of an NES Hack with multiple versions:
(M#001).nes
/(M#004).nes
For Translations:
(Literal Translation).ext
(Localized Translation).ext
For Patches:
- "Dependency Declarations": aka "Addendum"
(&)
patches.
And including an nsfw
desingation for nudity (since "strong language", "violence", & "blood & gore" are "par for the course" for most video games while nudity is not). As well as other "metainfo", like (Special Edition)
, for example.
Apply the "Title Transformation Rules": The "Series Rule", the "Parity Rule", & the "Uniqueness Rule".5
The best example of the "Series Rule" would be "The Quintet Trilogy" (on SNES).
The best example of the "Parity Rule" would be EA's NHL series (on both SNES & GEN/MD).
The best example of the "Uniqueness Rule" would be the Pokemon series (on GB/GBC/GBA/etc).
For different games that take place in the same fictional "Game Universe", attach an appropriate prefix: e.g. Mario, Pokemon, Simpsons, Sonic, TMNT, Zelda, etc. The exception here are games based on TV Cartoons (by Disney, Warner, & Hanna-Barbera), which together, all get the DIS
prefix. However, for "Eastern Cartoons" (Anime), use the AM3
prefix.
Finally, attach one of the below "Sports" prefixes (if applicable):
🆔 | Prefix | Description |
---|---|---|
🔫 | [1R] | (1)-dimensional (R)un-N-gun: Platform Shooters. |
🔫 | [2R] | (2)-dimensional (R)un-N-gun: Overhead Shooters. |
🔫 | [3R] | (3)-dimensional (R)un-N-gun: FPS & Gallery Shooters: {LG} suffix indicates Light-gun compatible. |
💣 | [4S] | (H)ybrid (S)hooter with multiple game modes (like 1R/2R , 1R/5H , or 2R/3R (etc), but NOT 5H/5V ). |
[5F] | (S)hooter (F)lying: 1st & 3rd Person, 3D SIM &/or Action Arcade style. | |
[5H] | (S)hooter (H)orizonal. | |
[5HV] | (S)hooter (H)orizonal & (V)ertical: Multiple game modes: 5H & 5V . |
|
[5V] | (S)hooter (V)ertical. | |
[5Z] | (S)hooter Miscellaneous(Z): Isometric scrolling &/or Multi-directional without auto-scrolling (etc). | |
🏆 | [6O] | (O)lympic (G)ames. |
🏂 | [720] | Skating, Skiing, & Snowboarding games w/ 180, 360, [720] , & 1080 tricks. |
[841] | =BALL : Dodgeball, Kickball, Volleyball, & other Misc Sports, like Speedball & Rugby, etc. |
|
🎸 | [964] | Rhythm & Action games: (P)ower-Pad, (G)uitar, & Controller Rhythm & (A)ction games. |
[BIOS] | Console BIOS file: "(B)asic (I)nput (O)output (S)ystem". | |
🔧 | [PRG] | Program or System Utility to test & diagnosis problems. |
🎲 | BG | (B)oard (G)ames & TV show games: e.g. (Monopoly)/(Wheel of Fortune). |
⛵ | BMC | Fishing games: (B)ass (M)aster (C)lassic. |
🏁 | F1 | (F)ormula-(1): 1st-person & 3rd-person Racing games with a 3D view. |
⛽ | F2 | (F)ormula-(2): 2nd-person Racing games with a birds-eye, overhead view. |
👠 | F7 | (F)amily (T)rainer: All other Power-Pad games (except sports: 6O & 964 ). |
⚽ | FIFA | Soccer games: (F)ederation (I)nternationale de (F)ootball (A)ssociation. |
🏰 | K0EI | Koei (& Koei-like knockoff) strategy games: Aerobiz, Gemfire, Genghis, Nobunaga, Romance, Sangokushi, etc. |
⚾ | MLB | Baseball games: (M)ajor (L)eague (B)aseball. |
🏀 | NBA | Basketball games: (N)ational (B)asketball (A)ssociation. |
🏈 | NFL | Football games: (N)ational (F)ootball (L)eague. |
🍁 | NHL | Hockey games: (N)ational (H)ockey (L)eague. |
📌 | P1N | Pinball games: IFPA: (I)nternational (F)lipper (P)inball (A)ssocation. |
🎱 | P88I | Table-top (P)ool, (8)-ball, & (B)(I)=Billiards games. |
🎳 | PB4 | Bowling games: (P)rofessional (B)owlers (A)ssociation: PBA. |
⛳ | PG4 | Golf & mini-golf games: (P)rofessional (G)olfers (A)ssociation: PGA. |
🔓 | PZ | (P)uzzle games: Like Tetris, Puyo Puyo, Panel de Pon, etc. |
🎾 | T3N | Tennis games: Association of Tennis Professionals: ATP. |
🆚 | VS | (V)ERSU(S), Two-Player Fighting games & Boxing games (VS BX ), but NOT "Beat'em-Ups". |
WSOP | Gambling games: (W)orld (S)eries (O)f (P)oker. | |
💪 | WWF | Wrestling games: (W)orld (W)restling (F)ederation (aka WWE). |
Footnotes
-
Title - Subtitle:
Capitalization: https://wiki.no-intro.org/index.php?title=Naming_Convention#Capitalization
Japanese Romanization: https://wiki.no-intro.org/index.php?title=Naming_Convention#Japanese_Romanization ↩ -
Language List: Order of Precedence: https://wiki.no-intro.org/index.php?title=Naming_Convention#Language(s)
Currently, there is a proposed change that while the most prevalent language in the West (English), is listed first, that, likewise, the most prevalent languages in the East (Korean, Japanese, Chinese) should be listed LAST (for quicker EYEdentification at a glance [sic]). ↩ -
{Attributes} Tag: Most games (with the exception of Sports) are assumed to be
{1P}
(one-player), and hence, such an "attribute" can be omitted for brevity. However,{1P}
is required for single player "Sports" games, since they are the exception to the general rule (that most "Sports" games are multiplayer). Furthermore, in order to give the best search functionality, a 4-player game (for example) would be formatted as{2P,4P}
. Some example queries: "{2P}
" (one-player/two-player support), "{2P
" (at least two-player), "{2P,
" (at least three-player), and "4P}
" (maximum 4-player). ↩ -
(MetaInfo) Tag: Please note that eventho this tag is a semi-colon seperated List, that each "element" within the List can also be a CSV (comma seperated) List, itself. And the "order of precedence" is: Highest priority (listed first): Unl, Pirate, Aftermarket. While the lowest priority (listed last) are the Dev Status Flags: Proto, Alpha, Beta, Demo, Sample, Snapshot, and also Reprint & Alt. ↩
-
Examples of the Title Transformation Rules: The "Series Rule", the "Parity Rule", & the "Uniqueness Rule":
https://gist.github.com/Europia79/14b6f95ae75758618095aef156462d8b ↩