mirror of
https://github.com/Melledy/Grasscutter.git
synced 2024-11-23 02:34:07 +00:00
189 lines
8.4 KiB
Markdown
189 lines
8.4 KiB
Markdown
|
# Hide and Seek!
|
||
|
Documentation on how the **Hide and Seek** game works.\
|
||
|
Externally dubbed: `Windtrace`.
|
||
|
|
||
|
# Map IDs
|
||
|
TODO: Document the map IDs of Windtrace.
|
||
|
|
||
|
TODO: Investigate `ServerGlobalValueChangeNotify`
|
||
|
|
||
|
# Asking Players to Play in a Co-Op Game
|
||
|
1. The client will send `DraftOwnerStartInviteReq`
|
||
|
2. The server will send `DraftOwnerInviteNotify` to all clients.
|
||
|
3. The server will send `DraftOwnerStartInviteRsp`
|
||
|
|
||
|
# Matching in a Co-Op Game
|
||
|
1. World owner talks to Gygax and begins a Windtrace game.
|
||
|
2. The packet `DraftOwnerInviteNotify` is sent to clients.
|
||
|
3. Clients will respond with `DraftGuestReplyInviteReq` (client-side)
|
||
|
4. The server will respond with `DraftGuestReplyInviteRsp`
|
||
|
5. The server will respond with `DraftInviteResultNotify`
|
||
|
|
||
|
# Starting Windtrace
|
||
|
1. If `DraftInviteResultNotify` is a success, the server will send a series of packets.
|
||
|
1. A series of `SceneEntityAppearNotify` packets.
|
||
|
2. `NpcTalkStateNotify`
|
||
|
3. `PlayerEnterSceneNotify`
|
||
|
4. `MultistagePlayInfoNotify`
|
||
|
2. The players are then teleported to the Windtrace map in their locations.
|
||
|
3. Server will send packets to clients. (this is server boilerplate)
|
||
|
4. The server sends another `MultistagePlayInfoNotify` to clients.
|
||
|
|
||
|
# Changing Avatars - Others
|
||
|
1. The server will send a `AvatarEquipChangeNotify` packet to clients.
|
||
|
2. The server will send a `SceneTeamUpdateNotify` packet to clients.
|
||
|
3. The server will send a `HideAndSeekPlayerSetAvatarNotify` packet to clients.
|
||
|
|
||
|
# Getting Ready
|
||
|
1. The client will send `HideAndSeekSetReadyReq` to the server.
|
||
|
2. The server will reply with `HideAndSeekPlayerReadyNotify` to clients.
|
||
|
3. The server will send `MultistagePlayInfoNotify` to clients.
|
||
|
4. The server will reply with `HideAndSeekSetReadyRsp` to the client.
|
||
|
5. If all players are ready, the server will move on to start Windtrace.
|
||
|
|
||
|
# Starting Windtrace
|
||
|
1. When all players are ready, the server will send a series of packets to players.
|
||
|
1. `GalleryStartNotify`
|
||
|
2. `SceneGalleryInfoNotify`
|
||
|
3. `MultistagePlayInfoNotify`
|
||
|
4. `MultistagePlayStageEndNotify`
|
||
|
5. This will only get sent at the `1.` countdown.
|
||
|
|
||
|
### Notes:
|
||
|
- `GuestReplyInviteRsp` is sent **after** `DraftInviteResultNotify`.
|
||
|
|
||
|
## `DraftOwnerInviteNotify`
|
||
|
- `invite_deadline_time` - This is the time when the invite expires.
|
||
|
- `draft_id` - The value is always `3001` for Windtrace.
|
||
|
|
||
|
## `DraftOwnerStartInviteReq`
|
||
|
- `draft_id` - The value is always `3001` for Windtrace.
|
||
|
|
||
|
## `DraftOwnerStartInviteRsp`
|
||
|
- `draft_id` - The value is always `3001` for Windtrace.
|
||
|
- `invite_fail_info_list` - A list of players who weren't invited.
|
||
|
- `retcode` - The response code.
|
||
|
- `wrong_uid` - Always `0`. (undocumented)
|
||
|
|
||
|
## `DraftGuestReplyInviteReq`
|
||
|
- `draft_id` - The value is always `3001` for Windtrace.
|
||
|
- `is_agree` - A boolean value for whether the client accepts the invite.
|
||
|
|
||
|
## `DraftGuestReplyInviteRsp`
|
||
|
- `draft_id` - The value is always `3001` for Windtrace.
|
||
|
- `retcode` - Response code for the request.
|
||
|
- `is_agree` - A boolean value for whether the server acknowledges the client's invite acceptation.
|
||
|
|
||
|
## `DraftInviteResultNotify`
|
||
|
- `draft_id` - The value is always `3001` for Windtrace.
|
||
|
- `is_all_agree` - A boolean value for whether all clients accepted the invite.
|
||
|
|
||
|
## `NpcTalkStateNotify`
|
||
|
- `is_ban` - This value is always true when entering Windtrace.
|
||
|
|
||
|
## `PlayerEnterSceneNotify`
|
||
|
- `pos` - This is where the player will be teleported to.
|
||
|
- This value depends on if the player is a hunter or a runner.
|
||
|
- This value is set by the server and must be hardcoded/read from a JSON file.
|
||
|
|
||
|
## `MultistagePlayStageEndNotify`
|
||
|
- `play_index` - Value picked by the server. (use 1)
|
||
|
- `group_id` - This value is always `133002121` for Windtrace.
|
||
|
|
||
|
## `MultistagePlayInfoNotify` - Initial + PostEnterSceneReq
|
||
|
- Image Reference: ![img.png](images/multistageplayinfo.png)
|
||
|
- `info` - MultistagePlayInfo data.
|
||
|
- `group_id` - The value is always `133002121` for Windtrace.
|
||
|
- `play_index` - Value picked by the server. (use 1)
|
||
|
- `hide_and_seek_info` - Information about Windtrace.
|
||
|
- `hider_uid_list` - A list of UIDs (ints) of the hiders.
|
||
|
- `hunter_uid` - The UID (int) of the hunter.
|
||
|
- `map_id` - The ID of the Windtrace map.
|
||
|
- `stage_type` - Windtrace state.
|
||
|
- This will be `HIDE_AND_SEEK_STAGE_TYPE_PREPARE`.
|
||
|
- `battle_info_map` - Contains a dictionary of UID -> `HideAndSeekPlayerBattleInfo` objects.
|
||
|
- `skill_list` - Array of 3 values of skill IDs chosen by the player.
|
||
|
- `avatar_id` - The ID of the avatar the player wants to use.
|
||
|
- `is_ready` - The player's in-game ready state.
|
||
|
- `costume_id` - The costume the player's avatar is wearing.
|
||
|
|
||
|
## `MultistagePlayInfoNotify` - Picking Avatars
|
||
|
- Image Reference: ![img.png](images/pickavatar.png)
|
||
|
- **Note:** This packet matches the initial structure and data.
|
||
|
- `info.hide_and_seek_info.stage_type` - This will be `HIDE_AND_SEEK_STAGE_TYPE_PICK`.
|
||
|
|
||
|
## `MultistagePlayInfoNotify` - Starting Windtrace
|
||
|
- Image Reference: ![img.png](images/startwindtrace.png)
|
||
|
- **Note:** This packet matches the initial structure and data.
|
||
|
- `info.hide_and_seek_info.stage_type` - This will be `HIDE_AND_SEEK_STAGE_TYPE_HIDE`.
|
||
|
|
||
|
## `MultistagePlayInfoNotify` - Seeking Time
|
||
|
- Image Reference: ![img.png](images/seektime.png)
|
||
|
- **Note:** This packet matches the initial structure and data.
|
||
|
- `info.hide_and_seek_info.stage_type` - This will be `HIDE_AND_SEEK_STAGE_TYPE_SEEK`.
|
||
|
|
||
|
## `MultistagePlayInfoNotify` - Finish Windtrace
|
||
|
- Image Reference: ![img.png](images/seektime.png)
|
||
|
- **Note:** This packet matches the initial structure and data.
|
||
|
- `info.hide_and_seek_info.stage_type` - This will be `HIDE_AND_SEEK_STAGE_TYPE_SETTLE`.
|
||
|
|
||
|
## `HideAndSeekPlayerSetAvatarNotify`
|
||
|
- `avatar_id` - The ID of the new avatar the player wants to use.
|
||
|
- `uid` - The UID of the player who changed their avatar.
|
||
|
- `costume_id` - The costume the player's avatar is wearing.
|
||
|
|
||
|
## `HideAndSeekSetReadyRsp`
|
||
|
- `retcode` - Response code for the request.
|
||
|
|
||
|
## `HideAndSeekPlayerReadyNotify`
|
||
|
- `uid_list` - A list of UIDs (ints) of the players who are ready.
|
||
|
|
||
|
## `GalleryStartNotify`
|
||
|
- `gallery_id` - TODO: Check if this value is always `7056` for Windtrace.
|
||
|
- `start_time` - This value is always `2444` for Windtrace.
|
||
|
- This value is `200` when displaying game end statistics.
|
||
|
- `owner_uid` - The UID of the player who started the Windtrace game.
|
||
|
- `player_count` - The number of players in the Windtrace game.
|
||
|
- `end_time` - This value is always the same as `start_time`.
|
||
|
|
||
|
## `SceneGalleryInfoNotify` - Starting Windtrace
|
||
|
- `gallery_info` - SceneGalleryInfo data.
|
||
|
- `end_time` - This value is always the same as `start_time`.
|
||
|
- `start_time` - This value is always `2444` for Windtrace.
|
||
|
- This value is `200` when displaying game end statistics.
|
||
|
- `gallery_id` - This value is always the same as `gallery_id` from `GalleryStartNotify`.
|
||
|
- `stage` - The current stage of the gallery.
|
||
|
- This will be `GALLERY_STAGE_TYPE_START`.
|
||
|
- `owner_uid` - The UID of the player who started the Windtrace game.
|
||
|
- `hide_and_seek_info` - SceneGalleryHideAndSeekInfo
|
||
|
- `visible_uid_list` - List of UIDs (ints) of the players who were left alive.
|
||
|
- `caught_uid_list` - List of UIDs (ints) of the players who have been caught.
|
||
|
- `player_count` - The amount of players in the Windtrace game.
|
||
|
- `pre_start_end_time` - This value is always `0` for Windtrace.
|
||
|
|
||
|
## `HideAndSeekSettleNotify`
|
||
|
- `reason` - The reason for the game ending.
|
||
|
- `winner_list` - A list of UIDs (ints) of the players who won the game.
|
||
|
- `settle_info_list` - HideAndSeekSettleInfo data.
|
||
|
- This is a list of players who participated in the game.
|
||
|
|
||
|
## `HideAndSeekSettleInfo`
|
||
|
- `card_list` - A collection of `ExhibitionDisplayInfo`
|
||
|
- If unknown: hardcode the specified values. ![img.png](images/defaultexhibitioninfo.png)
|
||
|
- These values are repeated during testing.
|
||
|
- `uid` - The UID of the player who participated in the game.
|
||
|
- `nickname` - The player's nickname.
|
||
|
- `head_image` - This value is always `0`.
|
||
|
- `online_id` - This value is always blank.
|
||
|
- `profile_picture` - `ProfilePicture` object.
|
||
|
- `play_index` - Value picked by the server. (use 1)
|
||
|
- `stage_type` - The stage type. (inconclusive; TODO)
|
||
|
- `cost_time` - The amount of time the player took to complete the game.
|
||
|
- `score_list` - A list of player scores.
|
||
|
|
||
|
## `ExhibitionDisplayInfo`
|
||
|
- `id` - The ID of the reward.
|
||
|
- `param` - The amount of the reward given.
|
||
|
- `detail_param` - This value is *mostly* 0.
|
||
|
- This value **matches** param when the reward is of the amount of time spent playing. (participation reward)
|