Game: RF 4.55 (Dragonborn), server v0.2.0, Windows build (stock gameserver.exe, SHA-256 96452fbd…).
Client: the supported Taiwan build, RF_Online.bin SHA-256 46528aac…2bbc558 (2025-07-16), Language=Taiwan.
Summary
The guild tables and the client support guild emblems, guild grades and Honor Guilds, but nothing on the server
sets them:
- Emblem: a guild master who picks an emblem in the guild window gets an error. The server answers the request with "verb not implemented in this slice". Every guild keeps
emblem_back / emblem_mark = 0xFFFFFFFF forever, so no guild ever shows an emblem. - Grade:
guilds.grade is written once, as 1, when the guild is founded, and no code changes it afterwards. - Honor Guild: the honor list request always gets an empty list, and there is no handler for setting honor guilds. No player ever shows the "1st"…"5th" honor tag.
- Guild-master aura: the client draws the master's aura only when the guild's grade is 3 or more, so with the grade stuck at 1 it never appears.
found this by reading gameserver.exe and the client, after looking for why no guild ever shows an emblem.
Haven't reproduced the in-game refusal live yet. Every address below is from the stock
v0.2.0 binaries.
1. Emblem: 1B/7B type 3 is refused
What the client sends. The guild window's emblem board sends 1B/7B guild_manage_request_clzo, 0x1D
bytes (Send_1B_7B, client 0x5b6bb0):
| Offset | Field |
|---|
| 0x00 | u8 type = 3 |
| 0x01 | u32 the master's avatar serial |
| 0x05 | u64 emblem back: cell << 16 | RGB565 colour (sign-extended u32) |
| 0x0D | u64 emblem mark: the same |
| 0x15 | padding |
The cells index SpriteImage\common\emblem.spr: page 0 holds the backgrounds (cells 1–22) and page 1 the marks
(cells 1–77), in 64×64 cells. The colour is packed by client 0x5e6660 from the board's ARGB. This is the same u32
pair the server already stores in guilds.emblem_back / emblem_mark and sends in 1B/03 and 1B/22.
What the server does. (*Server).handleGuildManage (0x14082aa60) handles only type 1 (expel,
guildManageExpulse) and type 4 (committee, guildManageCommittee). Types 0, 2, 3 and 5 log guild manage: verb
not implemented in this slice and reply 1B/7C with error 0xCA, which the client shows as an error.
The other gap. No SQL in the binary ever writes the emblem. The only statement naming emblem_back /
emblem_mark is the founding INSERT INTO guilds (serial, name, race, grade, emblem_back, emblem_mark, …). The
only guild UPDATEs are master_serial, possible_elect_master and disbanded_at.
Expected: type 3 checks the sender is the master (as the client only offers the board to the master), then:
- stores the pair in the guild record and in
guilds; - replies 1B/7C 0;
- tells every member online with 1B/28
guild_info_update_inform_zocl: u32 serial, u8 grade, u32 back, u32 mark, u32 ×3. The client already handles 1B/28 (0x5af660): it updates its guild cache and every member in view (0x51ff90).
Players who see the guild later get it from the 1B/22 reply the server already sends.
2. Grade never changes
grade is written only by the founding INSERT, with the default 1 (guildLifeRecordFrom 0x14081c0e0). No
UPDATE guilds SET grade exists. The client reads the grade from 1B/22 +0x15 into its guild cache (+0x2c). Two
things depend on it:
- the guild window shows it;
- the guild-master aura (
0x7dde30, at 0x7deb91–0x7decc5) plays only when the cached grade is ≥ 3.
So no guild master ever has the aura. Expected: the grade rises by whatever the server's guild-grade rule is,
and a change goes out in 1B/28.
3. Honor Guild is a stub
- 1B/6F
handleGuildHonorList (0x1407aef20) always calls protocol.GuildHonorListResult (0x14064ca80) with a nil list and count 0, so 1B/70 is always empty. The source file gommo/games/rf455/protocol/guildhonor.go is in the binary. - These have no handler and are never sent:
- 1B/71 honor set (the client sends 0x6F bytes: 5 × 0x16 entries) → 1B/72;
- 1B/75 patriarch honor set inform;
- 1B/76 → 1B/77 next list;
- 1B/7A
guild_honorguild_mark_zocl {u8 rank, u32 avatar serial, u8 kind}; - 1B/78
guild_master_info.
- The client takes the honor rank (0–4 = "1st".."5th", 0xFF none) from 1B/7A, from 03/1F +0x3D, 03/22 +0x23 and 03/04 +0x1AD (
0x44d860 sets the tag). The 62-byte 03/1F has no byte there (RF455-029), and 1B/7A is never sent.
Expected: the patriarch (Archon) can choose the race's honor guilds with 1B/71, as in the original game. The
server then sends 1B/7A to their members and keeps the rank in the 03/1F and 03/04 it sends.
Where to look
- Server:
handleGuildManage 0x14082aa60, guildManageGateLocked 0x14082b1c0, handleGuildHonorList 0x1407aef20, guild.(*Repository).LoadAll 0x140709920, guildDownloadInfo 0x140819220, guildQueryInfoReply 0x1408197a0. - Client: 1B/7B sender
0x5b6bb0, 1B/7C 0x5b6d90, 1B/22 0x5af570, 1B/28 0x5af660, 1B/7A 0x5b6ac0, honor tag 0x44d860, aura 0x7deb91.