Introduction
Welcome to an informal guide to modding Drift City (Skid Rush in South Korea)!
This documentation will always be considered incomplete. Whether you want to just discuss the content here or even contribute - feel free to hop onto the #creator-chat channel on Discord.
Server Setup
This guide will help you start your own playable old Drift City server. You'll be using the 2008 TW Docker Repack and configuring it to run locally on your computer for modding and/or playing.
Requirements
- A computer running Windows or Windows Server
- SQL Server 2022 directly from Microsoft
- newer is probably okay, just keep in mind this guide assumes 2022
- SQL Server Management Studio directly from Microsoft
- 2008 TW Docker Repack files from the RaGEZONE thread
- Visual Studio Code
- alternatively any advanced text editor that has proper encoding options
If you know what Docker and Docker Compose are and have previously used them, you can stop here and just use the repack files since they include a docker-compose config.
Steps
Set up SQL Server
- Simple:
- Run installer (SQL2022-something)
- Run Installation -> New SQL Server standalone installation
- Set up the database, selecting the following when relevant:
- developer edition
- no azure extension for sql server
- include database engine services
- mixed mode authentication, create and write down password
- Detailed:
- run installer (SQL2022-something)
- click
Custom
- click
Install
- it downloads and does stuff
SQL Server Installation Center
pops up- click
Installation
- click
New SQL Server standalone installation
- click
- says please wait,
SQL Server 2022 Setup
pops up - make sure free edition says
Developer
- click
Next
- click
I accept
- click
Next
Microsoft Update
step- click
Next
- click
Install Rules
step- click
Next
- click
Azure Extension for SQL Server
step- click
Azure Extension for SQL Server
to make sure it's not checked - click
Next
- click
Feature Selection
step- click
Database Engine Services
to make sure it's checked - click
Next
- click
Instance Configuration
step- click
Next
- click
Server Configuration
step- click
Next
- click
Database Engine Configuration
step- click on
Mixed Mode
to select it - enter a password and write it down (this guide will refer to this as database server password later)
- click
Add Current User
- click
Next
- click on
Ready to Install
step- click
Install
- click
Complete
step- click
Close
- click
- close
SQL Server Installation Center
Set up SQL Server Management Studio
- run installer (SSMS-something)
- click
Install
- click
Close
Creating a database for ZoneServer
- launch
Microsoft Sql Server Management Studio 18
- click
Connect
- right click the server in the left sidebar and click
Properties
- write down the name displayed near the top (this guide will refer to this as database server name later)
- click on
Connections
and make sureAllow remote connections to this server
is checked - click
OK
- right click
Databases
in the left sidebar - click
New Database
- name it
SKDBTW
- click
Options
- for
Recovery model:
chooseSimple
- click
Ok
- name it
- open the
File
menu at the top and underOpen
chooseFile
- find the
zoneserver-docker
folder and in thedb
folder select01_initialize_database
and pressOpen
- click
Execute
(with the little green play icon) - when it's done it should show
Commands completed successfully.
in the lower half of the window
- find the
- open the
File
menu at the top and underOpen
chooseFile
- find the
zoneserver-docker
folder and in thedb
folder select02_create_user
and pressOpen
- click
Execute
(with the little green play icon) - when it's done it should show
Commands completed successfully.
in the lower half of the window
- find the
Configuring database connectivity (ODBC)
- launch
ODBC Data Sources (32-bit)
- click on the
System DSN
tab - click
Add
- choose
SQL Server Native Client 11.0
- for
Name:
writeSKDBTW
- for
Server:
write the database server name you wrote down when creating the database
- choose
- click
With SQL Server authentication using a login ID and password entered by the user
- for
Login ID:
writesa
- for
Password:
write the database server password you wrote down when setting up the database
- for
- click
Next
- click
Change the default database to:
and writeSKDBTW
- click
Next
- click
Finish
- click
Test Data Source...
to check if everything was configured correctly- if you followed every step of this guide, it should say
TESTS COMPLETED SUCCESSFULLY!
- click
OK
, clickOK
again, and clickOK
to close the last ODBC window.
- if you followed every step of this guide, it should say
Set up Visual Studio Code
you can skip this if you decided to use some other editor instead. these settings are for convenience
- make sure the following options are selected:
Add "Open with Code" action to Windows Explorer file context menu
Add "Open with Code" action to Windows Explorer directory context menu
Configuring the server to use the new database
- find the
zoneserver-docker
folder and go to theserver
folder inside it - open the file named
GDBC
(right click it andopen with
->visual studio code
)- visual studio code should open up with the contents of the file displayed. if it's showing the
Get Started
page, you can click on the X next toGet Started
to close it.
- visual studio code should open up with the contents of the file displayed. if it's showing the
- you should see the contents of the file as follows:
[DBCONN]
0 SKDBTW
1 sa
2 z0ne!server
- replace
z0ne!server
with your database server password - click on
File
in the top left and then clickSave
to save your changes
Enabling legacy console
- launch
Command Prompt
- click on the icon in the top left and in the menu that pops up click
Properties
- click on
Use legacy console
near the bottom - click
OK
- close the command prompt window
Trying it out
- find the
zoneserver-docker
folder and go to theserver
folder inside it - double-click on
ZoneServer
to start the game server- if a
Windows Security Alert
pops up, make sure all the checkboxes are checked and pressAllow access
- if a
- find the
zoneserver-docker
folder and go to theclient
folder inside it - double-click on
DriftCity
to run the game - log in with username
admin
and passwordadmin
Author
Perl
Collision tutorial (video)
Video
Author
DCMods
Sticker UV tutorial (video)
Video
Author
Ghosty
Stage 2 to Stage 1 conversion (doc)
Author
Ahiru
NifSkope
NifSkope is a tool for opening and editing the NetImmerse file format (NIF). This file format is used for almost all entities in Drift City. It can contain anything from a single 3D model to an entire scene with animations.
Newer versions of NifSkope might not work with certain older Drift City Nifs. Try older versions if a Nif won't open properly.
Files Supported
.nif
.kf
Download
https://github.com/niftools/nifskope/releases
RiceTools
RiceTools refers to RicePack and RiceConvert, which are tools for viewing and modifying Drift City files.
RiceTools is old and unmaintained. Whenever possible, slidetown-cli and slidetown-gui should be used instead.
Files Supported
- RicePack
.agt
.tdf
(while viewed inside.agt
).lof
(read-only)
- RiceConvert
.hit
(produces.hit.obj
).chpath
(produces.chpath.obj
)
Download
https://github.com/amPerl/RiceTools/releases
slidetown-cli
slidetown-cli
is a command-line tool for packing, unpacking and converting various Drift City files. slidetown-cli
is the command-line frontend for slidetown
.
Download
https://github.com/amPerl/slidetown-cli/releases
slidetown-gui
slidetown-gui
is a tool for packing, unpacking and converting various Drift City files. slidetown-gui
is the graphical frontend for slidetown
.
Download
https://github.com/amPerl/slidetown-gui/releases
Generic Archive (*.agt)
Summary
The primary archive format. This is practically a zip, but with a custom format. This file format has remained the same from the earliest known version.
These files are always "encrypted", see Encryption.
Encryption
Almost the entire file is encrypted with a simple repeating XOR cipher. This cipher is hardcoded into the client and has remained the same from the earliest known version.
The very beginning of the file, the header, is plain. After that, from byte 0x20, the rest of the file is encrypted. Even though the encrypted section starts at 0x20, the offset into the cipher is absolute (also starts at 0x20).
Structure
These are the building blocks this archive format is built on. The offsets are relative to the beginning of the structure, not the file.
- Header
- File Info
- Repeated for every file
- File Contents
- Repeated for every file
Header
Offset | Type | Notes |
---|---|---|
0x00 | char[8] | always "NayaPack" |
0x08 | uint32 | always 0 |
0x0C | uint16 | always 1 |
0x0E | uint16 | always 1 |
0x10 | uint32 | File Count |
0x14 | uint32[3] | always 0 |
File Info
Offset | Type | Notes |
---|---|---|
0x00 | uint32 | Compressed Chunks Position |
0x04 | uint32 | Compressed Chunk Count |
0x08 | uint32 | Decompressed Length |
0x0C | uint32 | File Path Length |
0x10 | char[File Path Length] | File Path |
File Contents
Offset | Type | Notes |
---|---|---|
0x00 | uint16[Compressed Chunk Count] | Compressed Chunk Length |
n/a | uint8[Compressed Chunk Length] | Compressed Chunk Data (zlib deflate) |
Locations
Based on 0.02TW as an example:
Data_TW.agt
Data\decal.agt
Data\effects.agt
Data\game.agt
Data\Init.agt
Data\Localize.agt
Data\Option.agt
Data\vehicles.agt
Data\World\autoshop.agt
Data\World\cras.agt
Data\World\data.agt
Data\World\garage.agt
Data\World\koinonia.agt
Data\World\moonpalace.agt
Data\World\oros.agt
Data\World\parkinglot.agt
Patch\Patch.000
Patch\Patch.001
Patch\Patch.002
Patch\Patch.003
Patch\Patch.004
Patch\Patch.005
Patch\Patch.006
Patch\Patch.007
Patch\Patch.008
Patch\Patch.009
Patch\Patch.010
User Interface Layout (game.nui)
Summary
This file format contains the markup of the game interface.
This file is just an XML. The encoding is always(?) EUC-KR for known samples.
The top level object is the <document>
, which contains:
- FILEINFO
- DIALOGLIST
- COMPONENTLIST (old)
graph TD document --> FILEINFO document --> DIALOGLIST document --> COMPONENTLIST["(old) COMPONENTLIST"] DIALOGLIST --> DIALOG DIALOGLIST --> D["(old) D"] DIALOG --> CONTROL CONTROL --> INFO CONTROL --> NATION INFO --> N D --> D_C["(old) C"] D_C --> |GUID| COMPONENTLIST_C COMPONENTLIST --> COMPONENTLIST_C["(old) C"]
Locations
Data\gameui\game.nui
Data\
beingData_US\
orData_TW\
or the equivalent for any other region
FAQ
Help, instead of korean I just see garbage!
Check the beginning of the file for a section like this: <?xml version="1.0" encoding="euc-kr" ?>
. In this example it defines the encoding as EUC-KR.
Most text editors support reopening files in another encoding and if not already detected as EUC-KR, it should be changed.
In VS Code this can be done by pressing CTRL+SHIFT+P, selecting Change File Encoding
, which lets you reopen or save the file in a different encoding.
FILEINFO
Extra metadata about the interface file
Attributes
Name | Example | Presence | Notes |
---|---|---|---|
Type | User Interface | always | always User Interface |
Time | 2008-7-1 19:2:804 18355 | old only | datetime |
Time | 497050C6 | new only | unknown hex value |
Nation | 2 | new only | number representing the region |
Examples
Old
<FILEINFO Type="User Interface" Time="2008-7-1 19:2:804 18355" />
New
<FILEINFO Type="User Interface" Nation="2" Time="497050C6" />
DIALOG
A group of CONTROLs or Cs, usually a "screen", popup, or menu. Examples in game are loading screens, login screen, speedometer, settings menu.
graph TD DIALOG --> CONTROL CONTROL --> INFO CONTROL --> NATION INFO --> N
Attributes
Name | Example | Presence | Notes |
---|---|---|---|
A | 고정_로그인창 | optional | name or description |
B | {64B18162-4FD9-489F-81C4-86517735CC47} | old only | template identifier |
C | 10000 | always | numeric id |
D | ID_DIALOG_LOGIN | optional | plaintext id |
E | 18 | optional | alignment |
F | 1 2 | always | size mode, see H |
G | 100 20 | optional | offset? |
H | 100 100 | always | size in pixels if F is 1 1 , window% if F is 1 2 |
I | 1 | optional | scaling? |
Examples
Old
<D A="고정_로그인창" B="{64B18162-4FD9-489F-81C4-86517735CC47}" C="10000" D="ID_DIALOG_LOGIN" F="1 2" H="100 100">
<C A="{E97B4F4F-A1F4-4DB5-B352-BF55A124E350}" B="10001">
<N C="0" I="1" />
</C>
<C A="{F48AC423-B4F7-4F6A-864F-269FBC3A4103}" B="10002">
<N C="0" F="18" H="-153 -61" />
</C>
<C A="{3FA9601D-A8B8-4409-AFED-4EFE9E7D7DAF}" B="10003">
<N C="0" F="18" H="-133 -61" />
</C>
<C A="{26D42188-FA6B-4B4B-AD61-FF2B7FBC70C2}" B="10004">
<N C="0" F="18" H="133 -61" />
</C>
<C A="{1425BF0D-3BB0-4595-80B5-78F63DB4A1C9}" B="10005" E="ID_LOGIN_STATIC_TITLE">
<N C="0" F="18" H="-129 -41" />
</C>
<C A="{1BEFD961-92AE-4EEE-96AA-7C8C8632526D}" B="10006" E="ID_LOGIN_STATIC_ID">
<N C="0" F="18" H="-91 -8" />
<N C="2" F="18" H="-100 -8" />
</C>
<C A="{21F05409-F817-4ACA-AEA5-CA17550C81FF}" B="10007" E="ID_LOGIN_STATIC_PASS">
<N C="0" F="18" H="-103 20" />
</C>
<C A="{5931B73A-1C0F-4972-8FDB-BFF3C562EBA0}" B="10008" E="ID_LOGIN_ID">
<N C="0" F="18" H="-25 -9" />
</C>
<C A="{5931B73A-1C0F-4972-8FDB-BFF3C562EBA0}" B="10009" E="ID_LOGIN_PASS">
<N C="0" F="18" H="-25 23" />
</C>
<C A="{AA5F55A6-8B23-4553-BA22-5B9E5EE9A134}" B="10010" E="ID_LOGIN_ENTER">
<N C="0" F="18" H="-48 60" J="13" />
</C>
</D>
New
<DIALOG C="10000" F="1 2" H="100 100">
<CONTROL B="10001">
<INFO TYPE="1" NM="째챠횁짚_쨌횓짹횞횓_쨔챔째챈" EC="1" SZ1="1024 768" I1_1="1" UV1_1="0 0 1 0 0 0.75 1 0.75" POS1="0 0" />
<NATION C="0" I="1.00" />
</CONTROL>
<CONTROL B="10002">
<INFO TYPE="1" NM="횈횏쩐첨01_01" EC="1" SZ1="20 163" I1_1="2" UV1_1="0.09375 0.01171875 0.71875 0.01171875 0.09375 0.6484375 0.71875 0.6484375" POS1="0 0" />
<NATION C="0" F="18" H="-153 -61" />
</CONTROL>
<CONTROL B="10003">
<INFO TYPE="1" NM="횈횏쩐첨01_02" EC="1" SZ1="266 163" I1_1="3" UV1_1="0.125 0.01171875 0.625 0.01171875 0.125 0.6484375 0.625 0.6484375" POS1="0 0" />
<NATION C="0" F="18" H="-133 -61" />
</CONTROL>
<CONTROL B="10004">
<INFO TYPE="1" NM="횈횏쩐첨01_02" EC="1" SZ1="20 163" I1_1="4" UV1_1="0.03125 0.01171875 0.65625 0.01171875 0.03125 0.6484375 0.65625 0.6484375" POS1="0 0" />
<NATION C="0" F="18" H="133 -61" />
</CONTROL>
<CONTROL B="10005" E="ID_LOGIN_STATIC_TITLE">
<INFO TYPE="1" NM="쨔짰짹쨍_쨌횓짹횞횓 쨍횉횈짰" EC="1" SZ1="262 25" POS1="0 0" T1="횁짖쩌횙 쩐횈횑쨉챨쩔횒 쨘챰쨔횖쨔첩횊짙쨍짝 횚쨌횂횉횕쩌쩌쩔채." C1_1="FFFFFF" FN1="Trebuchet MS 18 700">
<N NATION="2" T1="Please enter your ID and password" FN1="Trebuchet MS 18 700" />
<N NATION="3" FN1="Trebuchet MS 20 700" />
</INFO>
<NATION C="0" F="18" H="-129 -41" />
</CONTROL>
<CONTROL B="10006" E="ID_LOGIN_STATIC_ID">
<INFO TYPE="1" NM="쨔짰짹쨍_쨌횓짹횞횓 쩐횈횑쨉챨" EC="1" SZ1="71 22" POS1="0 -2" T1="쩐횈횑쨉챨 :" C1_1="FFFFFF" FC1_1="FF0099FF" FN1="Verdana 11 400">
<N NATION="2" T1="ID :" FN1="Trebuchet MS 18 700" TA1="6" />
</INFO>
<NATION C="0" F="18" H="-91 -8" />
<NATION C="2" F="18" H="-100 -8" />
</CONTROL>
<CONTROL B="10007" E="ID_LOGIN_STATIC_PASS">
<INFO TYPE="1" NM="쨔짰짹쨍_쨌횓짹횞횓 쨘챰쨔첩" EC="1" SZ1="86 25" POS1="0 0" C1_1="FFFFFF" FC1_1="FF0099FF" T1="쨘챰쨔횖쨔첩횊짙 :" FN1="Verdana 11 400">
<N NATION="2" FN1="Trebuchet MS 18 700" T1="password :" />
</INFO>
<NATION C="0" F="18" H="-101 20" />
</CONTROL>
<CONTROL B="10008" E="ID_LOGIN_ID">
<INFO TYPE="8" NM="횚쨌횂횄짖_126x23" EC="10" SZ1="126 23" FC1_1="FFFFFFFF" SZ2="2 2" SZ3="2 2" SZ4="2 2" SZ5="2 2" SZ6="2 2" SZ7="2 2" SZ8="2 1" SZ9="2 1" SZ10="21 21" POS1="0 0" C1_1="FF666666" POS2="0 0" POS3="0 0" POS4="0 0" POS5="0 0" POS6="0 0" POS7="0 0" POS8="0 0" POS10="131 1" POS9="0 0" C2_1="FFFFFF" C3_1="FFFFFF" C4_1="FFFFFF" C5_1="FFFFFF" C6_1="FFFFFF" C7_1="FFFFFF" C8_1="FFFFFF" C9_1="FFFFFF" C10_1="FFFFFF" FN1="Verdana 13 700" />
<NATION C="0" F="18" H="-25 -9" />
</CONTROL>
<CONTROL B="10009" E="ID_LOGIN_PASS">
<INFO TYPE="8" NM="횚쨌횂횄짖_126x23" EC="10" SZ1="126 23" FC1_1="FFFFFFFF" SZ2="2 2" SZ3="2 2" SZ4="2 2" SZ5="2 2" SZ6="2 2" SZ7="2 2" SZ8="2 1" SZ9="2 1" SZ10="21 21" POS1="0 0" C1_1="FF666666" POS2="0 0" POS3="0 0" POS4="0 0" POS5="0 0" POS6="0 0" POS7="0 0" POS8="0 0" POS10="131 1" POS9="0 0" C2_1="FFFFFF" C3_1="FFFFFF" C4_1="FFFFFF" C5_1="FFFFFF" C6_1="FFFFFF" C7_1="FFFFFF" C8_1="FFFFFF" C9_1="FFFFFF" C10_1="FFFFFF" FN1="Verdana 13 700" />
<NATION C="0" F="18" H="-25 23" />
</CONTROL>
<CONTROL B="10010" E="ID_LOGIN_ENTER">
<INFO TYPE="2" NM="짹창쨘쨩쨔철횈째_횊짰횓" EC="2" SZ1="97 32" I1_1="5" I1_4="6" I1_5="7" I1_2="6" I1_3="5" UV1_1="0.015625 0.03125 0.7734375 0.03125 0.015625 0.53125 0.7734375 0.53125" UV1_4="0.0078125 0.03125 0.765625 0.03125 0.0078125 0.53125 0.765625 0.53125" UV1_5="0 0.03125 0.7578125 0.03125 0 0.53125 0.7578125 0.53125" UV1_3="0.015625 0.03125 0.7734375 0.03125 0.015625 0.53125 0.7734375 0.53125" UV1_2="0.0078125 0.03125 0.765625 0.03125 0.0078125 0.53125 0.765625 0.53125" C1_1="FFFFFFFF" C1_3="FFFFFFFF" FC1_1="FF0000FF" FC1_4="FF0000FF" FC1_2="FFFF0000" FC1_3="FF00FF00" POS2="0 0" POS1="0 0" FN1="ygo240 15 400" />
<NATION C="0" F="18" H="-48 60" J="13" />
</CONTROL>
</DIALOG>
CONTROL
A single interface element. This must contain an INFO and can contain NATIONs
graph TD CONTROL --> INFO CONTROL --> NATION INFO --> N
Attributes
Name | Example | Presence | Notes |
---|---|---|---|
A | {64B18162-4FD9-489F-81C4-86517735CC47} | old only | template identifier |
B | 110003 | always | numeric id |
D | 횆쨀쨍짱횇횒 | optional | name or description |
E | ID_CREATECHARACTER_NEW_CHARIMG_1 | optional | plaintext id |
Examples
Old template-based component
<C A="{E97B4F4F-A1F4-4DB5-B352-BF55A124E350}" B="10001">
<N C="0" I="1" />
</C>
0.02TW Login background image
<CONTROL B="10001">
<INFO TYPE="1" NM="째챠횁짚_쨌횓짹횞횓_쨔챔째챈" EC="1" SZ1="1024 768" I1_1="1" UV1_1="0 0 1 0 0 0.75 1 0.75" POS1="0 0" />
<NATION C="0" I="1.00" />
</CONTROL>
0.02TW Login title text
<CONTROL B="10005" E="ID_LOGIN_STATIC_TITLE">
<INFO TYPE="1" NM="쨔짰짹쨍_쨌횓짹횞횓 쨍횉횈짰" EC="1" SZ1="262 25" POS1="0 0" T1="횁짖쩌횙 쩐횈횑쨉챨쩔횒 쨘챰쨔횖쨔첩횊짙쨍짝 횚쨌횂횉횕쩌쩌쩔채." C1_1="FFFFFF" FN1="Trebuchet MS 18 700">
<N NATION="2" T1="Please enter your ID and password" FN1="Trebuchet MS 18 700" />
<N NATION="3" FN1="Trebuchet MS 20 700" />
</INFO>
<NATION C="0" F="18" H="-129 -41" />
</CONTROL>
0.02TW Login username input
<CONTROL B="10008" E="ID_LOGIN_ID">
<INFO TYPE="8" NM="횚쨌횂횄짖_126x23" EC="10" SZ1="126 23" FC1_1="FFFFFFFF" SZ2="2 2" SZ3="2 2" SZ4="2 2" SZ5="2 2" SZ6="2 2" SZ7="2 2" SZ8="2 1" SZ9="2 1" SZ10="21 21" POS1="0 0" C1_1="FF666666" POS2="0 0" POS3="0 0" POS4="0 0" POS5="0 0" POS6="0 0" POS7="0 0" POS8="0 0" POS10="131 1" POS9="0 0" C2_1="FFFFFF" C3_1="FFFFFF" C4_1="FFFFFF" C5_1="FFFFFF" C6_1="FFFFFF" C7_1="FFFFFF" C8_1="FFFFFF" C9_1="FFFFFF" C10_1="FFFFFF" FN1="Verdana 13 700" />
<NATION C="0" F="18" H="-25 -9" />
</CONTROL>
INFO
A control's internal properties such as its content and the content's size and alignment. The required attributes will differ depending on the type of control.
- The
INFO
element has both INFO Attributes and Shared Attributes.- It can optionally contain
N
elements that have N Attributes and Shared Attributes. - If the
N
's nation/region matches the client's, the shared attributes will overrideINFO
's.
- It can optionally contain
INFO Attributes
Name | Example | Presence | Notes |
---|---|---|---|
TYPE | 8 | always | see Types |
NM | 횚쨌횂횄짖_126x23 | optional | name or description |
N Attributes
Name | Example | Presence | Notes |
---|---|---|---|
NATION | 2 | always | the region the other attributes should apply to |
Shared Attributes
Name | Example | Presence | Notes |
---|---|---|---|
EC | 10 | optional | alignment |
IX _Y | 5 | optional | background image filename |
CX _Y | FFFFFFFF | optional | color |
TX | Fondo X | optional | text to display |
SX _Y | TODO | optional | TODO |
POSX | 0 0 | optional | x, y |
SZX | 126 23 | optional | width, height |
UVX _Y | 0 0 1 0 0 1 1 1 | optional | texture coordinates (top left, top right, bottom left, bottom right) |
TAX | 18 | optional | text alignment |
FNX | Verdana 13 700 | optional | font, size, weight |
FCX _Y | FFFFFFFF | optional | TODO color |
FOX _Y | 0 | optional | sometimes 0, mostly 1 (font shadow enabled?) |
FOCX _Y | FFFFFFFF | optional | TODO color |
Types
- Sprite
- Button
- n/a
- CheckBox
- ComboBox
- Slider
- TextArea
- TextInput
- ListBox
- ScrollView
Examples
0.02TW Login background image
<INFO TYPE="1" NM="째챠횁짚_쨌횓짹횞횓_쨔챔째챈" EC="1" SZ1="1024 768" I1_1="1" UV1_1="0 0 1 0 0 0.75 1 0.75" POS1="0 0" />
This describes a:
- Sprite
- Content aligned "top left"
- Size 1024x768
- Image ID 1
- Image UVs 0 0 1 0 0 0.75 1 0.75
- only the top 75% of the image in height is used, because the source image is 1024x1024, but the element is 1024x768
- Content position 0,0
0.02TW Login title text
<INFO TYPE="1" NM="쨔짰짹쨍_쨌횓짹횞횓 쨍횉횈짰" EC="1" SZ1="262 25" POS1="0 0" T1="횁짖쩌횙 쩐횈횑쨉챨쩔횒 쨘챰쨔횖쨔첩횊짙쨍짝 횚쨌횂횉횕쩌쩌쩔채." C1_1="FFFFFF" FN1="Trebuchet MS 18 700">
<N NATION="2" T1="Please enter your ID and password" FN1="Trebuchet MS 18 700" />
<N NATION="3" FN1="Trebuchet MS 20 700" />
</INFO>
This describes a:
- Sprite
- Content aligned "top left"
- Size 262x25
- Content position 0,0
- Default text "횁짖쩌횙 쩐횈횑쨉챨쩔횒 쨘챰쨔횖쨔첩횊짙쨍짝 횚쨌횂횉횕쩌쩌쩔채."
- Text color #FFFFFF
- Font "Trebuchet MS" size 18 weight 700
The following region overrides can apply:
- If the region is 2
- Text "Please enter your ID and password" is used instead
- Font configuration "Trebuchet MS 18 700" is used instead, but it's the same
- If the region is 3
- Font configuration "Trebuchet MS 20 700" is used instead, which is 2pt larger
0.02TW Login username input
<INFO TYPE="8" NM="횚쨌횂횄짖_126x23" EC="10" SZ1="126 23" FC1_1="FFFFFFFF" SZ2="2 2" SZ3="2 2" SZ4="2 2" SZ5="2 2" SZ6="2 2" SZ7="2 2" SZ8="2 1" SZ9="2 1" SZ10="21 21" POS1="0 0" C1_1="FF666666" POS2="0 0" POS3="0 0" POS4="0 0" POS5="0 0" POS6="0 0" POS7="0 0" POS8="0 0" POS10="131 1" POS9="0 0" C2_1="FFFFFF" C3_1="FFFFFF" C4_1="FFFFFF" C5_1="FFFFFF" C6_1="FFFFFF" C7_1="FFFFFF" C8_1="FFFFFF" C9_1="FFFFFF" C10_1="FFFFFF" FN1="Verdana 13 700" />
TODO
User Interface Textures (*.ntx)
Summary
This archive format is just a bunch of texture files with filenames. These files contain textures that are referenced in the User Interface Layout (game.nui) file.
In older clients, the filenames were just numbered, but in newer clients these are full names with coordinates, which are presumably to build a texture atlas.
Structure
These are the building blocks this archive format is built on. The offsets are relative to the beginning of the structure, not the file.
- File Entry (old) or File Entry (new)
- Repeated for every file until the end of the ntx file
File Entry (old)
Offset | Type | Notes |
---|---|---|
0x00 | char[16] | File Name (null terminated) |
0x10 | uint32 | File Length |
0x14 | uint8[File Length] | File Contents |
File Entry (new)
Offset | Type | Notes |
---|---|---|
0x00 | char[64] | File Name (null terminated) |
0x40 | uint32 | File Length |
0x44 | uint32 | unknown |
0x48 | uint8[File Length] | File Contents |
Locations
Usually packed in AGTs, located within a locale-specific data directory
Data_US\GameUI\tex\0.ntx
Data_US\GameUI\tex\1.ntx
Data_US\GameUI\tex\2.ntx
Data_US\GameUI\tex\3.ntx
Data_US\GameUI\tex\4.ntx
Data_US\GameUI\tex\5.ntx
Data_US\GameUI\tex\6.ntx
Data_US\GameUI\tex\7.ntx
Data_US\GameUI\tex\8.ntx
Data_US\GameUI\tex\9.ntx
Data_US\GameUI\tex\A.ntx
Data_US\GameUI\tex\B.ntx
Data_US\GameUI\tex\C.ntx
Data_US\GameUI\tex\D.ntx
Data_US\GameUI\tex\E.ntx
Data_US\GameUI\tex\F.ntx
Contributors
- DCMods (DCMods#4910)
- Perl
- Ahiru (Ahiru#0007)
- Ghosty (Ghosty#1234)