1223 else |
1223 else |
1224 value &= ~0x8000; |
1224 value &= ~0x8000; |
1225 |
1225 |
1226 group->g.callback.result = value; |
1226 group->g.callback.result = value; |
1227 |
1227 |
|
1228 return group; |
|
1229 } |
|
1230 |
|
1231 /** |
|
1232 * Creates a spritegroup representing a sprite number result. |
|
1233 * @param value The sprite number. |
|
1234 * @param sprites The number of sprites per set. |
|
1235 * @return A spritegroup representing the sprite number result. |
|
1236 */ |
|
1237 SpriteGroup *NewResultSpriteGroup(uint16 value, byte sprites) |
|
1238 { |
|
1239 SpriteGroup *group = calloc(1, sizeof(*group)); |
|
1240 group->type = SGT_RESULT; |
|
1241 group->g.result.result = value; |
|
1242 group->g.result.sprites = sprites; |
1228 return group; |
1243 return group; |
1229 } |
1244 } |
1230 |
1245 |
1231 /* Action 0x01 */ |
1246 /* Action 0x01 */ |
1232 static void NewSpriteSet(byte *buf, int len) |
1247 static void NewSpriteSet(byte *buf, int len) |
1419 |
1434 |
1420 rg->groups = calloc(rg->num_groups, sizeof(*rg->groups)); |
1435 rg->groups = calloc(rg->num_groups, sizeof(*rg->groups)); |
1421 for (i = 0; i < rg->num_groups; i++) { |
1436 for (i = 0; i < rg->num_groups; i++) { |
1422 uint16 groupid = grf_load_word(&buf); |
1437 uint16 groupid = grf_load_word(&buf); |
1423 |
1438 |
1424 if (groupid & 0x8000 || groupid >= _cur_grffile->spritegroups_count) { |
1439 if (HASBIT(groupid, 15)) { |
|
1440 rg->groups[i] = NewCallBackResultSpriteGroup(groupid); |
|
1441 } else if (groupid >= _cur_grffile->spritegroups_count) { |
1425 /* This doesn't exist for us. */ |
1442 /* This doesn't exist for us. */ |
1426 i--; |
1443 i--; |
1427 rg->num_groups--; |
1444 rg->num_groups--; |
1428 continue; |
1445 continue; |
1429 } |
1446 } else { |
1430 /* XXX: If multiple surreal sets attach a surreal |
1447 /* XXX: If multiple surreal sets attach a surreal |
1431 * set this way, we are in trouble. */ |
1448 * set this way, we are in trouble. */ |
1432 rg->groups[i] = _cur_grffile->spritegroups[groupid]; |
1449 rg->groups[i] = _cur_grffile->spritegroups[groupid]; |
|
1450 } |
1433 } |
1451 } |
1434 |
1452 |
1435 _cur_grffile->spritegroups[setid] = group; |
1453 _cur_grffile->spritegroups[setid] = group; |
1436 return; |
1454 return; |
1437 } |
1455 } |
1474 _cur_grffile->spriteset_start - _cur_grffile->sprite_offset, |
1492 _cur_grffile->spriteset_start - _cur_grffile->sprite_offset, |
1475 _cur_grffile->spriteset_start + (_cur_grffile->spriteset_numents * (numloaded + numloading)) - _cur_grffile->sprite_offset); |
1493 _cur_grffile->spriteset_start + (_cur_grffile->spriteset_numents * (numloaded + numloading)) - _cur_grffile->sprite_offset); |
1476 |
1494 |
1477 for (i = 0; i < numloaded; i++) { |
1495 for (i = 0; i < numloaded; i++) { |
1478 uint16 spriteset_id = grf_load_word(&loaded_ptr); |
1496 uint16 spriteset_id = grf_load_word(&loaded_ptr); |
1479 rg->loaded[i] = _cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents; |
1497 if (HASBIT(spriteset_id, 15)) { |
1480 DEBUG(grf, 8) ("NewSpriteGroup: + rg->loaded[%i] = %u (subset %u)", i, rg->loaded[i], spriteset_id); |
1498 rg->loaded[i] = NewCallBackResultSpriteGroup(spriteset_id); |
|
1499 } else { |
|
1500 rg->loaded[i] = NewResultSpriteGroup(_cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents, rg->sprites_per_set); |
|
1501 } |
|
1502 DEBUG(grf, 8) ("NewSpriteGroup: + rg->loaded[%i] = %u (subset %u)", i, rg->loaded[i]->g.result.result, spriteset_id); |
1481 } |
1503 } |
1482 |
1504 |
1483 for (i = 0; i < numloading; i++) { |
1505 for (i = 0; i < numloading; i++) { |
1484 uint16 spriteset_id = grf_load_word(&loading_ptr); |
1506 uint16 spriteset_id = grf_load_word(&loading_ptr); |
1485 rg->loading[i] = _cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents; |
1507 if (HASBIT(spriteset_id, 15)) { |
1486 DEBUG(grf, 8) ("NewSpriteGroup: + rg->loading[%i] = %u (subset %u)", i, rg->loading[i], spriteset_id); |
1508 rg->loading[i] = NewCallBackResultSpriteGroup(spriteset_id); |
|
1509 } else { |
|
1510 rg->loading[i] = NewResultSpriteGroup(_cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents, rg->sprites_per_set); |
|
1511 } |
|
1512 DEBUG(grf, 8) ("NewSpriteGroup: + rg->loading[%i] = %u (subset %u)", i, rg->loading[i]->g.result.result, spriteset_id); |
1487 } |
1513 } |
1488 |
1514 |
1489 _cur_grffile->spritegroups[setid] = group; |
1515 _cur_grffile->spritegroups[setid] = group; |
1490 } |
1516 } |
1491 |
1517 |