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

Tip

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
    • 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
    • Install Rules step
      • click Next
    • Azure Extension for SQL Server step
      • click Azure Extension for SQL Server to make sure it's not checked
      • click Next
    • Feature Selection step
      • click Database Engine Services to make sure it's checked
      • click Next
    • Instance Configuration step
      • click Next
    • Server Configuration step
      • click Next
    • 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
    • Ready to Install step
      • click Install
    • Complete step
      • click Close
    • 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 sure Allow 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: choose Simple
    • click Ok
  • open the File menu at the top and under Open choose File
    • find the zoneserver-docker folder and in the db folder select 01_initialize_database and press Open
    • 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
  • open the File menu at the top and under Open choose File
    • find the zoneserver-docker folder and in the db folder select 02_create_user and press Open
    • 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

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: write SKDBTW
    • for Server: write the database server name you wrote down when creating the database
  • click With SQL Server authentication using a login ID and password entered by the user
    • for Login ID: write sa
    • for Password: write the database server password you wrote down when setting up the database
  • click Next
  • click Change the default database to: and write SKDBTW
  • 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, click OK again, and click OK to close the last ODBC window.

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 the server folder inside it
  • open the file named GDBC (right click it and open 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 to Get Started to close it.
  • 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 click Save 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 the server 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 press Allow access
  • find the zoneserver-docker folder and go to the client folder inside it
  • double-click on DriftCity to run the game
  • log in with username admin and password admin

Author

Perl

Collision tutorial (video)

Video

Author

DCMods

Sticker UV tutorial (video)

Video

Author

Ghosty

Stage 2 to Stage 1 conversion (doc)

Google 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.

Warning

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.

Warning

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.

OffsetTypeNotes
0x00char[8]always "NayaPack"
0x08uint32always 0
0x0Cuint16always 1
0x0Euint16always 1
0x10uint32File Count
0x14uint32[3]always 0

File Info

OffsetTypeNotes
0x00uint32Compressed Chunks Position
0x04uint32Compressed Chunk Count
0x08uint32Decompressed Length
0x0Cuint32File Path Length
0x10char[File Path Length]File Path

File Contents

OffsetTypeNotes
0x00uint16[Compressed Chunk Count]Compressed Chunk Length
n/auint8[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:

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\ being Data_US\ or Data_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

NameExamplePresenceNotes
TypeUser Interfacealwaysalways User Interface
Time2008-7-1 19:2:804 18355old onlydatetime
Time497050C6new onlyunknown hex value
Nation2new onlynumber 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

NameExamplePresenceNotes
A고정_로그인창optionalname or description
B{64B18162-4FD9-489F-81C4-86517735CC47}old onlytemplate identifier
C10000alwaysnumeric id
DID_DIALOG_LOGINoptionalplaintext id
E18optionalalignment
F1 2alwayssize mode, see H
G100 20optionaloffset?
H100 100alwayssize in pixels if F is 1 1, window% if F is 1 2
I1optionalscaling?

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

NameExamplePresenceNotes
A{64B18162-4FD9-489F-81C4-86517735CC47}old onlytemplate identifier
B110003alwaysnumeric id
D횆쨀쨍짱횇횒optionalname or description
EID_CREATECHARACTER_NEW_CHARIMG_1optionalplaintext 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.

INFO Attributes

NameExamplePresenceNotes
TYPE8alwayssee Types
NM횚쨌횂횄짖_126x23optionalname or description

N Attributes

NameExamplePresenceNotes
NATION2alwaysthe region the other attributes should apply to

Shared Attributes

NameExamplePresenceNotes
EC10optionalalignment
IX_Y5optionalbackground image filename
CX_YFFFFFFFFoptionalcolor
TXFondo Xoptionaltext to display
SX_YTODOoptionalTODO
POSX0 0optionalx, y
SZX126 23optionalwidth, height
UVX_Y0 0 1 0 0 1 1 1optionaltexture coordinates (top left, top right, bottom left, bottom right)
TAX18optionaltext alignment
FNXVerdana 13 700optionalfont, size, weight
FCX_YFFFFFFFFoptionalTODO color
FOX_Y0optionalsometimes 0, mostly 1 (font shadow enabled?)
FOCX_YFFFFFFFFoptionalTODO color

Types

  1. Sprite
  2. Button
  3. n/a
  4. CheckBox
  5. ComboBox
  6. Slider
  7. TextArea
  8. TextInput
  9. ListBox
  10. 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)

OffsetTypeNotes
0x00char[16]File Name (null terminated)
0x10uint32File Length
0x14uint8[File Length]File Contents

File Entry (new)

OffsetTypeNotes
0x00char[64]File Name (null terminated)
0x40uint32File Length
0x44uint32unknown
0x48uint8[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)