Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions parsing/gameData.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"oilrefinery": 30,
"packager": 10,
"quantumencoder": 0.1,
"resourcesink": 30,
"smeltermk1": 4
},
"items": {
Expand Down
32 changes: 28 additions & 4 deletions parsing/src/buildings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,30 @@ function getProducingBuildings(data: any[]): string[] {
return Array.from(producingBuildingsSet); // Convert Set to an array
}

// Function to extract the power consumption for each producing building
function getPowerConsumptionForBuildings(data: any[], producingBuildings: string[]): { [key: string]: number } {
// For now this is just the 'Sink', but we may add more in the future
function getConsumingBuildings(data: any[]): string[] {
const consumingBuildingsSet = new Set<string>();

data
.filter((entry: any) => entry.Classes)
.flatMap((entry: any) => entry.Classes)
.forEach((building: any) => {
if (building.ClassName && building.ClassName === "Build_ResourceSink_C") {
//This is just to make sure that it still exists, but we may grab more data from it in the future

// Normalize the building name by removing "_C" and lowercasing it
let buildingName: string = building.ClassName.replace(/_C$/, '').toLowerCase();
buildingName = buildingName.startsWith('build_') ? buildingName.replace('build_', '') : buildingName;

consumingBuildingsSet.add(buildingName)
}
});

return Array.from(consumingBuildingsSet); // Convert Set to an array
}

// Function to extract the power consumption for each building
function getPowerConsumptionForBuildings(data: any[], buildings: string[]): { [key: string]: number } {
const buildingsPowerMap: { [key: string]: number } = {};

data
Expand All @@ -53,7 +75,7 @@ function getPowerConsumptionForBuildings(data: any[], producingBuildings: string
buildingName = buildingName.startsWith('build_') ? buildingName.replace('build_', '') : buildingName;

// Only include power data if the building is in the producingBuildings list
if (producingBuildings.includes(buildingName)) {
if (buildings.includes(buildingName)) {
buildingsPowerMap[buildingName] = parseFloat(building.mPowerConsumption) || 0;
}
}
Expand All @@ -68,4 +90,6 @@ function getPowerConsumptionForBuildings(data: any[], producingBuildings: string
return sortedMap;
}

export { getProducingBuildings, getPowerConsumptionForBuildings };


export { getProducingBuildings, getConsumingBuildings, getPowerConsumptionForBuildings };
7 changes: 5 additions & 2 deletions parsing/src/processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {ParserPowerRecipe} from "./interfaces/ParserPowerRecipe";
import {ParserPart, ParserItemDataInterface} from "./interfaces/ParserPart";
import {getItems, fixItemNames, fixTurbofuel} from './parts';
import {getProductionRecipes, getPowerGeneratingRecipes} from './recipes';
import {getProducingBuildings, getPowerConsumptionForBuildings} from './buildings';
import {getProducingBuildings, getConsumingBuildings, getPowerConsumptionForBuildings} from './buildings';

// Function to detect if the file is UTF-16
async function isUtf16(inputFile: string): Promise<boolean> {
Expand Down Expand Up @@ -88,8 +88,11 @@ async function processFile(
// Get an array of all buildings that produce something
const producingBuildings = getProducingBuildings(data);

// Get an array of all buildings that consume something
const consumingBuildings = getConsumingBuildings(data);

// Get power consumption for the producing buildings
const buildings = getPowerConsumptionForBuildings(data, producingBuildings);
const buildings = getPowerConsumptionForBuildings(data, [ ...producingBuildings, ...consumingBuildings]);

// Pass the producing buildings with power data to getRecipes to calculate perMin and powerPerProduct
const recipes = getProductionRecipes(data, buildings);
Expand Down
9 changes: 9 additions & 0 deletions parsing/tests/parsing.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@ describe('common', () => {
expect(results.recipes.length).toBe(291);
})

test('buildings test', () => {
//arrange

//act

//assert
expect(Object.keys(results.buildings).length).toBe(13);
})

test('buildings should generate correct data', () => {
expect(Object.keys(results.buildings).length).toBe(14);
Expand All @@ -83,6 +91,7 @@ describe('common', () => {
packager: 10,
quantumencoder: 0.1, // This has variable power consumption and is calculated in the recipe
smeltermk1: 4,
resourcesink: 30,
})
})

Expand Down
1 change: 1 addition & 0 deletions web/src/components/planner/Planner.vue
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@
['quantumencoder', 'Quantum Encoder'],
['smeltermk1', 'Smelter'],
['waterExtractor', 'Water Extractor'],
['resourcesink', 'Resource Sink'],
])

return buildingFriendly.get(building) || `UNKNOWN BUILDING: ${building}`
Expand Down
4 changes: 2 additions & 2 deletions web/src/components/planner/PlannerFactorySatisfaction.vue
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
</div>
</template>

<script setup lang="ts">
<script setup lang="ts">
import {
Factory,
} from '@/interfaces/planner/FactoryInterface'
Expand All @@ -76,4 +76,4 @@
// Reactive factory parts check
const hasParts = computed(() => Object.keys(props.factory.parts).length > 0)

</script>
</script>
51 changes: 49 additions & 2 deletions web/src/components/planner/PlannerFactorySatisfactionBuildings.vue
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
<template>
<v-card class="sub-card border-md">
<v-card-title>
<h2 class="text-h6">
<h2 class="text-h6 mr-3" style="display: inline">
<i class="fas fa-building" />
<span class="ml-3">Power &amp; Buildings</span>
</h2>
<v-btn
v-if="!hasSinks"
color="orange mr-2"
prepend-icon="fas fa-cube"
ripple
variant="flat"
@click="addSinkBuildingRequirement()"
>
Add Sink
</v-btn>
</v-card-title>
<v-card-text class="text-body-1 pb-2">
<v-chip
Expand Down Expand Up @@ -53,12 +63,49 @@
import { formatNumber, formatPower } from '@/utils/numberFormatter'
import { inject } from 'vue'
import { Factory } from '@/interfaces/planner/FactoryInterface'
import { useGameDataStore } from '@/stores/game-data-store'

const updateFactory = inject('updateFactory') as (factory: Factory) => void

const gameDataStore = useGameDataStore()

defineProps<{
const hasSinks = computed(() => props.factory.buildingRequirements && props.factory.buildingRequirements.resourcesink)

const props = defineProps<{
factory: Factory;
helpText: boolean;
}>()

const getBuildingDisplayName = inject('getBuildingDisplayName') as (part: string) => string

const addSinkBuildingRequirement = () => {
console.log('hasSinks')
console.log(hasSinks.value)

const amount = 1
const buildingPower = gameDataStore.getGameData().buildings.resourcesink

console.log('Found Building')
console.log(buildingPower)

if (!props.factory.buildingRequirements.resourcesink) {
console.log('New Sink needed!')

props.factory.buildingRequirements.resourcesink = {
name: 'resourcesink',
amount,
powerPerBuilding: buildingPower,
totalPower: buildingPower * amount,
}
}

console.log('Added Building!')
console.log(props.factory.buildingRequirements.resourcesink)

console.log('hasSinks')
console.log(hasSinks.value)

updateFactory(props.factory)
}

</script>
2 changes: 1 addition & 1 deletion web/src/interfaces/DataInterface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export interface RawResource {
}

export interface DataInterface {
buildings: { [key: string]: string };
buildings: { [key: string]: number };
items: {
parts: { [key: string]: Part };
rawResources: { [key: string]: RawResource };
Expand Down
21 changes: 21 additions & 0 deletions web/src/utils/factory-management/buildings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,15 @@ export const calculateProductBuildings = (factory: Factory, gameData: DataInterf
})
}

export const calculateBuildingsAndPower = (factory: Factory) => {
const sinkName = 'resourcesink'
const sinkAmount = factory.buildingRequirements[sinkName]?.amount
const sinkPower = factory.buildingRequirements[sinkName]?.powerPerBuilding

factory.totalPower = 0
factory.buildingRequirements = {} as {[key: string]: BuildingRequirement }
}

export const calculatePowerProducerBuildings = (factory: Factory, gameData: DataInterface) => {
// Loop through each power producer and add up the buildings
factory.powerProducers.forEach(producer => {
Expand Down Expand Up @@ -80,6 +89,18 @@ export const calculatePowerProducerBuildings = (factory: Factory, gameData: Data
facBuilding.amount = facBuilding.amount + Math.ceil(producer.buildingCount) // Total buildings regardless of clocks
facBuilding.powerProduced = Number(powerProduced.toFixed(3)) // Fucky wuky floating point numbers
})

// Special case for 'Sinks' that aren't used in a recipe/product. They are only added manually by the user
if (!sinkAmount || sinkAmount <= 0) return
factory.buildingRequirements[sinkName] = {
name: sinkName,
amount: sinkAmount,
powerPerBuilding: sinkPower,
totalPower: sinkPower * sinkAmount,
}

// Sum adding the Sink
factory.totalPower = factory.totalPower + (sinkPower * sinkAmount)
}

// Sums up all of the building data to create an aggregate value of power and building requirements
Expand Down