grfspecial.c
changeset 397 fc532e982139
parent 396 f7dc2d2144b6
child 398 20f8a2faf809
equal deleted inserted replaced
396:f7dc2d2144b6 397:fc532e982139
    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 }