Files
@ r9010:56ff6c523703
Branch filter:
Location: cpp/openttd-patchpack/source/src/articulated_vehicles.cpp - annotation
r9010:56ff6c523703
4.3 KiB
text/x-c
(svn r12805) -Codechange: remove some bit magic related to the news display states. Patch by cirdan.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | r6772:59235ded8522 r6772:59235ded8522 r6775:53e8e6f8d897 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6857:1e07df806ef1 r6772:59235ded8522 r6772:59235ded8522 r8144:1432edd15267 r6772:59235ded8522 r6857:1e07df806ef1 r7595:4f881cfee2f3 r6772:59235ded8522 r7928:a80e7e05d6c5 r6772:59235ded8522 r7595:4f881cfee2f3 r7595:4f881cfee2f3 r7595:4f881cfee2f3 r7595:4f881cfee2f3 r7595:4f881cfee2f3 r7595:4f881cfee2f3 r6772:59235ded8522 r7593:eb8fa3c88a8e r7595:4f881cfee2f3 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r7595:4f881cfee2f3 r7595:4f881cfee2f3 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r8559:0d8d367ca4c3 r6857:1e07df806ef1 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r7928:a80e7e05d6c5 r6772:59235ded8522 r7593:eb8fa3c88a8e r7215:b3433b9d5b54 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r7492:75510449064b r7492:75510449064b r6772:59235ded8522 r7518:59110e585012 r7492:75510449064b r6772:59235ded8522 r6857:1e07df806ef1 r7928:a80e7e05d6c5 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r7528:873b4bf1205a r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r7528:873b4bf1205a r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6857:1e07df806ef1 r6772:59235ded8522 r6772:59235ded8522 r6772:59235ded8522 | /* $Id$ */
/** @file articulated_vehicles.cpp */
#include "stdafx.h"
#include "openttd.h"
#include "articulated_vehicles.h"
#include "train.h"
#include "roadveh.h"
#include "newgrf_callbacks.h"
#include "newgrf_engine.h"
#include "vehicle_func.h"
uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
{
if (!HasBit(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return 0;
Vehicle *v = NULL;;
if (!purchase_window) {
v = new InvalidVehicle();
v->engine_type = engine_type;
}
uint i;
for (i = 1; i < MAX_UVALUE(EngineID); i++) {
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine_type, v);
if (callback == CALLBACK_FAILED || callback == 0xFF) break;
}
delete v;
return i - 1;
}
uint16 *GetCapacityOfArticulatedParts(EngineID engine, VehicleType type)
{
static uint16 capacity[NUM_CARGO];
memset(capacity, 0, sizeof(capacity));
if (type == VEH_TRAIN) {
const RailVehicleInfo *rvi = RailVehInfo(engine);
capacity[rvi->cargo_type] = rvi->capacity;
if (rvi->railveh_type == RAILVEH_MULTIHEAD) capacity[rvi->cargo_type] += rvi->capacity;
} else if (type == VEH_ROAD) {
const RoadVehicleInfo *rvi = RoadVehInfo(engine);
capacity[rvi->cargo_type] = rvi->capacity;
}
if (!HasBit(EngInfo(engine)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return capacity;
for (uint i = 1; i < MAX_UVALUE(EngineID); i++) {
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine, NULL);
if (callback == CALLBACK_FAILED || callback == 0xFF) break;
EngineID artic_engine = GetFirstEngineOfType(type) + GB(callback, 0, 7);
if (type == VEH_TRAIN) {
const RailVehicleInfo *rvi = RailVehInfo(artic_engine);
capacity[rvi->cargo_type] += GetEngineProperty(artic_engine, 0x14, rvi->capacity);
} else if (type == VEH_ROAD) {
const RoadVehicleInfo *rvi = RoadVehInfo(artic_engine);
capacity[rvi->cargo_type] += GetEngineProperty(artic_engine, 0x0F, rvi->capacity);
}
}
return capacity;
}
void AddArticulatedParts(Vehicle **vl, VehicleType type)
{
const Vehicle *v = vl[0];
Vehicle *u = vl[0];
if (!HasBit(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return;
for (uint i = 1; i < MAX_UVALUE(EngineID); i++) {
uint16 callback = GetVehicleCallback(CBID_VEHICLE_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->SetNext(vl[i]);
if (u->Next() == NULL) return;
Vehicle *previous = u;
u = u->Next();
EngineID engine_type = GetFirstEngineOfType(type) + GB(callback, 0, 7);
bool flip_image = HasBit(callback, 7);
/* 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->build_year = v->build_year;
u->vehstatus = v->vehstatus & ~VS_STOPPED;
u->cargo_subtype = 0;
u->max_speed = 0;
u->max_age = 0;
u->engine_type = engine_type;
u->value = 0;
u->subtype = 0;
u->cur_image = 0xAC2;
u->random_bits = VehicleRandomBits();
switch (type) {
default: NOT_REACHED();
case VEH_TRAIN: {
const RailVehicleInfo *rvi_artic = RailVehInfo(engine_type);
u = new (u) Train();
previous->SetNext(u);
u->u.rail.track = v->u.rail.track;
u->u.rail.railtype = v->u.rail.railtype;
u->u.rail.first_engine = v->engine_type;
u->spritenum = rvi_artic->image_index;
u->cargo_type = rvi_artic->cargo_type;
u->cargo_cap = rvi_artic->capacity;
SetArticulatedPart(u);
} break;
case VEH_ROAD: {
const RoadVehicleInfo *rvi_artic = RoadVehInfo(engine_type);
u = new (u) RoadVehicle();
previous->SetNext(u);
u->u.road.first_engine = v->engine_type;
u->u.road.cached_veh_length = GetRoadVehLength(u);
u->u.road.state = RVSB_IN_DEPOT;
u->u.road.roadtype = v->u.road.roadtype;
u->u.road.compatible_roadtypes = v->u.road.compatible_roadtypes;
u->spritenum = rvi_artic->image_index;
u->cargo_type = rvi_artic->cargo_type;
u->cargo_cap = rvi_artic->capacity;
SetRoadVehArticPart(u);
} break;
}
if (flip_image) u->spritenum++;
VehiclePositionChanged(u);
}
}
|