Add Fusion Thrusters, Add Atmospheric Density Modifier
This commit is contained in:
parent
d081dedef9
commit
5f80ab0c88
4 changed files with 168 additions and 62 deletions
src
|
@ -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 = {
|
||||
|
|
|
@ -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}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue