Skip to content

Commit 42d76c4

Browse files
committed
docs: update character creation bootstrap notes
1 parent 0303c9f commit 42d76c4

2 files changed

Lines changed: 72 additions & 13 deletions

File tree

README.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Legend:
6060
- [x] character list surface
6161
- [x] minimal `authd` and `gamed` runtime listeners
6262
- [ ] empire selection support if required
63-
- [ ] character creation and selection
63+
- [x] character creation and selection
6464

6565
### 5. World entry
6666
- [x] loading/bootstrap packets
@@ -180,9 +180,16 @@ Current stub bootstrap credentials:
180180

181181
Current minimal runtime path exposed by the shipped binaries:
182182
- `authd`: `HANDSHAKE -> AUTH -> LOGIN3 -> AUTH_SUCCESS`
183-
- `gamed`: `HANDSHAKE -> LOGIN -> SELECT -> LOADING -> GAME`
183+
- `gamed`: `HANDSHAKE -> LOGIN -> SELECT -> CHARACTER_CREATE? -> CHARACTER_SELECT -> LOADING -> GAME`
184184

185-
This is still a bootstrap runtime, not full gameplay or real auth/game state sharing.
185+
This is still a bootstrap runtime, not full gameplay.
186+
What exists today:
187+
- shared authd -> gamed login tickets
188+
- session-scoped character creation that can be selected immediately
189+
190+
What still does not exist yet:
191+
- durable account/character persistence across fresh sessions
192+
- full gameplay/world state beyond the boot path
186193

187194
## Development
188195

spec/protocol/select-world-entry.md

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
This document freezes the minimal packet and phase choreography needed to move from the selection surface into the live world.
44

55
The 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.
3338
The current project-owned selection/world-entry flow is:
3439

3540
1. 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

4654
This 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

56111
Direction:
@@ -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

121176
It 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

Comments
 (0)