1#![allow(non_camel_case_types)]
6#![allow(non_upper_case_globals)]
7
8use binrw::BinRead;
9use binrw::BinWrite;
10use ygopro_derive::Message;
11
12use crate::generate_enum;
13use crate::constants::CorePlayer;
14use crate::data::Deck;
15use crate::data::Response as DataResponse;
16use crate::message::HostInfo;
17use crate::utils::string::{FixedLengthString, U16String};
18
19
20include!(concat!(env!("OUT_DIR"), "/client_to_server.rs"));
21every_client_to_server_flat_message!(generate_enum);
22
23#[derive(BinRead, BinWrite, Debug, Clone, Message)]
24#[message(ctos, flag = 1)]
25pub struct Response {
26 #[br(args_raw = None)]
27 pub response: DataResponse
28}
29
30#[derive(BinRead, BinWrite, Debug, Clone, Message)]
31#[message(ctos, flag = 2)]
32#[repr(C)]
33pub struct UpdateDeck {
34 pub deck: Deck
35}
36
37#[derive(BinRead, BinWrite, Debug, Clone, Message)]
38#[message(ctos, flag = 3)]
39#[repr(C)]
40pub struct HandResult {
41 pub res: crate::constants::Hand
42}
43
44#[derive(BinRead, BinWrite, Debug, Clone, Message)]
45#[message(ctos, flag = 4)]
46#[repr(C)]
47pub struct TpResult {
48 #[br(map = |v: CorePlayer| v.opponent())]
49 #[bw(map = |v: &CorePlayer| v.opponent())]
50 pub result: CorePlayer
51}
52
53#[derive(BinRead, BinWrite, Debug, Clone, Message)]
54#[message(ctos, flag = 16)]
55#[repr(C)]
56pub struct PlayerInfo {
57 pub name: FixedLengthString<20>
58}
59
60#[derive(BinRead, BinWrite, Debug, Clone, Message)]
61#[message(ctos, flag = 17)]
62#[repr(C)]
63pub struct CreateGame {
64 pub host_info: HostInfo,
65 pub name: FixedLengthString<20>,
66 pub pass: FixedLengthString<20>
67}
68
69#[derive(BinRead, BinWrite, Debug, Clone, Message)]
70#[message(ctos, flag = 18)]
71#[repr(C)]
72pub struct JoinGame {
73 #[brw(pad_after=2)]
74 pub version: u16,
75 pub gameid: u32,
76 pub pass: FixedLengthString<20>
77}
78
79#[derive(BinRead, BinWrite, Debug, Clone, Message)]
80#[message(ctos, flag = 19)]
81#[repr(C)]
82pub struct LeaveGame;
83
84#[derive(BinRead, BinWrite, Debug, Clone, Message)]
85#[message(ctos, flag = 20)]
86#[repr(C)]
87pub struct Surrender;
88
89#[derive(BinRead, BinWrite, Debug, Clone, Message)]
90#[message(ctos, flag = 21)]
91#[repr(C)]
92pub struct TimeConfirm;
93
94#[derive(BinRead, BinWrite, Debug, Clone, Message)]
95#[message(ctos, flag = 22)]
96#[repr(C)]
97pub struct Chat {
98 pub msg: U16String
99}
100
101impl From<String> for Chat {
102 fn from(value: String) -> Self {
103 Self { msg: value.into() }
104 }
105}
106
107impl<'s> From<&'s str> for Chat {
108 fn from(value: &'s str) -> Self {
109 Self { msg: value.into() }
110 }
111}
112
113#[derive(BinRead, BinWrite, Debug, Clone, Message)]
114#[message(ctos, flag = 32)]
115#[repr(C)]
116pub struct HsToDuelist;
117
118#[derive(BinRead, BinWrite, Debug, Clone, Message)]
119#[message(ctos, flag = 33)]
120#[repr(C)]
121pub struct HsToObserver;
122
123#[derive(BinRead, BinWrite, Debug, Clone, Message)]
124#[message(ctos, flag = 34)]
125#[repr(C)]
126pub struct HsReady;
127
128#[derive(BinRead, BinWrite, Debug, Clone, Message)]
129#[message(ctos, flag = 35)]
130#[repr(C)]
131pub struct HsNotReady;
132
133#[derive(BinRead, BinWrite, Debug, Clone, Message)]
134#[message(ctos, flag = 36)]
135#[repr(C)]
136pub struct HsKick {
137 pub pos: crate::constants::Netplayer
138}
139
140#[derive(BinRead, BinWrite, Debug, Clone, Message)]
141#[message(ctos, flag = 37)]
142#[repr(C)]
143pub struct HsStart;
144
145#[derive(BinRead, BinWrite, Debug, Clone, Message)]
146#[message(ctos, flag = 48)]
147#[repr(C)]
148pub struct RequestField;
149
150#[cfg(test)]
151mod test {
152 #[test]
153 fn print_sizes() {
154 macro_rules! print_size {
155 ($($msg:ident = $flag:literal),* $(,)?) => {
156 println!("=== CTOS ===");
157 $(
158 println!(" {:30}: {:>4} bytes", stringify!($msg), std::mem::size_of::<super::$msg>());
159 )*
160 println!(" {:30}: {:>4} bytes", "MessageType", std::mem::size_of::<super::MessageType>());
161 println!(" {:30}: {:>4} bytes", "Message", std::mem::size_of::<super::Message>());
162 };
163 }
164 every_client_to_server_flat_message!(print_size);
165 }
166}
167