diff --git a/docs/events/windtrace/README.md b/docs/events/windtrace/README.md new file mode 100644 index 000000000..dcea3a96d --- /dev/null +++ b/docs/events/windtrace/README.md @@ -0,0 +1,188 @@ +# 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) diff --git a/docs/events/windtrace/images/defaultexhibitioninfo.png b/docs/events/windtrace/images/defaultexhibitioninfo.png new file mode 100644 index 000000000..8e4c4ee55 Binary files /dev/null and b/docs/events/windtrace/images/defaultexhibitioninfo.png differ diff --git a/docs/events/windtrace/images/multistageplayinfo.png b/docs/events/windtrace/images/multistageplayinfo.png new file mode 100644 index 000000000..4ec882a4f Binary files /dev/null and b/docs/events/windtrace/images/multistageplayinfo.png differ diff --git a/docs/events/windtrace/images/pickavatar.png b/docs/events/windtrace/images/pickavatar.png new file mode 100644 index 000000000..bc2b97cb2 Binary files /dev/null and b/docs/events/windtrace/images/pickavatar.png differ diff --git a/docs/events/windtrace/images/seektime.png b/docs/events/windtrace/images/seektime.png new file mode 100644 index 000000000..cfde3b356 Binary files /dev/null and b/docs/events/windtrace/images/seektime.png differ diff --git a/docs/events/windtrace/images/startwindtrace.png b/docs/events/windtrace/images/startwindtrace.png new file mode 100644 index 000000000..09e21c4d3 Binary files /dev/null and b/docs/events/windtrace/images/startwindtrace.png differ