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 { useStockListUtils } from '../../../utils/stockListUtils';
import { getCurrentStockFileName } from '../../../composables/file';
import { getCurrentStockFileName, getStockStringOutput } from '../../../composables/file';
import {
Bookmark,
@@ -166,7 +166,7 @@ export default defineComponent({
methods: {
copyToClipboard() {
navigator.clipboard.writeText(this.store.stockString);
navigator.clipboard.writeText(getStockStringOutput());
setTimeout(() => {
alert(this.$t('stocklist.alert-copied'));
@@ -224,7 +224,7 @@ export default defineComponent({
if (!fileName) return;
const blob = new Blob([this.store.stockString]);
const blob = new Blob([getStockStringOutput()]);
const file = fileName + '.con';
var e = document.createEvent('MouseEvents'),
+25
View File
@@ -1,4 +1,5 @@
import { useStore } from '../store';
import { additionalCargoTypes } from '../utils/vehicleUtils';
export function getCurrentStockFileName() {
const store = useStore();
@@ -23,3 +24,27 @@ export function getCurrentStockFileName() {
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 { useStore } from '../store';
import { ICarWagon, ILocomotive, IStock, ICargo, IVehicle } from '../types/common.types';
import { isTractionUnit } from '../utils/vehicleUtils';
import { additionalCargoTypes, isTractionUnit } from '../utils/vehicleUtils';
export default defineComponent({
setup() {
@@ -28,11 +28,7 @@ export default defineComponent({
const stock = this.getStockObject(vehicle, cargo);
if (
isTractionUnit(stock.vehicleRef) &&
this.store.stockList.length > 0 &&
!isTractionUnit(this.store.stockList[0].vehicleRef)
)
if (isTractionUnit(stock.vehicleRef) && this.store.stockList.length > 0 && !isTractionUnit(this.store.stockList[0].vehicleRef))
this.store.stockList.unshift(stock);
else this.store.stockList.push(stock);
},
@@ -40,8 +36,7 @@ export default defineComponent({
addLocomotive(loco: ILocomotive) {
const stockObj = this.getStockObject(loco);
if (this.store.stockList.length > 0 && !isTractionUnit(this.store.stockList[0].vehicleRef))
this.store.stockList.unshift(stockObj);
if (this.store.stockList.length > 0 && !isTractionUnit(this.store.stockList[0].vehicleRef)) this.store.stockList.unshift(stockObj);
else this.store.stockList.push(stockObj);
},
@@ -80,10 +75,22 @@ export default defineComponent({
this.store.isDoubleManned = spawnProps.includes('d');
}
} else {
const [carType, cargo] = type.split(':');
const [carType, ...cargo] = type.split(':');
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) {
-2
View File
@@ -93,8 +93,6 @@ export const useStore = defineStore('store', {
return state.stockList
.map((stock, i) => {
// let cargoString = '';
let stockTypeStr = isTractionUnit(stock.vehicleRef) || !stock.cargo ? stock.vehicleRef.type : `${stock.vehicleRef.type}:${stock.cargo.id}`;
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 { 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 {
return (vehicle as ILocomotive).cabinType !== undefined;
}
@@ -42,12 +92,25 @@ export function carDataList(vehiclesData: IVehicleData[] | undefined) {
return vehiclesData.reduce<ICarWagon[]>((acc, data) => {
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({
group: data.type as WagonGroupType,
type: data.name,
constructionType: data.group.name,
loadable: data.group.cargoTypes !== null && data.group.cargoTypes.length > 0,
cargoTypes: data.group?.cargoTypes ?? [],
cargoTypes,
sponsorOnlyTimestamp: data.restrictions?.sponsorOnly ?? 0,
teamOnly: data.restrictions?.teamOnly ?? false,