{#snippet primary(label: string, icon: IconName, onclick: () => void, disabled: boolean, pending = false)}
{lead}
{/snippet}{#if s?.update_required} ODIAN {s.available} is required before launch while connected. Sign in with your {site} account to download it. {:else if s?.installed} Sign in with your {site} account. This PC then remembers you, online and offline, until you sign out. {:else} Sign in with your {site} account to download ODIAN{#if s?.available} {s.available}{/if}. {/if}
{#if !s?.installed}{@render driveLink("No access to the DHP?")}{/if} {:else if action === "signing_in"} {@render primary("Waiting for sign-in", "key", () => {}, true, true)}Complete the Keycloak sign-in in your browser, then come back here.
{:else if action === "install"} {@render primary("Install", "download", () => launcher.install(), blocked, busy === "install")}ODIAN {s?.available} from {site}, into {s?.install_dir}.
{#if s?.dhp_blocked}Dev mode: a run straight against {site} needs no install, but {s.dhp_blocked}
{/if} {@render driveLink("Have an ODIAN drive?")} {:else if action === "offline_unavailable"} {@render primary("Connect to your DHP to install", "globe", () => {}, true)} {@render driveLink("Installing needs your DHP, or an ODIAN drive.")} {:else if action === "signed_out_offline"} {@render primary("Connect to your DHP to sign in", "globe", () => {}, true)}This PC doesn't remember an operator anymore. Sign in once while connected to {site}, and ODIAN launches offline again after that.
{:else if action === "update"} {@render primary(`Update to ${s?.available}`, "update", () => launcher.install(), blocked, busy === "install")}Updating is required before launch while connected to {site}. Everything already verified is reused.
{:else if action === "launch"} {@render primary("Launch", "play", () => launcher.launch(), blocked || !s?.can_launch, busy === "launch")}{#if checking} Checking {site}… {:else if !s?.installed} Nothing is installed here: the client comes from your checkout and runs on {site}'s data. You sign in inside ODIAN, not here. {:else if s?.update_required} ODIAN {s.installed} is installed, {s.available} is on {site}. A dev run starts your checkout, so it does not need it. {:else if s?.online} ODIAN {s.installed} is up to date. {:else} Offline: ODIAN {s?.installed} runs on local data and map tiles. {/if}
{#if launcher.syncAttention > 0}
Operator data syncs with {site} before every launch.
{/if} {#if devOn}Name the folder that holds ODIAN_Engine and Launch runs from it.
Running as {devUser} — this PC will not sync with the DHP.
{/if}
Cancelling keeps every file already verified; the next install resumes from there.
{:else if action === "restoring"}This can take a few minutes. Keep the launcher open until it finishes.
{:else if action === "syncing"}Sending this PC's changes to {site} and taking in the other operators' work.
{:else if action === "building"}The build's own window has its output. A first build takes a while.
{:else if action === "removing"}Deleting a map is hundreds of thousands of files. Nothing is downloaded meanwhile.
{:else if action === "pulling_tiles"}Tiles the other operators baked while this PC was away. It can be stopped and resumed.
{:else if action === "stack"}{site}'s map service is unreachable: drawing from this PC's own tiles. {#if s?.map_problem} ({s.map_problem}){/if}
{s?.error ?? "Something went wrong."}
for the full log.
{/if} {#if showNotice}{launcher.notice}