summaryrefslogtreecommitdiff
path: root/newgrf.c
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2005-11-12 00:19:34 +0000
committerpeter1138 <peter1138@openttd.org>2005-11-12 00:19:34 +0000
commit12009af1c5fd83a24451155a283fe97926568be8 (patch)
treee5f727d749b6f788bedbdaeef17fab347dbfefbb /newgrf.c
parentce9f2fe82364224d8081f5a5ac43e19152e33500 (diff)
downloadopenttd-12009af1c5fd83a24451155a283fe97926568be8.tar.xz
(svn r3167) - NewGRF: Start moving custom station code to separate files.
Rewrite handling of station classes. Allow for more than 8 station tile layouts. Start of code to unload custom stations.
Diffstat (limited to 'newgrf.c')
-rw-r--r--newgrf.c73
1 files changed, 46 insertions, 27 deletions
diff --git a/newgrf.c b/newgrf.c
index f66cec1f5..0d0ed95cd 100644
--- a/newgrf.c
+++ b/newgrf.c
@@ -800,22 +800,7 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
classid |= *(buf++) << 8;
classid |= *(buf++);
- switch (classid) {
- case 'DFLT':
- stat->sclass = STAT_CLASS_DFLT;
- break;
- case 'WAYP':
- stat->sclass = STAT_CLASS_WAYP;
- break;
- default:
- /* TODO: No support for custom
- * classes for now, so stuff
- * everything to the single
- * default one. --pasky */
- stat->sclass = STAT_CLASS_DFLT;
- //stat->sclass = STAT_CLASS_CUSTOM;
- break;
- }
+ stat->sclass = AllocateStationClass(classid);
}
break;
}
@@ -825,24 +810,28 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
StationSpec *stat = &_cur_grffile->stations[stid + i];
int t;
- stat->tiles = grf_load_byte(&buf);
+ stat->tiles = grf_load_extended(&buf);
+ stat->renderdata = calloc(stat->tiles, sizeof(*stat->renderdata));
for (t = 0; t < stat->tiles; t++) {
DrawTileSprites *dts = &stat->renderdata[t];
int seq_count = 0;
+ PalSpriteID ground_sprite;
- if (t >= 8) {
- grfmsg(GMS_WARN, "StationChangeInfo: Sprite %d>=8, skipping.", t);
- grf_load_dword(&buf); // at least something
- continue;
- }
-
- dts->ground_sprite = grf_load_dword(&buf);
- if (!dts->ground_sprite) {
+ ground_sprite = grf_load_dword(&buf);
+ if (ground_sprite == 0) {
static const DrawTileSeqStruct empty = {0x80, 0, 0, 0, 0, 0, 0};
dts->seq = &empty;
continue;
}
+ if (HASBIT(ground_sprite, 31)) {
+ // Bit 31 indicates that we should use a custom sprite.
+ dts->ground_sprite = GB(ground_sprite, 0, 15) - 0x42D;
+ dts->ground_sprite += _cur_grffile->first_spriteset;
+ } else {
+ dts->ground_sprite = ground_sprite;
+ }
+
dts->seq = NULL;
while (buf < *bufp + len) {
DrawTileSeqStruct *dtss;
@@ -873,6 +862,7 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
int t;
stat->tiles = srcstat->tiles;
+ stat->renderdata = calloc(stat->tiles, sizeof(*stat->renderdata));
for (t = 0; t < stat->tiles; t++) {
DrawTileSprites *dts = &stat->renderdata[t];
const DrawTileSprites *sdts = &srcstat->renderdata[t];
@@ -1548,6 +1538,9 @@ static void NewSpriteGroup(byte *buf, int len)
loaded_ptr = buf;
loading_ptr = buf + 2 * numloaded;
+ if (_cur_grffile->first_spriteset == 0)
+ _cur_grffile->first_spriteset = _cur_grffile->spriteset_start;
+
if (numloaded > 16) {
grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid);
numloaded = 16;
@@ -1688,8 +1681,8 @@ static void NewVehicle_SpriteGroupMapping(byte *buf, int len)
stat->spritegroup[0] = _cur_grffile->spritegroups[groupid];
stat->spritegroup[0]->ref_count++;
stat->grfid = _cur_grffile->grfid;
- SetCustomStation(stid, stat);
- stat->sclass = STAT_CLASS_NONE;
+ stat->localidx = stid;
+ SetCustomStation(stat);
}
}
return;
@@ -2396,6 +2389,28 @@ static void ReleaseSpriteGroups(GRFFile *file)
file->spritegroups_count = 0;
}
+static void ResetCustomStations(void)
+{
+ GRFFile *file;
+ int i;
+ CargoID c;
+
+ for (file = _first_grffile; file != NULL; file = file->next) {
+ for (i = 0; i < 256; i++) {
+ if (file->stations[i].grfid != file->grfid)
+ continue;
+
+ // TODO: Release renderdata, platforms and layouts
+
+ // Release this stations sprite groups.
+ for (c = 0; c < NUM_GLOBAL_CID; c++) {
+ if (file->stations[i].spritegroup[c] != NULL)
+ UnloadSpriteGroup(&file->stations[i].spritegroup[c]);
+ }
+ }
+ }
+}
+
/**
* Reset all NewGRF loaded data
* TODO
@@ -2433,6 +2448,10 @@ static void ResetNewGRFData(void)
// Reset price base data
ResetPriceBaseMultipliers();
+
+ // Reset station classes
+ ResetStationClasses();
+ ResetCustomStations();
}
static void InitNewGRFFile(const char* filename, int sprite_offset)