summaryrefslogtreecommitdiff
path: root/newgrf.c
diff options
context:
space:
mode:
authorhackykid <hackykid@openttd.org>2005-06-01 11:34:37 +0000
committerhackykid <hackykid@openttd.org>2005-06-01 11:34:37 +0000
commit351d7aaa9fd2fe1e5cd464130186727df38e646f (patch)
tree09bec4a6bd097d4449f7cfdff13cc475960d9703 /newgrf.c
parentd1c1a7cba725de322c2b7948db75fd83cdf77fe5 (diff)
downloadopenttd-351d7aaa9fd2fe1e5cd464130186727df38e646f.tar.xz
(svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
- Feature: [newgrf] Implement the 'refit capacity' callback.
Diffstat (limited to 'newgrf.c')
-rw-r--r--newgrf.c46
1 files changed, 37 insertions, 9 deletions
diff --git a/newgrf.c b/newgrf.c
index 225b2d10f..0815d8034 100644
--- a/newgrf.c
+++ b/newgrf.c
@@ -1080,6 +1080,28 @@ ignoring:
#undef FOR_EACH_OBJECT
+/**
+ * Creates a spritegroup representing a callback result
+ * @param value The value that was used to represent this callback result
+ * @return A spritegroup representing that callback result
+ */
+SpriteGroup NewCallBackResult(uint16 value)
+{
+ SpriteGroup group;
+
+ group.type = SGT_CALLBACK;
+
+ // Old style callback results have the highest byte 0xFF so signify it is a callback result
+ // New style ones only have the highest bit set (allows 15-bit results, instead of just 8)
+ if ((value >> 8) == 0xFF)
+ value &= 0xFF;
+ else
+ value &= ~0x8000;
+
+ group.g.callback.result = value;
+
+ return group;
+}
/* Action 0x01 */
static void NewSpriteSet(byte *buf, int len)
@@ -1183,37 +1205,43 @@ static void NewSpriteGroup(byte *buf, int len)
dg->divmod_val = grf_load_byte(&buf);
}
- /* (groupid & 0x8000) means this is callback result; we happily
- * ignore that for now. */
+ /* (groupid & 0x8000) means this is callback result. */
dg->num_ranges = grf_load_byte(&buf);
dg->ranges = calloc(dg->num_ranges, sizeof(*dg->ranges));
for (i = 0; i < dg->num_ranges; i++) {
groupid = grf_load_word(&buf);
- if (groupid & 0x8000 || groupid >= _cur_grffile->spritegroups_count) {
+ if (groupid & 0x8000) {
+ dg->ranges[i].group = NewCallBackResult(groupid);
+ } else if (groupid >= _cur_grffile->spritegroups_count) {
/* This doesn't exist for us. */
grf_load_word(&buf); // skip range
i--; dg->num_ranges--;
continue;
- }
+ } else {
/* XXX: If multiple surreal sets attach a surreal
* set this way, we are in trouble. */
- dg->ranges[i].group = _cur_grffile->spritegroups[groupid];
+ dg->ranges[i].group = _cur_grffile->spritegroups[groupid];
+ }
+
dg->ranges[i].low = grf_load_byte(&buf);
dg->ranges[i].high = grf_load_byte(&buf);
}
groupid = grf_load_word(&buf);
- if (groupid & 0x8000 || groupid >= _cur_grffile->spritegroups_count) {
+ if (groupid & 0x8000) {
+ dg->default_group = malloc(sizeof(*dg->default_group));
+ *dg->default_group = NewCallBackResult(groupid);
+ } else if (groupid >= _cur_grffile->spritegroups_count) {
/* This spritegroup stinks. */
free(dg->ranges), dg->ranges = NULL;
grfmsg(GMS_WARN, "NewSpriteGroup(%02x:0x%x): Default groupid %04x is cargo callback or unknown, ignoring spritegroup.", setid, numloaded, groupid);
return;
+ } else {
+ dg->default_group = malloc(sizeof(*dg->default_group));
+ memcpy(dg->default_group, &_cur_grffile->spritegroups[groupid], sizeof(*dg->default_group));
}
- dg->default_group = malloc(sizeof(*dg->default_group));
- memcpy(dg->default_group, &_cur_grffile->spritegroups[groupid], sizeof(*dg->default_group));
-
return;
} else if (numloaded == 0x80 || numloaded == 0x83) {