diff --git a/src/app/components/Account/AccountCard.tsx b/src/app/components/Account/AccountCard.tsx index ebbc3f5..d0fd77c 100644 --- a/src/app/components/Account/AccountCard.tsx +++ b/src/app/components/Account/AccountCard.tsx @@ -12,6 +12,7 @@ import { EvePraisalResult } from "@/eve-praisal"; import { STORAGE_IDS, PI_SCHEMATICS, PI_PRODUCT_VOLUMES, STORAGE_CAPACITIES } from "@/const"; import { DateTime } from "luxon"; import { PlanetCalculations, AlertState, StorageContent, StorageInfo } from "@/types/planet"; +import { getProgramOutputPrediction } from "../PlanetaryInteraction/ExtractionSimulation"; interface AccountTotals { monthlyEstimate: number; @@ -49,18 +50,27 @@ const calculatePlanetDetails = (planet: PlanetWithInfo, piPrices: EvePraisalResu ])); // Calculate extractor averages and check for large differences + const CYCLE_TIME = 30 * 60; // 30 minutes in seconds const extractorAverages = extractors .filter(e => e.extractor_details?.product_type_id && e.extractor_details?.qty_per_cycle) .map(e => { - const cycleTime = e.extractor_details?.cycle_time || 3600; + const installDate = new Date(e.install_time ?? ""); + const expiryDate = new Date(e.expiry_time ?? ""); + const programDuration = (expiryDate.getTime() - installDate.getTime()) / 1000; + const cycles = Math.floor(programDuration / CYCLE_TIME); + const qtyPerCycle = e.extractor_details?.qty_per_cycle || 0; + const prediction = getProgramOutputPrediction(qtyPerCycle, CYCLE_TIME, cycles); + const totalOutput = prediction.reduce((sum, val) => sum + val, 0); + const averagePerHour = totalOutput / cycles * 2; + return { typeId: e.extractor_details!.product_type_id!, - averagePerHour: (qtyPerCycle * 3600) / cycleTime + averagePerHour }; }); - const hasLargeExtractorDifference = extractorAverages.length === 2 && + const hasLargeExtractorDifference = extractorAverages.length === 2 && Math.abs(extractorAverages[0].averagePerHour - extractorAverages[1].averagePerHour) > balanceThreshold; // Calculate storage info diff --git a/src/app/components/PlanetaryInteraction/ExtractionSimulationTooltip.tsx b/src/app/components/PlanetaryInteraction/ExtractionSimulationTooltip.tsx index 87185c9..49d9359 100644 --- a/src/app/components/PlanetaryInteraction/ExtractionSimulationTooltip.tsx +++ b/src/app/components/PlanetaryInteraction/ExtractionSimulationTooltip.tsx @@ -159,7 +159,7 @@ export const ExtractionSimulationTooltip: React.FC - • Average per Cycle: {(totalOutput / cycles).toFixed(1)} units + • Average per Cycle: {(totalOutput / (cycles)).toFixed(1)} units - • Average per hour: {((extractors[idx].baseValue * 3600) / extractors[idx].cycleTime).toFixed(1)} units + • Average per hour: {(totalOutput / cycles * 2).toFixed(1)} units • Expires in: @@ -185,17 +185,24 @@ export const ExtractionSimulationTooltip: React.FC {extractors.map((extractor, index) => { - const averagePerHour = (extractor.baseValue * 3600) / extractor.cycleTime; + const prediction = getProgramOutputPrediction( + extractor.baseValue, + CYCLE_TIME, + extractorPrograms[index].cycles + ); + const totalOutput = prediction.reduce((sum, val) => sum + val, 0); + const cycles = extractorPrograms[index].cycles; + const averagePerHour = totalOutput / cycles * 2; return ( • {PI_TYPES_MAP[extractor.typeId]?.name}: {averagePerHour.toFixed(1)} u/h ); })} - - Difference: {Math.abs( - (extractors[0].baseValue * 3600 / extractors[0].cycleTime) - - (extractors[1].baseValue * 3600 / extractors[1].cycleTime) - ).toFixed(1)} u/h + Difference: {(() => { + const prediction0 = getProgramOutputPrediction( + extractors[0].baseValue, + CYCLE_TIME, + extractorPrograms[0].cycles + ); + const totalOutput0 = prediction0.reduce((sum, val) => sum + val, 0); + const cycles0 = extractorPrograms[0].cycles; + const avg0 = totalOutput0 / cycles0 * 2; + + const prediction1 = getProgramOutputPrediction( + extractors[1].baseValue, + CYCLE_TIME, + extractorPrograms[1].cycles + ); + const totalOutput1 = prediction1.reduce((sum, val) => sum + val, 0); + const cycles1 = extractorPrograms[1].cycles; + const avg1 = totalOutput1 / cycles1 * 2; + + return Math.abs(avg0 - avg1).toFixed(1); + })()} u/h