mirror of https://github.com/OpenTTD/OpenTTD
(svn r20484) -Codechange: Move BuildRefitList to the RefitWindow class.
parent
144a7cab1a
commit
ffcd869dda
|
@ -307,79 +307,6 @@ struct RefitOption {
|
||||||
|
|
||||||
typedef SmallVector<RefitOption, 32> RefitList;
|
typedef SmallVector<RefitOption, 32> RefitList;
|
||||||
|
|
||||||
/**
|
|
||||||
* Collects all (cargo, subcargo) refit-options of a vehicle chain
|
|
||||||
* @param v front vehicle
|
|
||||||
* @param refit_list container to store result
|
|
||||||
*/
|
|
||||||
static void BuildRefitList(const Vehicle *v, RefitList *refit_list)
|
|
||||||
{
|
|
||||||
refit_list->Clear();
|
|
||||||
Vehicle *u = const_cast<Vehicle *>(v);
|
|
||||||
|
|
||||||
do {
|
|
||||||
const Engine *e = Engine::Get(u->engine_type);
|
|
||||||
uint32 cmask = e->info.refit_mask;
|
|
||||||
byte callback_mask = e->info.callback_mask;
|
|
||||||
|
|
||||||
/* Skip this engine if it does not carry anything */
|
|
||||||
if (!e->CanCarryCargo()) continue;
|
|
||||||
|
|
||||||
/* Loop through all cargos in the refit mask */
|
|
||||||
const CargoSpec *cs;
|
|
||||||
FOR_ALL_SORTED_CARGOSPECS(cs) {
|
|
||||||
CargoID cid = cs->Index();
|
|
||||||
/* Skip cargo type if it's not listed */
|
|
||||||
if (!HasBit(cmask, cid)) continue;
|
|
||||||
|
|
||||||
/* Check the vehicle's callback mask for cargo suffixes */
|
|
||||||
if (HasBit(callback_mask, CBM_VEHICLE_CARGO_SUFFIX)) {
|
|
||||||
/* Make a note of the original cargo type. It has to be
|
|
||||||
* changed to test the cargo & subtype... */
|
|
||||||
CargoID temp_cargo = u->cargo_type;
|
|
||||||
byte temp_subtype = u->cargo_subtype;
|
|
||||||
|
|
||||||
u->cargo_type = cid;
|
|
||||||
|
|
||||||
for (uint refit_cyc = 0; refit_cyc < MAX_REFIT_CYCLE; refit_cyc++) {
|
|
||||||
u->cargo_subtype = refit_cyc;
|
|
||||||
|
|
||||||
/* Make sure we don't pick up anything cached. */
|
|
||||||
u->First()->InvalidateNewGRFCache();
|
|
||||||
u->InvalidateNewGRFCache();
|
|
||||||
uint16 callback = GetVehicleCallback(CBID_VEHICLE_CARGO_SUFFIX, 0, 0, u->engine_type, u);
|
|
||||||
|
|
||||||
if (callback == 0xFF) callback = CALLBACK_FAILED;
|
|
||||||
if (refit_cyc != 0 && callback == CALLBACK_FAILED) break;
|
|
||||||
|
|
||||||
RefitOption option;
|
|
||||||
option.cargo = cid;
|
|
||||||
option.subtype = refit_cyc;
|
|
||||||
option.value = callback;
|
|
||||||
option.engine = u->engine_type;
|
|
||||||
refit_list->Include(option);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reset the vehicle's cargo type */
|
|
||||||
u->cargo_type = temp_cargo;
|
|
||||||
u->cargo_subtype = temp_subtype;
|
|
||||||
|
|
||||||
/* And make sure we haven't tainted the cache */
|
|
||||||
u->First()->InvalidateNewGRFCache();
|
|
||||||
u->InvalidateNewGRFCache();
|
|
||||||
} else {
|
|
||||||
/* No cargo suffix callback -- use no subtype */
|
|
||||||
RefitOption option;
|
|
||||||
option.cargo = cid;
|
|
||||||
option.subtype = 0;
|
|
||||||
option.value = CALLBACK_FAILED;
|
|
||||||
option.engine = INVALID_ENGINE;
|
|
||||||
refit_list->Include(option);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while ((v->type == VEH_TRAIN || v->type == VEH_ROAD) && (u = u->Next()) != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw the list of available refit options for a consist and highlight the selected refit option (if any).
|
* Draw the list of available refit options for a consist and highlight the selected refit option (if any).
|
||||||
* @param *list First vehicle in consist to get the refit-options of
|
* @param *list First vehicle in consist to get the refit-options of
|
||||||
|
@ -430,6 +357,78 @@ struct RefitWindow : public Window {
|
||||||
VehicleOrderID order; ///< If not #INVALID_VEH_ORDER_ID, selection is part of a refit order (rather than execute directly).
|
VehicleOrderID order; ///< If not #INVALID_VEH_ORDER_ID, selection is part of a refit order (rather than execute directly).
|
||||||
Scrollbar *vscroll;
|
Scrollbar *vscroll;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects all (cargo, subcargo) refit options of a vehicle chain.
|
||||||
|
*/
|
||||||
|
void BuildRefitList()
|
||||||
|
{
|
||||||
|
this->list.Clear();
|
||||||
|
Vehicle *v = Vehicle::Get(this->window_number);
|
||||||
|
|
||||||
|
do {
|
||||||
|
const Engine *e = Engine::Get(v->engine_type);
|
||||||
|
uint32 cmask = e->info.refit_mask;
|
||||||
|
byte callback_mask = e->info.callback_mask;
|
||||||
|
|
||||||
|
/* Skip this engine if it does not carry anything */
|
||||||
|
if (!e->CanCarryCargo()) continue;
|
||||||
|
|
||||||
|
/* Loop through all cargos in the refit mask */
|
||||||
|
const CargoSpec *cs;
|
||||||
|
FOR_ALL_SORTED_CARGOSPECS(cs) {
|
||||||
|
CargoID cid = cs->Index();
|
||||||
|
/* Skip cargo type if it's not listed */
|
||||||
|
if (!HasBit(cmask, cid)) continue;
|
||||||
|
|
||||||
|
/* Check the vehicle's callback mask for cargo suffixes */
|
||||||
|
if (HasBit(callback_mask, CBM_VEHICLE_CARGO_SUFFIX)) {
|
||||||
|
/* Make a note of the original cargo type. It has to be
|
||||||
|
* changed to test the cargo & subtype... */
|
||||||
|
CargoID temp_cargo = v->cargo_type;
|
||||||
|
byte temp_subtype = v->cargo_subtype;
|
||||||
|
|
||||||
|
v->cargo_type = cid;
|
||||||
|
|
||||||
|
for (uint refit_cyc = 0; refit_cyc < MAX_REFIT_CYCLE; refit_cyc++) {
|
||||||
|
v->cargo_subtype = refit_cyc;
|
||||||
|
|
||||||
|
/* Make sure we don't pick up anything cached. */
|
||||||
|
v->First()->InvalidateNewGRFCache();
|
||||||
|
v->InvalidateNewGRFCache();
|
||||||
|
uint16 callback = GetVehicleCallback(CBID_VEHICLE_CARGO_SUFFIX, 0, 0, v->engine_type, v);
|
||||||
|
|
||||||
|
if (callback == 0xFF) callback = CALLBACK_FAILED;
|
||||||
|
if (refit_cyc != 0 && callback == CALLBACK_FAILED) break;
|
||||||
|
|
||||||
|
RefitOption option;
|
||||||
|
option.cargo = cid;
|
||||||
|
option.subtype = refit_cyc;
|
||||||
|
option.value = callback;
|
||||||
|
option.engine = v->engine_type;
|
||||||
|
this->list.Include(option);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset the vehicle's cargo type */
|
||||||
|
v->cargo_type = temp_cargo;
|
||||||
|
v->cargo_subtype = temp_subtype;
|
||||||
|
|
||||||
|
/* And make sure we haven't tainted the cache */
|
||||||
|
v->First()->InvalidateNewGRFCache();
|
||||||
|
v->InvalidateNewGRFCache();
|
||||||
|
} else {
|
||||||
|
/* No cargo suffix callback -- use no subtype */
|
||||||
|
RefitOption option;
|
||||||
|
option.cargo = cid;
|
||||||
|
option.subtype = 0;
|
||||||
|
option.value = CALLBACK_FAILED;
|
||||||
|
option.engine = INVALID_ENGINE;
|
||||||
|
this->list.Include(option);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while ((v->type == VEH_TRAIN || v->type == VEH_ROAD) && (v = v->Next()) != NULL);
|
||||||
|
this->vscroll->SetCount(this->list.Length());
|
||||||
|
}
|
||||||
|
|
||||||
RefitWindow(const WindowDesc *desc, const Vehicle *v, VehicleOrderID order) : Window()
|
RefitWindow(const WindowDesc *desc, const Vehicle *v, VehicleOrderID order) : Window()
|
||||||
{
|
{
|
||||||
this->CreateNestedTree(desc);
|
this->CreateNestedTree(desc);
|
||||||
|
@ -446,8 +445,6 @@ struct RefitWindow : public Window {
|
||||||
|
|
||||||
this->order = order;
|
this->order = order;
|
||||||
this->sel = -1;
|
this->sel = -1;
|
||||||
BuildRefitList(v, &this->list);
|
|
||||||
this->vscroll->SetCount(this->list.Length());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void OnInit()
|
virtual void OnInit()
|
||||||
|
@ -457,8 +454,7 @@ struct RefitWindow : public Window {
|
||||||
RefitOption current_refit_option = *(this->cargo);
|
RefitOption current_refit_option = *(this->cargo);
|
||||||
|
|
||||||
/* Rebuild the refit list */
|
/* Rebuild the refit list */
|
||||||
BuildRefitList(Vehicle::Get(this->window_number), &this->list);
|
this->BuildRefitList();
|
||||||
this->vscroll->SetCount(this->list.Length());
|
|
||||||
this->sel = -1;
|
this->sel = -1;
|
||||||
this->cargo = NULL;
|
this->cargo = NULL;
|
||||||
for (uint i = 0; i < this->list.Length(); i++) {
|
for (uint i = 0; i < this->list.Length(); i++) {
|
||||||
|
@ -525,9 +521,7 @@ struct RefitWindow : public Window {
|
||||||
{
|
{
|
||||||
switch (data) {
|
switch (data) {
|
||||||
case 0: { // The consist lenght of the vehicle has changed; rebuild the entire list.
|
case 0: { // The consist lenght of the vehicle has changed; rebuild the entire list.
|
||||||
Vehicle *v = Vehicle::Get(this->window_number);
|
this->BuildRefitList();
|
||||||
BuildRefitList(v, &this->list);
|
|
||||||
this->vscroll->SetCount(this->list.Length());
|
|
||||||
/* FALL THROUGH */
|
/* FALL THROUGH */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue