uint GetTotalCapacityOfArticulatedParts(EngineID engine) { uint total = 0; CargoArray cap = GetCapacityOfArticulatedParts(engine); for (CargoID c = 0; c < NUM_CARGO; c++) { total += cap[c]; } return total; }
/** * Checks whether the specs of freshly build articulated vehicles are consistent with the information specified in the purchase list. * Only essential information is checked to leave room for magic tricks/workarounds to grfcoders. * It checks: * For autoreplace/-renew: * - Default cargo type (without capacity) * - intersection and union of refit masks. */ void CheckConsistencyOfArticulatedVehicle(const Vehicle *v) { const Engine *engine = Engine::Get(v->engine_type); uint32 purchase_refit_union, purchase_refit_intersection; GetArticulatedRefitMasks(v->engine_type, true, &purchase_refit_union, &purchase_refit_intersection); CargoArray purchase_default_capacity = GetCapacityOfArticulatedParts(v->engine_type); uint32 real_refit_union = 0; uint32 real_refit_intersection = UINT_MAX; CargoArray real_default_capacity; do { uint32 refit_mask = GetAvailableVehicleCargoTypes(v->engine_type, true); real_refit_union |= refit_mask; if (refit_mask != 0) real_refit_intersection &= refit_mask; assert(v->cargo_type < NUM_CARGO); real_default_capacity[v->cargo_type] += v->cargo_cap; switch (v->type) { case VEH_TRAIN: v = Train::From(v)->HasArticulatedPart() ? Train::From(v)->GetNextArticPart() : NULL; break; case VEH_ROAD: v = RoadVehicle::From(v)->HasArticulatedPart() ? v->Next() : NULL; break; default: v = NULL; break; } } while (v != NULL); /* Check whether the vehicle carries more cargos than expected */ bool carries_more = false; for (CargoID cid = 0; cid < NUM_CARGO; cid++) { if (real_default_capacity[cid] != 0 && purchase_default_capacity[cid] == 0) { carries_more = true; break; } } /* show a warning once for each GRF after each game load */ if (real_refit_union != purchase_refit_union || real_refit_intersection != purchase_refit_intersection || carries_more) { ShowNewGrfVehicleError(engine->index, STR_NEWGRF_BUGGY, STR_NEWGRF_BUGGY_ARTICULATED_CARGO, GBUG_VEH_REFIT, false); } }
static int DrawCargoCapacityInfo(int left, int right, int y, EngineID engine, bool refittable) { CargoArray cap = GetCapacityOfArticulatedParts(engine); for (CargoID c = 0; c < NUM_CARGO; c++) { if (cap[c] == 0) continue; SetDParam(0, c); SetDParam(1, cap[c]); SetDParam(2, refittable ? STR_PURCHASE_INFO_REFITTABLE : STR_EMPTY); DrawString(left, right, y, STR_PURCHASE_INFO_CAPACITY); y += FONT_HEIGHT_NORMAL; /* Only show as refittable once */ refittable = false; } return y; }
int32 ScriptEventEnginePreview::GetCapacity() { if (!this->IsEngineValid()) return -1; const Engine *e = ::Engine::Get(this->engine); switch (e->type) { case VEH_ROAD: case VEH_TRAIN: { CargoArray capacities = GetCapacityOfArticulatedParts(this->engine); for (CargoID c = 0; c < NUM_CARGO; c++) { if (capacities[c] == 0) continue; return capacities[c]; } return -1; } case VEH_SHIP: case VEH_AIRCRAFT: return e->GetDisplayDefaultCapacity(); default: NOT_REACHED(); } }
/* static */ int32 ScriptEngine::GetCapacity(EngineID engine_id) { if (!IsValidEngine(engine_id)) return -1; const Engine *e = ::Engine::Get(engine_id); switch (e->type) { case VEH_ROAD: case VEH_TRAIN: { CargoArray capacities = GetCapacityOfArticulatedParts(engine_id); for (CargoID c = 0; c < NUM_CARGO; c++) { if (capacities[c] == 0) continue; return capacities[c]; } return -1; } case VEH_SHIP: case VEH_AIRCRAFT: return e->GetDisplayDefaultCapacity(); default: NOT_REACHED(); } }
/** * Get the capacity of an engine with articulated parts. * @param engine The engine to get the capacity of. * @return The capacity. */ uint GetTotalCapacityOfArticulatedParts(EngineID engine) { CargoArray cap = GetCapacityOfArticulatedParts(engine); return cap.GetSum<uint>(); }