@@ -63,6 +63,8 @@ struct StartupSyncPacket {
6363 int32_t input_lag_turns ;
6464 TbBigChecksum map_checksum ;
6565 uint32_t sprite_zip_checksum ;
66+ uint8_t sprite_zip_entry_count ;
67+ struct SpriteZipEntry sprite_zip_entries [SPRITE_ZIP_ENTRY_COUNT ];
6668 uint16_t initial_tendencies ;
6769 uint32_t isometric_view_zoom_level ;
6870 uint32_t frontview_zoom_level ;
@@ -157,10 +159,54 @@ static TbBool verify_map_checksums(const struct StartupSyncPacket startup_sync_p
157159
158160static void verify_startup_sprite_zip_checksums (const struct StartupSyncPacket startup_sync_packets [MAX_NET_USERS ])
159161{
162+ int host_player_id = get_host_player_id ();
163+ const struct StartupSyncPacket * host_sync = & startup_sync_packets [host_player_id ];
160164 for (int i = 0 ; i < MAX_NET_USERS ; i ++ ) {
161- if (net_player_info [i ].network_user_active && startup_sync_packets [i ].sprite_zip_checksum != sprite_zip_combined_checksum ) {
162- message_add (MsgType_Player , 0 , get_string (GUIStr_NetVerifyFxdataSame ));
163- message_add_fmt (MsgType_Player , 0 , get_string (GUIStr_NetCustomSpriteMismatch ), network_player_name (i ));
165+ if (!net_player_info [i ].network_user_active || i == host_player_id ) {
166+ continue ;
167+ }
168+ const struct StartupSyncPacket * client_sync = & startup_sync_packets [i ];
169+ if (client_sync -> sprite_zip_checksum == host_sync -> sprite_zip_checksum ) {
170+ continue ;
171+ }
172+ TbBool reported = false;
173+ for (int pass = 0 ; pass < 2 ; pass ++ ) {
174+ const struct StartupSyncPacket * source_sync = host_sync ;
175+ const struct StartupSyncPacket * target_sync = client_sync ;
176+ int target_player_id = i ;
177+ if (pass == 1 ) {
178+ source_sync = client_sync ;
179+ target_sync = host_sync ;
180+ target_player_id = host_player_id ;
181+ }
182+ for (int source_idx = 0 ; source_idx < source_sync -> sprite_zip_entry_count ; source_idx ++ ) {
183+ const struct SpriteZipEntry * source_entry = & source_sync -> sprite_zip_entries [source_idx ];
184+ TbBool found = false;
185+ for (int target_idx = 0 ; target_idx < target_sync -> sprite_zip_entry_count ; target_idx ++ ) {
186+ const struct SpriteZipEntry * target_entry = & target_sync -> sprite_zip_entries [target_idx ];
187+ if (strcasecmp (source_entry -> filename , target_entry -> filename ) != 0 ) {
188+ continue ;
189+ }
190+ found = true;
191+ if (pass == 0 && source_entry -> checksum != target_entry -> checksum ) {
192+ WARNLOG ("Custom sprite zip differs for %s: %s" , network_player_name (host_player_id ), source_entry -> filename );
193+ message_add_fmt (MsgType_Blank , 0 , "/fxdata/%.30s differs for %.12s" , source_entry -> filename , network_player_name (host_player_id ));
194+ WARNLOG ("Custom sprite zip differs for %s: %s" , network_player_name (i ), source_entry -> filename );
195+ message_add_fmt (MsgType_Blank , 0 , "/fxdata/%.30s differs for %.12s" , source_entry -> filename , network_player_name (i ));
196+ reported = true;
197+ }
198+ break ;
199+ }
200+ if (!found ) {
201+ WARNLOG ("Custom sprite zip missing for %s: %s" , network_player_name (target_player_id ), source_entry -> filename );
202+ message_add_fmt (MsgType_Blank , 0 , "/fxdata/%.30s missing for %.12s" , source_entry -> filename , network_player_name (target_player_id ));
203+ reported = true;
204+ }
205+ }
206+ }
207+ if (!reported ) {
208+ WARNLOG ("Custom sprite zip order or overflow mismatch for %s" , network_player_name (i ));
209+ message_add_fmt (MsgType_Blank , 0 , "/fxdata/ zip order error" );
164210 }
165211 }
166212}
@@ -177,6 +223,8 @@ static void build_local_startup_sync(void)
177223 s_local_startup_sync .input_lag_turns = game .input_lag_turns ;
178224 s_local_startup_sync .map_checksum = calculate_network_startup_map_checksum ();
179225 s_local_startup_sync .sprite_zip_checksum = sprite_zip_combined_checksum ;
226+ s_local_startup_sync .sprite_zip_entry_count = sprite_zip_entry_count ;
227+ memcpy (s_local_startup_sync .sprite_zip_entries , sprite_zip_entries , sizeof (s_local_startup_sync .sprite_zip_entries ));
180228 uint16_t initial_tendencies = 0 ;
181229 if (IMPRISON_BUTTON_DEFAULT ) {initial_tendencies |= CrTend_Imprison ;}
182230 if (FLEE_BUTTON_DEFAULT ) {initial_tendencies |= CrTend_Flee ;}
0 commit comments