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); |