42 int spriteset_start; |
42 int spriteset_start; |
43 int spriteset_numsets; |
43 int spriteset_numsets; |
44 int spriteset_numents; |
44 int spriteset_numents; |
45 int spriteset_feature; |
45 int spriteset_feature; |
46 |
46 |
47 int spritesset_count; |
47 int spritegroups_count; |
48 struct SpriteGroup *spritesset; |
48 struct SpriteGroup *spritegroups; |
49 |
49 |
50 uint32 statinfo_classid[256]; |
50 uint32 statinfo_classid[256]; |
51 byte statinfo_tiles[256]; |
51 byte statinfo_tiles[256]; |
52 DrawTileSprites statinfo_renderdata[256][8]; |
52 DrawTileSprites statinfo_renderdata[256][8]; |
53 }; |
53 }; |
1061 |
1061 |
1062 if (numloaded == 0x81) { |
1062 if (numloaded == 0x81) { |
1063 /* XXX: This just goes for the default superset for now, |
1063 /* XXX: This just goes for the default superset for now, |
1064 * straight and safe. --pasky */ |
1064 * straight and safe. --pasky */ |
1065 uint8 var = buf[4]; |
1065 uint8 var = buf[4]; |
1066 //uint8 shiftnum = buf[5]; |
1066 uint8 shiftnum = buf[5]; |
1067 //uint8 andmask = buf[6]; |
1067 uint8 andmask = buf[6]; |
1068 uint8 nvar = buf[7]; |
1068 uint8 nvar = buf[7]; |
1069 //uint32 val; |
1069 //uint32 val; |
1070 uint16 def; |
1070 uint16 def; |
1071 |
1071 |
1072 grfmsg(GMS_WARN, "NewSpriteGroup(0x81): Unsupported variable %x. Using default cid.", var); |
1072 grfmsg(GMS_WARN, "NewSpriteGroup(0x81): Unsupported variable %x. Using default cid.", var); |
1073 |
1073 |
1074 //val = (0xff << shiftnum) & andmask; |
1074 //val = (0xff << shiftnum) & andmask; |
1075 |
1075 |
1076 if (setid >= _cur_grffile->spritesset_count) { |
1076 if (setid >= _cur_grffile->spritegroups_count) { |
1077 _cur_grffile->spritesset_count = setid + 1; |
1077 _cur_grffile->spritegroups_count = setid + 1; |
1078 _cur_grffile->spritesset = realloc(_cur_grffile->spritesset, _cur_grffile->spritesset_count * sizeof(struct SpriteGroup)); |
1078 _cur_grffile->spritegroups = realloc(_cur_grffile->spritegroups, _cur_grffile->spritegroups_count * sizeof(struct SpriteGroup)); |
1079 } |
1079 } |
1080 buf += 8 + nvar * 4; |
1080 buf += 8 + nvar * 4; |
1081 def = grf_load_word(&buf); |
1081 def = grf_load_word(&buf); |
1082 _cur_grffile->spritesset[setid] = _cur_grffile->spritesset[def]; |
1082 _cur_grffile->spritegroups[setid] = _cur_grffile->spritegroups[def]; |
1083 return; |
1083 return; |
1084 |
1084 |
1085 } else if (numloaded & 0x80) { |
1085 } else if (numloaded & 0x80) { |
1086 grfmsg(GMS_WARN, "NewSpriteGroup(0x%x): Unsupported special group.", numloaded); |
1086 grfmsg(GMS_WARN, "NewSpriteGroup(0x%x): Unsupported special group.", numloaded); |
1087 return; |
1087 return; |
1110 if (numloading > 16) { |
1110 if (numloading > 16) { |
1111 grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid); |
1111 grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid); |
1112 numloading = 16; |
1112 numloading = 16; |
1113 } |
1113 } |
1114 |
1114 |
1115 if (setid >= _cur_grffile->spritesset_count) { |
1115 if (setid >= _cur_grffile->spritegroups_count) { |
1116 _cur_grffile->spritesset_count = setid + 1; |
1116 _cur_grffile->spritegroups_count = setid + 1; |
1117 _cur_grffile->spritesset = realloc(_cur_grffile->spritesset, _cur_grffile->spritesset_count * sizeof(struct SpriteGroup)); |
1117 _cur_grffile->spritegroups = realloc(_cur_grffile->spritegroups, _cur_grffile->spritegroups_count * sizeof(struct SpriteGroup)); |
1118 } |
1118 } |
1119 group = &_cur_grffile->spritesset[setid]; |
1119 group = &_cur_grffile->spritegroups[setid]; |
1120 memset(group, 0, sizeof(struct SpriteGroup)); |
1120 memset(group, 0, sizeof(struct SpriteGroup)); |
1121 group->sprites_per_set = _cur_grffile->spriteset_numents; |
1121 group->sprites_per_set = _cur_grffile->spriteset_numents; |
1122 group->loaded_count = numloaded; |
1122 group->loaded_count = numloaded; |
1123 group->loading_count = numloading; |
1123 group->loading_count = numloading; |
1124 |
1124 |
1195 |
1195 |
1196 for (i = 0; i < idcount; i++) { |
1196 for (i = 0; i < idcount; i++) { |
1197 uint8 stid = buf[3 + i]; |
1197 uint8 stid = buf[3 + i]; |
1198 int j; |
1198 int j; |
1199 |
1199 |
1200 if (groupid >= _cur_grffile->spritesset_count) { |
1200 if (groupid >= _cur_grffile->spritegroups_count) { |
1201 grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Spriteset %x out of range %x, skipping.", |
1201 grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Spriteset %x out of range %x, skipping.", |
1202 groupid, _cur_grffile->spritesset_count); |
1202 groupid, _cur_grffile->spritegroups_count); |
1203 return; |
1203 return; |
1204 } |
1204 } |
1205 |
1205 |
1206 // relocate sprite indexes based on spriteset locations |
1206 // relocate sprite indexes based on spriteset locations |
1207 for (j = 0; j < _cur_grffile->statinfo_tiles[stid]; j++) { |
1207 for (j = 0; j < _cur_grffile->statinfo_tiles[stid]; j++) { |
1208 DrawTileSeqStruct *seq; |
1208 DrawTileSeqStruct *seq; |
1209 |
1209 |
1210 foreach_draw_tile_seq(seq, (DrawTileSeqStruct*) _cur_grffile->statinfo_renderdata[stid][j].seq) { |
1210 foreach_draw_tile_seq(seq, (DrawTileSeqStruct*) _cur_grffile->statinfo_renderdata[stid][j].seq) { |
1211 seq->image += _cur_grffile->spritesset[groupid].loading[0]; |
1211 seq->image += _cur_grffile->spritegroups[groupid].loading[0]; |
1212 } |
1212 } |
1213 } |
1213 } |
1214 /* FIXME: This means several GRF files defining new stations |
1214 /* FIXME: This means several GRF files defining new stations |
1215 * will override each other, but the stid should be GRF-specific |
1215 * will override each other, but the stid should be GRF-specific |
1216 * instead! --pasky */ |
1216 * instead! --pasky */ |
1231 |
1231 |
1232 // FIXME: Tropicset contains things like: |
1232 // FIXME: Tropicset contains things like: |
1233 // 03 00 01 19 01 00 00 00 00 - this is missing one 00 at the end, |
1233 // 03 00 01 19 01 00 00 00 00 - this is missing one 00 at the end, |
1234 // what should we exactly do with that? --pasky |
1234 // what should we exactly do with that? --pasky |
1235 |
1235 |
1236 if (!_cur_grffile->spriteset_start || !_cur_grffile->spritesset) { |
1236 if (!_cur_grffile->spriteset_start || !_cur_grffile->spritegroups) { |
1237 grfmsg(GMS_WARN, "VehicleMapSpriteGroup: No sprite set to work on! Skipping."); |
1237 grfmsg(GMS_WARN, "VehicleMapSpriteGroup: No sprite set to work on! Skipping."); |
1238 return; |
1238 return; |
1239 } |
1239 } |
1240 |
1240 |
1241 if (!wagover && last_engines_count != idcount) { |
1241 if (!wagover && last_engines_count != idcount) { |
1270 uint8 ctype = grf_load_byte(&bp); |
1270 uint8 ctype = grf_load_byte(&bp); |
1271 uint16 groupid = grf_load_word(&bp); |
1271 uint16 groupid = grf_load_word(&bp); |
1272 |
1272 |
1273 DEBUG(grf, 8) ("VehicleMapSpriteGroup: * [%d] Cargo type %x, group id %x", c, ctype, groupid); |
1273 DEBUG(grf, 8) ("VehicleMapSpriteGroup: * [%d] Cargo type %x, group id %x", c, ctype, groupid); |
1274 |
1274 |
1275 if (groupid >= _cur_grffile->spritesset_count) { |
1275 if (groupid >= _cur_grffile->spritegroups_count) { |
1276 grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Spriteset %x out of range %x, skipping.", groupid, _cur_grffile->spritesset_count); |
1276 grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Spriteset %x out of range %x, skipping.", groupid, _cur_grffile->spritegroups_count); |
1277 return; |
1277 return; |
1278 } |
1278 } |
1279 |
1279 |
1280 if (ctype == 0xFF) |
1280 if (ctype == 0xFF) |
1281 ctype = CID_PURCHASE; |
1281 ctype = CID_PURCHASE; |
1282 |
1282 |
1283 if (wagover) { |
1283 if (wagover) { |
1284 // TODO: No multiple cargo types per vehicle yet. --pasky |
1284 // TODO: No multiple cargo types per vehicle yet. --pasky |
1285 SetWagonOverrideSprites(engine, &_cur_grffile->spritesset[groupid], last_engines, last_engines_count); |
1285 SetWagonOverrideSprites(engine, &_cur_grffile->spritegroups[groupid], last_engines, last_engines_count); |
1286 } else { |
1286 } else { |
1287 SetCustomEngineSprites(engine, ctype, &_cur_grffile->spritesset[groupid]); |
1287 SetCustomEngineSprites(engine, ctype, &_cur_grffile->spritegroups[groupid]); |
1288 last_engines[i] = engine; |
1288 last_engines[i] = engine; |
1289 } |
1289 } |
1290 } |
1290 } |
1291 } |
1291 } |
1292 |
1292 |
1298 |
1298 |
1299 for (i = 0; i < idcount; i++) { |
1299 for (i = 0; i < idcount; i++) { |
1300 uint8 engine = buf[3 + i] + _vehshifts[feature]; |
1300 uint8 engine = buf[3 + i] + _vehshifts[feature]; |
1301 |
1301 |
1302 // Don't tell me you don't love duplicated code! |
1302 // Don't tell me you don't love duplicated code! |
1303 if (groupid >= _cur_grffile->spritesset_count) { |
1303 if (groupid >= _cur_grffile->spritegroups_count) { |
1304 grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Spriteset %x out of range %x, skipping.", groupid, _cur_grffile->spritesset_count); |
1304 grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Spriteset %x out of range %x, skipping.", groupid, _cur_grffile->spritegroups_count); |
1305 return; |
1305 return; |
1306 } |
1306 } |
1307 |
1307 |
1308 if (wagover) { |
1308 if (wagover) { |
1309 // TODO: No multiple cargo types per vehicle yet. --pasky |
1309 // TODO: No multiple cargo types per vehicle yet. --pasky |
1310 SetWagonOverrideSprites(engine, &_cur_grffile->spritesset[groupid], last_engines, last_engines_count); |
1310 SetWagonOverrideSprites(engine, &_cur_grffile->spritegroups[groupid], last_engines, last_engines_count); |
1311 } else { |
1311 } else { |
1312 SetCustomEngineSprites(engine, CID_DEFAULT, &_cur_grffile->spritesset[groupid]); |
1312 SetCustomEngineSprites(engine, CID_DEFAULT, &_cur_grffile->spritegroups[groupid]); |
1313 last_engines[i] = engine; |
1313 last_engines[i] = engine; |
1314 } |
1314 } |
1315 } |
1315 } |
1316 } |
1316 } |
1317 } |
1317 } |