newgrf.c
changeset 2491 15a117630a4f
parent 2490 0eac698c33cf
child 2506 eca87f30e05a
equal deleted inserted replaced
2490:0eac698c33cf 2491:15a117630a4f
  1402 		} else {
  1402 		} else {
  1403 			dg->default_group = _cur_grffile->spritegroups[groupid];
  1403 			dg->default_group = _cur_grffile->spritegroups[groupid];
  1404 		}
  1404 		}
  1405 		dg->default_group->ref_count++;
  1405 		dg->default_group->ref_count++;
  1406 
  1406 
       
  1407 		if (_cur_grffile->spritegroups[setid] != NULL)
       
  1408 			UnloadSpriteGroup(&_cur_grffile->spritegroups[setid]);
  1407 		_cur_grffile->spritegroups[setid] = group;
  1409 		_cur_grffile->spritegroups[setid] = group;
  1408 		group->ref_count++;
  1410 		group->ref_count++;
  1409 		return;
  1411 		return;
  1410 
  1412 
  1411 	} else if (numloaded == 0x80 || numloaded == 0x83) {
  1413 	} else if (numloaded == 0x80 || numloaded == 0x83) {
  1452 				rg->groups[i] = _cur_grffile->spritegroups[groupid];
  1454 				rg->groups[i] = _cur_grffile->spritegroups[groupid];
  1453 				rg->groups[i]->ref_count++;
  1455 				rg->groups[i]->ref_count++;
  1454 			}
  1456 			}
  1455 		}
  1457 		}
  1456 
  1458 
       
  1459 		if (_cur_grffile->spritegroups[setid] != NULL)
       
  1460 			UnloadSpriteGroup(&_cur_grffile->spritegroups[setid]);
  1457 		_cur_grffile->spritegroups[setid] = group;
  1461 		_cur_grffile->spritegroups[setid] = group;
  1458 		group->ref_count++;
  1462 		group->ref_count++;
  1459 		return;
  1463 		return;
  1460 	}
  1464 	}
  1461 
  1465 
  1517 		}
  1521 		}
  1518 		rg->loading[i]->ref_count++;
  1522 		rg->loading[i]->ref_count++;
  1519 		DEBUG(grf, 8) ("NewSpriteGroup: + rg->loading[%i] = %u (subset %u)", i, rg->loading[i]->g.result.result, spriteset_id);
  1523 		DEBUG(grf, 8) ("NewSpriteGroup: + rg->loading[%i] = %u (subset %u)", i, rg->loading[i]->g.result.result, spriteset_id);
  1520 	}
  1524 	}
  1521 
  1525 
       
  1526 	if (_cur_grffile->spritegroups[setid] != NULL)
       
  1527 		UnloadSpriteGroup(&_cur_grffile->spritegroups[setid]);
  1522 	_cur_grffile->spritegroups[setid] = group;
  1528 	_cur_grffile->spritegroups[setid] = group;
  1523 	group->ref_count++;
  1529 	group->ref_count++;
  1524 }
  1530 }
  1525 
  1531 
  1526 /* Action 0x03 */
  1532 /* Action 0x03 */
  2294 	                   | (1 << 0x17)  /* newstartyear */
  2300 	                   | (1 << 0x17)  /* newstartyear */
  2295 	                   | (_patches.wagon_speed_limits ? (1 << 0x1D) : 0); /* wagonspeedlimits */
  2301 	                   | (_patches.wagon_speed_limits ? (1 << 0x1D) : 0); /* wagonspeedlimits */
  2296 }
  2302 }
  2297 
  2303 
  2298 /**
  2304 /**
       
  2305  * Unload unused sprite groups from the specified GRF file.
       
  2306  * Called after loading each GRF file.
       
  2307  * @param file GRF file
       
  2308  */
       
  2309 static void ReleaseSpriteGroups(GRFFile *file)
       
  2310 {
       
  2311 	int i;
       
  2312 
       
  2313 	// Bail out if no spritegroups were defined.
       
  2314 	if (file->spritegroups == NULL)
       
  2315 		return;
       
  2316 
       
  2317 	DEBUG(grf, 6)("ReleaseSpriteGroups: Releasing for `%s'.", file->filename);
       
  2318 	for (i = 0; i < file->spritegroups_count; i++) {
       
  2319 		if (file->spritegroups[i] != NULL)
       
  2320 			UnloadSpriteGroup(&file->spritegroups[i]);
       
  2321 	}
       
  2322 	free(file->spritegroups);
       
  2323 	file->spritegroups = NULL;
       
  2324 	file->spritegroups_count = 0;
       
  2325 }
       
  2326 
       
  2327 /**
  2299  * Reset all NewGRF loaded data
  2328  * Reset all NewGRF loaded data
  2300  * TODO
  2329  * TODO
  2301  */
  2330  */
  2302 static void ResetNewGRFData(void)
  2331 static void ResetNewGRFData(void)
  2303 {
  2332 {
  2319 				free(_bridge[i].sprite_table[j]);
  2348 				free(_bridge[i].sprite_table[j]);
  2320 			free(_bridge[i].sprite_table);
  2349 			free(_bridge[i].sprite_table);
  2321 		}
  2350 		}
  2322 	}
  2351 	}
  2323 	memcpy(&_bridge, &orig_bridge, sizeof(_bridge));
  2352 	memcpy(&_bridge, &orig_bridge, sizeof(_bridge));
       
  2353 
       
  2354 	// Unload sprite group data
       
  2355 	UnloadWagonOverrides();
       
  2356 	UnloadCustomEngineSprites();
  2324 }
  2357 }
  2325 
  2358 
  2326 static void InitNewGRFFile(const char* filename, int sprite_offset)
  2359 static void InitNewGRFFile(const char* filename, int sprite_offset)
  2327 {
  2360 {
  2328 	GRFFile *newfile;
  2361 	GRFFile *newfile;
  2491 			}
  2524 			}
  2492 		}
  2525 		}
  2493 
  2526 
  2494 		if (_skip_sprites > 0) _skip_sprites--;
  2527 		if (_skip_sprites > 0) _skip_sprites--;
  2495 	}
  2528 	}
       
  2529 
       
  2530 	// Release our sprite group references.
       
  2531 	// Any groups that are referenced elsewhere will be cleaned up later.
       
  2532 	// This removes groups that aren't used. (Perhaps skipped?)
       
  2533 	ReleaseSpriteGroups(_cur_grffile);
  2496 }
  2534 }
  2497 
  2535 
  2498 
  2536 
  2499 void LoadNewGRF(uint load_index, uint file_index)
  2537 void LoadNewGRF(uint load_index, uint file_index)
  2500 {
  2538 {