chore(stock): added supporting internal cargo for generating 627Z & 412Z mixed containers

This commit is contained in:
2026-04-01 23:04:15 +02:00
parent 80a694dd23
commit 5220eeb236
5 changed files with 109 additions and 16 deletions
@@ -110,7 +110,7 @@ import { isTractionUnit } from '../../../utils/vehicleUtils';
import stockMixin from '../../../mixins/stockMixin'; import stockMixin from '../../../mixins/stockMixin';
import { useStockListUtils } from '../../../utils/stockListUtils'; import { useStockListUtils } from '../../../utils/stockListUtils';
import { getCurrentStockFileName } from '../../../composables/file'; import { getCurrentStockFileName, getStockStringOutput } from '../../../composables/file';
import { import {
Bookmark, Bookmark,
@@ -166,7 +166,7 @@ export default defineComponent({
methods: { methods: {
copyToClipboard() { copyToClipboard() {
navigator.clipboard.writeText(this.store.stockString); navigator.clipboard.writeText(getStockStringOutput());
setTimeout(() => { setTimeout(() => {
alert(this.$t('stocklist.alert-copied')); alert(this.$t('stocklist.alert-copied'));
@@ -224,7 +224,7 @@ export default defineComponent({
if (!fileName) return; if (!fileName) return;
const blob = new Blob([this.store.stockString]); const blob = new Blob([getStockStringOutput()]);
const file = fileName + '.con'; const file = fileName + '.con';
var e = document.createEvent('MouseEvents'), var e = document.createEvent('MouseEvents'),
+25
View File
@@ -1,4 +1,5 @@
import { useStore } from '../store'; import { useStore } from '../store';
import { additionalCargoTypes } from '../utils/vehicleUtils';
export function getCurrentStockFileName() { export function getCurrentStockFileName() {
const store = useStore(); const store = useStore();
@@ -23,3 +24,27 @@ export function getCurrentStockFileName() {
return fileName; return fileName;
} }
export function getStockStringOutput() {
const store = useStore();
const stockEntries = store.stockString.split(';');
const parsedEntries = store.stockList.map((stockVehicle, i) => {
if (stockVehicle.cargo && /412Z|627Z/.test(stockVehicle.vehicleRef.constructionType)) {
const additionalCargo = additionalCargoTypes.find(
(c) => c.groupType == stockVehicle.vehicleRef.constructionType && c.id == stockVehicle.cargo!.id
);
if (additionalCargo) {
let cargoString = additionalCargo.cargoStringVariations[Math.floor(Math.random() * additionalCargo.cargoStringVariations.length)];
return stockEntries[i].replace(stockVehicle.cargo.id, cargoString);
}
}
return stockEntries[i];
});
return parsedEntries.join(';');
}
+17 -10
View File
@@ -1,7 +1,7 @@
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { useStore } from '../store'; import { useStore } from '../store';
import { ICarWagon, ILocomotive, IStock, ICargo, IVehicle } from '../types/common.types'; import { ICarWagon, ILocomotive, IStock, ICargo, IVehicle } from '../types/common.types';
import { isTractionUnit } from '../utils/vehicleUtils'; import { additionalCargoTypes, isTractionUnit } from '../utils/vehicleUtils';
export default defineComponent({ export default defineComponent({
setup() { setup() {
@@ -28,11 +28,7 @@ export default defineComponent({
const stock = this.getStockObject(vehicle, cargo); const stock = this.getStockObject(vehicle, cargo);
if ( if (isTractionUnit(stock.vehicleRef) && this.store.stockList.length > 0 && !isTractionUnit(this.store.stockList[0].vehicleRef))
isTractionUnit(stock.vehicleRef) &&
this.store.stockList.length > 0 &&
!isTractionUnit(this.store.stockList[0].vehicleRef)
)
this.store.stockList.unshift(stock); this.store.stockList.unshift(stock);
else this.store.stockList.push(stock); else this.store.stockList.push(stock);
}, },
@@ -40,8 +36,7 @@ export default defineComponent({
addLocomotive(loco: ILocomotive) { addLocomotive(loco: ILocomotive) {
const stockObj = this.getStockObject(loco); const stockObj = this.getStockObject(loco);
if (this.store.stockList.length > 0 && !isTractionUnit(this.store.stockList[0].vehicleRef)) if (this.store.stockList.length > 0 && !isTractionUnit(this.store.stockList[0].vehicleRef)) this.store.stockList.unshift(stockObj);
this.store.stockList.unshift(stockObj);
else this.store.stockList.push(stockObj); else this.store.stockList.push(stockObj);
}, },
@@ -80,10 +75,22 @@ export default defineComponent({
this.store.isDoubleManned = spawnProps.includes('d'); this.store.isDoubleManned = spawnProps.includes('d');
} }
} else { } else {
const [carType, cargo] = type.split(':'); const [carType, ...cargo] = type.split(':');
vehicle = this.store.carDataList.find((car) => car.type == carType) || null; vehicle = this.store.carDataList.find((car) => car.type == carType) || null;
if (cargo) vehicleCargo = vehicle?.cargoTypes.find((c) => c.id == cargo) || null; if (vehicle && cargo.length > 0) {
if (/412Z|627Z/.test(vehicle.constructionType)) {
const additionalCargo = additionalCargoTypes.find(
(c) => c.groupType == vehicle!.constructionType && c.cargoStringVariations.includes(cargo.join(':'))
);
if (additionalCargo) {
cargo[0] = additionalCargo.id;
}
}
vehicleCargo = vehicle?.cargoTypes.find((c) => c.id == cargo[0]) || null;
}
} }
if (!vehicle && type) { if (!vehicle && type) {
-2
View File
@@ -93,8 +93,6 @@ export const useStore = defineStore('store', {
return state.stockList return state.stockList
.map((stock, i) => { .map((stock, i) => {
// let cargoString = '';
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)) if (i == 0 && (coldStartActive || doubleManningActive))
+64 -1
View File
@@ -1,6 +1,56 @@
import { ICarWagon, ILocomotive, IStock, IVehicleData, LocoGroupType, WagonGroupType } from '../types/common.types'; import { ICarWagon, ILocomotive, IStock, IVehicleData, LocoGroupType, WagonGroupType } from '../types/common.types';
import { MassLimitLocoType, calculateMassLimit, calculateSpeedLimit } from './vehicleLimitsUtils'; import { MassLimitLocoType, calculateMassLimit, calculateSpeedLimit } from './vehicleLimitsUtils';
export const additionalCargoTypes = [
{
groupType: '627Z',
id: '627Z_mix1_sctc_loaded',
weight: 96500,
cargoStringVariations: [
'sc_20:tc_20_loaded:tc_20_loaded:tc_20_loaded',
'tc_20_loaded:sc_20:tc_20_loaded:tc_20_loaded',
'tc_20_loaded:tc_20_loaded:sc_20:tc_20_loaded',
'tc_20_loaded:tc_20_loaded:tc_20_loaded:sc_20',
],
},
{
groupType: '627Z',
id: '627Z_mix2_sctc_loaded',
weight: 87000,
cargoStringVariations: [
'sc_20:tc_20_loaded:tc_20_loaded:sc_20',
'sc_20:tc_20_loaded:sc_20:tc_20_loaded',
'sc_20:sc_20:tc_20_loaded:tc_20_loaded',
'tc_20_loaded:tc_20_loaded:sc_20:sc_20',
'tc_20_loaded:sc_20:tc_20_loaded:sc_20',
'tc_20_loaded:sc_20:sc_20:tc_20_loaded',
],
},
{
groupType: '627Z',
id: '627Z_mix3_sctc_loaded',
weight: 77500,
cargoStringVariations: [
'sc_20:sc_20:sc_20:tc_20_loaded',
'sc_20:sc_20:tc_20_loaded:sc_20',
'sc_20:tc_20_loaded:sc_20:sc_20',
'tc_20_loaded:sc_20:sc_20:sc_20',
],
},
{
groupType: '412Z',
id: '412Z_mix1_sctc_loaded',
weight: 43500,
cargoStringVariations: ['sc_20:tc_20_loaded', 'tc_20_loaded:sc_20'],
},
{
groupType: '412Z',
id: '412Z_mix1_sctc_empty',
weight: 33970,
cargoStringVariations: ['sc_20:tc_20_empty:sc_20'],
},
];
export function isTractionUnit(vehicle: ILocomotive | ICarWagon): vehicle is ILocomotive { export function isTractionUnit(vehicle: ILocomotive | ICarWagon): vehicle is ILocomotive {
return (vehicle as ILocomotive).cabinType !== undefined; return (vehicle as ILocomotive).cabinType !== undefined;
} }
@@ -42,12 +92,25 @@ export function carDataList(vehiclesData: IVehicleData[] | undefined) {
return vehiclesData.reduce<ICarWagon[]>((acc, data) => { return vehiclesData.reduce<ICarWagon[]>((acc, data) => {
if (data.cabinName !== null) return acc; if (data.cabinName !== null) return acc;
const cargoTypes = data.group.cargoTypes || [];
if (/412Z|627Z/.test(data.group.name)) {
cargoTypes.push(
...additionalCargoTypes
.filter((c) => c.groupType == data.group.name)
.map((c) => ({
id: c.id,
weight: c.weight,
}))
);
}
acc.push({ acc.push({
group: data.type as WagonGroupType, group: data.type as WagonGroupType,
type: data.name, type: data.name,
constructionType: data.group.name, constructionType: data.group.name,
loadable: data.group.cargoTypes !== null && data.group.cargoTypes.length > 0, loadable: data.group.cargoTypes !== null && data.group.cargoTypes.length > 0,
cargoTypes: data.group?.cargoTypes ?? [], cargoTypes,
sponsorOnlyTimestamp: data.restrictions?.sponsorOnly ?? 0, sponsorOnlyTimestamp: data.restrictions?.sponsorOnly ?? 0,
teamOnly: data.restrictions?.teamOnly ?? false, teamOnly: data.restrictions?.teamOnly ?? false,