diff --git a/src/components/tabs/stock-list/StockWarnings.vue b/src/components/tabs/stock-list/StockWarnings.vue
index 817d8aa..185a897 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('; ') }}
(!)
-
+
{{ $t('stocklist.acceptable-mass-docs') }}
@@ -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/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/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/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..2306b54 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",
@@ -323,5 +325,14 @@
"418Vb_WIEBE": "loose cargo (sand, stone)",
"418Vb_ZOS": "loose cargo (sand, stone)",
"418Vb_ZUE": "loose cargo (sand, stone)"
+ },
+ "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_military_pn": "PN: military transport"
}
}
\ No newline at end of file
diff --git a/src/locales/pl.json b/src/locales/pl.json
index 62ffeeb..fbed476 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",
@@ -322,5 +324,14 @@
"418Vb_WIEBE": "drobnica, ładunki sypkie (piasek, kamień)",
"418Vb_ZOS": "drobnica, ładunki sypkie (piasek, kamień)",
"418Vb_ZUE": "drobnica, ładunki sypkie (piasek, kamień)"
+ },
+ "cargo-warnings": {
+ "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_military_pn": "PN: transport wojskowy"
}
}
\ No newline at end of file
diff --git a/src/store.ts b/src/store.ts
index 99db9af..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,
@@ -25,13 +26,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,
@@ -70,15 +69,13 @@ export const useStore = defineStore({
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),
@@ -87,15 +84,11 @@ export const useStore = defineStore({
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/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..a4f1905 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;
@@ -35,11 +22,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 +53,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;
@@ -72,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[]) {
@@ -83,27 +74,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[]) {
@@ -111,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;
}
@@ -123,23 +91,28 @@ 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;
+}
+
+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.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');
+ }
+ });
+
+ return warnings;
}