Language: English | Tagalog | Cebuano | 简体中文 | More languages
An unofficial Assault Fire PH preservation/server-emulation project.
Important
Server independence disclaimer
This repository provides emulator software and preservation/research tooling only.
Any private, public, community, hosted, or third-party server that uses, modifies, or is based on this repository is independently operated and is not affiliated with, endorsed by, sponsored by, controlled by, or officially operated by this repository or its maintainers.
The repository maintainers are not responsible for third-party server operators, accounts, rules, moderation, content, security, availability, conduct, or services.
Important
This project is currently made for Assault Fire PH v1.0.0.24 only.
If your game is a different version, stop. Do not force the patches.
Warning
This repository does not include the original game client.
You must already have your own Assault Fire PH files.
Put the whole af-emulator folder inside your Assault Fire PH game folder.
AssaultFirePH
├─ Binaries
│ └─ Win32
│ └─ TGame.exe
├─ TCLS
│ ├─ client.exe
│ └─ Tenio
│ └─ TCLS.dll
├─ TGame
└─ af-emulator
└─ START_ASSAULT_FIRE.ps1
Then right-click:
START_ASSAULT_FIRE.ps1
and choose:
Run with PowerShell
That is now the normal setup/launch path.
The script handles the annoying parts for you:
- asks Windows for Administrator permission;
- finds the game automatically;
- checks that the client is the supported Assault Fire PH v1.0.0.24 build;
- reuses any working Python 3.10+ installation; if none is found, Windows Package Manager installs Python Install Manager, which supplies the current stable Python 3 release;
- creates a persistent runtime at
GAME_ROOT\.af-emulator-runtime\venv; oldervenv-py312runtimes are detected and reused automatically; - asks whether you want the verified permanent TCLS.dll compatibility patch;
- creates/verifies the local RSA key pair and installs the matching
APClient.dat; - repairs the three Windows hosts entries;
- applies the verified datetime patch permanently to your own
TGame.exe, first saving an exactTGame.exe.bakbackup; - creates
TGame_AFDEV.exelocally from that verified patchedTGame.exeso PvE does not require a separately distributed AFDEV executable; - starts the emulator server;
- waits for preflight to reach UNLOCKED;
- starts the runtime launch helper automatically;
- launches
TCLS\client.exeautomatically.
When you run the launcher, it starts the development account website on your PC and opens the registration page in your browser. Register there the first time you use this local server. The usual address is:
http://127.0.0.1:8080/register
If port 8080 is already in use, the server selects another local port and
prints the exact Registration address in its window. 127.0.0.1 means
localhost: this page is reachable only from the same PC running the emulator.
Choose a username with 3–24 letters, numbers, dots, underscores, or hyphens, and a password with 8–72 characters. Then use that same username and password to log in through the Assault Fire launcher. Register only once for this local server database. On later launches, close the registration page and use your existing credentials. Keep the emulator server window open while you play.
If the browser did not open automatically, copy the [WEB] Registration URL
from the server window into your browser. The local website is part of the
development setup; it is not a public registration service.
After your account is registered, the normal player interaction is:
log in with your registered username and password
↓
wait for the START button
↓
click START
You do not need to manually start the server, set AF_CLIENT_ROOT, set AF_GAME_DIR, run the hosts helper, run the TCLS launch helper, or create TGame_AFDEV.exe.
The launcher saves your normal Y/N choices in a local launcher.config.json file beside START_ASSAULT_FIRE.ps1. It uses those choices the next time you run the script. Answers are not case-sensitive, and pressing Enter uses the shown default.
The config is created automatically after your first saved choice. If you want to set the common defaults before the first run, copy launcher.config.example.json to launcher.config.json in the same folder. You can edit the Y/N values in that file. Delete launcher.config.json to answer the prompts again from scratch.
For safety, the launcher still asks before replacing a mismatched PRIVATE.PEM. Before launch, it validates the TGame PE and exact datetime patch signature. If the known patch RVA has no file bytes, it searches executable sections and accepts only one exact match; an already-patched image must also have the complete known trampoline. A clean supported image uses an aligned 0x00/0xCC code cave in a mapped executable section when one is available. If no cave is available, the patcher adds a small .afdt executable section only when the PE headers contain an unused section-header slot. It saves an exact TGame.exe.bak before replacing the file. If validation, backup verification, or post-write checks fail, the game is not accepted for launch and the original file is left in place. The suspended-launch helper then checks the selected RVA and trampoline again in the loaded TGame process before resuming it. This verifies the patch site, not every byte of the executable, so use the same PH v1.0.0.24 game build. The launcher does not accept a file just because you confirm it. The config stores preferences, not the contents of your private key, and Git ignores the local config file.
Important
The one-click script does not download or redistribute Assault Fire files.
It only works with the game files you already have. It permanently patches a
verified local TGame.exe and keeps the original as TGame.exe.bak. The local
TGame_AFDEV.exe copy is created from that verified patched file. If the
signature is at a different RVA, it must be the only matching executable-
section signature. The patcher uses a safe code cave or adds a dedicated
executable section when the PE headers have an unused section-header slot.
Caution
If the script cannot verify the TGame.exe patch-site signature or reports an
unknown TCLS.dll hash, stop. Do not force a patch onto another game version.
The steps below are kept for developers, troubleshooting, and machines where the one-click script cannot be used.
You normally do this part only once.
You need:
Python 3.10 or newer
Git
your own Assault Fire PH v1.0.0.24
If you do not know where to download Python or Git, use the official websites below.
Open this website in your browser:
Python official website:
https://www.python.org/downloads/windows/
Scroll down to the Files section.
Under Windows, click:
Windows installer (64-bit)
For most normal Windows 10/11 computers, this is the correct one.
After the file downloads:
- Double-click the Python installer.
- On the first installer screen, look near the bottom.
- If you see:
Add python.exe to PATH
turn that checkbox ON. 4. Click:
Install Now
- Wait for it to finish.
- Close the installer.
Important
Install a current 64-bit Python 3.10 or newer release.
The one-click launcher is no longer locked to one exact Python minor version.
Open a new PowerShell window and run:
py --versionGOOD:
Python 3.10.x or newer
BAD:
py is not recognized
If you get the BAD message:
- close PowerShell,
- reopen PowerShell,
- try again.
If it still does not work, reinstall Python and make sure the Python launcher/PATH option is enabled.
Open this website:
Git official website:
https://git-scm.com/install/windows
Click the big Windows download link for:
64-bit Git for Windows
After it downloads:
- Double-click the installer.
- Keep the default options.
- Keep clicking Next.
- Click Install.
- When it finishes, click Finish.
You do not need to understand the Git installer options for this project. The normal/default choices are fine.
Open a new PowerShell window and run:
git --versionGOOD:
git version ...
BAD:
git is not recognized
If you get the BAD message, close PowerShell, reopen it, and try again.
This repository does not download Assault Fire for you.
You must already have your own:
Assault Fire PH v1.0.0.24
The emulator repository does not include the original game client or proprietary game files.
Before continuing, these two commands should work:
py -3 --version
git --versionIf both commands print a version number, continue to Step 2.
If either command says not recognized, fix that first.
Open PowerShell and paste:
git clone https://github.com/armangido/af-emulator.git
cd af-emulator- Extract the ZIP.
- Open the extracted
af-emulatorfolder. - Click the Windows Explorer address bar.
- Type:
powershell
- Press Enter.
A PowerShell window should open inside the emulator folder.
You should see files/folders like:
README.md
server
tools
docs
tests
Your PowerShell line should end with something similar to:
...\af-emulator>
Caution
Do not run setup commands from inside server\.
Stay in the main af-emulator folder.
Copy and paste these two commands:
py -3 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txtWait for them to finish.
This file should now exist:
af-emulator\.venv\Scripts\python.exe
If PowerShell says:
.\.venv\Scripts\python.exe is not recognized
you are probably in the wrong folder.
Go back to the folder containing README.md, server, and tools, then try again.
This is very important.
Open your Assault Fire PH folder in Windows Explorer.
A correct game folder should contain something like:
Your Assault Fire Folder
│
├─ TCLS
│ ├─ Tenio
│ │ └─ TCLS.dll
│ └─ config
│ └─ APClient.dat
│
└─ Binaries
└─ Win32
└─ TGame.exe
Example:
D:\AssaultFirePH
Another computer might use:
C:\Program Files (x86)\Level Up Games\Assault Fire PH
Both are fine.
In Windows Explorer:
- Open the Assault Fire folder.
- Click the address bar.
- Copy the full path.
You will use that path below.
Important
Whenever this README says:
YOUR_GAME_FOLDER
replace it with the real folder you copied.
Do not literally type YOUR_GAME_FOLDER.
Go back to the PowerShell window inside af-emulator.
Example if your game is in D:\AssaultFirePH:
.\.venv\Scripts\python.exe .\tools\setup\generate_local_rsa_keypair.py --client-config-dir "D:\AssaultFirePH\TCLS\config"If your game is somewhere else, change only the path inside the quotes.
This creates:
af-emulator\server\PRIVATE.PEM
and
YOUR_GAME_FOLDER\TCLS\config\APClient.dat
Caution
Never upload PRIVATE.PEM.
Never send it to another person.
Never commit it to GitHub.
Example:
.\.venv\Scripts\python.exe .\tools\patches\diagnose_tcls_apclient.py --client-root "D:\AssaultFirePH"Replace D:\AssaultFirePH with your real game folder.
You want:
class : validated raw-PEM-compatible PH TCLS build
exact byte match : YES
same RSA key : YES
If those are already correct, go to Step 7.
If the diagnostic shows this original TCLS SHA-256:
13EAD403452E0F25CF00658369BF4BF5FF34ED1B16027F7833FB27D398386CD1
fully close Assault Fire and client.exe.
Then run:
.\.venv\Scripts\python.exe .\tools\patches\patch_tcls_apclient_raw_pem.py "YOUR_GAME_FOLDER\TCLS\Tenio\TCLS.dll" --applyExample:
.\.venv\Scripts\python.exe .\tools\patches\patch_tcls_apclient_raw_pem.py "D:\AssaultFirePH\TCLS\Tenio\TCLS.dll" --applyThe known working patched SHA-256 is:
3FF351E0ADB594D7544E28DB2E966A6D6EB548E9DF70DAAF4DAF58F2EE438D56
The tool also creates:
TCLS.dll.bak
Now run the diagnostic from the beginning of Step 6 again.
Caution
If the tool says the DLL/hash is unknown, STOP.
Do not force the patch.
Open PowerShell as Administrator.
How:
Start menu
→ search "PowerShell"
→ right-click PowerShell
→ Run as administrator
Go to your af-emulator folder.
Then run:
powershell -ExecutionPolicy Bypass -File .\tools\setup\setup_assaultfire_hosts.ps1The helper configures these names:
tversion.levelupgames.ph
tauthproxy.levelupgames.ph
tdir.levelupgames.ph
to use:
127.0.0.1
That means:
"connect to my own PC"
You normally do not need to edit the Windows hosts file yourself.
You can now use the shorter steps below every time you want to play.
This is the important part.
You need two PowerShell windows.
Think of them like this:
WINDOW 1 = SERVER
WINDOW 2 = GAME LAUNCH HELPER
Do not close Window 1 while playing.
Open the af-emulator folder in Windows Explorer.
Click the address bar and type:
powershell
Press Enter.
This is Window 1.
Example game folder:
D:\AssaultFirePH
Paste:
$env:AF_CLIENT_ROOT = "D:\AssaultFirePH"
$env:AF_GAME_DIR = "D:\AssaultFirePH\Binaries\Win32"Use your own real game path.
Important
These variables belong to this PowerShell window.
If you close the window and open a new one, set them again.
In the same PowerShell window:
.\.venv\Scripts\python.exe .\server\assaultfire_server_v143b.pyIf this machine is only hosting the emulator/backend, start it with:
.\.venv\Scripts\python.exe .\server\assaultfire_server_v143b.py --server-onlyYou can also set AF_SERVER_ONLY=1.
Server-only mode skips the local client/TCLS/APClient.dat/hosts preflight, so
AF_CLIENT_ROOT and AF_GAME_DIR are not required on the host. It does not
unlock the local game-launch helpers.
AUTH still requires your private server RSA key. The server checks, in order, an
explicit --private-key <path>, AF_PRIVATE_KEY / AF_PRIVATE_KEY_PATH,
PRIVATE.PEM beside the server script, and common repository server\PRIVATE.PEM
locations. This means a developer copy such as af\TEST\assaultfire_server_v143b.py
can automatically find af\server\PRIVATE.PEM when it exists.
Never commit or share PRIVATE.PEM.
Now wait.
Do not open the game yet.
The server checks your setup first.
At first you may see:
[PREFLIGHT] game launch gate : LOCKED
That can be normal for a moment.
The server is still opening its ports.
[PREFLIGHT] game launch gate : UNLOCKED
[MAIN] All listeners running.
You should also have:
[PREFLIGHT] TCLS validated build : YES
[PREFLIGHT] APClient exact bytes : YES
[PREFLIGHT] same RSA key : YES
If everything is good, leave Window 1 open.
If you see:
[PREFLIGHT] client root : None
[PREFLIGHT] TCLS validated build : NO
[PREFLIGHT] APClient exact bytes : NO
[PREFLIGHT] same RSA key : NO
[PREFLIGHT] game launch gate : LOCKED
do not continue.
Do not click START.
The game-launch helper will intentionally block you.
Common fixes:
| What you see | What it usually means |
|---|---|
client root : None |
You forgot AF_CLIENT_ROOT |
TCLS validated build : NO |
Wrong/unpatched TCLS |
APClient exact bytes : NO |
Wrong APClient.dat |
same RSA key : NO |
PRIVATE.PEM and APClient.dat do not belong together |
hosts check = NO |
Run Step 7 again as Administrator |
| port/bind error | Another emulator/server is probably already running |
The full log is saved in:
af-emulator\server\af_server_live.log
Send that log when reporting an emulator bug.
Do not send PRIVATE.PEM.
Now open:
YOUR_GAME_FOLDER\TCLS\client.exe
Log in normally.
Wait until you reach the launcher screen with the START button.
Stop at the START button.
Leave the launcher open.
Go back to the af-emulator folder in Windows Explorer.
Click the address bar.
Type:
powershell
Press Enter.
This is Window 2.
In Window 2, paste:
.\.venv\Scripts\python.exe .\tools\patches\patch_tcls_suspended_launch.pyWait.
TCLS ARMED
Click START in the Assault Fire launcher now.
When you see those lines:
The helper will automatically:
create TGame.exe safely
↓
finish TCLS handoff
↓
apply the required TGame compatibility patch
↓
resume TGame.exe
You do not need to do those steps yourself.
Important
When using patch_tcls_suspended_launch.py, do not also run patch_tgame_datetime.py.
Use one launch method, not both.
If you forget everything else, remember this:
1. Open PowerShell in af-emulator
2. Set AF_CLIENT_ROOT
3. Set AF_GAME_DIR
4. Start assaultfire_server_v143b.py
5. WAIT for UNLOCKED
6. Open client.exe
7. Log in
8. STOP at START
9. Open second PowerShell in af-emulator
10. Run patch_tcls_suspended_launch.py
11. WAIT for TCLS ARMED
12. Click START
This example assumes the game is installed here:
D:\AssaultFirePH
$env:AF_CLIENT_ROOT = "D:\AssaultFirePH"
$env:AF_GAME_DIR = "D:\AssaultFirePH\Binaries\Win32"
.\.venv\Scripts\python.exe .\server\assaultfire_server_v143b.pyWait for:
[PREFLIGHT] game launch gate : UNLOCKED
[MAIN] All listeners running.
Then open:
D:\AssaultFirePH\TCLS\client.exe
Log in.
Stop at START.
.\.venv\Scripts\python.exe .\tools\patches\patch_tcls_suspended_launch.pyWait for:
TCLS ARMED
Click START in the Assault Fire launcher now.
Then click START.
The default console level is:
INFO
That is fine for normal players.
The full file log still saves DEBUG + INFO + WARNING + ERROR, even when DEBUG is hidden from the console.
Full log:
server\af_server_live.log
So if something breaks, the detailed information should still be there.
At startup you may see:
[LOGGING] console=INFO file=DEBUG+ path=...\server\af_server_live.log
That is good.
Before starting the server:
$env:AF_LOG_LEVEL = "DEBUG"Other choices:
INFO
WARNING
ERROR
Changing this affects the console only.
The file still keeps DEBUG records.
Raw AUTH plaintext/ciphertext can contain authentication information.
It is therefore off by default, even though normal DEBUG logging is always saved.
Only enable it for a controlled local diagnostic:
$env:AF_DEBUG_AUTH_HEX = "1"Turn it off again after testing:
Remove-Item Env:AF_DEBUG_AUTH_HEX -ErrorAction SilentlyContinueDo not post raw sensitive AUTH logs publicly.
The dedicated-server spawner is enabled by default.
The important setting is:
$env:AF_GAME_DIR = "YOUR_GAME_FOLDER\Binaries\Win32"If this points to the wrong place, the launcher/login may work but starting a PvE match can fail later.
Example:
$env:AF_GAME_DIR = "D:\AssaultFirePH\Binaries\Win32"When a PvE room starts, the emulator handles the dedicated-server lifecycle automatically.
You do not normally start AFDEV manually.
More details for developers: PvE Runtime.
Wrong:
$env:AF_CLIENT_ROOT = "YOUR_GAME_FOLDER"Correct example:
$env:AF_CLIENT_ROOT = "D:\AssaultFirePH"Wrong PowerShell location:
...\af-emulator\server>
Better:
...\af-emulator>
You should be able to see:
README.md
server
tools
docs
Correct order:
launcher reaches START
↓
DO NOT CLICK IT
↓
run patch_tcls_suspended_launch.py
↓
wait for TCLS ARMED
↓
click START
Do not click START.
Wait first.
If it changes to:
UNLOCKED
you are good.
If it stays LOCKED and shows a NO or FAILED, fix that problem first.
Run:
.\.venv\Scripts\python.exe .\tools\patches\diagnose_tcls_apclient.py --client-root "YOUR_GAME_FOLDER"You need:
validated TCLS
exact byte match = YES
same RSA key = YES
If not, go back to First-time Step 6.
More details: Launcher Errors.
Use the recommended suspended launch helper.
Do not just click START by itself.
If the helper reports:
TGame build/signature mismatch
stop.
Do not force the patch.
Your TGame may not be the supported PH v1.0.0.24 build.
You may already have another emulator running.
Close the old server window and try again.
Do not run two copies of the emulator on the same ports unless you intentionally configured different ports.
Send:
1. A screenshot of the error
2. What step you were doing
3. The exact command you ran
4. server\af_server_live.log
5. Your Assault Fire version
Do not send:
PRIVATE.PEM
passwords
account credentials
tokens
original proprietary game binaries
The original PH client contains an old kernel-level security/anti-cheat component made for an older Windows environment.
On modern Windows it can cause problems before the emulator is contacted.
This repository does not provide instructions for bypassing, disabling, or modifying that kernel security component.
See Vital Setup Notes.
The public stable baseline is v143b.
Working/integrated areas include VERSION, AUTH, DIR, ROLE, ZONE, existing/local profile login, shared rooms, dynamic room work, PvE dedicated-server allocation/lifecycle, stock-selected PvE map/settings propagation, lazy AFDEV startup, inventory/shop/profile preservation work, and the current local AP synchronization path.
Local username/password registration is available through the development website described above. First-time in-game nickname creation and parts of the social/progression systems are still incomplete or being validated.
Important
AP initialization currently uses a temporary local-only workaround on PH v1.0.0.24.
The server wallet and normal AP purchases remain authoritative, but the stock client's native initial AP/GamePoint population is not yet fully recovered.
The emulator currently copies the persisted AP balance into the verified local player field once per TGame.exe process. Disable this with AF_LOCAL_AP_SYNC=0 only if you know why you are doing it.
For the detailed matrix, read Project Status.
Normal players do not need to read these first.
| Document | What it is for |
|---|---|
| Getting Started | longer setup guide |
| Project Status | what works / what is partial |
| PvE Runtime | dedicated-server lifecycle |
| Launch Requirements | TCLS → TGame technical details |
| Launcher Errors | launcher/TGame troubleshooting |
| Architecture | ports and services |
| Research Findings | verified protocol/runtime research |
| RE Tooling | reverse-engineering helpers/workflow |
| FAQ | common questions |
| Contributing | contributing code/research |
Do not commit or upload:
original TGame.exe / TCLS.dll
maps / UPK / UDK files
original game assets
PRIVATE.PEM
passwords
tokens
cookies
personal account information
memory dumps containing third-party code or private data
Users must obtain original game files independently and lawfully.
Original emulator code and documentation in this repository are licensed under the MIT License.
This license does not grant rights to Assault Fire, the original client, executables, DLLs, maps, packages, artwork, audio, trademarks, or other third-party material.
This project is not affiliated with, endorsed by, or sponsored by Tencent, Level Up! Games, or any original rights holder.
