Game: RF 4.55 (Dragonborn), server v0.3.1, Windows build (stock gameserver.exe, SHA-256 c10012f3…f699a).
Client: the supported Taiwan build, RF_Online.bin SHA-256 46528aac…2bbc558 (2025-07-16), Language=Taiwan.
Summary
radarDetect returns an empty list unless the radar's eff_sort has '1' in its fourth digit. Of the three
radars, only the plain Satellite Radar (1001) has that, and its other-race digits are 0. So:
- High-Speed (
1100) and Ultra Satellite Radar (1110) list nobody at all, not even your own race. - Satellite Radar (
1001) lists your own race only. - No radar ever lists a player of another race.
How each part is known:
- Server side: read in the stock v0.3.1
gameserver.exe (with a Go symbol disassembler). - Item data: read from
gamedata_rf455.db. - Server log: shows each radar used, with its
eff_sort (below). - What the radar showed in game: not captured.
1. radarDetect stops at the fourth digit (v0.3.1, read)
radarUse (0x1407ed0a0) stores a run {until, effSort, map} (startRadarRun 0x1407ec940).effSort is the item's m_strEffSort; radarUse logs the same value as eff_sort in "radar used".
sendRadarCharList (0x1407ee440) passes the run to (*Server).radarDetect (0x1407ee560). There r8/r9 are the effSort string (pointer, length):
1407ee5ae: 49 83 f9 03 cmp r9, 3
1407ee5b2: 0f 8e fa 00 00 00 jle 0x1407ee6b2 ; len <= 3 -> empty list
1407ee5b8: 41 80 78 03 31 cmp byte ptr [r8+3], '1'
1407ee5bd: 0f 1f 00 nop
1407ee5c0: 0f 85 ec 00 00 00 jne 0x1407ee6b2 ; effSort[3] != '1' -> empty list
...
1407ee5e6: movzx ecx, byte ptr [r8] ; digit 0
1407ee5ee: movzx ecx, byte ptr [r8+1] ; digit 1
1407ee5f7: movzx ecx, byte ptr [r8+2] ; digit 2
2. After the check, only digits 0–2 decide who is listed (read)
The function walks playersInScope on the run's map. It skips itself and clients with no character, and stops at
50 entries.
- Another race (
raceSex >> 1 differs):- type 3 when
effSort[2] == '1' and raceBossRankOf gives 0; - otherwise type 2 when
effSort[1] == '1'; - otherwise not listed.
- Own race: listed only when
effSort[0] == '1'.- Type 1 when
raceBossRankOf gives 0. - Otherwise type 0, except that party members (
membersOf) are skipped.
raceBossRankOf (0x140904140) returns 0xFF for a character with no race rank, else the stored rank. We take rank 0 to be the patriarch, from gmRaceBoss's labels in an earlier build; we didn't re-check that on v0.3.1.
So digit 3 is only an on/off switch. Only the radar whose other-race digits are both 0 has it on.
3. Data (read)
radaritem in gamedata_rf455.db (m_strCode, m_strName, m_strEffSort):
| Code | Name | eff_sort |
|---|
rdaaa01, rdpvp01 | Satellite Radar | 1001 |
rdaaa02, rdpvp02 | High-Speed Satellite Radar | 1100 |
rdaaa03, rdpvp03 | Ultra Satellite Radar | 1110 |
From our server's history.log (2026-10-11):
radar used {"session": 2, "serial": 93, "code": "rdpvp02", "act_delay_sec": 300, "eff_sort": "1100"}
radar used {"session": 173, "serial": 96, "code": "rdpvp03", "act_delay_sec": 300, "eff_sort": "1110"}
radar used {"session": 173, "serial": 98, "code": "rdaaa01", "act_delay_sec": 300, "eff_sort": "1001"}Expected
This is inferred from the digit use above; i haven't checked it against the original game.
- The digits read as own race, other race, other-race patriarch, plus a fourth flag.
- The stronger radars should show more than the plain one:
- High-Speed: your own race and enemies;
- Ultra: the same, with the enemy patriarch marked.
I don't know what the fourth digit means. The check may be a wrong index, an inverted test, or a flag meant for
something else. Either way, it shuts off the two stronger radars completely.
Suggested fix
Drop the effSort[3] check, or give it its intended meaning. Keep the length check, since digits 0–2 are read after
it.
How to reproduce in game
Expected from the code above; not yet confirmed with the real client.
- Stand on a map with players of another race (and of your own race).
- Use a High-Speed or Ultra Satellite Radar. Nobody should appear.
- Use a plain Satellite Radar. Only your own race should appear.
What we do locally (not a fix)
A server byte patch turns the jne at 0x1407ee5c0 into a 6-byte nop (66 0f 1f 44 00 00).
Where to look
- Server (v0.3.1):
radarUse 0x1407ed0a0, startRadarRun 0x1407ec940, sendRadarCharList 0x1407ee440;radarDetect 0x1407ee560 (the check at 0x1407ee5ae–0x1407ee5c0, the list cap at 0x1407eeb0f);raceBossRankOf 0x140904140.
- Data:
radaritem.m_strEffSort.