src/newgrf.cpp
branchNewGRF_ports
changeset 6835 0364f49694ea
parent 6817 ef4c1d63b69f
child 6853 b3b8bb6c0a48
equal deleted inserted replaced
6834:970db24bf26c 6835:0364f49694ea
  2196 				fsmportspec->callbackmask = grf_load_byte(&buf);
  2196 				fsmportspec->callbackmask = grf_load_byte(&buf);
  2197 				break;
  2197 				break;
  2198 
  2198 
  2199 			case 0x0E: // Define custom layout
  2199 			case 0x0E: // Define custom layout
  2200 				fsmportspec->copied_layouts = false;
  2200 				fsmportspec->copied_layouts = false;
  2201 				{
  2201 				fsmportspec->numlayouts = grf_load_byte(&buf);
  2202 					fsmportspec->numlayouts = grf_load_byte(&buf);
  2202 				fsmportspec->size_x = ReallocT(fsmportspec->size_x, fsmportspec->numlayouts);
  2203 					fsmportspec->size_x = ReallocT(fsmportspec->size_x, fsmportspec->numlayouts);
  2203 				memset(fsmportspec->size_x, 0, fsmportspec->numlayouts);
  2204 					memset(fsmportspec->size_x, 0, fsmportspec->numlayouts);
  2204 				fsmportspec->size_y = ReallocT(fsmportspec->size_y, fsmportspec->numlayouts);
  2205 					fsmportspec->size_y = ReallocT(fsmportspec->size_y, fsmportspec->numlayouts);
  2205 				memset(fsmportspec->size_y, 0, fsmportspec->numlayouts);
  2206 					memset(fsmportspec->size_y, 0, fsmportspec->numlayouts);
  2206 				fsmportspec->layouts = ReallocT(fsmportspec->layouts, fsmportspec->numlayouts);
  2207 					fsmportspec->layouts = ReallocT(fsmportspec->layouts, fsmportspec->numlayouts);
  2207 				for (uint set = 0; set < fsmportspec->numlayouts; set++) {
  2208 					for (uint set = 0; set < fsmportspec->numlayouts; set++) {
  2208 					byte orientation = grf_load_byte(&buf);
  2209 						byte orientation = grf_load_byte(&buf);
  2209 					byte x = grf_load_byte(&buf);
  2210 						byte x = grf_load_byte(&buf);
  2210 					byte y = grf_load_byte(&buf);
  2211 						byte y = grf_load_byte(&buf);
  2211 					FSMportsLayout layout;
  2212 						FSMportsLayout layout;
  2212 
  2213 
  2213 					if (x == 0 || y == 0) break;
  2214 						if (x == 0 || y == 0) break;
  2214 
  2215 
  2215 					fsmportspec->size_x[set] = x;
  2216 						fsmportspec->size_x[set] = x;
  2216 					fsmportspec->size_y[set] = y;
  2217 						fsmportspec->size_y[set] = y;
  2217 
  2218 
  2218 					layout = MallocT<byte>((x * y) + 2);
  2219 						layout = MallocT<byte>((x * y) + 2);
  2219 					layout[0] = orientation;
  2220 						layout[0] = orientation;
  2220 					layout[1] = grf_load_byte(&buf); //minipic sprite ID
  2221 						layout[1] = grf_load_byte(&buf); //minipic sprite ID
  2221 					for (byte l = 2; l < (x * y) + 2; l++) {
  2222 						for (byte l = 2; l < (x * y) + 2; l++) {
  2222 						layout[l] = grf_load_byte(&buf);
  2223 							layout[l] = grf_load_byte(&buf);
       
  2224 						}
       
  2225 
       
  2226 						fsmportspec->layouts[set] = layout;
       
  2227 					}
  2223 					}
       
  2224 
       
  2225 					fsmportspec->layouts[set] = layout;
  2228 				}
  2226 				}
  2229 				break;
  2227 				break;
  2230 
  2228 
  2231 			case 0x0F: { // Copy custom layout
  2229 			case 0x0F: { // Copy custom layout
  2232 				byte srcid = grf_load_byte(&buf);
  2230 				byte srcid = grf_load_byte(&buf);
  2270 				fsmportspec->portFSM->nofelements = grf_load_byte(&buf);
  2268 				fsmportspec->portFSM->nofelements = grf_load_byte(&buf);
  2271 				fsmportspec->portFSM->layout = MallocT<AirportFTA>(fsmportspec->portFSM->nofelements);
  2269 				fsmportspec->portFSM->layout = MallocT<AirportFTA>(fsmportspec->portFSM->nofelements);
  2272 				fsmportspec->portFSM->moving_data = MallocT<AirportMovingData>(fsmportspec->portFSM->nofelements);
  2270 				fsmportspec->portFSM->moving_data = MallocT<AirportMovingData>(fsmportspec->portFSM->nofelements);
  2273 				fsmportspec->portFSM->size_x = fsmportspec->size_x[0];
  2271 				fsmportspec->portFSM->size_x = fsmportspec->size_x[0];
  2274 				fsmportspec->portFSM->size_y = fsmportspec->size_y[0];
  2272 				fsmportspec->portFSM->size_y = fsmportspec->size_y[0];
  2275 				for (byte element = 0; element < fsmportspec->portFSM->nofelements; element++)
  2273 				for (byte element = 0; element < fsmportspec->portFSM->nofelements; element++) {
  2276 				{
       
  2277 					AirportMovingData md;
  2274 					AirportMovingData md;
  2278 					md.x = grf_load_word(&buf);
  2275 					md.x = grf_load_word(&buf);
  2279 					md.y = grf_load_word(&buf);
  2276 					md.y = grf_load_word(&buf);
  2280 					md.z = grf_load_word(&buf);
  2277 					md.z = grf_load_word(&buf);
  2281 					md.state = grf_load_byte(&buf);
  2278 					md.state = grf_load_byte(&buf);
  2314 						current->next = newNode;
  2311 						current->next = newNode;
  2315 						current = current->next;
  2312 						current = current->next;
  2316 					}
  2313 					}
  2317 					current->next = NULL;
  2314 					current->next = NULL;
  2318 				}
  2315 				}
  2319 				ret = true;
       
  2320 				break;
  2316 				break;
  2321 
  2317 
  2322 			case 0x1C: // Entry points
  2318 			case 0x1C: // Entry points
  2323 				fsmportspec->portFSM->entry_points = MallocT<byte>(4);
  2319 				fsmportspec->portFSM->entry_points = MallocT<byte>(4);
  2324 				//TODO: store entry points
  2320 				//TODO: store entry points
  2325 				for (uint entry = 0; entry < 4; entry++)
  2321 				for (uint entry = 0; entry < 4; entry++) {
  2326 				{
       
  2327 					fsmportspec->portFSM->entry_points[entry] = grf_load_byte(&buf);
  2322 					fsmportspec->portFSM->entry_points[entry] = grf_load_byte(&buf);
  2328 				}
  2323 				}
  2329 				ret = true;
       
  2330 				break;
  2324 				break;
  2331 
  2325 
  2332 			case 0x1D: // Hangar locations
  2326 			case 0x1D: // Hangar locations
  2333 				fsmportspec->portFSM->nof_depots = grf_load_byte(&buf);
  2327 				fsmportspec->portFSM->nof_depots = grf_load_byte(&buf);
  2334 				fsmportspec->portFSM->airport_depots = MallocT<TileIndexDiffC>(fsmportspec->portFSM->nof_depots);
  2328 				fsmportspec->portFSM->airport_depots = MallocT<TileIndexDiffC>(fsmportspec->portFSM->nof_depots);
  2335 				for (uint depot = 0; depot < fsmportspec->portFSM->nof_depots; depot++)
  2329 				for (uint depot = 0; depot < fsmportspec->portFSM->nof_depots; depot++) {
  2336 				{
       
  2337 					TileIndexDiffC depot_tile;
  2330 					TileIndexDiffC depot_tile;
  2338 					depot_tile.x = grf_load_byte(&buf);
  2331 					depot_tile.x = grf_load_byte(&buf);
  2339 					depot_tile.y = grf_load_byte(&buf);
  2332 					depot_tile.y = grf_load_byte(&buf);
  2340 					grf_load_byte(&buf);  //TODO: depot number. for the moment discard. will be used to allow multi-tile depots
  2333 					grf_load_byte(&buf);  //TODO: depot number. for the moment discard. will be used to allow multi-tile depots
  2341 					fsmportspec->portFSM->airport_depots[depot] = depot_tile;
  2334 					fsmportspec->portFSM->airport_depots[depot] = depot_tile;
  2342 				}
  2335 				}
  2343 				ret = true;
       
  2344 				break;
  2336 				break;
  2345 
  2337 
  2346 			case 0x1E: // Terminal groups
  2338 			case 0x1E: // Terminal groups
  2347 				{
  2339 				{
  2348 					uint num_termgroups = grf_load_byte(&buf);
  2340 					uint num_termgroups = grf_load_byte(&buf);
  2349 					fsmportspec->portFSM->terminals = MallocT<byte>(num_termgroups + 1);
  2341 					fsmportspec->portFSM->terminals = MallocT<byte>(num_termgroups + 1);
  2350 					fsmportspec->portFSM->terminals[0] = num_termgroups;
  2342 					fsmportspec->portFSM->terminals[0] = num_termgroups;
  2351 					for (uint terms = 0; terms < num_termgroups; terms++)
  2343 					for (uint terms = 0; terms < num_termgroups; terms++) {
  2352 					{
       
  2353 						fsmportspec->portFSM->terminals[terms + 1] = grf_load_byte(&buf);
  2344 						fsmportspec->portFSM->terminals[terms + 1] = grf_load_byte(&buf);
  2354 					}
  2345 					}
  2355 					ret = true;
       
  2356 				}
  2346 				}
  2357 				break;
  2347 				break;
  2358 
  2348 
  2359 			case 0x1F: // Helipad groups
  2349 			case 0x1F: // Helipad groups
  2360 				{
  2350 				{
  2361 					uint num_helipads = grf_load_byte(&buf);
  2351 					uint num_helipads = grf_load_byte(&buf);
  2362 					fsmportspec->portFSM->helipads = MallocT<byte>(num_helipads + 1);
  2352 					fsmportspec->portFSM->helipads = MallocT<byte>(num_helipads + 1);
  2363 					fsmportspec->portFSM->helipads[0] = num_helipads;
  2353 					fsmportspec->portFSM->helipads[0] = num_helipads;
  2364 					for (uint helipads = 0; helipads < num_helipads; helipads++)
  2354 					for (uint helipads = 0; helipads < num_helipads; helipads++) {
  2365 					{
       
  2366 						fsmportspec->portFSM->helipads[helipads + 1] = grf_load_byte(&buf);
  2355 						fsmportspec->portFSM->helipads[helipads + 1] = grf_load_byte(&buf);
  2367 					}
  2356 					}
  2368 					ret = true;
       
  2369 				}
  2357 				}
  2370 				break;
  2358 				break;
  2371 
  2359 
  2372 			case 0x20: // Port Subtype
  2360 			case 0x20: // Port Subtype
  2373 				fsmportspec->portFSM->flags = (AirportFTAClass::Flags)grf_load_byte(&buf);
  2361 				fsmportspec->portFSM->flags = (AirportFTAClass::Flags)grf_load_byte(&buf);
  2374 				ret = true;
       
  2375 				break;
  2362 				break;
  2376 
  2363 
  2377 			case 0x22: // Catchment Area
  2364 			case 0x22: // Catchment Area
  2378 				fsmportspec->portFSM->catchment = grf_load_byte(&buf);
  2365 				fsmportspec->portFSM->catchment = grf_load_byte(&buf);
  2379 				ret = true;
       
  2380 				break;
  2366 				break;
  2381 
  2367 
  2382 			case 0x23: // Define placement layout mask
  2368 			case 0x23: // Define placement layout mask
  2383 				{
  2369 				{
  2384 					byte numlayouts = grf_load_byte(&buf);
  2370 					byte numlayouts = grf_load_byte(&buf);