diff options
-rw-r--r-- | projects/openttd.vcproj | 6 | ||||
-rw-r--r-- | projects/openttd_vs80.vcproj | 8 | ||||
-rw-r--r-- | source.list | 2 | ||||
-rw-r--r-- | src/articulated_vehicles.cpp | 84 | ||||
-rw-r--r-- | src/articulated_vehicles.h | 11 | ||||
-rw-r--r-- | src/build_vehicle_gui.cpp | 1 | ||||
-rw-r--r-- | src/train_cmd.cpp | 70 |
7 files changed, 113 insertions, 69 deletions
diff --git a/projects/openttd.vcproj b/projects/openttd.vcproj index 9bfe7b14e..7ecb68cdb 100644 --- a/projects/openttd.vcproj +++ b/projects/openttd.vcproj @@ -164,6 +164,9 @@ RelativePath=".\..\src\airport.cpp"> </File> <File + RelativePath=".\..\src\articulated_vehicles.cpp"> + </File> + <File RelativePath=".\..\src\autoreplace_cmd.cpp"> </File> <File @@ -387,6 +390,9 @@ RelativePath=".\..\src\airport_movement.h"> </File> <File + RelativePath=".\..\src\autoreplace_cmd.h"> + </File> + <File RelativePath=".\..\src\aystar.h"> </File> <File diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj index 87f6b0784..2f461495b 100644 --- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -448,6 +448,10 @@ > </File> <File + RelativePath=".\..\src\articulated_vehicles.cpp" + > + </File> + <File RelativePath=".\..\src\autoreplace_cmd.cpp" > </File> @@ -744,6 +748,10 @@ > </File> <File + RelativePath=".\..\src\autoreplace_cmd.h" + > + </File> + <File RelativePath=".\..\src\aystar.h" > </File> diff --git a/source.list b/source.list index 740c43b99..c373f5f4f 100644 --- a/source.list +++ b/source.list @@ -1,5 +1,6 @@ # Source Files airport.cpp +articulated_vehicles.cpp autoreplace_cmd.cpp aystar.cpp bmp.cpp @@ -96,6 +97,7 @@ window.cpp aircraft.h airport.h airport_movement.h +autoreplace_cmd.h aystar.h bmp.h cargotype.h diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp new file mode 100644 index 000000000..d9f30d2e7 --- /dev/null +++ b/src/articulated_vehicles.cpp @@ -0,0 +1,84 @@ +/* $Id$ */ + +/** @file train_cmd.cpp */ + +#include "stdafx.h" +#include "openttd.h" +#include "debug.h" +#include "functions.h" +#include "command.h" +#include "vehicle.h" +#include "articulated_vehicles.h" +#include "engine.h" +#include "train.h" +#include "newgrf_callbacks.h" +#include "newgrf_engine.h" + +uint CountArticulatedParts(EngineID engine_type) +{ + if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return 0; + + uint i; + for (i = 1; i < 10; i++) { + uint16 callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, engine_type, NULL); + if (callback == CALLBACK_FAILED || callback == 0xFF) break; + } + + return i - 1; +} + +void AddArticulatedParts(Vehicle **vl) +{ + const Vehicle *v = vl[0]; + Vehicle *u = vl[0]; + + if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return; + + for (uint i = 1; i < 10; i++) { + uint16 callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, v->engine_type, v); + if (callback == CALLBACK_FAILED || callback == 0xFF) return; + + /* Attempt to use pre-allocated vehicles until they run out. This can happen + * if the callback returns different values depending on the cargo type. */ + u->next = vl[i]; + if (u->next == NULL) u->next = AllocateVehicle(); + if (u->next == NULL) return; + + u = u->next; + + EngineID engine_type = GB(callback, 0, 7); + bool flip_image = HASBIT(callback, 7); + const RailVehicleInfo *rvi_artic = RailVehInfo(engine_type); + + /* get common values from first engine */ + u->direction = v->direction; + u->owner = v->owner; + u->tile = v->tile; + u->x_pos = v->x_pos; + u->y_pos = v->y_pos; + u->z_pos = v->z_pos; + u->u.rail.track = v->u.rail.track; + u->u.rail.railtype = v->u.rail.railtype; + u->build_year = v->build_year; + u->vehstatus = v->vehstatus & ~VS_STOPPED; + u->u.rail.first_engine = v->engine_type; + + /* get more settings from rail vehicle info */ + u->spritenum = rvi_artic->image_index; + if (flip_image) u->spritenum++; + u->cargo_type = rvi_artic->cargo_type; + u->cargo_subtype = 0; + u->cargo_cap = rvi_artic->capacity; + u->max_speed = 0; + u->max_age = 0; + u->engine_type = engine_type; + u->value = 0; + u = new (u) Train(); + u->subtype = 0; + SetArticulatedPart(u); + u->cur_image = 0xAC2; + u->random_bits = VehicleRandomBits(); + + VehiclePositionChanged(u); + } +} diff --git a/src/articulated_vehicles.h b/src/articulated_vehicles.h new file mode 100644 index 000000000..79aea98d3 --- /dev/null +++ b/src/articulated_vehicles.h @@ -0,0 +1,11 @@ +/* $Id$ */ + +/** @file articulated_vehicles.h */ + +#ifndef ARTICULATED_VEHICLES_H +#define ARTICULATED_VEHICLES_H + +uint CountArticulatedParts(EngineID engine_type); +void AddArticulatedParts(Vehicle **vl); + +#endif /* ARTICULATED_VEHICLES_H */ diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index ad02f8557..430ffca67 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -15,6 +15,7 @@ #include "window.h" #include "gui.h" #include "vehicle.h" +#include "articulated_vehicles.h" #include "gfx.h" #include "station.h" #include "command.h" diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 7e5c74cfb..b7e597059 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -15,6 +15,7 @@ #include "tile.h" #include "tunnel_map.h" #include "vehicle.h" +#include "articulated_vehicles.h" #include "command.h" #include "pathfind.h" #include "npf.h" @@ -501,75 +502,6 @@ void DrawTrainEngine(int x, int y, EngineID engine, SpriteID pal) DrawSprite(image, pal, x, y); } -uint CountArticulatedParts(EngineID engine_type) -{ - if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return 0; - - uint i; - for (i = 1; i < 10; i++) { - uint16 callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, engine_type, NULL); - if (callback == CALLBACK_FAILED || callback == 0xFF) break; - } - - return i - 1; -} - -static void AddArticulatedParts(Vehicle **vl) -{ - const Vehicle *v = vl[0]; - Vehicle *u = vl[0]; - - if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return; - - for (uint i = 1; i < 10; i++) { - uint16 callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, v->engine_type, v); - if (callback == CALLBACK_FAILED || callback == 0xFF) return; - - /* Attempt to use pre-allocated vehicles until they run out. This can happen - * if the callback returns different values depending on the cargo type. */ - u->next = vl[i]; - if (u->next == NULL) u->next = AllocateVehicle(); - if (u->next == NULL) return; - - u = u->next; - - EngineID engine_type = GB(callback, 0, 7); - bool flip_image = HASBIT(callback, 7); - const RailVehicleInfo *rvi_artic = RailVehInfo(engine_type); - - /* get common values from first engine */ - u->direction = v->direction; - u->owner = v->owner; - u->tile = v->tile; - u->x_pos = v->x_pos; - u->y_pos = v->y_pos; - u->z_pos = v->z_pos; - u->u.rail.track = v->u.rail.track; - u->u.rail.railtype = v->u.rail.railtype; - u->build_year = v->build_year; - u->vehstatus = v->vehstatus & ~VS_STOPPED; - u->u.rail.first_engine = v->engine_type; - - /* get more settings from rail vehicle info */ - u->spritenum = rvi_artic->image_index; - if (flip_image) u->spritenum++; - u->cargo_type = rvi_artic->cargo_type; - u->cargo_subtype = 0; - u->cargo_cap = rvi_artic->capacity; - u->max_speed = 0; - u->max_age = 0; - u->engine_type = engine_type; - u->value = 0; - u = new (u) Train(); - u->subtype = 0; - SetArticulatedPart(u); - u->cur_image = 0xAC2; - u->random_bits = VehicleRandomBits(); - - VehiclePositionChanged(u); - } -} - static int32 CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags) { SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); |