Add Fusion Thrusters, Add Atmospheric Density Modifier

This commit is contained in:
Neshura 2024-05-21 01:49:20 +02:00
parent d081dedef9
commit 5f80ab0c88
Signed by: Neshura
GPG key ID: B6983AAA6B9A7A6C
4 changed files with 168 additions and 62 deletions

View file

@ -1,10 +1,34 @@
import {Map} from "svelte/reactivity";
export enum Grids {
Small = "smallGrid",
Large = "largeGrid"
}
export enum ThrusterFuel {
Electric = "electric",
Hydrogen = "hydrogen",
Deuterium = "deuterium"
}
export class ThrusterTypeDetails {
atmosphericFactor: number;
vacuumFactor: number;
fuel: ThrusterFuel;
sizes: Map<ThrusterSize, ThrusterSizeDetails>;
constructor(atmos: number, vacuum: number, fuel: ThrusterFuel, sizes: Map<ThrusterSize, ThrusterSizeDetails>) {
this.atmosphericFactor = atmos;
this.vacuumFactor = vacuum;
this.fuel = fuel;
this.sizes = sizes;
}
}
export enum ThrusterSize {
Small = "smallThruster",
Large = "largeThruster",
Huge = "hugeThruster",
}
export enum ThrusterType {
Ion = "ion",
Atmospheric = "atmos",
@ -12,47 +36,54 @@ export enum ThrusterType {
Fusion = "fusion"
}
export enum ThrusterSize {
Small = "smallThruster",
Large = "largeThruster"
export class ThrusterSizeDetails {
thrust: number;
maxFuelConsumption: number;
constructor(thrust: number, maxFuelConsumption = 0) {
this.thrust = thrust;
this.maxFuelConsumption = maxFuelConsumption;
}
}
export const thrustValues = new Map([
export const thrusterDetails: Map<Grids, Map<ThrusterType, ThrusterTypeDetails>> = new Map([
[Grids.Large, new Map([
[ThrusterType.Atmospheric, new Map([
[ThrusterSize.Large, 4500000],
[ThrusterSize.Small, 350000]
])],
[ThrusterType.Ion, new Map([
[ThrusterSize.Large, 4320000],
[ThrusterSize.Small, 345600]
])],
[ThrusterType.Fusion, new Map([
[ThrusterSize.Large, 666],
[ThrusterSize.Small, 666]
])],
[ThrusterType.Hydrogen, new Map([
[ThrusterSize.Large, 7200000],
[ThrusterSize.Small, 1080000]
])]
[ThrusterType.Atmospheric, new ThrusterTypeDetails(1, 0, ThrusterFuel.Electric, new Map([
[ThrusterSize.Large, new ThrusterSizeDetails(4500000)],
[ThrusterSize.Small, new ThrusterSizeDetails(350000)]
]))],
[ThrusterType.Ion, new ThrusterTypeDetails(0.2, 1, ThrusterFuel.Electric, new Map([
[ThrusterSize.Large, new ThrusterSizeDetails(4320000)],
[ThrusterSize.Small, new ThrusterSizeDetails(345600)]
]))],
[ThrusterType.Hydrogen, new ThrusterTypeDetails(1, 1, ThrusterFuel.Hydrogen, new Map([
[ThrusterSize.Large, new ThrusterSizeDetails(7200000)],
[ThrusterSize.Small, new ThrusterSizeDetails(1080000)]
]))],
[ThrusterType.Fusion, new ThrusterTypeDetails(0.5, 1, ThrusterFuel.Deuterium, new Map([
[ThrusterSize.Large, new ThrusterSizeDetails(33780000)],
[ThrusterSize.Small, new ThrusterSizeDetails(9040000)]
]))]
])],
[Grids.Small, new Map([
[ThrusterType.Atmospheric, new Map([
[ThrusterSize.Large, 340000],
[ThrusterSize.Small, 65000]
])],
[ThrusterType.Ion, new Map([
[ThrusterSize.Large, 172800],
[ThrusterSize.Small, 14400]
])],
[ThrusterType.Fusion, new Map([
[ThrusterSize.Large, 666],
[ThrusterSize.Small, 666]
])],
[ThrusterType.Hydrogen, new Map([
[ThrusterSize.Large, 480000],
[ThrusterSize.Small, 98400]
])]
[ThrusterType.Atmospheric, new ThrusterTypeDetails(1, 0, ThrusterFuel.Electric, new Map([
[ThrusterSize.Large, new ThrusterSizeDetails(340000)],
[ThrusterSize.Small, new ThrusterSizeDetails(65000)]
]))],
[ThrusterType.Ion, new ThrusterTypeDetails(0.2, 1, ThrusterFuel.Electric, new Map([
[ThrusterSize.Large, new ThrusterSizeDetails(172800)],
[ThrusterSize.Small, new ThrusterSizeDetails(14400)]
]))],
[ThrusterType.Hydrogen, new ThrusterTypeDetails(1, 1, ThrusterFuel.Hydrogen, new Map([
[ThrusterSize.Large, new ThrusterSizeDetails(480000)],
[ThrusterSize.Small, new ThrusterSizeDetails(98400)]
]))],
[ThrusterType.Fusion, new ThrusterTypeDetails(0.5, 1, ThrusterFuel.Deuterium, new Map([
[ThrusterSize.Huge, new ThrusterSizeDetails(9040000)],
[ThrusterSize.Large, new ThrusterSizeDetails(1030000)],
[ThrusterSize.Small, new ThrusterSizeDetails(210000)]
]))]
])]
])
@ -159,6 +190,10 @@ export const localization = new Map([
["en-GB", "Large"],
["de-DE", "Großer"]
])],
["hugeThruster", new Map([
["en-GB", "Huge"],
["de-DE", "Rießiger"]
])],
["connector", new Map([
["en-GB", "Connector"],
["de-DE", "Verbinder"]
@ -251,6 +286,10 @@ export const localization = new Map([
["en-GB", "Density"],
["de-DE", "Dichte"]
])],
["atmosDensity", new Map([
["en-GB", "Atmospheric Density"],
["de-DE", "Atmosphärendichte"]
])],
])
export type Thruster = {

View file

@ -10,11 +10,12 @@
localization, metricModifiers, type Thruster,
ThrusterSize,
ThrusterType,
thrustValues, Density, densityValues
thrusterDetails, Density, densityValues, ThrusterTypeDetails, ThrusterSizeDetails
} from "$lib/constants";
import {Input} from "$lib/components/ui/input";
import {Label} from "$lib/components/ui/label";
import {Separator} from "$lib/components/ui/separator";
import * as DropdownMenu from "$lib/components/ui/dropdown-menu";
import {onMount} from "svelte";
let locale = $state("en-GB");
@ -61,6 +62,13 @@
}
})
let atmosphericDensity: number = $state(1);
$effect(() => {
if (mounted) {
localStorage.setItem("atmosphericDensity", atmosphericDensity);
}
})
let newThruster: Thruster = $state({
type: ThrusterType.Atmospheric,
size: ThrusterSize.Small,
@ -81,7 +89,7 @@
let totalThrust: number = $derived.by(() => {
let thrust = 0;
thrusters.forEach((thruster) => {
thrust += getThrusterPower(thruster)
thrust += getThrust(thruster)
})
return thrust
});
@ -110,8 +118,19 @@
return inventorySizes.get(gridSize).get(inventory) * inventoryMultiplier
}
function getThrusterPower(thruster: Thruster): number {
return thrustValues.get(gridSize).get(thruster.type).get(thruster.size)
function getThrusterDetails(thruster: Thruster): ThrusterSizeDetails {
return thrusterDetails.get(gridSize).get(thruster.type).sizes.get(thruster.size)
}
function getThrust(thruster: Thruster): number {
let typeDetails = getThrusterTypeDetails(thruster);
let sizeDetails = getThrusterDetails(thruster);
let thrustEfficiency = (typeDetails.vacuumFactor * (1 - atmosphericDensity)) + (typeDetails.atmosphericFactor * atmosphericDensity);
return sizeDetails.thrust * thrustEfficiency;
}
function getThrusterTypeDetails(thruster: Thruster): ThrusterTypeDetails {
return thrusterDetails.get(gridSize).get(thruster.type)
}
function addThruster() {
@ -187,6 +206,10 @@
density = localStorage.getItem("density")
}
if (localStorage.getItem("atmosphericDensity") !== null) {
atmosphericDensity = localStorage.getItem("atmosphericDensity")
}
if (localStorage.getItem("inventoryMultiplier") !== null) {
inventoryMultiplier = localStorage.getItem("inventoryMultiplier")
}
@ -217,6 +240,8 @@
<Separator />
<Label for="gravity">{localized("gravity")}</Label>
<Input type="number" step="0.01" id="gravity" bind:value={gravity}/>
<Label for="atmosDensity">{localized("atmosDensity")}</Label>
<Input type="number" step="0.01" id="atmosDensity" bind:value={atmosphericDensity}/>
<Separator />
<Label for="gridSize">{localized("gridSize")}</Label>
<div id="gridSize" class="flex">
@ -252,24 +277,26 @@
<Separator />
<Card.Root>
<Card.Content class="flex flex-col gap-3 pt-6">
<div class="flex gap-2">
{#each Object.values(ThrusterType) as thruster}
{#if newThruster.type === thruster}
<Button variant="primary">{localized(thruster)}</Button>
{:else}
<Button variant="secondary" onclick={() => newThruster.type = thruster}>{localized(thruster)}</Button>
{/if}
{/each}
</div>
<div class="flex gap-2">
{#each Object.values(ThrusterSize) as size}
{#if newThruster.size === size}
<Button variant="primary">{localized(size)}</Button>
{:else}
<Button variant="secondary" onclick={() => newThruster.size = size}>{localized(size)}</Button>
{/if}
{/each}
</div>
<DropdownMenu.Root>
<DropdownMenu.Trigger>{localized(newThruster.type)}</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.RadioGroup bind:value={newThruster.type}>
{#each Object.values(ThrusterType) as thrusterType}
<DropdownMenu.RadioItem value={thrusterType}>{localized(thrusterType)}</DropdownMenu.RadioItem>
{/each}
</DropdownMenu.RadioGroup>
</DropdownMenu.Content>
</DropdownMenu.Root>
<DropdownMenu.Root>
<DropdownMenu.Trigger>{localized(newThruster.size)}</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.RadioGroup bind:value={newThruster.size}>
{#each getThrusterTypeDetails(newThruster).sizes.keys() as thrusterDetails}
<DropdownMenu.RadioItem value={thrusterDetails}>{localized(thrusterDetails)}</DropdownMenu.RadioItem>
{/each}
</DropdownMenu.RadioGroup>
</DropdownMenu.Content>
</DropdownMenu.Root>
<Button variant="secondary" onclick={() => addThruster()}>{localized("addThruster")}</Button>
</Card.Content>
</Card.Root>
@ -282,7 +309,7 @@
<div class="max-h-full overflow-y-auto">
{#each thrusters as thruster, index}
<p class="p-1">
- {localized(thruster.size)} {localized(thruster.type)} {localized("thruster")}: {applyUnits(getThrusterPower(thruster), "N")}
- {localized(thruster.size)} {localized(thruster.type)} {localized("thruster")}: {applyUnits(getThrust(thruster), "N")}
<Button variant="destructive" onclick={() => thrusters.splice(index, 1)}>X</Button>
</p>
{/each}