diff options
-rw-r--r-- | grfspecial.c | 115 | ||||
-rw-r--r-- | roadveh_cmd.c | 15 |
2 files changed, 124 insertions, 6 deletions
diff --git a/grfspecial.c b/grfspecial.c index 55b0a7643..b164646c1 100644 --- a/grfspecial.c +++ b/grfspecial.c @@ -339,6 +339,112 @@ static bool RailVehicleChangeInfo(uint engine, int numinfo, int prop, byte **buf return ret; } +static bool RoadVehicleChangeInfo(uint engine, int numinfo, int prop, byte **bufp, int len) +{ + RoadVehicleInfo *rvi = &_road_vehicle_info[engine]; + byte *buf = *bufp; + int i; + bool ret = false; + + switch (prop) { + case 0x08: { /* Speed */ + FOR_EACH_ENGINE { + uint8 speed = grf_load_byte(&buf); + + rvi[i].max_speed = speed; // ?? units + } + } break; + case 0x09: { /* Running cost factor */ + FOR_EACH_ENGINE { + uint8 runcost = grf_load_byte(&buf); + + rvi[i].running_cost = runcost; + } + } break; + case 0x0A: /* Running cost base */ + /* TODO: I have no idea. --pasky */ + FOR_EACH_ENGINE { + grf_load_byte(&buf); + } + ret = true; + break; + case 0x0E: { /* Sprite ID */ + FOR_EACH_ENGINE { + uint8 spriteid = grf_load_byte(&buf); + + if (spriteid == 0xFF) + spriteid = 0xFD; // cars have different custom id in the GRF file + + // This is currently not used but there's no reason + // in not having it here for the future. + if (spriteid == 0xFD && rvi[i].image_index != 0xFD) + _engine_original_sprites[ROAD_ENGINES_INDEX + engine + i] = rvi[i].image_index; + + rvi[i].image_index = spriteid; + } + } break; + case 0x0F: { /* Cargo capacity */ + FOR_EACH_ENGINE { + uint16 capacity = grf_load_word(&buf); + + rvi[i].capacity = capacity; + } + } break; + case 0x10: { /* Cargo type */ + FOR_EACH_ENGINE { + uint8 cargo = grf_load_byte(&buf); + + rvi[i].cargo_type = cargo; + } + } break; + case 0x11: { /* Cost factor */ + FOR_EACH_ENGINE { + uint8 cost_factor = grf_load_byte(&buf); + + rvi[i].base_cost = cost_factor; // ?? is it base_cost? + } + } break; + case 0x12: { /* SFX */ + FOR_EACH_ENGINE { + uint8 sfx = grf_load_byte(&buf); + + rvi[i].sfx = sfx; + } + } break; + case 0x13: /* Power in 10hp */ + case 0x14: /* Weight in 1/4 tons */ + case 0x15: /* Speed in mph*0.8 */ + /* TODO: Support for road vehicles realistic power + * computations (called rvpower in TTDPatch) is just + * missing in OTTD yet. --pasky */ + FOR_EACH_ENGINE { + grf_load_byte(&buf); + } + ret = true; + break; + case 0x16: { /* Cargos available for refitting */ + FOR_EACH_ENGINE { + uint32 refit_mask = grf_load_dword(&buf); + + _engine_refit_masks[ROAD_ENGINES_INDEX + engine + i] = refit_mask; + } + } break; + case 0x17: /* Callback */ + case 0x18: /* Tractive effort */ + /* TODO */ + FOR_EACH_ENGINE { + grf_load_byte(&buf); + } + ret = true; + break; + default: + ret = true; + } + + *bufp = buf; + return ret; +} + static bool ShipVehicleChangeInfo(uint engine, int numinfo, int prop, byte **bufp, int len) { ShipVehicleInfo *svi = &_ship_vehicle_info[engine]; @@ -460,7 +566,7 @@ static void VehicleChangeInfo(byte *buf, int len) static const VCI_Handler handler[5] = { /* GSF_TRAIN */ RailVehicleChangeInfo, - /* GSF_ROAD */ NULL, + /* GSF_ROAD */ RoadVehicleChangeInfo, /* GSF_SHIP */ ShipVehicleChangeInfo, /* GSF_AIRCRAFT */ NULL, /* GSF_STATION */ NULL, @@ -478,7 +584,10 @@ static void VehicleChangeInfo(byte *buf, int len) numinfo = buf[3]; engine = buf[4]; - if (feature != GSF_TRAIN && feature != GSF_SHIP) { + DEBUG(grf, 6) ("VehicleChangeInfo: Feature %d, %d properties, to apply to %d+%d", + feature, numprops, engine, numinfo); + + if (feature != GSF_TRAIN && feature != GSF_ROAD && feature != GSF_SHIP) { grfmsg(GMS_WARN, "VehicleChangeInfo: Unsupported vehicle type %x, skipping.", feature); return; } @@ -528,7 +637,7 @@ static void VehicleChangeInfo(byte *buf, int len) ei[i].railtype_climates |= climates; } } break; - case 0x07: { /* Loading spee */ + case 0x07: { /* Loading speed */ /* TODO */ /* Hyronymus explained me what does * this mean and insists on having a diff --git a/roadveh_cmd.c b/roadveh_cmd.c index f4a66bcd9..becb2605e 100644 --- a/roadveh_cmd.c +++ b/roadveh_cmd.c @@ -56,13 +56,11 @@ int GetRoadVehImage(Vehicle *v, byte direction) int img = v->spritenum; int image; -#ifdef ROADVEH_CUSTOM_SPRITES // TODO --pasky if (is_custom_sprite(img)) { image = GetCustomVehicleSprite(v, direction); if (image) return image; img = _engine_original_sprites[v->engine_type]; } -#endif image = direction + _roadveh_images[img]; if (v->cargo_count >= (v->cargo_cap >> 1)) @@ -72,7 +70,18 @@ int GetRoadVehImage(Vehicle *v, byte direction) void DrawRoadVehEngine(int x, int y, int engine, uint32 image_ormod) { - DrawSprite((6 + _roadveh_images[road_vehicle_info(engine)->image_index]) | image_ormod, x, y); + int spritenum = road_vehicle_info(engine)->image_index; + + if (is_custom_sprite(spritenum)) { + int sprite = GetCustomVehicleIcon(engine, 6); + + if (sprite) { + DrawSprite(sprite | image_ormod, x, y); + return; + } + spritenum = _engine_original_sprites[engine]; + } + DrawSprite((6 + _roadveh_images[spritenum]) | image_ormod, x, y); } void DrawRoadVehEngineInfo(int engine, int x, int y, int maxw) |