src/articulated_vehicles.cpp
author celestar
Wed, 13 Jun 2007 12:05:56 +0000
branchgamebalance
changeset 9912 1ac8aac92385
permissions -rw-r--r--
(svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
9912
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
     1
/* $Id$ */
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
     2
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
     3
/** @file articulated_vehicles.cpp */
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
     4
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
     5
#include "stdafx.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
     6
#include "openttd.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
     7
#include "functions.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
     8
#include "command.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
     9
#include "vehicle.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    10
#include "articulated_vehicles.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    11
#include "engine.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    12
#include "train.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    13
#include "roadveh.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    14
#include "newgrf_callbacks.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    15
#include "newgrf_engine.h"
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    16
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    17
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    18
uint CountArticulatedParts(EngineID engine_type)
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    19
{
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    20
	if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return 0;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    21
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    22
	uint i;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    23
	for (i = 1; i < 10; i++) {
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    24
		uint16 callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, engine_type, NULL);
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    25
		if (callback == CALLBACK_FAILED || callback == 0xFF) break;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    26
	}
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    27
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    28
	return i - 1;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    29
}
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    30
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    31
void AddArticulatedParts(Vehicle **vl, VehicleType type)
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    32
{
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    33
	const Vehicle *v = vl[0];
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    34
	Vehicle *u = vl[0];
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    35
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    36
	if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    37
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    38
	for (uint i = 1; i < 10; i++) {
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    39
		uint16 callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, v->engine_type, v);
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    40
		if (callback == CALLBACK_FAILED || callback == 0xFF) return;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    41
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    42
		/* Attempt to use pre-allocated vehicles until they run out. This can happen
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    43
		 * if the callback returns different values depending on the cargo type. */
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    44
		u->next = vl[i];
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    45
		if (u->next == NULL) u->next = AllocateVehicle();
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    46
		if (u->next == NULL) return;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    47
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    48
		u = u->next;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    49
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    50
		EngineID engine_type = GetFirstEngineOfType(type) + GB(callback, 0, 7);
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    51
		bool flip_image = HASBIT(callback, 7);
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    52
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    53
		/* get common values from first engine */
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    54
		u->direction = v->direction;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    55
		u->owner = v->owner;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    56
		u->tile = v->tile;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    57
		u->x_pos = v->x_pos;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    58
		u->y_pos = v->y_pos;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    59
		u->z_pos = v->z_pos;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    60
		u->build_year = v->build_year;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    61
		u->vehstatus = v->vehstatus & ~VS_STOPPED;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    62
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    63
		u->cargo_subtype = 0;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    64
		u->max_speed = 0;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    65
		u->max_age = 0;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    66
		u->engine_type = engine_type;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    67
		u->value = 0;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    68
		u->subtype = 0;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    69
		u->cur_image = 0xAC2;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    70
		u->random_bits = VehicleRandomBits();
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    71
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    72
		switch (type) {
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    73
			default: NOT_REACHED();
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    74
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    75
			case VEH_TRAIN: {
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    76
				const RailVehicleInfo *rvi_artic = RailVehInfo(engine_type);
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    77
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    78
				u = new (u) Train();
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    79
				u->u.rail.track = v->u.rail.track;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    80
				u->u.rail.railtype = v->u.rail.railtype;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    81
				u->u.rail.first_engine = v->engine_type;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    82
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    83
				u->spritenum = rvi_artic->image_index;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    84
				u->cargo_type = rvi_artic->cargo_type;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    85
				u->cargo_cap = rvi_artic->capacity;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    86
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    87
				SetArticulatedPart(u);
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    88
			} break;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    89
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    90
			case VEH_ROAD: {
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    91
				const RoadVehicleInfo *rvi_artic = RoadVehInfo(engine_type);
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    92
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    93
				u = new (u) RoadVehicle();
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    94
				u->u.road.first_engine = v->engine_type;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    95
				u->u.road.cached_veh_length = GetRoadVehLength(u);
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    96
				u->u.road.state = RVSB_IN_DEPOT;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    97
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    98
				u->u.road.roadtype = v->u.road.roadtype;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
    99
				u->u.road.compatible_roadtypes = v->u.road.compatible_roadtypes;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   100
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   101
				u->spritenum = rvi_artic->image_index;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   102
				u->cargo_type = rvi_artic->cargo_type;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   103
				u->cargo_cap = rvi_artic->capacity;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   104
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   105
				SetRoadVehArticPart(u);
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   106
			} break;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   107
		}
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   108
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   109
		if (flip_image) u->spritenum++;
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   110
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   111
		VehiclePositionChanged(u);
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   112
	}
1ac8aac92385 (svn r10136) [gamebalance] -Sync: r9900:10100 from trunk
celestar
parents:
diff changeset
   113
}