summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--projects/openttd.vcproj6
-rw-r--r--projects/openttd_vs80.vcproj8
-rw-r--r--source.list2
-rw-r--r--src/articulated_vehicles.cpp84
-rw-r--r--src/articulated_vehicles.h11
-rw-r--r--src/build_vehicle_gui.cpp1
-rw-r--r--src/train_cmd.cpp70
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);