diff options
author | peter1138 <peter1138@openttd.org> | 2006-02-03 23:02:01 +0000 |
---|---|---|
committer | peter1138 <peter1138@openttd.org> | 2006-02-03 23:02:01 +0000 |
commit | 05d7d046c71943317d31c2e3c22a960faf38f6f1 (patch) | |
tree | c3c5d03adebff80a4e0005e6e6590c5611d8641a /newgrf_station.c | |
parent | c5a669b39f6a78ee3ed0b819dd9bc5985cbb2c18 (diff) | |
download | openttd-05d7d046c71943317d31c2e3c22a960faf38f6f1.tar.xz |
(svn r3530) - NewGRF: Move station resolver to newgrf_station
Diffstat (limited to 'newgrf_station.c')
-rw-r--r-- | newgrf_station.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/newgrf_station.c b/newgrf_station.c index 81ce3249a..2bb9e56ff 100644 --- a/newgrf_station.c +++ b/newgrf_station.c @@ -6,6 +6,7 @@ #include "openttd.h" #include "debug.h" #include "sprite.h" +#include "station.h" #include "newgrf_station.h" static StationClass station_classes[STAT_CLASS_MAX]; @@ -113,3 +114,85 @@ const StationSpec *GetCustomStation(StationClassID sclass, uint station) // probably was not loaded. return NULL; } + +static const RealSpriteGroup *ResolveStationSpriteGroup(const SpriteGroup *spg, const Station *st) +{ + switch (spg->type) { + case SGT_REAL: + return &spg->g.real; + + case SGT_DETERMINISTIC: { + const DeterministicSpriteGroup *dsg = &spg->g.determ; + SpriteGroup *target; + int value = -1; + + if ((dsg->variable >> 6) == 0) { + /* General property */ + value = GetDeterministicSpriteValue(dsg->variable); + } else { + if (st == NULL) { + /* We are in a build dialog of something, + * and we are checking for something undefined. + * That means we should get the first target + * (NOT the default one). */ + if (dsg->num_ranges > 0) { + target = dsg->ranges[0].group; + } else { + target = dsg->default_group; + } + return ResolveStationSpriteGroup(target, NULL); + } + + /* Station-specific property. */ + if (dsg->var_scope == VSG_SCOPE_PARENT) { + /* TODO: Town structure. */ + + } else /* VSG_SELF */ { + if (dsg->variable == 0x40 || dsg->variable == 0x41) { + /* FIXME: This is ad hoc only + * for waypoints. */ + value = 0x01010000; + } else { + /* TODO: Only small fraction done. */ + // TTDPatch runs on little-endian arch; + // Variable is 0x70 + offset in the TTD's station structure + switch (dsg->variable - 0x70) { + case 0x80: value = st->facilities; break; + case 0x81: value = st->airport_type; break; + case 0x82: value = st->truck_stops->status; break; + case 0x83: value = st->bus_stops->status; break; + case 0x86: value = st->airport_flags & 0xFFFF; break; + case 0x87: value = st->airport_flags & 0xFF; break; + case 0x8A: value = st->build_date; break; + } + } + } + } + + target = value != -1 ? EvalDeterministicSpriteGroup(dsg, value) : dsg->default_group; + return ResolveStationSpriteGroup(target, st); + } + + default: + case SGT_RANDOMIZED: + DEBUG(grf, 6)("I don't know how to handle random spritegroups yet!"); + return NULL; + } +} + +uint32 GetCustomStationRelocation(const StationSpec *spec, const Station *st, byte ctype) +{ + const RealSpriteGroup *rsg = ResolveStationSpriteGroup(spec->spritegroup[ctype], st); + + if (rsg->sprites_per_set != 0) { + if (rsg->loading_count != 0) return rsg->loading[0]->g.result.result; + if (rsg->loaded_count != 0) return rsg->loaded[0]->g.result.result; + } + + DEBUG(grf, 6)("Custom station 0x%08x::0x%02x has no sprites associated.", + spec->grfid, spec->localidx); + /* This is what gets subscribed of dtss->image in newgrf.c, + * so it's probably kinda "default offset". Try to use it as + * emergency measure. */ + return 0; +} |