33This document freezes the minimal packet and phase choreography needed to move from the selection surface into the live world.
44
55The goal of this slice is narrow:
6+ - accept ` CHARACTER_CREATE ` in ` SELECT `
7+ - return ` PLAYER_CREATE_SUCCESS ` or ` PLAYER_CREATE_FAILURE `
68- accept ` CHARACTER_SELECT `
79- enter ` LOADING `
810- send the minimum bootstrap packets
@@ -13,6 +15,9 @@ It does not yet freeze the full visible-world packet set.
1315
1416## Covered packets
1517
18+ - ` CHARACTER_CREATE `
19+ - ` PLAYER_CREATE_SUCCESS `
20+ - ` PLAYER_CREATE_FAILURE `
1621- ` CHARACTER_SELECT `
1722- ` ENTERGAME `
1823- ` MAIN_CHARACTER `
@@ -33,15 +38,18 @@ See `frame-layout.md` for the envelope contract.
3338The current project-owned selection/world-entry flow is:
3439
35401 . the session is in ` SELECT `
36- 2 . the client sends ` CHARACTER_SELECT `
37- 3 . the server validates the slot and transitions to ` LOADING `
38- 4 . the server emits:
41+ 2 . the client may send ` CHARACTER_CREATE `
42+ 3 . on create success, the server emits ` PLAYER_CREATE_SUCCESS ` and stays in ` SELECT `
43+ 4 . on create failure, the server emits ` PLAYER_CREATE_FAILURE ` and stays in ` SELECT `
44+ 5 . the client sends ` CHARACTER_SELECT `
45+ 6 . the server validates the slot and transitions to ` LOADING `
46+ 7 . the server emits:
3947 - ` PHASE(LOADING) `
4048 - ` MAIN_CHARACTER `
4149 - ` PLAYER_POINTS `
42- 5 . the client sends ` ENTERGAME `
43- 6 . the server transitions to ` GAME `
44- 7 . the server emits ` PHASE(GAME) `
50+ 8 . the client sends ` ENTERGAME `
51+ 9 . the server transitions to ` GAME `
52+ 10 . the server emits ` PHASE(GAME) `
4553
4654This slice keeps the bootstrap minimal on purpose:
4755- no item stream is required yet
@@ -51,6 +59,53 @@ This slice keeps the bootstrap minimal on purpose:
5159
5260## Packet layouts
5361
62+ ### ` CHARACTER_CREATE `
63+
64+ Direction:
65+ - client -> server
66+
67+ Header:
68+ - ` 0x0201 `
69+
70+ Payload layout:
71+ - ` index ` — ` uint8 `
72+ - ` name ` — fixed ` 65 ` bytes (` CHARACTER_NAME_MAX_LEN + 1 ` )
73+ - ` race_num ` — ` uint16 `
74+ - ` shape ` — ` uint8 `
75+ - ` con ` , ` int ` , ` str ` , ` dex ` — ` uint8 ` each
76+
77+ Frame length:
78+ - ` 76 ` bytes total (` 4 + 72 ` )
79+
80+ ### ` PLAYER_CREATE_SUCCESS `
81+
82+ Direction:
83+ - server -> client
84+
85+ Header:
86+ - ` 0x020C `
87+
88+ Payload layout:
89+ - ` index ` — ` uint8 `
90+ - ` player ` — packed ` SimplePlayer ` record (` 103 ` bytes)
91+
92+ Frame length:
93+ - ` 108 ` bytes total (` 4 + 1 + 103 ` )
94+
95+ ### ` PLAYER_CREATE_FAILURE `
96+
97+ Direction:
98+ - server -> client
99+
100+ Header:
101+ - ` 0x020D `
102+
103+ Payload layout:
104+ - ` type ` — ` uint8 `
105+
106+ Frame length:
107+ - ` 5 ` bytes total (` 4 + 1 ` )
108+
54109### ` CHARACTER_SELECT `
55110
56111Direction:
@@ -116,12 +171,9 @@ Frame length:
116171
117172## Slice scope
118173
119- This slice freezes only the minimal ` SELECT -> LOADING -> GAME ` boundary.
174+ This slice freezes the minimal ` SELECT -> LOADING -> GAME ` boundary, including in-phase character creation .
120175
121176It does not yet freeze:
122- - ` CHARACTER_CREATE `
123- - ` PLAYER_CREATE_SUCCESS `
124- - ` PLAYER_CREATE_FAILURE `
125177- quickslot bootstrap
126178- skill-level bootstrap
127179- item bootstrap
0 commit comments