newgrf.c
changeset 2489 6fbb72b64e07
parent 2488 1e98c71e5f6a
child 2490 0eac698c33cf
equal deleted inserted replaced
2488:1e98c71e5f6a 2489:6fbb72b64e07
  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