SROCodex
ironsro

What the fight tells your browser

The messages that cross between this site's server and your screen — which are the game's own, and the four we had to invent because the game has no way to say them.

verified: partialSR_GameServer.exe, RSBot — the shard's own message layouts (the appendix)lib/play/wire.ts, lib/sro/ — the code this page describes

Every number you see in a fight arrives as a message. This page says which of those messages are the real game's and which are ours, because the difference is the difference between "this site reproduces Silkroad" and "this site is like Silkroad".

The game's own messages · Game

Almost everything is the shard's own vocabulary, unchanged: a body appearing or leaving, where it is walking, a cast starting and what it did, health and mana moving, which bad statuses are on you, a buff going on or coming off, an item being used. The reader that decodes them in your browser is a port of the client's own code, so what your screen believes is what a real client would believe.

The one about damage is worth knowing. A hit does not arrive as a plain number: it arrives with flags saying what kind of hit it was — an ordinary one, a critical, a block, one that pierced defence, one that knocked you down or threw you back — and the number beside them. That is why the fight can tell you why a swing did what it did rather than only how much.

The four we invented · Ours

The shard has no way to say some things, because in the real game nothing needs to. Rather than bend an existing message into a shape it does not have, this site uses four numbers no real client ever sends or receives. They are deliberately outside the range the game uses, so nothing can collide with them, and the bridge that speaks to real clients never emits them.

What it says Why the game has no message for it
Whether you are fighting or watching A room here can be opened by one person and walked into by another. The real game has no such thing
That the fight is over, who won, and how many fell The real game has no "fight": you simply stop being attacked, or you die
How long each status and buff has left The shard's own status message carries no clock. The real client does not need one — the server takes the status off when it ends and the client just believes it. Ours draws a countdown, so the number has to travel
Why something you pressed did nothing The game refuses a walk in silence. "I click and nothing happens" had no answer, so now every refusal carries its own reason

The third one is the clearest example of the trade. The real game's status message is a bare set of flags — what is on you, nothing more. A page that draws a ticking clock beside each icon needs a number the original never sends, so we send it on a channel of our own and label it as ours rather than pretending the shard provides it.

What we leave unsaid · Missing

The shard's messages carry far more than a fight needs — trade, jobs, guilds, parties, shops, mail. This site's server never sends any of them, and the reader in your browser would not know what to do with them if it did. The appendix below documents the layouts anyway, because they are what our reading of the shard is checked against.

For anyone opening the binary

Everything below is reference: hit-state flags, packet layouts, item and monster classification, and the config a real shard runs on, recovered from the original server's own files. It describes their messages, not ours.

Hit State Flags (ActionHitStateFlag)

Normal     - Regular hit
Block      - Blocked (no damage)
KnockBack  - Knockback (position data follows)
Dead       - Entity died

Damage Packet Layout (from server)

1. Hit State flags (byte)
2. Crit status (byte): 0x01 = normal, 0x02 = critical
3. Damage value (3 bytes, little-endian, combined into Int32)
4. Unknown state (4 bytes)

KnockBack Packet Layout

When HitState has KnockBack flag:
  - Position data follows: Position X, Y, Z (as Int32 from packet)

Magic Options & Alchemy Stats

Magic Option Types (from NATTR_ definitions)

Code Stat Name
NATTR_DUR Durability
NATTR_PDSTR Physical Defense (STR)
NATTR_MDINT Magical Defense (INT)
NATTR_PD Physical Defense
NATTR_MD Magical Defense
NATTR_ER Evasion Rate
NATTR_PASTR Physical Attack (STR)
NATTR_MAINT Magical Attack (INT)
NATTR_HR Hit Rate
NATTR_PA Physical Attack
NATTR_MA Magical Attack
NATTR_CRITICAL Critical Hit Chance
NATTR_BR Block Rate
NATTR_PAR Physical Attack Rating
NATTR_MAR Magical Attack Rating

Magic Option Bonuses (format strings from server)

Format String Meaning
reinforce +%d%% Plus level bonus
anti-burn +%d%% Burn resistance
critical +%d Critical bonus (flat)
block rate +%d Block rate bonus (flat)
resist stun +%d%% Stun resistance (percent)
anti-eshock +%d%% Electric shock resistance
resist disease +%d%% Disease resistance
resist sleep +%d%% Sleep resistance
NASRUN umpc +%d%% ??? (MP consumption reduction?)
NASRUN umdc +%d%% ??? (??? damage reduction?)

Alchemy System

  • Magic stones (Luck 07, 08, 09 grades) - add blue stats
  • Attribute stones - add attributes (physical/magical)
  • Element stones - add element (Fire, etc.)
  • Reinforce recipes - required for +ing items (Weapon, Shield, Armor, Accessory)
  • Rondo (01, 02) - Lucky powder for success rate
  • Sockets: Maker, StoneInserter, StoneEraser classes exist
  • Avatar items have separate enchanting system

Enchant Classes

CEnchant_EnchantAttrStone   - Add attribute (STR/INT)
CEnchant_EnchantMagicStone  - Add magic option (blue stats)
CEnchant_Reinforce          - Plus (+) items
CEnchant_UpperReinforce     - Advanced plus
CEnchant_SocketMaker        - Make socket holes
CEnchant_SocketStoneInserter - Insert socket stones
CEnchant_SocketStoneEraser  - Remove socket stones
CEnchant_EnchantAvatarItem  - Avatar enchanting
CBless_AvatarItemWithNPC    - Bless avatar with NPC

Success Rate Functions

  • _SumSuccessRatio() - Calculate alchemy success
  • _GetTotalSuccessRatio() - Total success calculation
  • Avatar items can reach 100% success rate

Skill Data Format (from skills_raw.txt)

Skills table has 6,631 entries. Format:

ID, ReqCommon_Mastery1, Basic_Code, ReqCommon_MasteryLevel1, 
Action_CastingTime, Consume_MP, UI_IconFile, UI_SkillName, ReqLearn_Race

Example (Sword Smash A level 1):

ID: 3
Mastery: 257 (Sword Mastery)
Code: SKILL_CH_SWORD_SMASH_A_01
Req Level: 5
Casting Time: 411ms
Consume MP: 19
Icon: skill\china\sword_smash_a.ddj
Race: 0 (Chinese)

Skill Series Progression (example - Sword Smash)

Level Mastery Level MP Cost Series
A_01 5 19 Smash A
A_02 7 23 Smash A
A_03 9 27 Smash A
A_04 11 31 Smash A
A_05 13 36 Smash A
A_06 15 42 Smash A
A_07 17 47 Smash A
A_08 19 53 Smash A
A_09 21 60 Smash A
B_01 27 91 Smash B
B_02 29 100 Smash B
C_01 49 290 Smash C

Item Data Format (from items_raw_new.txt)

Items table has 8,513 entries. Format:

ID, CodeName128, NameStrID128, AssocFileObj128, 
TypeID1, TypeID2, TypeID3, TypeID4,
ItemClass, ReqGender, ReqStr, ReqInt, ReqLevel1

TypeID Classification

TypeID1 = Main type, TypeID2 = Sub-type, TypeID3 = Sub-sub-type, TypeID4 = Detail

Item Classes (ItemClass)

Class Meaning
1 Equipment (weapon)
2 Equipment (armor)
... ...

Item Categories (by CodeName prefix)

Prefix Category
ITEM_CH_SWORD_ Chinese Sword
ITEM_CH_BLADE_ Chinese Blade
ITEM_CH_SPEAR_ Chinese Spear
ITEM_CH_BOW_ Chinese Bow
ITEM_CH_TBLADE_ Chinese Two-handed Blade
ITEM_CH_SHIELD_ Chinese Shield
ITEM_CH_M_CLOTHES_ Chinese Male Clothes
ITEM_CH_W_CLOTHES_ Chinese Female Clothes
ITEM_CH_M_HEAVY_ Chinese Male Heavy Armor
ITEM_CH_W_HEAVY_ Chinese Female Heavy Armor
ITEM_CH_M_LIGHT_ Chinese Male Light Armor
ITEM_CH_W_LIGHT_ Chinese Female Light Armor
ITEM_CH_NECKLACE_ Necklace
ITEM_CH_RING_ Ring
ITEM_CH_EARRING_ Earring
ITEM_EU_SWORD_ European Sword
ITEM_EU_TSWORD_ European Two-handed Sword
ITEM_EU_AXE_ European Axe
ITEM_EU_CROSSBOW_ European Crossbow
ITEM_EU_DAGGER_ European Dagger
ITEM_EU_HARP_ European Harp
ITEM_EU_WAND_ European Wand
ITEM_EU_STAFF_ European Staff
ITEM_EU_SHIELD_ European Shield
ITEM_EU_M_CLOTHES_ European Male Clothes
ITEM_EU_W_CLOTHES_ European Female Clothes
ITEM_EU_M_HEAVY_ European Male Heavy Armor
ITEM_EU_W_HEAVY_ European Female Heavy Armor
ITEM_EU_M_LIGHT_ European Male Light Armor
ITEM_EU_W_LIGHT_ European Female Light Armor
ITEM_ETC_ Etc/Consumable items

Item Grade (A/B/C suffix)

  • A = Basic (low stats)
  • B = Normal (medium stats)
  • C = Premium (high stats)

Item Degree (number before underscore)

Higher number = higher degree = higher level requirement e.g., SWORD_01 = degree 1, SWORD_11 = degree 11


Monster Data Format (from monsters_raw.txt)

Monsters table has 13,662 entries. Format:

ID, CodeName128, NameStrID128, AssocFileObj128, Lvl, MaxHP, MaxMP

Monster Type Prefixes

Prefix Region
MOB_CH_ China (Jangan area)
MOB_WC_ West China (Donwhang)
MOB_KT_ ???
MOB_EU_ Europe (Constantinople)
MOB_CA_ Central Asia (Hotan)
MOB_SD_ Special Dungeon
MOB_RM_ Roc Mountain
MOB_EVE_ Event monsters
MOB_TQ_ Unique monsters (quest)

Monster Clones

Monsters suffixed with _CLON are clone variations (different stats for higher/lower level areas).

Monster Spawn System

SpawnMonster[CodeName]-RegionXZ[X, Z] PositionXYZ[X, Y, Z]
  • Monsters spawn in specific regions with exact coordinates
  • GiantMonster_SpawnRatio controls unique monster spawn rate
  • AGGRO_LINK_DECREASE_RATIO controls aggro chaining

Movement & Position Data

Position Format

  • Server sends position as RegionID, X, Y, Z (floating point)
  • Positions are region-based (128 regions on the SRO world map)
  • Each region has blocks with cells for navigation

Movement Boundaries

  • Cell-based movement system
  • Total Block Size, CurBlockID, DestBlockID - Path data
  • CurPosRegionID, CurPosRegion X, CurPosRegion Z - Current position
  • FastestCurBlockCellID - Pathfinding cell ID

Speed Config

  • PCSpeedRatio - Global player speed multiplier
  • Speed scrolls exist: ITEM_ETC_E051123_SPEED_UP_SCROLL

The server uses a NavMesh system for pathfinding:

  • NavMesh_new library
  • RTNavMeshTerrain - Terrain navigation
  • RTNavMeshDungeon - Dungeon navigation
  • RTNavMeshObj - Object navigation
  • RTNavEdge - Navigation edges
  • RegionManagerBody - Region boundary management

Game World / Instance System

World Types

  • Normal overland worlds (shared by all players)
  • Dungeon instances (private/party)
  • Siege fortress dungeons
  • Event worlds
  • GAME_WORLD_NORMALIZE_TYPE, GAME_WORLD_NORMALIZE_TYPE_A

Dungeon System

  • SimpleDungeonData files for dungeon layouts
  • INS_SIEGE_DUNGEON - Siege dungeon instance
  • Trying to warp to dungeon!!! - Debug message
  • Can't open chin's tomb instance (missing ref data)

Instance Data

  • _CharInstanceWorldData table - tracks character's instance progress
  • SetupInstanceDataAccess - Initialize instance data
  • Max instance dungeon count: server controlled

PvP & Battle Arena

Arena Types (from server.cfg)

BattleArenaRandom 1   - Random arena
BattleArenaParty 1    - Party arena
BattleArenaGuild 1    - Guild arena
BattleArenaJob 1      - Job arena
ArenaMatchOccupy 1    - Occupy match
ArenaMatchFlag 1      - Flag/CTF match
ArenaMatchPoint 1     - Point match

Arena Rewards (Evangelion config)

  • Guild & Job arena: win/loose reward count configurable
  • Random & Party arena: win/loose reward count configurable
  • CTF reward count configurable
  • Reward item codes configurable via arenaRewards/ctfRewards sections

Cash Shop System

Cash Item Types

_STRG_BUY_CASHITEM_EXP          - EXP boost items
_STRG_BUY_CASHITEM_EQUIP_NORMAL - Equipment from cash shop

Cash Items Referenced

ITEM_MALL_SKILL_RESTORATION_POTION  - Skill reset potion
ITEM_MALL_PREMIUM_GOLDTIME          - Premium gold time
ITEM_PRE_GOLTAM_4W                  - Premium 4 weeks
ITEM_MALL_DAMAGE_INC_20P_SCROLL     - Damage increase 20%
ITEM_MALL_DAMAGE_ABS_20P_SCROLL     - Damage absorb 20%

Cash Item Service

  • Trying to add CashItem, is not in service! - Service check
  • MAX_CASHITEM_TID_COUNT - Max cash item types
  • btCash < MAX_CASHITEM_TID_COUNT - Assertion check

Job/Mastery System

Mastery Types (from skill data)

ID Mastery
257 Chinese Sword (Bicheon)
513 European Warrior Shield
??? Chinese Spear (Haeksal)
??? Chinese Bow (Pacheon)
... ...

Job Levels

  • Skill levels tied to mastery level
  • _REFHWANLEVEL table for mastery level data
  • ReqCommon_MasteryLevel1 in skill data

Skill Point Management

  • RemainSkillPoint - Available skill points
  • OffsetSkillPoint - Modify skill points
  • Skill Learn Abuser!! - Anti-cheat for skill learning

Event System

Event Types (from server.cfg comments)

WINTER_EVENT_2009
EUBUSINESS_EVENT
GOLDEN_PIG_FEBRUARY_EVENT
THANKS_GIVING_EVENT
LIBERATION_EVENT

Event Triggers

CGameTriggerCondition_MONSTER_LEVEL_KILL
CGameTriggerCondition_USER_LEVEL
CGameTriggerCondition_POSITION_EVENTZONE_IN
CGameTriggerCondition_POSITION_EVENTZONE_OUT
CGameTriggerEvent_POSITION_EVENTZONE
CGameTriggerAction_CREATEOBJECT_TELEPORT
CGameTriggerAction_SWITCH_TELEPORT

Event Items

ITEM_EVENT_DAMAGE_ABS_20P_SCROLL
ITEM_EVENT_DAMAGE_INC_20P_SCROLL
ITEM_EVENT_REVERSE_RETURN_SCROLL
ITEM_EVENT_RETURN_SCROLL_HIGH_SPEED
ITEM_EVENT_COS_C_SCARABAEUS_SCROLL
ITEM_EVENT_COS_C_WILDPIG_SCROLL
ITEM_EVENT_COS_C_OSTRICH_SCROLL
ITEM_EVENT_COS_C_PEGASUS_SCROLL

Server Events (scheduled)

_AddLogSchedule
_AddLogServerEvent
schedule.cfg - Schedule configuration file

Repository File Structure (for wiki dev)

Key Data Files Available

VSRO_Database/
  items_raw.txt        - 8,513 items (basic: ID, CodeName, TypeIDs, Class, Req)
  items_raw_new.txt    - 8,513 items (extended: +ReqLevel1)
  monsters_raw.txt     - 13,662 monsters (ID, CodeName, Level, MaxHP, MaxMP)
  *.bak               - Full SQL Server database backups

pk2_extractor/
  skills_raw.txt       - 6,631 skills (ID, Mastery, Code, CastTime, MPCost, Icon)
  textdata_equip&skill.txt - Binary skill/item text data
  textdata_new.txt     - Binary updated text data
  *.py                 - Python extraction scripts

sro-web/public/models/
  monsters_db.json     - Monster data dump
  items_db.json        - Items data dump
  skills_db.json       - Skills data dump
  catalog.json         - Item catalog tree
  character_textures.json - Character texture variants

Server/
  SR_GameServer.exe    - Main game server (contains ALL game logic)
  Evangelion.dll       - Custom server modifications
  server.cfg           - Server configuration
  schedule.cfg         - Scheduled events
  regioninfo.txt       - Region data

3D Model Formats

.bsr - Binary Scene Resource (main model file)
.ddj - Skeleton/Animation descriptor
.bms - Binary Mesh (vertex data)
.bsk - Skeleton (bone hierarchy)
.ban - Animation (keyframe data)
.bmt - Material/Texture

Map Data Files (in project root)

*.m            - Terrain: heights, tiles, water (JMXVMAPM1000)
*.o, *.o2      - Object placements (JMXVMAPO1001)
*.t            - Tile/texture map (JMXVMAPT1001)
mapinfo.mfo    - Map metadata
object.ifo     - Placed objects
objectstring.ifo - Object name strings
tile2d.ifo     - 2D tile data