From 39f26886113954ae77ffa92bf60c3e6dd7f923d1 Mon Sep 17 00:00:00 2001 From: Spythere Date: Sat, 31 May 2025 14:21:28 +0200 Subject: [PATCH 1/7] chore: prettier settings --- .prettierrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.prettierrc b/.prettierrc index cbd1fe3..93006ad 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,5 +2,5 @@ "semi": true, "singleQuote": true, "trailingComma": "es5", - "printWidth": 100 + "printWidth": 150 } From 32fbf519432f928c964c0cf833eba71305d32634 Mon Sep 17 00:00:00 2001 From: Spythere Date: Sat, 31 May 2025 14:21:43 +0200 Subject: [PATCH 2/7] refactor: calculating stock speed limit --- src/components/tabs/stock-list/StockSpecs.vue | 20 +-- src/constants/speedLimits.json | 153 ------------------ src/store.ts | 4 +- src/types/common.types.ts | 15 +- src/utils/vehicleLimitsUtils.ts | 52 ++++-- src/utils/vehicleUtils.ts | 29 +--- 6 files changed, 63 insertions(+), 210 deletions(-) delete mode 100644 src/constants/speedLimits.json diff --git a/src/components/tabs/stock-list/StockSpecs.vue b/src/components/tabs/stock-list/StockSpecs.vue index 6d7bf68..6f9634e 100644 --- a/src/components/tabs/stock-list/StockSpecs.vue +++ b/src/components/tabs/stock-list/StockSpecs.vue @@ -2,10 +2,7 @@
- + {{ store.chosenStorageStockName.slice(0, 40) }} {{ store.chosenStorageStockName.length > 41 ? '...' : '' }} @@ -16,11 +13,7 @@ - + {{ chosenRealComposition.number }} {{ chosenRealComposition.name }} @@ -30,14 +23,11 @@ {{ $t('stocklist.mass') }} {{ (store.totalWeight / 1000).toFixed(1) }}t ({{ $t('stocklist.mass-accepted') }}: - {{ - store.acceptableWeight ? `${~~(store.acceptableWeight / 1000)}t` : '-' - }}{{ store.acceptableWeight ? `${~~(store.acceptableWeight / 1000)}t` : '-' }}) - {{ $t('stocklist.length') }}: {{ store.totalLength }}m - - {{ $t('stocklist.vmax') }} - (?): - {{ store.maxStockSpeed }} km/h + - {{ $t('stocklist.vmax') }} (?): + {{ isFinite(store.maxStockSpeed) ? store.maxStockSpeed : '--' }} km/h
diff --git a/src/constants/speedLimits.json b/src/constants/speedLimits.json deleted file mode 100644 index 72afef0..0000000 --- a/src/constants/speedLimits.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "EU07": { - "passenger": { - "650000": 125 - }, - "cargo": { - "2000000": 70 - }, - "none": 110 - }, - "4E": { - "passenger": { - "650000": 125 - }, - "cargo": { - "2000000": 70 - }, - "none": 110 - }, - "EU07E": { - "passenger": { - "650000": 125 - }, - "cargo": { - "2000000": 70 - }, - "none": 110 - }, - "EP07": { - "passenger": { - "650000": 125 - }, - "cargo": null, - "none": 110 - }, - "EP08": { - "passenger": { - "650000": 140 - }, - "cargo": null, - "none": 110 - }, - "EP09": { - "passenger": { - "650000": 160 - }, - "cargo": null, - "none": 160 - }, - "ET22": { - "passenger": { - "650000": 125 - }, - "cargo": { - "1200000": 100, - "3100000": 70 - }, - "none": 125 - }, - "201E": { - "passenger": { - "650000": 125 - }, - "cargo": { - "1200000": 100, - "3100000": 70 - }, - "none": 125 - }, - "ET41": { - "passenger": { - "700000": 125 - }, - "cargo": { - "4000000": 70 - }, - "none": 110 - }, - "SM42": { - "passenger": { - "95000": 90, - "200000": 80, - "300000": 70, - "450000": 60, - "750000": 50, - "1130000": 40, - "1720000": 30, - "2400000": 20 - }, - "cargo": { - "95000": 90, - "200000": 80, - "300000": 70, - "450000": 60, - "750000": 50, - "1130000": 40, - "1720000": 30, - "2400000": 20 - }, - "none": 90 - }, - "M62": { - "passenger": { - "500000": 100, - "800000": 80, - "1200000": 60, - "2000000": 40, - "3000000": 20 - }, - "cargo": { - "500000": 100, - "800000": 80, - "1200000": 60, - "2000000": 40, - "3000000": 20 - }, - "none": 100 - }, - "ST44": { - "passenger": { - "500000": 100, - "800000": 80, - "1200000": 60, - "2000000": 40, - "3000000": 20 - }, - "cargo": { - "500000": 100, - "800000": 80, - "1200000": 60, - "2000000": 40, - "3000000": 20 - }, - "none": 100 - }, - "CTLR4C": { - "passenger": { - "500000": 100, - "800000": 80, - "1200000": 60, - "2000000": 40, - "3000000": 20 - }, - "cargo": { - "500000": 100, - "800000": 80, - "1200000": 60, - "2000000": 40, - "3000000": 20 - }, - "none": 100 - } -} diff --git a/src/store.ts b/src/store.ts index 99db9af..7863190 100644 --- a/src/store.ts +++ b/src/store.ts @@ -25,13 +25,11 @@ import { totalWeight, } from './utils/vehicleUtils'; -import i18n from './i18n-setup'; import http from './http'; import realCompositionsJSON from './data/realCompositions.json'; -export const useStore = defineStore({ - id: 'store', +export const useStore = defineStore('store', { state: () => ({ chosenCar: null as ICarWagon | null, chosenLoco: null as ILocomotive | null, diff --git a/src/types/common.types.ts b/src/types/common.types.ts index 8191609..6e5bb8f 100644 --- a/src/types/common.types.ts +++ b/src/types/common.types.ts @@ -28,12 +28,14 @@ export interface ILocomotive { constructionType: string; cabinType: string; maxSpeed: number; + maxSpeedLoco: number; weight: number; length: number; coldStart: boolean; doubleManned: boolean; sponsorOnlyTimestamp: number; teamOnly: boolean; + massSpeeds: VehicleGroupMassSpeeds | null; } export interface ICarWagon { @@ -42,11 +44,13 @@ export interface ICarWagon { constructionType: string; loadable: boolean; maxSpeed: number; + maxSpeedLoaded: number; weight: number; length: number; cargoTypes: ICargo[]; sponsorOnlyTimestamp: number; teamOnly: boolean; + massSpeeds: VehicleGroupMassSpeeds | null; } export interface IStock { @@ -83,10 +87,13 @@ export interface IVehicleGroup { id: number; name: string; speed: number; + speedLoaded?: number; + speedLoco?: number; length: number; weight: number; cargoTypes: IVehicleCargoType[] | null; locoProps: IVehicleLocoProps | null; + massSpeeds: VehicleGroupMassSpeeds | null; } export interface IVehicleCargoType { @@ -99,9 +106,15 @@ export interface IVehicleLocoProps { doubleManned: boolean; } +export interface VehicleGroupMassSpeeds { + passenger: Record | null; + cargo: Record | null; + none: number | null; +} + export interface StorageStockEntry { id: string; createdAt: number; updatedAt?: number; stockString: string; -} \ No newline at end of file +} diff --git a/src/utils/vehicleLimitsUtils.ts b/src/utils/vehicleLimitsUtils.ts index 722cd65..b0b03bd 100644 --- a/src/utils/vehicleLimitsUtils.ts +++ b/src/utils/vehicleLimitsUtils.ts @@ -1,29 +1,47 @@ -import speedLimits from '../constants/speedLimits.json'; import massLimits from '../constants/massLimits.json'; +import { IStock } from '../types/common.types'; -export type SpeedLimitLocoType = keyof typeof speedLimits; export type MassLimitLocoType = keyof typeof massLimits; -export function calculateSpeedLimit( - locoType: SpeedLimitLocoType, - stockTotalWeight: number, - stockCount: number, - isTrainPassenger: boolean -) { - if (speedLimits[locoType] === undefined) return 0; +export function calculateSpeedLimit(stockList: IStock[], isPassenger: boolean, stockMass: number) { + // Check the whole consist speed limit + const stockMaxSpeed = stockList.reduce((acc, vehicle, i) => { + let vehicleSpeed = vehicle.vehicleRef.maxSpeed; - if (stockCount == 1) return speedLimits[locoType]['none']; + if ( + vehicle.vehicleRef.group == 'wagon-freight' && + vehicle.cargo !== undefined && + vehicle.vehicleRef.maxSpeedLoaded + ) { + vehicleSpeed = vehicle.vehicleRef.maxSpeedLoaded; + } - const stockType = isTrainPassenger ? 'passenger' : 'cargo'; - const speedTable = speedLimits[locoType][stockType]; + return Math.min(vehicleSpeed, acc); + }, Infinity); - if (!speedTable) return undefined; + // Check the head vehicle speed limit + const headVehicle = stockList[0]; - let speedLimit = 0; - for (const mass in speedTable) - if (stockTotalWeight > Number(mass)) speedLimit = (speedTable as any)[mass]; + // Omit speed check for head vehicle if there's no data for it + if (!headVehicle || !headVehicle.vehicleRef.massSpeeds) return stockMaxSpeed; - return speedLimit; + const massSpeeds = + headVehicle.vehicleRef.massSpeeds[ + stockList.length == 1 ? 'none' : isPassenger ? 'passenger' : 'cargo' + ]; + + // Omit speed check if there's no data on mass speeds + if (!massSpeeds) return stockMaxSpeed; + + // Number type for locomotives alone + if (typeof massSpeeds === 'number') return massSpeeds; + + // Record type for passenger or cargo, find the closest range + const massKey = Object.keys(massSpeeds).findLast((massKey) => stockMass >= Number(massKey)); + + const massMaxSpeed = massKey ? massSpeeds[massKey] : Infinity; + + return Math.min(massMaxSpeed, stockMaxSpeed); } export function calculateMassLimit(locoType: MassLimitLocoType, isTrainPassenger: boolean) { diff --git a/src/utils/vehicleUtils.ts b/src/utils/vehicleUtils.ts index 7dc189f..d57a9a7 100644 --- a/src/utils/vehicleUtils.ts +++ b/src/utils/vehicleUtils.ts @@ -35,11 +35,14 @@ export function locoDataList(vehiclesData: IVehicleData[] | undefined) { teamOnly: data.restrictions?.teamOnly ?? false, maxSpeed: data.group.speed, + maxSpeedLoco: data.group.speedLoco ?? data.group.speed, length: data.group.length, weight: data.group.weight, coldStart: data.group.locoProps?.coldStart ?? false, doubleManned: data.group.locoProps?.doubleManned ?? false, + + massSpeeds: data.group.massSpeeds, }); return acc; @@ -63,8 +66,12 @@ export function carDataList(vehiclesData: IVehicleData[] | undefined) { teamOnly: data.restrictions?.teamOnly ?? false, maxSpeed: data.group.speed, + maxSpeedLoaded: data.group.speedLoaded ?? data.group.speed, + length: data.group.length, weight: data.group.weight, + + massSpeeds: data.group.massSpeeds, }); return acc; @@ -83,27 +90,7 @@ export function totalLength(stockList: IStock[]) { } export function maxStockSpeed(stockList: IStock[]) { - const stockSpeedLimit = stockList.reduce( - (acc, stock) => (stock.vehicleRef.maxSpeed < acc || acc == 0 ? stock.vehicleRef.maxSpeed : acc), - 0 - ); - const headingLoco = - stockList[0] && isTractionUnit(stockList[0].vehicleRef) ? stockList[0] : undefined; - - if (!headingLoco) return stockSpeedLimit; - - const locoType = headingLoco.vehicleRef.type.split('-')[0]; - - if (/^(EN|2EN|SN)/.test(locoType)) return stockSpeedLimit; - - const speedLimitByMass = calculateSpeedLimit( - locoType as SpeedLimitLocoType, - totalWeight(stockList), - stockList.length, - isTrainPassenger(stockList) - ); - - return speedLimitByMass ? Math.min(stockSpeedLimit, speedLimitByMass) : stockSpeedLimit; + return calculateSpeedLimit(stockList, isTrainPassenger(stockList), totalWeight(stockList)); } export function acceptableWeight(stockList: IStock[]) { From fe70b19f2ab669877c6b50452f2bd203b4f368c3 Mon Sep 17 00:00:00 2001 From: Spythere Date: Sat, 31 May 2025 14:42:00 +0200 Subject: [PATCH 3/7] chore: added new container cargo to generator --- src/data/generatorData.json | 311 ++++++++++++++++++++++++++++++++---- src/locales/en.json | 4 +- src/locales/pl.json | 4 +- 3 files changed, 289 insertions(+), 30 deletions(-) diff --git a/src/data/generatorData.json b/src/data/generatorData.json index 13b060a..0d30cc2 100644 --- a/src/data/generatorData.json +++ b/src/data/generatorData.json @@ -1,10 +1,197 @@ { "cargo": { - "kontenery": ["627Z:all", "412Z:all"], - "chłodnia": ["202Lc:all"], - "drobnica": ["426S:all", "208Kf:all", "401Ka_PKP_Gags:all", "401Ka_PKPC_Gags:all"], - "węgiel": ["412W:coal_01", "413S:coal_413S", "429W:coal_01", "401Zb:coal_02"], - "ruda": ["412W:ore_01", "401Zl:ore_35", "429W:ore_01"], + "kontenery": [ + "412Z:sc_20_red", + "412Z:sc_20_blue", + "412Z:sc_20_green", + "412Z:sc_20_APL", + "412Z:sc_20_CMA", + "412Z:sc_20_Cosco", + "412Z:sc_20_Evr1", + "412Z:sc_20_Evr2", + "412Z:sc_20_Finnlines", + "412Z:sc_20_Hamburg", + "412Z:sc_20_Hanjin", + "412Z:sc_20_HapagLloyd", + "412Z:sc_20_HMM", + "412Z:sc_20_KLine", + "412Z:sc_20_Maersk", + "412Z:sc_20_ONE", + "412Z:sc_20_OOCL", + "412Z:sc_20_Schavemaker", + "412Z:sc_20_TD2", + "412Z:sc_20_Titan", + "412Z:sc_20_Toll", + "412Z:sc_40_red", + "412Z:sc_40_blue", + "412Z:sc_40_green", + "412Z:sc_40_APL", + "412Z:sc_40_CMA", + "412Z:sc_40_Cosco", + "412Z:sc_40_Evr1", + "412Z:sc_40_Evr2", + "412Z:sc_40_Finnlines", + "412Z:sc_40_Hamburg", + "412Z:sc_40_Hanjin", + "412Z:sc_40_HapagLloyd", + "412Z:sc_40_HMM", + "412Z:sc_40_KLine", + "412Z:sc_40_Maersk", + "412Z:sc_40_ONE", + "412Z:sc_40_OOCL", + "412Z:sc_40_Schavemaker", + "412Z:sc_40_TD2", + "412Z:sc_40_Titan", + "412Z:sc_40_Toll", + "612Z:sc_20", + "612Z:sc_20_red", + "612Z:sc_20_blue", + "612Z:sc_20_green", + "612Z:sc_20_APL", + "612Z:sc_20_CMA", + "612Z:sc_20_Cosco", + "612Z:sc_20_Evr1", + "612Z:sc_20_Evr2", + "612Z:sc_20_Finnlines", + "612Z:sc_20_Hamburg", + "612Z:sc_20_Hanjin", + "612Z:sc_20_HapagLloyd", + "612Z:sc_20_HMM", + "612Z:sc_20_KLine", + "612Z:sc_20_Maersk", + "612Z:sc_20_ONE", + "612Z:sc_20_OOCL", + "612Z:sc_20_Schavemaker", + "612Z:sc_20_TD2", + "612Z:sc_20_Titan", + "612Z:sc_20_Toll", + "612Z:sc_40_red", + "612Z:sc_40", + "612Z:sc_40_blue", + "612Z:sc_40_green", + "612Z:sc_40_APL", + "612Z:sc_40_CMA", + "612Z:sc_40_Cosco", + "612Z:sc_40_Evr1", + "612Z:sc_40_Evr2", + "612Z:sc_40_Finnlines", + "612Z:sc_40_Hamburg", + "612Z:sc_40_Hanjin", + "612Z:sc_40_HapagLloyd", + "612Z:sc_40_HMM", + "612Z:sc_40_KLine", + "612Z:sc_40_Maersk", + "612Z:sc_40_ONE", + "612Z:sc_40_OOCL", + "612Z:sc_40_Schavemaker", + "612Z:sc_40_TD2", + "612Z:sc_40_Titan", + "612Z:sc_40_Toll" + ], + "biomasa": [ + "412Z:wt_20_biomass", + "412Z:wt_20_mix_black_green_biomass", + "412Z:wt_20_mix_blue_biomass", + "412Z:wt_20_mix_blue_CDC_white_biomass", + "412Z:wt_20_mix_blue_white_biomass", + "412Z:wt_20_mix_EPC_biomass", + "412Z:wt_20_mix_green_biomass", + "412Z:wt_20_black_biomass", + "412Z:wt_20_blue_biomass", + "412Z:wt_20_blue_gr_biomass", + "412Z:wt_20_blue_gr_r_biomass", + "412Z:wt_20_CDC_biomass", + "412Z:wt_20_EPC_black_biomass", + "412Z:wt_20_EPC_red_biomass", + "412Z:wt_20_green_new_biomass", + "412Z:wt_20_green_old_biomass", + "412Z:wt_20_white_new_biomass", + "412Z:wt_20_white_old_biomass", + "412Z:wt_20_white_old_gr_biomass", + "412Z:wt_20_white_old_gr_r_biomass", + "627Z:wt_20_biomass", + "627Z:wt_20_mix_black_green_biomass", + "627Z:wt_20_mix_blue_biomass", + "627Z:wt_20_mix_blue_CDC_white_biomass", + "627Z:wt_20_mix_blue_white_biomass", + "627Z:wt_20_mix_EPC_biomass", + "627Z:wt_20_mix_green_biomass", + "627Z:wt_20_black_biomass", + "627Z:wt_20_blue_biomass", + "627Z:wt_20_blue_gr_biomass", + "627Z:wt_20_blue_gr_r_biomass", + "627Z:wt_20_CDC_biomass", + "627Z:wt_20_EPC_black_biomass", + "627Z:wt_20_EPC_red_biomass", + "627Z:wt_20_green_new_biomass", + "627Z:wt_20_green_old_biomass", + "627Z:wt_20_white_new_biomass", + "627Z:wt_20_white_old_biomass", + "627Z:wt_20_white_old_gr_biomass", + "627Z:wt_20_white_old_gr_r_biomass" + ], + "biomasa-puste": [ + "412Z:wt_20_empty", + "412Z:wt_20_mix_black_green_empty", + "412Z:wt_20_mix_blue_empty", + "412Z:wt_20_mix_blue_CDC_white_empty", + "412Z:wt_20_mix_blue_white_empty", + "412Z:wt_20_mix_EPC_empty", + "412Z:wt_20_mix_green_empty", + "412Z:wt_20_black_empty", + "412Z:wt_20_blue_empty", + "412Z:wt_20_blue_gr_empty", + "412Z:wt_20_blue_gr_r_empty", + "412Z:wt_20_CDC_empty", + "412Z:wt_20_EPC_black_empty", + "412Z:wt_20_EPC_red_empty", + "412Z:wt_20_green_new_empty", + "412Z:wt_20_green_old_empty", + "412Z:wt_20_white_new_empty", + "412Z:wt_20_white_old_empty", + "412Z:wt_20_white_old_gr_empty", + "412Z:wt_20_white_old_gr_r_empty", + "627Z:wt_20_empty", + "627Z:wt_20_mix_black_green_empty", + "627Z:wt_20_mix_blue_empty", + "627Z:wt_20_mix_blue_CDC_white_empty", + "627Z:wt_20_mix_blue_white_empty", + "627Z:wt_20_mix_EPC_empty", + "627Z:wt_20_mix_green_empty", + "627Z:wt_20_black_empty", + "627Z:wt_20_blue_empty", + "627Z:wt_20_blue_gr_empty", + "627Z:wt_20_blue_gr_r_empty", + "627Z:wt_20_CDC_empty", + "627Z:wt_20_EPC_black_empty", + "627Z:wt_20_EPC_red_empty", + "627Z:wt_20_green_new_empty", + "627Z:wt_20_green_old_empty", + "627Z:wt_20_white_new_empty", + "627Z:wt_20_white_old_empty", + "627Z:wt_20_white_old_gr_empty", + "627Z:wt_20_white_old_gr_r_empty" + ], + "chłodnia": [ + "202Lc:all" + ], + "drobnica": [ + "426S:all", + "208Kf:all", + "401Ka_PKP_Gags:all", + "401Ka_PKPC_Gags:all" + ], + "węgiel": [ + "412W:coal_01", + "413S:coal_413S", + "429W:coal_01", + "401Zb:coal_02" + ], + "ruda": [ + "412W:ore_01", + "401Zl:ore_35", + "429W:ore_01" + ], "piasek": [ "412W:sand_01", "412W:sand_02", @@ -16,7 +203,9 @@ "418Va:sand_418V", "418Vb:sand_418V" ], - "kreda": ["413S:chalk_413S"], + "kreda": [ + "413S:chalk_413S" + ], "kamień": [ "412W:stone_01", "412W:stone_50", @@ -26,32 +215,98 @@ "418Va:stone_418V", "418Vb:stone_418V" ], - "złom": ["412W:scrap_01", "412W:scrap_02", "429W:scrap_01", "429W:scrap_02"], - "paliwo": ["29R_CTLL:all", "29R_PKP:all", "445Rb:all"], - "melasa": ["29R_PLPOL:all"], - "żwir": ["441V"], - "koła": ["424Z:wheels_01"], - "drewno": ["424Z:woods_01", "424Z:woods_02"], - "szyny": ["424Z:rails_01"], - "kable": ["424Z:cables_01", "24Z:cables_Ks", "401Ze:cables_02"], - "kruszywo": ["59WS:all"], - "techniczne": ["209c", "304Ca", "102a_PKPE", "401Ka_PKP_XGa:all"], - "poczta": ["211K:all"], + "złom": [ + "412W:scrap_01", + "412W:scrap_02", + "429W:scrap_01", + "429W:scrap_02" + ], + "paliwo": [ + "29R_CTLL:all", + "29R_PKP:all", + "445Rb:all" + ], + "melasa": [ + "29R_PLPOL:all" + ], + "żwir": [ + "441V" + ], + "koła": [ + "424Z:wheels_01" + ], + "drewno": [ + "424Z:woods_01", + "424Z:woods_02" + ], + "szyny": [ + "424Z:rails_01" + ], + "kable": [ + "424Z:cables_01", + "24Z:cables_Ks", + "401Ze:cables_02" + ], + "kruszywo": [ + "59WS:all" + ], + "techniczne": [ + "209c", + "304Ca", + "102a_PKPE", + "401Ka_PKP_XGa:all" + ], + "poczta": [ + "211K:all" + ], "cement": [ "408S:cement_4", "206S_CEMET:cement_3", "206S_SPEED:cement_3", "220S_CEMET:cement_3" ], - "wapno": ["408S:lime_4", "206S_CEMET:lime_3", "206S_SPEED:lime_3", "220S_CEMET:lime_3"], - "soda": ["408S:soda_4", "206S_CEMET:soda_3", "206S_SPEED:soda_3", "220S_CEMET:soda_3"], - "pszenica": ["206Sh_PKP_Ugpps:wheat_3", "206Sh_PKPC_Ugpps:wheat_3"], - "kukurydza": ["206Sh_PKP_Ugpps:corn_3", "206Sh_PKPC_Ugpps:corn_3"], - "pasza": ["206Sh_PKP_Ugpps:forage_3", "206Sh_PKPC_Ugpps:forage_3"], - "pojazdy": ["426Z:tank_01", "426Z:truck_01", "426Z:vehicles_01"], - "karbid": ["421S:carbide_01"], - "wrażliwe": ["425S:all", "421S:carbide_01"], - "stal": ["401Ze:steel_01", "401Ze:steel_02"], - "gaz": ["WB117:all"] + "wapno": [ + "408S:lime_4", + "206S_CEMET:lime_3", + "206S_SPEED:lime_3", + "220S_CEMET:lime_3" + ], + "soda": [ + "408S:soda_4", + "206S_CEMET:soda_3", + "206S_SPEED:soda_3", + "220S_CEMET:soda_3" + ], + "pszenica": [ + "206Sh_PKP_Ugpps:wheat_3", + "206Sh_PKPC_Ugpps:wheat_3" + ], + "kukurydza": [ + "206Sh_PKP_Ugpps:corn_3", + "206Sh_PKPC_Ugpps:corn_3" + ], + "pasza": [ + "206Sh_PKP_Ugpps:forage_3", + "206Sh_PKPC_Ugpps:forage_3" + ], + "pojazdy": [ + "426Z:tank_01", + "426Z:truck_01", + "426Z:vehicles_01" + ], + "karbid": [ + "421S:carbide_01" + ], + "wrażliwe": [ + "425S:all", + "421S:carbide_01" + ], + "stal": [ + "401Ze:steel_01", + "401Ze:steel_02" + ], + "gaz": [ + "WB117:all" + ] } -} +} \ No newline at end of file diff --git a/src/locales/en.json b/src/locales/en.json index 304e3c2..60270ff 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -101,7 +101,7 @@ "chosen-empty-warning": "Choose at least one cargo type to see available cars!", "chosen-warning": "Cars containing chosen cargo are shown below. Hover over a type to see a preview of the car. Click it to include/exclude it from a drawing (only highlighted types will be included).", "action-generate": "GENERATE", - "action-generate-empty": "GENERATE EMPTY", + "action-generate-empty": "GENERATE CARS ALONE", "action-reset": "RESET CARGO" }, "numgen": { @@ -221,6 +221,8 @@ }, "cargo": { "kontenery": "containers", + "biomasa": "biomass", + "biomasa-puste": "biomass (empty)", "chłodnia": "refrigerator", "drobnica": "loose cargo", "węgiel": "coal", diff --git a/src/locales/pl.json b/src/locales/pl.json index 62ffeeb..a1914f7 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -101,7 +101,7 @@ "chosen-empty-warning": "Wybierz co najmniej jeden ładunek, aby zobaczyć wagony, które go posiadają!", "chosen-warning": "Wagony posiadające wybrane ładunki. Najedź na nazwę, aby zobaczyć podgląd wagonu. Kliknij, aby wyłączyć z losowania (tylko podświetlone nazwy będą uwzględnione).", "action-generate": "WYGENERUJ", - "action-generate-empty": "WYGENERUJ PRÓŻNE WAGONY", + "action-generate-empty": "WYGENERUJ SAME WAGONY", "action-reset": "ZRESETUJ ŁADUNKI" }, "numgen": { @@ -221,6 +221,8 @@ }, "cargo": { "kontenery": "kontenery", + "biomasa": "biomasa", + "biomasa-puste": "biomasa (puste)", "chłodnia": "chłodnia", "drobnica": "drobnica", "węgiel": "węgiel", From 09e5c5355828ecd1d7388cf15e0c501536e4bc10 Mon Sep 17 00:00:00 2001 From: Spythere Date: Sat, 31 May 2025 15:38:15 +0200 Subject: [PATCH 4/7] chore: updated acceptable mass limits --- src/constants/massLimits.json | 9 +++++++- src/utils/vehicleUtils.ts | 43 ++++++----------------------------- 2 files changed, 15 insertions(+), 37 deletions(-) diff --git a/src/constants/massLimits.json b/src/constants/massLimits.json index d4d3a15..8011058 100644 --- a/src/constants/massLimits.json +++ b/src/constants/massLimits.json @@ -7,5 +7,12 @@ "EP08": [650000, 650000], "EP09": [800000, 800000], "ET41": [700000, 4000000], - "SM42": [2400000, 2400000] + "SM42": [2400000, 2400000], + "ET22": [650000, 3100000], + "201E": [650000, 3100000], + "ST44": [3000000, 3000000], + "M62": [3000000, 3000000], + "CTLR4C": [3000000, 3000000], + "SU45": [1500000, 1500000], + "SP45": [1500000, 1500000] } diff --git a/src/utils/vehicleUtils.ts b/src/utils/vehicleUtils.ts index d57a9a7..5915910 100644 --- a/src/utils/vehicleUtils.ts +++ b/src/utils/vehicleUtils.ts @@ -1,18 +1,5 @@ -import { - ICarWagon, - ILocomotive, - IStock, - IVehicleData, - IVehiclesAPIResponse, - LocoGroupType, - WagonGroupType, -} from '../types/common.types'; -import { - MassLimitLocoType, - SpeedLimitLocoType, - calculateMassLimit, - calculateSpeedLimit, -} from './vehicleLimitsUtils'; +import { ICarWagon, ILocomotive, IStock, IVehicleData, LocoGroupType, WagonGroupType } from '../types/common.types'; +import { MassLimitLocoType, calculateMassLimit, calculateSpeedLimit } from './vehicleLimitsUtils'; export function isTractionUnit(vehicle: ILocomotive | ICarWagon): vehicle is ILocomotive { return (vehicle as ILocomotive).cabinType !== undefined; @@ -79,10 +66,7 @@ export function carDataList(vehiclesData: IVehicleData[] | undefined) { } export function totalWeight(stockList: IStock[]) { - return stockList.reduce( - (acc, stock) => acc + (stock.vehicleRef.weight + (stock.cargo?.weight ?? 0)), - 0 - ); + return stockList.reduce((acc, stock) => acc + (stock.vehicleRef.weight + (stock.cargo?.weight ?? 0)), 0); } export function totalLength(stockList: IStock[]) { @@ -98,10 +82,7 @@ export function acceptableWeight(stockList: IStock[]) { const activeLocomotiveType = stockList[0].vehicleRef.type.split('-')[0]; - const locoMassLimit = calculateMassLimit( - activeLocomotiveType as MassLimitLocoType, - isTrainPassenger(stockList) - ); + const locoMassLimit = calculateMassLimit(activeLocomotiveType as MassLimitLocoType, isTrainPassenger(stockList)); return locoMassLimit; } @@ -110,23 +91,13 @@ export function isTrainPassenger(stockList: IStock[]) { if (stockList.length == 0) return false; if (stockList.every((stock) => isTractionUnit(stock.vehicleRef))) return false; - return stockList - .filter((stock) => !isTractionUnit(stock.vehicleRef)) - .every((stock) => stock.vehicleRef.group === 'wagon-passenger'); + return stockList.filter((stock) => !isTractionUnit(stock.vehicleRef)).every((stock) => stock.vehicleRef.group === 'wagon-passenger'); } export function stockSupportsColdStart(stockList: IStock[]) { - return ( - stockList.length == 1 && - isTractionUnit(stockList[0].vehicleRef) && - stockList[0].vehicleRef.coldStart - ); + return stockList.length == 1 && isTractionUnit(stockList[0].vehicleRef) && stockList[0].vehicleRef.coldStart; } export function stockSupportsDoubleManning(stockList: IStock[]) { - return ( - stockList.length != 0 && - isTractionUnit(stockList[0].vehicleRef) && - stockList[0].vehicleRef.doubleManned - ); + return stockList.length != 0 && isTractionUnit(stockList[0].vehicleRef) && stockList[0].vehicleRef.doubleManned; } From 05ae446af720f07ccb24c37b94c4c5d91695d99f Mon Sep 17 00:00:00 2001 From: Spythere Date: Sat, 31 May 2025 23:32:41 +0200 Subject: [PATCH 5/7] chore: added additional cargo warnings --- .../tabs/stock-list/StockWarnings.vue | 37 ++++++------------- src/locales/en.json | 8 ++++ src/locales/pl.json | 8 ++++ src/store.ts | 15 +++----- src/utils/vehicleUtils.ts | 14 +++++++ 5 files changed, 47 insertions(+), 35 deletions(-) diff --git a/src/components/tabs/stock-list/StockWarnings.vue b/src/components/tabs/stock-list/StockWarnings.vue index 817d8aa..d00be8c 100644 --- a/src/components/tabs/stock-list/StockWarnings.vue +++ b/src/components/tabs/stock-list/StockWarnings.vue @@ -2,31 +2,25 @@
(!) {{ $t('stocklist.warning-not-suitable') }}
-
- (!) {{ $t('stocklist.warning-passenger-too-long') }} -
+
(!) {{ $t('stocklist.warning-passenger-too-long') }}
-
- (!) {{ $t('stocklist.warning-freight-too-long') }} -
+
(!) {{ $t('stocklist.warning-freight-too-long') }}
(!) - {{ - $t('stocklist.warning-team-only-vehicle', [ - teamOnlyVehicles.map((v) => v.vehicleRef.type).join(', '), - ]) - }} + {{ $t('stocklist.warning-team-only-vehicle', [teamOnlyVehicles.map((v) => v.vehicleRef.type).join(', ')]) }} +
+ +
+ {{ $t('cargo-warnings.title') }} + {{ [...store.cargoWarnings].map((v) => $t(`cargo-warnings.${v}`)).join('; ') }}
(!) @@ -55,16 +49,11 @@ export default defineComponent({ }, hasAnyWarnings() { - return ( - this.weightExceeded || this.lengthExceeded || this.locoNotSuitable || this.teamOnlyVehicles - ); + return this.weightExceeded || this.lengthExceeded || this.locoNotSuitable || this.teamOnlyVehicles; }, lengthExceeded() { - return ( - (this.store.totalLength > 350 && this.store.isTrainPassenger) || - (this.store.totalLength > 650 && !this.store.isTrainPassenger) - ); + return (this.store.totalLength > 350 && this.store.isTrainPassenger) || (this.store.totalLength > 650 && !this.store.isTrainPassenger); }, weightExceeded() { @@ -76,9 +65,7 @@ export default defineComponent({ !this.store.isTrainPassenger && this.store.stockList.length > 1 && !this.store.stockList.every((stock) => isTractionUnit(stock.vehicleRef)) && - this.store.stockList.some( - (stock) => isTractionUnit(stock.vehicleRef) && stock.vehicleRef.type.startsWith('EP') - ) + this.store.stockList.some((stock) => isTractionUnit(stock.vehicleRef) && stock.vehicleRef.type.startsWith('EP')) ); }, }, diff --git a/src/locales/en.json b/src/locales/en.json index 60270ff..93ce4b2 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -325,5 +325,13 @@ "418Vb_WIEBE": "loose cargo (sand, stone)", "418Vb_ZOS": "loose cargo (sand, stone)", "418Vb_ZUE": "loose cargo (sand, stone)" + }, + "cargo-warnings": { + "title": "Cargo warnings:", + "warning_wt_20_pn": "PN: exceeded gauge (Innofreight - C45)", + "warning_un1965_twr": "TWR: LPG (UN 1965)", + "warning_un1965_tn": "TN: LPG - empty tank (UN 1965)", + "warning_un1202_twr": "TWR: diesel fuel (UN 1202)", + "warning_un1202_tn": "TN: diesel fuel - empty tank (UN 1202)" } } \ No newline at end of file diff --git a/src/locales/pl.json b/src/locales/pl.json index a1914f7..8f65fa5 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -324,5 +324,13 @@ "418Vb_WIEBE": "drobnica, ładunki sypkie (piasek, kamień)", "418Vb_ZOS": "drobnica, ładunki sypkie (piasek, kamień)", "418Vb_ZUE": "drobnica, ładunki sypkie (piasek, kamień)" + }, + "cargo-warnings": { + "title": "Uwagi przewozowe:", + "warning_wt_20_pn": "PN: przekroczona skrajnia (Innofreight - C45)", + "warning_un1965_twr": "TWR: gazy węglowodorowe skroplone (UN 1965)", + "warning_un1965_tn": "TN: gazy węglowodorowe skroplone - puste cysterny (UN 1965)", + "warning_un1202_twr": "TWR: olej napędowy (UN 1202)", + "warning_un1202_tn": "TN: olej napędowy - puste cysterny (UN 1202)" } } \ No newline at end of file diff --git a/src/store.ts b/src/store.ts index 7863190..9bfaed3 100644 --- a/src/store.ts +++ b/src/store.ts @@ -15,6 +15,7 @@ import { defineStore } from 'pinia'; import { acceptableWeight, carDataList, + getCargoWarnings, isTractionUnit, isTrainPassenger, locoDataList, @@ -68,15 +69,13 @@ export const useStore = defineStore('store', { getters: { locoDataList: (state) => locoDataList(state.vehiclesData), carDataList: (state) => carDataList(state.vehiclesData), - vehicleDataList: (state) => [ - ...locoDataList(state.vehiclesData), - ...carDataList(state.vehiclesData), - ], + vehicleDataList: (state) => [...locoDataList(state.vehiclesData), ...carDataList(state.vehiclesData)], totalWeight: (state) => totalWeight(state.stockList), totalLength: (state) => totalLength(state.stockList), maxStockSpeed: (state) => maxStockSpeed(state.stockList), isTrainPassenger: (state) => isTrainPassenger(state.stockList), acceptableWeight: (state) => acceptableWeight(state.stockList), + cargoWarnings: (state) => getCargoWarnings(state.stockList), stockSupportsColdStart: (state) => stockSupportsColdStart(state.stockList), stockSupportsDoubleManning: (state) => stockSupportsDoubleManning(state.stockList), @@ -85,15 +84,11 @@ export const useStore = defineStore('store', { if (state.stockList.length == 0) return ''; const coldStartActive = state.isColdStart && stockSupportsColdStart(state.stockList); - const doubleManningActive = - state.isDoubleManned && stockSupportsDoubleManning(state.stockList); + const doubleManningActive = state.isDoubleManned && stockSupportsDoubleManning(state.stockList); return state.stockList .map((stock, i) => { - let stockTypeStr = - isTractionUnit(stock.vehicleRef) || !stock.cargo - ? stock.vehicleRef.type - : `${stock.vehicleRef.type}:${stock.cargo.id}`; + let stockTypeStr = isTractionUnit(stock.vehicleRef) || !stock.cargo ? stock.vehicleRef.type : `${stock.vehicleRef.type}:${stock.cargo.id}`; if (i == 0 && (coldStartActive || doubleManningActive)) return `${stockTypeStr},${coldStartActive ? 'c' : ''}${doubleManningActive ? 'd' : ''}`; diff --git a/src/utils/vehicleUtils.ts b/src/utils/vehicleUtils.ts index 5915910..c0defeb 100644 --- a/src/utils/vehicleUtils.ts +++ b/src/utils/vehicleUtils.ts @@ -101,3 +101,17 @@ export function stockSupportsColdStart(stockList: IStock[]) { export function stockSupportsDoubleManning(stockList: IStock[]) { return stockList.length != 0 && isTractionUnit(stockList[0].vehicleRef) && stockList[0].vehicleRef.doubleManned; } + +export function getCargoWarnings(stockList: IStock[]) { + let warnings: Set = new Set(); + + stockList.forEach((stockVehicle) => { + if (stockVehicle.vehicleRef.group == 'wagon-freight') { + if (stockVehicle.cargo && stockVehicle.cargo.id.startsWith('wt_20')) warnings.add('warning_wt_20_pn'); + else if (stockVehicle.vehicleRef.type.startsWith('WB117')) warnings.add(stockVehicle.cargo ? 'warning_un1965_twr' : 'warning_un1965_tn'); + else if (stockVehicle.vehicleRef.type.startsWith('445Rb')) warnings.add(stockVehicle.cargo ? 'warning_un1202_twr' : 'warning_un1202_tn'); + } + }); + + return warnings; +} From b68e9da71524ec20fd8e6f7a6b1b719b9a54152e Mon Sep 17 00:00:00 2001 From: Spythere Date: Sun, 1 Jun 2025 17:25:14 +0200 Subject: [PATCH 6/7] chore: new cargo warning --- src/components/tabs/stock-list/StockWarnings.vue | 2 +- src/locales/en.json | 5 +++-- src/locales/pl.json | 5 +++-- src/utils/vehicleUtils.ts | 1 + 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/tabs/stock-list/StockWarnings.vue b/src/components/tabs/stock-list/StockWarnings.vue index d00be8c..185a897 100644 --- a/src/components/tabs/stock-list/StockWarnings.vue +++ b/src/components/tabs/stock-list/StockWarnings.vue @@ -12,7 +12,7 @@
- {{ $t('cargo-warnings.title') }} + (!) {{ $t('cargo-warnings.title') }} {{ [...store.cargoWarnings].map((v) => $t(`cargo-warnings.${v}`)).join('; ') }}
diff --git a/src/locales/en.json b/src/locales/en.json index 93ce4b2..2306b54 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -327,11 +327,12 @@ "418Vb_ZUE": "loose cargo (sand, stone)" }, "cargo-warnings": { - "title": "Cargo warnings:", + "title": "Rolling stock containing extra cargo warnings:", "warning_wt_20_pn": "PN: exceeded gauge (Innofreight - C45)", "warning_un1965_twr": "TWR: LPG (UN 1965)", "warning_un1965_tn": "TN: LPG - empty tank (UN 1965)", "warning_un1202_twr": "TWR: diesel fuel (UN 1202)", - "warning_un1202_tn": "TN: diesel fuel - empty tank (UN 1202)" + "warning_un1202_tn": "TN: diesel fuel - empty tank (UN 1202)", + "warning_military_pn": "PN: military transport" } } \ No newline at end of file diff --git a/src/locales/pl.json b/src/locales/pl.json index 8f65fa5..fbed476 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -326,11 +326,12 @@ "418Vb_ZUE": "drobnica, ładunki sypkie (piasek, kamień)" }, "cargo-warnings": { - "title": "Uwagi przewozowe:", + "title": "Skład z dodatkowymi uwagami przewozowymi:", "warning_wt_20_pn": "PN: przekroczona skrajnia (Innofreight - C45)", "warning_un1965_twr": "TWR: gazy węglowodorowe skroplone (UN 1965)", "warning_un1965_tn": "TN: gazy węglowodorowe skroplone - puste cysterny (UN 1965)", "warning_un1202_twr": "TWR: olej napędowy (UN 1202)", - "warning_un1202_tn": "TN: olej napędowy - puste cysterny (UN 1202)" + "warning_un1202_tn": "TN: olej napędowy - puste cysterny (UN 1202)", + "warning_military_pn": "PN: transport wojskowy" } } \ No newline at end of file diff --git a/src/utils/vehicleUtils.ts b/src/utils/vehicleUtils.ts index c0defeb..a4f1905 100644 --- a/src/utils/vehicleUtils.ts +++ b/src/utils/vehicleUtils.ts @@ -108,6 +108,7 @@ export function getCargoWarnings(stockList: IStock[]) { stockList.forEach((stockVehicle) => { if (stockVehicle.vehicleRef.group == 'wagon-freight') { if (stockVehicle.cargo && stockVehicle.cargo.id.startsWith('wt_20')) warnings.add('warning_wt_20_pn'); + else if (stockVehicle.cargo && /^(tank|vehicles|truck)/.test(stockVehicle.cargo.id)) warnings.add('warning_military_pn'); else if (stockVehicle.vehicleRef.type.startsWith('WB117')) warnings.add(stockVehicle.cargo ? 'warning_un1965_twr' : 'warning_un1965_tn'); else if (stockVehicle.vehicleRef.type.startsWith('445Rb')) warnings.add(stockVehicle.cargo ? 'warning_un1202_twr' : 'warning_un1202_tn'); } From 633f7f4c26d960bfc7c5c0d91d8e3f0895a71844 Mon Sep 17 00:00:00 2001 From: Spythere Date: Sun, 1 Jun 2025 17:25:41 +0200 Subject: [PATCH 7/7] bump: v1.9.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a669bdc..ca45604 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pojazdownik", - "version": "1.9.1", + "version": "1.9.2", "private": true, "type": "module", "scripts": {