From c51d2fc4fbaeb6ec15509b2929ac1abc2caf0ca9 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 7 Jul 2021 18:00:41 +0000 Subject: [PATCH 01/68] update client --- docs/README.md | 1 + ...nericerrorboundary.genericerrorboundary.md | 85 +++++++++++++++++++ .../modules/backend_network_leaderboardapi.md | 4 +- docs/modules/frontend_utils_apphooks.md | 8 +- .../frontend_views_genericerrorboundary.md | 7 ++ docs/modules/frontend_views_leaderboard.md | 6 +- last_updated.txt | 2 +- package.json | 16 ++-- src/Backend/Network/LeaderboardApi.ts | 4 +- src/Frontend/Pages/LandingPage.tsx | 4 +- src/Frontend/Utils/AppHooks.ts | 13 +-- src/Frontend/Views/GenericErrorBoundary.tsx | 43 ++++++++++ src/Frontend/Views/Leaderboard.tsx | 39 +++++---- 13 files changed, 184 insertions(+), 48 deletions(-) create mode 100644 docs/classes/frontend_views_genericerrorboundary.genericerrorboundary.md create mode 100644 docs/modules/frontend_views_genericerrorboundary.md create mode 100644 src/Frontend/Views/GenericErrorBoundary.tsx diff --git a/docs/README.md b/docs/README.md index c2da9e4a..7f8e5546 100644 --- a/docs/README.md +++ b/docs/README.md @@ -239,6 +239,7 @@ - [Frontend/Views/EmojiPicker](modules/frontend_views_emojipicker.md) - [Frontend/Views/EmojiPlanetNotification](modules/frontend_views_emojiplanetnotification.md) - [Frontend/Views/GameWindowLayout](modules/frontend_views_gamewindowlayout.md) +- [Frontend/Views/GenericErrorBoundary](modules/frontend_views_genericerrorboundary.md) - [Frontend/Views/Leaderboard](modules/frontend_views_leaderboard.md) - [Frontend/Views/MenuBar](modules/frontend_views_menubar.md) - [Frontend/Views/ModalIcon](modules/frontend_views_modalicon.md) diff --git a/docs/classes/frontend_views_genericerrorboundary.genericerrorboundary.md b/docs/classes/frontend_views_genericerrorboundary.genericerrorboundary.md new file mode 100644 index 00000000..c3c0f078 --- /dev/null +++ b/docs/classes/frontend_views_genericerrorboundary.genericerrorboundary.md @@ -0,0 +1,85 @@ +# Class: GenericErrorBoundary + +[Frontend/Views/GenericErrorBoundary](../modules/frontend_views_genericerrorboundary.md).GenericErrorBoundary + +## Hierarchy + +- _Component_ + + ↳ **GenericErrorBoundary** + +## Table of contents + +### Constructors + +- [constructor](frontend_views_genericerrorboundary.genericerrorboundary.md#constructor) + +### Methods + +- [componentDidCatch](frontend_views_genericerrorboundary.genericerrorboundary.md#componentdidcatch) +- [render](frontend_views_genericerrorboundary.genericerrorboundary.md#render) +- [getDerivedStateFromError](frontend_views_genericerrorboundary.genericerrorboundary.md#getderivedstatefromerror) + +## Constructors + +### constructor + +\+ **new GenericErrorBoundary**(`props`: GenericErrorBoundaryProps): [_GenericErrorBoundary_](frontend_views_genericerrorboundary.genericerrorboundary.md) + +#### Parameters + +| Name | Type | +| :------ | :------------------------ | +| `props` | GenericErrorBoundaryProps | + +**Returns:** [_GenericErrorBoundary_](frontend_views_genericerrorboundary.genericerrorboundary.md) + +Overrides: React.Component< +GenericErrorBoundaryProps, +{ hasError: boolean } +\>.constructor + +## Methods + +### componentDidCatch + +▸ **componentDidCatch**(`error`: Error, `_errorInfo`: ErrorInfo): _void_ + +#### Parameters + +| Name | Type | +| :----------- | :-------- | +| `error` | Error | +| `_errorInfo` | ErrorInfo | + +**Returns:** _void_ + +Overrides: React.Component.componentDidCatch + +--- + +### render + +▸ **render**(): _undefined_ \| `null` \| {} + +**Returns:** _undefined_ \| `null` \| {} + +Overrides: React.Component.render + +--- + +### getDerivedStateFromError + +▸ `Static` **getDerivedStateFromError**(`_error`: Error): _object_ + +#### Parameters + +| Name | Type | +| :------- | :---- | +| `_error` | Error | + +**Returns:** _object_ + +| Name | Type | +| :--------- | :-------- | +| `hasError` | _boolean_ | diff --git a/docs/modules/backend_network_leaderboardapi.md b/docs/modules/backend_network_leaderboardapi.md index eeeacaaa..737cc11b 100644 --- a/docs/modules/backend_network_leaderboardapi.md +++ b/docs/modules/backend_network_leaderboardapi.md @@ -10,6 +10,6 @@ ### loadLeaderboard -▸ **loadLeaderboard**(): _Promise_ +▸ **loadLeaderboard**(): _Promise_ -**Returns:** _Promise_ +**Returns:** _Promise_ diff --git a/docs/modules/frontend_utils_apphooks.md b/docs/modules/frontend_utils_apphooks.md index 53a945c1..fe04a83e 100644 --- a/docs/modules/frontend_utils_apphooks.md +++ b/docs/modules/frontend_utils_apphooks.md @@ -108,10 +108,10 @@ Loads the leaderboard **Returns:** _object_ -| Name | Type | -| :------------ | :---------------------------------- | -| `error` | Error \| _undefined_ | -| `leaderboard` | AggregateLeaderboard \| _undefined_ | +| Name | Type | +| :------------ | :------------------------- | +| `error` | Error \| _undefined_ | +| `leaderboard` | Leaderboard \| _undefined_ | --- diff --git a/docs/modules/frontend_views_genericerrorboundary.md b/docs/modules/frontend_views_genericerrorboundary.md new file mode 100644 index 00000000..509f72c8 --- /dev/null +++ b/docs/modules/frontend_views_genericerrorboundary.md @@ -0,0 +1,7 @@ +# Module: Frontend/Views/GenericErrorBoundary + +## Table of contents + +### Classes + +- [GenericErrorBoundary](../classes/frontend_views_genericerrorboundary.genericerrorboundary.md) diff --git a/docs/modules/frontend_views_leaderboard.md b/docs/modules/frontend_views_leaderboard.md index a6d131ff..b3d562f0 100644 --- a/docs/modules/frontend_views_leaderboard.md +++ b/docs/modules/frontend_views_leaderboard.md @@ -4,12 +4,12 @@ ### Functions -- [Leaderboard](frontend_views_leaderboard.md#leaderboard) +- [LeadboardDisplay](frontend_views_leaderboard.md#leadboarddisplay) ## Functions -### Leaderboard +### LeadboardDisplay -▸ **Leaderboard**(): _Element_ +▸ **LeadboardDisplay**(): _Element_ **Returns:** _Element_ diff --git a/last_updated.txt b/last_updated.txt index 07e2b9da..f721dc13 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Tue Jun 29 22:41:23 UTC 2021 +last updated: Wed Jul 7 18:00:41 UTC 2021 diff --git a/package.json b/package.json index 42e45ce4..180ce874 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { "name": "client", - "version": "6.2.9", + "version": "6.2.10", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.9", - "@darkforest_eth/contracts": "6.2.9", - "@darkforest_eth/hashing": "6.2.9", - "@darkforest_eth/hexgen": "6.2.9", - "@darkforest_eth/serde": "6.2.9", - "@darkforest_eth/snarks": "6.2.9", - "@darkforest_eth/types": "6.2.9", + "@darkforest_eth/constants": "6.2.10", + "@darkforest_eth/contracts": "6.2.10", + "@darkforest_eth/hashing": "6.2.10", + "@darkforest_eth/hexgen": "6.2.10", + "@darkforest_eth/serde": "6.2.10", + "@darkforest_eth/snarks": "6.2.10", + "@darkforest_eth/types": "6.2.10", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", diff --git a/src/Backend/Network/LeaderboardApi.ts b/src/Backend/Network/LeaderboardApi.ts index d6981343..9cb8c317 100644 --- a/src/Backend/Network/LeaderboardApi.ts +++ b/src/Backend/Network/LeaderboardApi.ts @@ -1,8 +1,8 @@ -import { AggregateLeaderboard } from '@darkforest_eth/types'; +import { Leaderboard } from '@darkforest_eth/types'; const LEADERBOARD_API = process.env.LEADERBOARD_API as string; -export async function loadLeaderboard(): Promise { +export async function loadLeaderboard(): Promise { const address = `${LEADERBOARD_API}/leaderboard`; const res = await fetch(address, { method: 'GET', diff --git a/src/Frontend/Pages/LandingPage.tsx b/src/Frontend/Pages/LandingPage.tsx index 8206d9cb..cf7600ff 100644 --- a/src/Frontend/Pages/LandingPage.tsx +++ b/src/Frontend/Pages/LandingPage.tsx @@ -6,7 +6,7 @@ import { EmailCTA, EmailCTAMode } from '../Components/Email'; import { Sub, BlinkCursor, Invisible, HideSmall } from '../Components/Text'; import LandingPageCanvas from '../Renderers/LandingPageCanvas'; import dfstyles from '../Styles/dfstyles'; -import { Leaderboard } from '../Views/Leaderboard'; +import { LeadboardDisplay } from '../Views/Leaderboard'; export const enum LandingPageZIndex { Background = 0, @@ -185,7 +185,7 @@ export default function LandingPage() { - + diff --git a/src/Frontend/Utils/AppHooks.ts b/src/Frontend/Utils/AppHooks.ts index 1b1eef4a..3a7892d9 100644 --- a/src/Frontend/Utils/AppHooks.ts +++ b/src/Frontend/Utils/AppHooks.ts @@ -1,13 +1,7 @@ import { useCallback, useMemo, useState } from 'react'; import GameUIManager from '../../Backend/GameLogic/GameUIManager'; import { Wrapper } from '../../Backend/Utils/Wrapper'; -import { - EthAddress, - Planet, - ArtifactId, - Artifact, - AggregateLeaderboard, -} from '@darkforest_eth/types'; +import { EthAddress, Planet, ArtifactId, Artifact, Leaderboard } from '@darkforest_eth/types'; import { createDefinedContext } from './createDefinedContext'; import { useKeyPressed, useWrappedEmitter } from './EmitterHooks'; import { ctrlDown$, ctrlUp$ } from './KeyEmitters'; @@ -111,16 +105,17 @@ export function useControlDown(): boolean { /** Loads the leaderboard */ export function useLeaderboard(poll: number | undefined = undefined): { - leaderboard: AggregateLeaderboard | undefined; + leaderboard: Leaderboard | undefined; error: Error | undefined; } { - const [leaderboard, setLeaderboard] = useState(); + const [leaderboard, setLeaderboard] = useState(); const [error, setError] = useState(); const load = useCallback(async function load() { try { setLeaderboard(await loadLeaderboard()); } catch (e) { + console.log('error loading leaderboard', e); setError(e); } }, []); diff --git a/src/Frontend/Views/GenericErrorBoundary.tsx b/src/Frontend/Views/GenericErrorBoundary.tsx new file mode 100644 index 00000000..ac568879 --- /dev/null +++ b/src/Frontend/Views/GenericErrorBoundary.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import styled from 'styled-components'; +import { Red } from '../Components/Text'; + +interface GenericErrorBoundaryProps { + errorMessage: string; +} + +export class GenericErrorBoundary extends React.Component< + GenericErrorBoundaryProps, + { hasError: boolean } +> { + constructor(props: GenericErrorBoundaryProps) { + super(props); + this.state = { hasError: false }; + } + + static getDerivedStateFromError(_error: Error) { + return { hasError: true }; + } + + componentDidCatch(error: Error, _errorInfo: React.ErrorInfo) { + console.error(`ui rendering error`); + console.error(error); + } + + render() { + if (this.state.hasError) { + return ( + + {this.props.errorMessage} + + ); + } + + return this.props.children; + } +} + +const ErrorBoundaryContent = styled.div` + padding: 8px; + max-width: 350px; +`; diff --git a/src/Frontend/Views/Leaderboard.tsx b/src/Frontend/Views/Leaderboard.tsx index c9c65000..5108ab7d 100644 --- a/src/Frontend/Views/Leaderboard.tsx +++ b/src/Frontend/Views/Leaderboard.tsx @@ -1,4 +1,4 @@ -import { AggregateLeaderboard, ArtifactRarity } from '@darkforest_eth/types'; +import { Leaderboard, ArtifactRarity } from '@darkforest_eth/types'; import _ from 'lodash'; import React, { useState } from 'react'; import { useEffect } from 'react'; @@ -11,17 +11,20 @@ import { RarityColors } from '../Styles/Colors'; import dfstyles from '../Styles/dfstyles'; import { useLeaderboard } from '../Utils/AppHooks'; import { formatDuration } from '../Utils/TimeUtils'; +import { GenericErrorBoundary } from './GenericErrorBoundary'; import { Table } from './Table'; -export function Leaderboard() { +export function LeadboardDisplay() { const { leaderboard, error } = useLeaderboard(); + const errorMessage = 'Error Loading Leaderboard'; + return ( - <> + {!leaderboard && !error && } {leaderboard && } - {error && error loading leaderboard} - + {error && {errorMessage}} + ); } @@ -144,18 +147,20 @@ function CountDown() { return <>{str}; } -function LeaderboardBody({ leaderboard }: { leaderboard: AggregateLeaderboard }) { - const leaderboardRoundNames = Object.getOwnPropertyNames(leaderboard); - const firstRoundLeaderboard = leaderboard[leaderboardRoundNames[0]]; - const firstRoundScores = Object.getOwnPropertyNames(firstRoundLeaderboard.scoresByPlayer).map( - (name) => [name, firstRoundLeaderboard.scoresByPlayer[name]] - ); +function LeaderboardBody({ leaderboard }: { leaderboard: Leaderboard }) { + const rankedPlayers = leaderboard.entries.filter((entry) => entry.score > 0); - const sortedFirstRoundScores = _.sortBy(firstRoundScores, (row) => -row[1]) as Array< - [string, number] - >; + leaderboard.entries.sort((a, b) => { + return b.score - a.score; + }); + + const rows: [string, number][] = leaderboard.entries.map((entry) => { + if (typeof entry.twitter === 'string') { + return [entry.twitter, entry.score]; + } - const rankedPlayers = sortedFirstRoundScores.filter((entry) => entry[1] > 0); + return [entry.ethAddress, entry.score]; + }); return (
@@ -170,7 +175,7 @@ function LeaderboardBody({ leaderboard }: { leaderboard: AggregateLeaderboard }) players - {sortedFirstRoundScores.length} + {leaderboard.entries.length} ranked players @@ -180,7 +185,7 @@ function LeaderboardBody({ leaderboard }: { leaderboard: AggregateLeaderboard }) - +
); } From 4ed3ecbe53414348b85b3b646e63b84202829845 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 9 Jul 2021 04:57:27 +0000 Subject: [PATCH 02/68] update client --- docs/README.md | 2 + .../backend_network_ethconnection.default.md | 84 ++++++++- ...tend_utils_settingshooks.autogassetting.md | 29 ++++ ...ntend_panes_diagnosticspane.diagnostics.md | 7 + docs/modules/backend_network_chainapi.md | 40 +++++ docs/modules/backend_utils_utils.md | 16 ++ .../frontend_components_displaygasprices.md | 22 +++ docs/modules/frontend_utils_settingshooks.md | 8 + last_updated.txt | 2 +- package.json | 16 +- src/Backend/GameLogic/ContractsAPI.ts | 1 + src/Backend/Network/ChainAPI.ts | 57 ++++++ src/Backend/Network/EthConnection.ts | 68 +++++++- src/Backend/Network/TxExecutor.ts | 13 +- src/Backend/Utils/Utils.ts | 26 ++- src/Frontend/Components/DisplayGasPrices.tsx | 19 ++ src/Frontend/Pages/GameLandingPage.tsx | 2 +- src/Frontend/Pages/TxConfirmPopup.tsx | 5 +- src/Frontend/Panes/DiagnosticsPane.tsx | 10 ++ src/Frontend/Panes/PrivatePane.tsx | 4 +- src/Frontend/Panes/SettingsPane.tsx | 162 +++++++++++------- src/Frontend/Utils/SettingsHooks.tsx | 14 +- 22 files changed, 518 insertions(+), 89 deletions(-) create mode 100644 docs/enums/frontend_utils_settingshooks.autogassetting.md create mode 100644 docs/modules/backend_network_chainapi.md create mode 100644 docs/modules/frontend_components_displaygasprices.md create mode 100644 src/Backend/Network/ChainAPI.ts create mode 100644 src/Frontend/Components/DisplayGasPrices.tsx diff --git a/docs/README.md b/docs/README.md index 7f8e5546..d79f21cc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -24,6 +24,7 @@ - [Backend/Miner/MiningPatterns](modules/backend_miner_miningpatterns.md) - [Backend/Miner/miner.worker](modules/backend_miner_miner_worker.md) - [Backend/Miner/permutation](modules/backend_miner_permutation.md) +- [Backend/Network/ChainAPI](modules/backend_network_chainapi.md) - [Backend/Network/ConversationAPI](modules/backend_network_conversationapi.md) - [Backend/Network/EthConnection](modules/backend_network_ethconnection.md) - [Backend/Network/EventLogger](modules/backend_network_eventlogger.md) @@ -59,6 +60,7 @@ - [Frontend/Components/Button](modules/frontend_components_button.md) - [Frontend/Components/CoreUI](modules/frontend_components_coreui.md) - [Frontend/Components/Corner](modules/frontend_components_corner.md) +- [Frontend/Components/DisplayGasPrices](modules/frontend_components_displaygasprices.md) - [Frontend/Components/Email](modules/frontend_components_email.md) - [Frontend/Components/FlexRows](modules/frontend_components_flexrows.md) - [Frontend/Components/GameLandingPageComponents](modules/frontend_components_gamelandingpagecomponents.md) diff --git a/docs/classes/backend_network_ethconnection.default.md b/docs/classes/backend_network_ethconnection.default.md index 6d4b860b..f78ba93d 100644 --- a/docs/classes/backend_network_ethconnection.default.md +++ b/docs/classes/backend_network_ethconnection.default.md @@ -24,6 +24,9 @@ Responsible for - [blockNumber](backend_network_ethconnection.default.md#blocknumber) - [blockNumber$](backend_network_ethconnection.default.md#blocknumber$) +- [diagnosticsUpdater](backend_network_ethconnection.default.md#diagnosticsupdater) +- [gasPrices](backend_network_ethconnection.default.md#gasprices) +- [gasPrices$](backend_network_ethconnection.default.md#gasprices$) - [knownAddresses](backend_network_ethconnection.default.md#knownaddresses) - [provider](backend_network_ethconnection.default.md#provider) - [rpcURL](backend_network_ethconnection.default.md#rpcurl) @@ -36,6 +39,8 @@ Responsible for - [adjustPollRateBasedOnVisibility](backend_network_ethconnection.default.md#adjustpollratebasedonvisibility) - [getAddress](backend_network_ethconnection.default.md#getaddress) - [getBalance](backend_network_ethconnection.default.md#getbalance) +- [getGasPriceGwei](backend_network_ethconnection.default.md#getgaspricegwei) +- [getGasPrices](backend_network_ethconnection.default.md#getgasprices) - [getKnownAccounts](backend_network_ethconnection.default.md#getknownaccounts) - [getNonce](backend_network_ethconnection.default.md#getnonce) - [getPrivateKey](backend_network_ethconnection.default.md#getprivatekey) @@ -48,9 +53,12 @@ Responsible for - [loadGettersContract](backend_network_ethconnection.default.md#loadgetterscontract) - [loadWhitelistContract](backend_network_ethconnection.default.md#loadwhitelistcontract) - [processEvents](backend_network_ethconnection.default.md#processevents) +- [refreshGasPrices](backend_network_ethconnection.default.md#refreshgasprices) - [setAccount](backend_network_ethconnection.default.md#setaccount) +- [setDiagnosticUpdater](backend_network_ethconnection.default.md#setdiagnosticupdater) - [setRpcEndpoint](backend_network_ethconnection.default.md#setrpcendpoint) - [signMessage](backend_network_ethconnection.default.md#signmessage) +- [startPollingGasPrices](backend_network_ethconnection.default.md#startpollinggasprices) - [subscribeToEvents](backend_network_ethconnection.default.md#subscribetoevents) - [verifySignature](backend_network_ethconnection.default.md#verifysignature) - [waitForTransaction](backend_network_ethconnection.default.md#waitfortransaction) @@ -79,9 +87,27 @@ Overrides: EventEmitter.constructor --- +### diagnosticsUpdater + +• `Private` **diagnosticsUpdater**: _undefined_ \| [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) + +--- + +### gasPrices + +• `Private` **gasPrices**: GasPrices + +--- + +### gasPrices$ + +• `Readonly` **gasPrices$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) + +--- + ### knownAddresses -• `Private` `Readonly` **knownAddresses**: EthAddress[] +• `Private` **knownAddresses**: EthAddress[] --- @@ -153,6 +179,32 @@ Overrides: EventEmitter.constructor --- +### getGasPriceGwei + +▸ **getGasPriceGwei**(`txType`: EthTxType, `gasPrices`: GasPrices): _number_ + +Get the gas price, measured in gwei, that we should send for a given transaction type, given +the current prices for transaction speeds, and given the user's gas price setting. + +#### Parameters + +| Name | Type | +| :---------- | :-------- | +| `txType` | EthTxType | +| `gasPrices` | GasPrices | + +**Returns:** _number_ + +--- + +### getGasPrices + +▸ **getGasPrices**(): GasPrices + +**Returns:** GasPrices + +--- + ### getKnownAccounts ▸ **getKnownAccounts**(): EthAddress[] @@ -278,6 +330,14 @@ Overrides: EventEmitter.constructor --- +### refreshGasPrices + +▸ `Private` **refreshGasPrices**(): _Promise_ + +**Returns:** _Promise_ + +--- + ### setAccount ▸ **setAccount**(`address`: EthAddress): _void_ @@ -292,6 +352,20 @@ Overrides: EventEmitter.constructor --- +### setDiagnosticUpdater + +▸ **setDiagnosticUpdater**(`diagnosticUpdater?`: [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md)): _void_ + +#### Parameters + +| Name | Type | +| :------------------- | :--------------------------------------------------------------------------------------------- | +| `diagnosticUpdater?` | [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) | + +**Returns:** _void_ + +--- + ### setRpcEndpoint ▸ **setRpcEndpoint**(`url`: _string_): _Promise_ @@ -320,6 +394,14 @@ Overrides: EventEmitter.constructor --- +### startPollingGasPrices + +▸ `Private` **startPollingGasPrices**(): _void_ + +**Returns:** _void_ + +--- + ### subscribeToEvents ▸ **subscribeToEvents**(`contract`: _DarkForestCore_, `handlers`: _Partial_\>): _void_ diff --git a/docs/enums/frontend_utils_settingshooks.autogassetting.md b/docs/enums/frontend_utils_settingshooks.autogassetting.md new file mode 100644 index 00000000..eb43be9c --- /dev/null +++ b/docs/enums/frontend_utils_settingshooks.autogassetting.md @@ -0,0 +1,29 @@ +# Enumeration: AutoGasSetting + +[Frontend/Utils/SettingsHooks](../modules/frontend_utils_settingshooks.md).AutoGasSetting + +## Table of contents + +### Enumeration members + +- [Average](frontend_utils_settingshooks.autogassetting.md#average) +- [Fast](frontend_utils_settingshooks.autogassetting.md#fast) +- [Slow](frontend_utils_settingshooks.autogassetting.md#slow) + +## Enumeration members + +### Average + +• **Average**: = "Average" + +--- + +### Fast + +• **Fast**: = "Fast" + +--- + +### Slow + +• **Slow**: = "Slow" diff --git a/docs/interfaces/frontend_panes_diagnosticspane.diagnostics.md b/docs/interfaces/frontend_panes_diagnosticspane.diagnostics.md index 6e94266a..db18337d 100644 --- a/docs/interfaces/frontend_panes_diagnosticspane.diagnostics.md +++ b/docs/interfaces/frontend_panes_diagnosticspane.diagnostics.md @@ -9,6 +9,7 @@ - [callsInQueue](frontend_panes_diagnosticspane.diagnostics.md#callsinqueue) - [chunkUpdates](frontend_panes_diagnosticspane.diagnostics.md#chunkupdates) - [fps](frontend_panes_diagnosticspane.diagnostics.md#fps) +- [gasPrices](frontend_panes_diagnosticspane.diagnostics.md#gasprices) - [totalCalls](frontend_panes_diagnosticspane.diagnostics.md#totalcalls) - [totalChunks](frontend_panes_diagnosticspane.diagnostics.md#totalchunks) - [totalPlanets](frontend_panes_diagnosticspane.diagnostics.md#totalplanets) @@ -37,6 +38,12 @@ --- +### gasPrices + +• `Optional` **gasPrices**: GasPrices + +--- + ### totalCalls • **totalCalls**: _number_ diff --git a/docs/modules/backend_network_chainapi.md b/docs/modules/backend_network_chainapi.md new file mode 100644 index 00000000..f079aa6a --- /dev/null +++ b/docs/modules/backend_network_chainapi.md @@ -0,0 +1,40 @@ +# Module: Backend/Network/ChainAPI + +## Table of contents + +### Variables + +- [DEFAULT_GAS_PRICES](backend_network_chainapi.md#default_gas_prices) +- [MAX_AUTO_GAS_PRICE_GWEI](backend_network_chainapi.md#max_auto_gas_price_gwei) + +### Functions + +- [getAutoGasPrices](backend_network_chainapi.md#getautogasprices) + +## Variables + +### DEFAULT_GAS_PRICES + +• `Const` **DEFAULT_GAS_PRICES**: _Readonly_ + +In case of errors, these are the default gas prices. + +--- + +### MAX_AUTO_GAS_PRICE_GWEI + +• `Const` **MAX_AUTO_GAS_PRICE_GWEI**: `15`= 15 + +In case xDai's auto-price is something ridiculous, we don't want our players to insta run out of +money. + +## Functions + +### getAutoGasPrices + +▸ **getAutoGasPrices**(): _Promise_ + +Gets the current gas prices from xDai's price oracle. If the oracle is broken, return some sane +defaults. + +**Returns:** _Promise_ diff --git a/docs/modules/backend_utils_utils.md b/docs/modules/backend_utils_utils.md index b51f40c7..132ad966 100644 --- a/docs/modules/backend_utils_utils.md +++ b/docs/modules/backend_utils_utils.md @@ -17,6 +17,7 @@ - [deferred](backend_utils_utils.md#deferred) - [formatNumber](backend_utils_utils.md#formatnumber) - [getFormatProp](backend_utils_utils.md#getformatprop) +- [getGasSettingGwei](backend_utils_utils.md#getgassettinggwei) - [getOwnerColor](backend_utils_utils.md#getownercolor) - [getPlanetMaxRank](backend_utils_utils.md#getplanetmaxrank) - [getPlanetRank](backend_utils_utils.md#getplanetrank) @@ -155,6 +156,21 @@ --- +### getGasSettingGwei + +▸ **getGasSettingGwei**(`setting`: [_AutoGasSetting_](../enums/frontend_utils_settingshooks.autogassetting.md), `gasPrices`: GasPrices): _number_ \| _undefined_ + +#### Parameters + +| Name | Type | +| :---------- | :-------------------------------------------------------------------------- | +| `setting` | [_AutoGasSetting_](../enums/frontend_utils_settingshooks.autogassetting.md) | +| `gasPrices` | GasPrices | + +**Returns:** _number_ \| _undefined_ + +--- + ### getOwnerColor ▸ `Const` **getOwnerColor**(`planet`: Planet): _string_ diff --git a/docs/modules/frontend_components_displaygasprices.md b/docs/modules/frontend_components_displaygasprices.md new file mode 100644 index 00000000..dcad431c --- /dev/null +++ b/docs/modules/frontend_components_displaygasprices.md @@ -0,0 +1,22 @@ +# Module: Frontend/Components/DisplayGasPrices + +## Table of contents + +### Functions + +- [DisplayGasPrices](frontend_components_displaygasprices.md#displaygasprices) + +## Functions + +### DisplayGasPrices + +▸ **DisplayGasPrices**(`__namedParameters`: { `gasPrices?`: GasPrices }): _Element_ + +#### Parameters + +| Name | Type | +| :----------------------------- | :-------- | +| `__namedParameters` | _object_ | +| `__namedParameters.gasPrices?` | GasPrices | + +**Returns:** _Element_ diff --git a/docs/modules/frontend_utils_settingshooks.md b/docs/modules/frontend_utils_settingshooks.md index 8d81e5b2..a1daf92d 100644 --- a/docs/modules/frontend_utils_settingshooks.md +++ b/docs/modules/frontend_utils_settingshooks.md @@ -4,10 +4,12 @@ ### Enumerations +- [AutoGasSetting](../enums/frontend_utils_settingshooks.autogassetting.md) - [Setting](../enums/frontend_utils_settingshooks.setting.md) ### Variables +- [ALL_AUTO_GAS_SETTINGS](frontend_utils_settingshooks.md#all_auto_gas_settings) - [settingChanged$](frontend_utils_settingshooks.md#settingchanged$) ### Functions @@ -27,6 +29,12 @@ ## Variables +### ALL_AUTO_GAS_SETTINGS + +• `Const` **ALL_AUTO_GAS_SETTINGS**: [_AutoGasSetting_](../enums/frontend_utils_settingshooks.autogassetting.md)[] + +--- + ### settingChanged$ • `Const` **settingChanged$**: [_Monomitter_](frontend_utils_monomitter.md#monomitter)<[_Setting_](../enums/frontend_utils_settingshooks.setting.md)\> diff --git a/last_updated.txt b/last_updated.txt index f721dc13..7fcc5471 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Wed Jul 7 18:00:41 UTC 2021 +last updated: Fri Jul 9 04:57:27 UTC 2021 diff --git a/package.json b/package.json index 180ce874..e737218f 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { "name": "client", - "version": "6.2.10", + "version": "6.2.11", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.10", - "@darkforest_eth/contracts": "6.2.10", - "@darkforest_eth/hashing": "6.2.10", - "@darkforest_eth/hexgen": "6.2.10", - "@darkforest_eth/serde": "6.2.10", - "@darkforest_eth/snarks": "6.2.10", - "@darkforest_eth/types": "6.2.10", + "@darkforest_eth/constants": "6.2.11", + "@darkforest_eth/contracts": "6.2.11", + "@darkforest_eth/hashing": "6.2.11", + "@darkforest_eth/hexgen": "6.2.11", + "@darkforest_eth/serde": "6.2.11", + "@darkforest_eth/snarks": "6.2.11", + "@darkforest_eth/types": "6.2.11", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", diff --git a/src/Backend/GameLogic/ContractsAPI.ts b/src/Backend/GameLogic/ContractsAPI.ts index 4263efb9..f45c772c 100644 --- a/src/Backend/GameLogic/ContractsAPI.ts +++ b/src/Backend/GameLogic/ContractsAPI.ts @@ -1086,6 +1086,7 @@ class ContractsAPI extends EventEmitter { this.diagnosticsUpdater = diagnosticUpdater; this.contractCaller.setDiagnosticUpdater(diagnosticUpdater); this.txRequestExecutor?.setDiagnosticUpdater(diagnosticUpdater); + this.ethConnection.setDiagnosticUpdater(diagnosticUpdater); } } diff --git a/src/Backend/Network/ChainAPI.ts b/src/Backend/Network/ChainAPI.ts new file mode 100644 index 00000000..0801fd4d --- /dev/null +++ b/src/Backend/Network/ChainAPI.ts @@ -0,0 +1,57 @@ +import { GasPrices } from '@darkforest_eth/types'; + +const GAS_PRICE_API = 'https://blockscout.com/xdai/mainnet/api/v1/gas-price-oracle'; + +/** + * In case of errors, these are the default gas prices. + */ +export const DEFAULT_GAS_PRICES: Readonly = Object.freeze({ + slow: 1, + average: 3, + fast: 10, +}); + +/** + * In case xDai's auto-price is something ridiculous, we don't want our players to insta run out of + * money. + */ +export const MAX_AUTO_GAS_PRICE_GWEI = 15; + +/** + * Gets the current gas prices from xDai's price oracle. If the oracle is broken, return some sane + * defaults. + */ +export async function getAutoGasPrices(): Promise { + try { + const res = await fetch(GAS_PRICE_API, { + method: 'GET', + }); + + const prices = (await res.json()) as GasPrices; + cleanGasPrices(prices); + return prices; + } catch (e) { + return DEFAULT_GAS_PRICES; + } +} + +/** + * In case xDai gives us a malformed response, clean it up with some default gas prices. + */ +function cleanGasPrices(gasPrices: GasPrices): void { + if (typeof gasPrices.fast !== 'number') { + gasPrices.fast = DEFAULT_GAS_PRICES.fast; + } + + if (typeof gasPrices.average !== 'number') { + gasPrices.average = DEFAULT_GAS_PRICES.average; + } + + if (typeof gasPrices.slow !== 'number') { + gasPrices.slow = DEFAULT_GAS_PRICES.slow; + } + + gasPrices.fast = Math.max(1, Math.min(MAX_AUTO_GAS_PRICE_GWEI, gasPrices.fast)); + gasPrices.average = Math.max(1, Math.min(MAX_AUTO_GAS_PRICE_GWEI, gasPrices.average)); + gasPrices.slow = Math.max(1, Math.min(MAX_AUTO_GAS_PRICE_GWEI, gasPrices.slow)); +} diff --git a/src/Backend/Network/EthConnection.ts b/src/Backend/Network/EthConnection.ts index d95ac983..485d782c 100644 --- a/src/Backend/Network/EthConnection.ts +++ b/src/Backend/Network/EthConnection.ts @@ -19,8 +19,8 @@ import EventEmitter from 'events'; import stringify from 'json-stable-stringify'; import { XDAI_CHAIN_ID } from '../../Frontend/Utils/constants'; import { Monomitter, monomitter } from '../../Frontend/Utils/Monomitter'; -import { EthAddress } from '@darkforest_eth/types'; -import { callWithRetry, sleep } from '../Utils/Utils'; +import { EthAddress, EthTxType, GasPrices } from '@darkforest_eth/types'; +import { callWithRetry, getGasSettingGwei, sleep } from '../Utils/Utils'; import type { DarkForestCore, DarkForestGetters, @@ -34,6 +34,9 @@ import whitelistContractAbiPath from '@darkforest_eth/contracts/abis/Whitelist.j import gptCreditContractAbiPath from '@darkforest_eth/contracts/abis/DarkForestGPTCredit.json'; import { ContractEvent } from '../../_types/darkforest/api/ContractsAPITypes'; import { BlockWaiter } from '../Utils/BlockWaiter'; +import { DEFAULT_GAS_PRICES, getAutoGasPrices } from './ChainAPI'; +import { DiagnosticUpdater } from '../Interfaces/DiagnosticUpdater'; +import { getSetting, Setting, AutoGasSetting } from '../../Frontend/Utils/SettingsHooks'; /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -51,12 +54,15 @@ class EthConnection extends EventEmitter { private static readonly XDAI_DEFAULT_URL = process.env.DEFAULT_RPC as string; public readonly blockNumber$: Monomitter; - private blockNumber: number; + public readonly gasPrices$: Monomitter; - private readonly knownAddresses: EthAddress[]; + private diagnosticsUpdater: DiagnosticUpdater | undefined; + private knownAddresses: EthAddress[]; + private blockNumber: number; private provider: JsonRpcProvider; private signer: Wallet | undefined; private rpcURL: string; + private gasPrices: GasPrices = DEFAULT_GAS_PRICES; public constructor() { super(); @@ -83,6 +89,56 @@ class EthConnection extends EventEmitter { this.blockNumber$ = monomitter(true); this.adjustPollRateBasedOnVisibility(); + this.startPollingGasPrices(); + this.gasPrices$ = monomitter(); + } + + private async refreshGasPrices() { + this.gasPrices = await getAutoGasPrices(); + this.gasPrices$.publish(this.gasPrices); + this.diagnosticsUpdater?.updateDiagnostics((d) => (d.gasPrices = this.gasPrices)); + } + + private startPollingGasPrices() { + this.refreshGasPrices(); + setInterval(() => { + this.refreshGasPrices(); + }, 1000 * 10); + } + + public getGasPrices(): GasPrices { + return { ...this.gasPrices }; + } + + /** + * Get the gas price, measured in gwei, that we should send for a given transaction type, given + * the current prices for transaction speeds, and given the user's gas price setting. + */ + public getGasPriceGwei(txType: EthTxType, gasPrices: GasPrices): number { + // all init transactions should be fast, regardless of user setting. it's important that this + // transaction actually happens. + if (txType === EthTxType.INIT) { + return gasPrices.fast; + } + + // either a `AutoGasSetting` or a stringified number + const gasPriceSetting = getSetting(this.getAddress(), Setting.GasFeeGwei); + + // if `userSetting` represents an 'auto' choice, return that choice's current price + const autoPrice = getGasSettingGwei(gasPriceSetting as AutoGasSetting, gasPrices); + if (autoPrice !== undefined) { + return autoPrice; + } + + // if `userSetting` is not an auto choice, it is a string representing the user's + // preferred gas price, measured in gwei. + const parsedSetting = parseFloat(gasPriceSetting); + if (!isNaN(parsedSetting)) { + return parsedSetting; + } + + // if the setting has become corrupted, just return an average gas price + return gasPrices.average; } private adjustPollRateBasedOnVisibility() { @@ -369,6 +425,10 @@ class EthConnection extends EventEmitter { } }); } + + public setDiagnosticUpdater(diagnosticUpdater?: DiagnosticUpdater) { + this.diagnosticsUpdater = diagnosticUpdater; + } } export default EthConnection; diff --git a/src/Backend/Network/TxExecutor.ts b/src/Backend/Network/TxExecutor.ts index 2662a99a..6e8c8e8b 100644 --- a/src/Backend/Network/TxExecutor.ts +++ b/src/Backend/Network/TxExecutor.ts @@ -8,7 +8,6 @@ import { EventLogger } from './EventLogger'; import NotificationManager from '../../Frontend/Game/NotificationManager'; import { openConfirmationWindowForTransaction } from '../../Frontend/Game/Popups'; import { DiagnosticUpdater } from '../Interfaces/DiagnosticUpdater'; -import { getSetting, Setting } from '../../Frontend/Utils/SettingsHooks'; export interface QueuedTxRequest { onSubmissionError: (e: Error) => void; @@ -83,15 +82,9 @@ export class TxExecutor extends EventEmitter { const [txReceipt, rejectTxReceipt, receiptPromise] = deferred(); if (overrides.gasPrice === undefined) { - const gwei = EthersBN.from('1000000000'); - let userGasPriceGwei = getSetting(this.eth.getAddress(), Setting.GasFeeGwei); - - // TODO: this value should be pulled from blockscout API or something - if (type === EthTxType.INIT) { - userGasPriceGwei = '10'; - } - - overrides.gasPrice = gwei.mul(userGasPriceGwei); + overrides.gasPrice = EthersBN.from('1000000000').mul( + this.eth.getGasPriceGwei(type, this.eth.getGasPrices()) + ); } this.txQueue.add(() => { diff --git a/src/Backend/Utils/Utils.ts b/src/Backend/Utils/Utils.ts index 03710f52..28991a6a 100644 --- a/src/Backend/Utils/Utils.ts +++ b/src/Backend/Utils/Utils.ts @@ -1,9 +1,17 @@ import * as bigInt from 'big-integer'; import { BigInteger } from 'big-integer'; import { StatIdx } from '../../_types/global/GlobalTypes'; -import { Planet, EthAddress, SpaceType, Upgrade, UpgradeBranchName } from '@darkforest_eth/types'; +import { + Planet, + EthAddress, + SpaceType, + Upgrade, + UpgradeBranchName, + GasPrices, +} from '@darkforest_eth/types'; import _ from 'lodash'; import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; +import { AutoGasSetting } from '../../Frontend/Utils/SettingsHooks'; export const ONE_DAY = 24 * 60 * 60 * 1000; @@ -252,3 +260,19 @@ export function deferred(): [(t: T) => void, (t: Error) => void, Promise] /* eslint-disable @typescript-eslint/no-explicit-any */ return [resolve as any, reject as any, promise]; } + +export function getGasSettingGwei( + setting: AutoGasSetting, + gasPrices: GasPrices +): number | undefined { + switch (setting) { + case AutoGasSetting.Slow: + return gasPrices.slow; + case AutoGasSetting.Average: + return gasPrices.average; + case AutoGasSetting.Fast: + return gasPrices.fast; + default: + return undefined; + } +} diff --git a/src/Frontend/Components/DisplayGasPrices.tsx b/src/Frontend/Components/DisplayGasPrices.tsx new file mode 100644 index 00000000..e1054521 --- /dev/null +++ b/src/Frontend/Components/DisplayGasPrices.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { GasPrices } from '@darkforest_eth/types'; +import { Underline } from './CoreUI'; + +export function DisplayGasPrices({ gasPrices }: { gasPrices?: GasPrices }) { + return ( +
+ {!gasPrices ? ( + 'unknown' + ) : ( + <> + slow: {gasPrices.slow + ' '} + average: {gasPrices.average + ' '} + fast: {gasPrices.fast + ' '} + + )} +
+ ); +} diff --git a/src/Frontend/Pages/GameLandingPage.tsx b/src/Frontend/Pages/GameLandingPage.tsx index 71457e46..efc871f3 100644 --- a/src/Frontend/Pages/GameLandingPage.tsx +++ b/src/Frontend/Pages/GameLandingPage.tsx @@ -233,7 +233,6 @@ export default function GameLandingPage() { '0xb05d95422bf8d5024f9c340e8f7bd696d67ee3a9', TerminalTextStyle.White ); - terminal.current?.newline(); terminal.current?.print(' v0.6 r1 '); terminal.current?.print('05/22/2021 ', TerminalTextStyle.White); terminal.current?.printLink( @@ -244,6 +243,7 @@ export default function GameLandingPage() { TerminalTextStyle.White ); terminal.current?.newline(); + terminal.current?.newline(); const knownAddrs = ethConnection.getKnownAccounts(); terminal.current?.println(`Found ${knownAddrs.length} accounts on this device.`); diff --git a/src/Frontend/Pages/TxConfirmPopup.tsx b/src/Frontend/Pages/TxConfirmPopup.tsx index 98eb7ad6..fad521dc 100644 --- a/src/Frontend/Pages/TxConfirmPopup.tsx +++ b/src/Frontend/Pages/TxConfirmPopup.tsx @@ -149,7 +149,8 @@ export function TxConfirmPopup({ match }: RouteComponentProps) { else approve(); }; - const gasFeeGwei = parseInt(localStorage.getItem(`${addr.toLowerCase()}-gasFeeGwei`) || '1', 10); + const gasFeeGwei = parseInt(localStorage.getItem(`${addr}-gasFeeGwei`) || '1', 10); + const fromPlanet = localStorage.getItem(`${addr.toLowerCase()}-fromPlanet`); const toPlanet = localStorage.getItem(`${addr.toLowerCase()}-toPlanet`); @@ -158,7 +159,7 @@ export function TxConfirmPopup({ match }: RouteComponentProps) { const hatCost: number = method === 'buyHat' && hatLevel ? 2 ** parseInt(hatLevel) : 0; const gptCost: number = method === 'buyCredits' ? 0.5 : 0; - const txCost: number = 0.002 * gasFeeGwei + hatCost + gptCost; + const txCost: number = hatCost + gptCost + 0.002 * gasFeeGwei; const upPlanet = localStorage.getItem(`${addr.toLowerCase()}-upPlanet`); const branch = localStorage.getItem(`${addr.toLowerCase()}-branch`); diff --git a/src/Frontend/Panes/DiagnosticsPane.tsx b/src/Frontend/Panes/DiagnosticsPane.tsx index 7bc59836..92fa1c10 100644 --- a/src/Frontend/Panes/DiagnosticsPane.tsx +++ b/src/Frontend/Panes/DiagnosticsPane.tsx @@ -1,7 +1,9 @@ import React, { useState } from 'react'; import { useEffect } from 'react'; import styled from 'styled-components'; +import { GasPrices } from '@darkforest_eth/types'; import { Spacer, Underline } from '../Components/CoreUI'; +import { DisplayGasPrices } from '../Components/DisplayGasPrices'; import { White } from '../Components/Text'; import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; @@ -24,6 +26,7 @@ export interface Diagnostics { totalTransactions: number; transactionsInQueue: number; totalChunks: number; + gasPrices?: GasPrices; } export function DiagnosticsPane({ hook }: { hook: ModalHook }) { @@ -133,6 +136,13 @@ function NetworkingTab({ diagnostics }: { diagnostics: Diagnostics }) { queued transactions {diagnostics.transactionsInQueue.toLocaleString()} + + + oracle gas prices (gwei) + + + + ); diff --git a/src/Frontend/Panes/PrivatePane.tsx b/src/Frontend/Panes/PrivatePane.tsx index c543e802..336fe30e 100644 --- a/src/Frontend/Panes/PrivatePane.tsx +++ b/src/Frontend/Panes/PrivatePane.tsx @@ -25,11 +25,11 @@ export function PrivatePane({ hook }: { hook: ModalHook }) { setHome(coords ? `(${coords.x}, ${coords.y})` : ''); }, [uiManager]); return ( - +

- SKEY + secret key

{sKey}

diff --git a/src/Frontend/Panes/SettingsPane.tsx b/src/Frontend/Panes/SettingsPane.tsx index dea26737..90756a73 100644 --- a/src/Frontend/Panes/SettingsPane.tsx +++ b/src/Frontend/Panes/SettingsPane.tsx @@ -4,13 +4,19 @@ import styled from 'styled-components'; import EthConnection from '../../Backend/Network/EthConnection'; import { Chunk } from '../../_types/global/GlobalTypes'; import { Btn } from '../Components/Btn'; -import { Spacer } from '../Components/CoreUI'; +import { Spacer, Underline } from '../Components/CoreUI'; import { Input } from '../Components/Input'; -import { White, Red, Green } from '../Components/Text'; +import { Red, Green, Link } from '../Components/Text'; import Viewport, { getDefaultScroll } from '../Game/Viewport'; import dfstyles from '../Styles/dfstyles'; import { useUIManager, useAccount } from '../Utils/AppHooks'; -import { BooleanSetting, Setting, MultiSelectSetting } from '../Utils/SettingsHooks'; +import { useEmitterValue } from '../Utils/EmitterHooks'; +import { + BooleanSetting, + Setting, + MultiSelectSetting, + AutoGasSetting, +} from '../Utils/SettingsHooks'; import { ModalHook, ModalName, ModalPane } from '../Views/ModalPane'; const SCROLL_MIN = 0.0001 * 10000; @@ -45,15 +51,19 @@ const Section = styled.div` padding: 1em 0; border-bottom: 1px solid ${dfstyles.colors.subtext}; + &:first-child { + margin-top: -8px; + } + &:last-child { border-bottom: none; } `; const SectionHeader = styled.div` - text-decoration: underline; color: white; margin-bottom: 8px; + font-weight: bold; `; const ScrollSpeedInput = styled(Input)` @@ -73,6 +83,7 @@ export function SettingsPane({ }) { const uiManager = useUIManager(); const account = useAccount(uiManager); + const gasPrices = useEmitterValue(ethConnection.gasPrices$, ethConnection.getGasPrices()); const [rpcURLText, setRpcURLText] = useState(ethConnection.getRpcEndpoint()); const [rpcURL, setRpcURL] = useState(ethConnection.getRpcEndpoint()); @@ -197,10 +208,22 @@ export function SettingsPane({
- Manage account - Your SKEY, or secret key, together with your home planet's{' '} - coordinates, grant you access to your Dark Forest account on different browsers (kind of - like a password). + Burner Wallet Info + + Public Key + {account} + + + Balance + {balance} + +
+ +
+ Burner Wallet Info (Private) + Your secret key, together with your{' '} + home planet's coordinates, grant you access to your Dark Forest + account on different browsers. You should save this info somewhere on your computer. WARNING: Never ever send this to anyone! @@ -212,61 +235,69 @@ export function SettingsPane({
- Manage wallet - - Public Key - {account} - - - Balance - {balance} - - - gas fee (gwei) - - - - - Auto-confirm all transactions except purchases. Currently, you can only purchase GPT - Credits, and Hats. - - - - + Auto Confirm Transactions + + Whether or not to auto-confirm all transactions, except purchases. This will allow you to + make moves, spend silver on upgrades, etc. without requiring you to confirm each + transaction. However, the client WILL ask for confirmation before purchasing GPT credits + or buying hats. + + + +
+ +
+ Gas Price + Your gas price setting determines the price you pay for each transaction. A higher gas + price means your transactions will be prioritized by the blockchain, making them confirm + faster. We recommend using the auto average setting. All auto + settings prices are pulled from{' '} + an oracle{' '} + and are capped at 15 gwei. + +
- Export and import explored maps + Import and Export Map Data WARNING: Maps from others could be altered and are not guaranteed to be correct! - - Copy Map to Clipboard - - - - Import Map from Clipboard - - - You can also import a map by pasting from your clipboard into the text input below, and - clicking the import button below it. - + + - Import + Import Map From Above + + + + + Copy Map to Clipboard + + + Import Map from Clipboard + + + {success} {failure}
@@ -324,14 +367,17 @@ export function SettingsPane({
- Manage other settings. -
Show notifications for MOVE
+ Show notifications for MOVE +
+
+ Scroll speed + Scroll speed = { OptOutMetrics: 'false', AutoApproveNonPurchaseTransactions: 'false', @@ -47,7 +59,7 @@ const defaultSettings: Record = { HighPerformanceRendering: 'false', MoveNotifications: 'true', HasAcceptedPluginRisk: 'false', - GasFeeGwei: '1', + GasFeeGwei: AutoGasSetting.Average, TerminalVisible: 'true', TutorialOpen: 'true', From 2165660e672a2c428dfa0df2bb52e2910b3f6cba Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 9 Jul 2021 07:23:16 +0000 Subject: [PATCH 03/68] update client --- last_updated.txt | 2 +- package.json | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/last_updated.txt b/last_updated.txt index 7fcc5471..93941dda 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Fri Jul 9 04:57:27 UTC 2021 +last updated: Fri Jul 9 07:23:15 UTC 2021 diff --git a/package.json b/package.json index e737218f..3dc4d96a 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { "name": "client", - "version": "6.2.11", + "version": "6.2.12", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.11", - "@darkforest_eth/contracts": "6.2.11", - "@darkforest_eth/hashing": "6.2.11", - "@darkforest_eth/hexgen": "6.2.11", - "@darkforest_eth/serde": "6.2.11", - "@darkforest_eth/snarks": "6.2.11", - "@darkforest_eth/types": "6.2.11", + "@darkforest_eth/constants": "6.2.12", + "@darkforest_eth/contracts": "6.2.12", + "@darkforest_eth/hashing": "6.2.12", + "@darkforest_eth/hexgen": "6.2.12", + "@darkforest_eth/serde": "6.2.12", + "@darkforest_eth/snarks": "6.2.12", + "@darkforest_eth/types": "6.2.12", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", From 74455530d7ecd2206337addcf060db65cbe22b47 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 9 Jul 2021 21:16:52 +0000 Subject: [PATCH 04/68] update client --- last_updated.txt | 2 +- package.json | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/last_updated.txt b/last_updated.txt index 93941dda..d2abbfa4 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Fri Jul 9 07:23:15 UTC 2021 +last updated: Fri Jul 9 21:16:52 UTC 2021 diff --git a/package.json b/package.json index 3dc4d96a..6de36700 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { "name": "client", - "version": "6.2.12", + "version": "6.2.13", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.12", - "@darkforest_eth/contracts": "6.2.12", - "@darkforest_eth/hashing": "6.2.12", - "@darkforest_eth/hexgen": "6.2.12", - "@darkforest_eth/serde": "6.2.12", - "@darkforest_eth/snarks": "6.2.12", - "@darkforest_eth/types": "6.2.12", + "@darkforest_eth/constants": "6.2.13", + "@darkforest_eth/contracts": "6.2.13", + "@darkforest_eth/hashing": "6.2.13", + "@darkforest_eth/hexgen": "6.2.13", + "@darkforest_eth/serde": "6.2.13", + "@darkforest_eth/snarks": "6.2.13", + "@darkforest_eth/types": "6.2.13", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", From 304f40a0b05dd111ce834d525c94ee0a5798e82f Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 15 Jul 2021 18:16:53 +0000 Subject: [PATCH 05/68] update client --- docs/README.md | 524 ++- ...GameLogic_ContractCaller.ContractCaller.md | 83 + .../Backend_GameLogic_ContractsAPI.default.md | 810 +++++ ...ConversationManager.ConversationManager.md | 155 + .../Backend_GameLogic_GameManager.default.md | 2836 +++++++++++++++++ ...ckend_GameLogic_GameObjects.GameObjects.md | 1246 ++++++++ ...Backend_GameLogic_GameUIManager.default.md | 2330 ++++++++++++++ ...teDownloader.InitialGameStateDownloader.md | 81 + ...Backend_GameLogic_LayeredMap.LayeredMap.md | 91 + ...ersationManager.PaidConversationManager.md | 170 + ...d_GameLogic_PluginManager.PluginManager.md | 405 +++ ...end_GameLogic_PluginManager.ProcessInfo.md | 36 + ...ckend_GameLogic_TutorialManager.default.md | 135 + ...Logic_ViewportEntities.ViewportEntities.md | 231 ++ ..._MinerManager.HomePlanetMinerChunkStore.md | 99 + .../Backend_Miner_MinerManager.default.md | 441 +++ ...kend_Miner_MiningPatterns.SpiralPattern.md | 82 + ...Miner_MiningPatterns.SwissCheesePattern.md | 82 + .../Backend_Network_EthConnection.default.md | 500 +++ ...Backend_Network_EventLogger.EventLogger.md | 73 + ...oncurrentQueue.ThrottledConcurrentQueue.md | 217 ++ .../Backend_Network_TxExecutor.TxExecutor.md | 181 ++ .../Backend_Procedural_Noise.default.md | 75 + ...nd_Procedural_ProcgenUtils.ProcgenUtils.md | 605 ++++ ...nd_Storage_PersistentChunkStore.default.md | 551 ++++ ...Backend_Storage_ReaderDataStore.default.md | 213 ++ .../Backend_Utils_BlockWaiter.BlockWaiter.md | 61 + .../Backend_Utils_SnarkArgsHelper.default.md | 298 ++ ...er.md => Backend_Utils_Wrapper.Wrapper.md} | 14 +- ...ontend_Game_NotificationManager.default.md | 502 +++ .../classes/Frontend_Game_Viewport.default.md | 867 +++++ ...Game_ViewportAnimation.AnimationManager.md | 56 + ...ame_ViewportAnimation.ViewportAnimation.md | 113 + .../Frontend_Game_WindowManager.default.md | 179 ++ ...facts_ArtifactRenderer.ArtifactRenderer.md | 344 ++ ...derers_GameRenderer_EngineUtils.default.md | 334 ++ ...derer_Entities_AsteroidRenderer.default.md | 208 ++ ...rer_Entities_BackgroundRenderer.default.md | 98 + ...eRenderer_Entities_BeltRenderer.default.md | 279 ++ ...er_Entities_BlackDomainRenderer.default.md | 242 ++ ...enderer_Entities_CircleRenderer.default.md | 264 ++ ...eRenderer_Entities_LineRenderer.default.md | 243 ++ ...eRenderer_Entities_MaskRenderer.default.md | 225 ++ ...ities_MineBodyRenderer.MineBodyRenderer.md | 244 ++ ...erer_Entities_MineRenderer.MineRenderer.md | 102 + ..._Entities_PerlinRenderer.PerlinRenderer.md | 279 ++ ...er_Entities_PlanetRenderManager.default.md | 310 ++ ...enderer_Entities_PlanetRenderer.default.md | 249 ++ ...s_QuasarBodyRenderer.QuasarBodyRenderer.md | 243 ++ ...ies_QuasarRayRenderer.QuasarRayRenderer.md | 252 ++ ..._Entities_QuasarRenderer.QuasarRenderer.md | 134 + ...eRenderer_Entities_RectRenderer.default.md | 284 ++ ...eRenderer_Entities_RingRenderer.default.md | 285 ++ ...er_Entities_RuinsRenderer.RuinsRenderer.md | 262 ++ ...acetimeRipRenderer.SpacetimeRipRenderer.md | 240 ++ ..._Entities_SpriteRenderer.SpriteRenderer.md | 380 +++ ...eRenderer_Entities_TextRenderer.default.md | 317 ++ ...enderer_Entities_VoyageRenderer.default.md | 82 + ...ities_WormholeRenderer.WormholeRenderer.md | 64 + ..._GameRenderer_Overlay2DRenderer.default.md | 300 ++ ...Renderers_GameRenderer_Renderer.default.md | 321 ++ ...rers_GameRenderer_UIRenderer.UIRenderer.md | 119 + ...eRenderer_WebGL_AttribArray.AttribArray.md | 105 + ...meRenderer_WebGL_AttribManager.default.md} | 58 +- ...derer_WebGL_GameGLManager.GameGLManager.md | 137 + ...r_WebGL_GenericRenderer.GenericRenderer.md | 195 ++ ...GameRenderer_WebGL_ProgramUtils.default.md | 75 + ...enderer_WebGL_ShaderMixins.ShaderMixins.md | 134 + ...enderer_WebGL_WebGLManager.WebGLManager.md | 108 + ...ntend_Renderers_GifRenderer.GifRenderer.md | 343 ++ ...scapeRenderer_PathRenderer.PathRenderer.md | 80 + ...PlanetScapeRenderer.PlanetscapeRenderer.md | 323 ++ .../Frontend_Utils_UIEmitter.default.md | 60 + ...d_Views_DFErrorBoundary.DFErrorBoundary.md | 92 + ...nericErrorBoundary.GenericErrorBoundary.md | 95 + ...d_Views_OwnedPluginView.OwnedPluginView.md | 177 + .../_types_global_GlobalTypes.Chunk.md | 41 + .../_types_global_globaltypes.chunk.md | 43 - ...types_worker_loader_WorkerTypes.default.md | 25 + ...types_worker_loader_workertypes.default.md | 25 - ...gamelogic_contractcaller.contractcaller.md | 81 - .../backend_gamelogic_contractsapi.default.md | 722 ----- ...conversationmanager.conversationmanager.md | 147 - .../backend_gamelogic_gamemanager.default.md | 2508 --------------- ...ckend_gamelogic_gameobjects.gameobjects.md | 1123 ------- ...backend_gamelogic_gameuimanager.default.md | 2034 ------------ ...tedownloader.initialgamestatedownloader.md | 67 - ...backend_gamelogic_layeredmap.layeredmap.md | 89 - ...ersationmanager.paidconversationmanager.md | 158 - ...d_gamelogic_pluginmanager.pluginmanager.md | 373 --- ...end_gamelogic_pluginmanager.processinfo.md | 38 - ...ckend_gamelogic_tutorialmanager.default.md | 123 - ...logic_viewportentities.viewportentities.md | 213 -- .../backend_miner_minermanager.default.md | 399 --- ..._minermanager.homeplanetminerchunkstore.md | 95 - ...kend_miner_miningpatterns.spiralpattern.md | 76 - ...miner_miningpatterns.swisscheesepattern.md | 76 - .../backend_network_ethconnection.default.md | 446 --- ...backend_network_eventlogger.eventlogger.md | 69 - ...oncurrentqueue.throttledconcurrentqueue.md | 203 -- .../backend_network_txexecutor.txexecutor.md | 178 -- .../backend_procedural_noise.default.md | 71 - ...nd_procedural_procgenutils.procgenutils.md | 509 --- ...nd_storage_persistentchunkstore.default.md | 495 --- ...backend_storage_readerdatastore.default.md | 197 -- .../backend_utils_blockwaiter.blockwaiter.md | 61 - .../backend_utils_snarkargshelper.default.md | 278 -- ...ontend_game_notificationmanager.default.md | 369 --- .../classes/frontend_game_viewport.default.md | 773 ----- ...game_viewportanimation.animationmanager.md | 54 - ...ame_viewportanimation.viewportanimation.md | 111 - .../frontend_game_windowmanager.default.md | 163 - ...facts_artifactrenderer.artifactrenderer.md | 302 -- ...derers_gamerenderer_engineutils.default.md | 300 -- ...derer_entities_asteroidrenderer.default.md | 175 - ...rer_entities_backgroundrenderer.default.md | 94 - ...erenderer_entities_beltrenderer.default.md | 244 -- ...er_entities_blackdomainrenderer.default.md | 209 -- ...enderer_entities_circlerenderer.default.md | 229 -- ...erenderer_entities_linerenderer.default.md | 206 -- ...erenderer_entities_maskrenderer.default.md | 194 -- ...ities_minebodyrenderer.minebodyrenderer.md | 207 -- ...erer_entities_minerenderer.minerenderer.md | 96 - ..._entities_perlinrenderer.perlinrenderer.md | 244 -- ...enderer_entities_planetrenderer.default.md | 216 -- ...er_entities_planetrendermanager.default.md | 282 -- ...s_quasarbodyrenderer.quasarbodyrenderer.md | 210 -- ...ies_quasarrayrenderer.quasarrayrenderer.md | 219 -- ..._entities_quasarrenderer.quasarrenderer.md | 126 - ...erenderer_entities_rectrenderer.default.md | 247 -- ...erenderer_entities_ringrenderer.default.md | 250 -- ...er_entities_ruinsrenderer.ruinsrenderer.md | 227 -- ...acetimeriprenderer.spacetimeriprenderer.md | 207 -- ..._entities_spriterenderer.spriterenderer.md | 335 -- ...erenderer_entities_textrenderer.default.md | 276 -- ...enderer_entities_voyagerenderer.default.md | 78 - ...ities_wormholerenderer.wormholerenderer.md | 62 - ..._gamerenderer_overlay2drenderer.default.md | 276 -- ...renderers_gamerenderer_renderer.default.md | 311 -- ...rers_gamerenderer_uirenderer.uirenderer.md | 107 - ...erenderer_webgl_attribarray.attribarray.md | 101 - ...derer_webgl_gameglmanager.gameglmanager.md | 119 - ...r_webgl_genericrenderer.genericrenderer.md | 193 -- ...gamerenderer_webgl_programutils.default.md | 71 - ...enderer_webgl_shadermixins.shadermixins.md | 136 - ...enderer_webgl_webglmanager.webglmanager.md | 104 - ...ntend_renderers_gifrenderer.gifrenderer.md | 303 -- ...scaperenderer_pathrenderer.pathrenderer.md | 80 - ...planetscaperenderer.planetscaperenderer.md | 285 -- .../frontend_utils_uiemitter.default.md | 56 - ...d_views_dferrorboundary.dferrorboundary.md | 82 - ...nericerrorboundary.genericerrorboundary.md | 85 - ...d_views_ownedpluginview.ownedpluginview.md | 161 - ...meLogic_ArtifactUtils.ArtifactFileColor.md | 22 + ..._GameLogic_GameManager.GameManagerEvent.md | 50 + ...eLogic_GameUIManager.GameUIManagerEvent.md | 22 + ...ic_TutorialManager.TutorialManagerEvent.md | 15 + ...GameLogic_TutorialManager.TutorialState.md | 92 + ...d_Miner_MinerManager.MinerManagerEvent.md} | 6 +- ..._Miner_MiningPatterns.MiningPatternType.md | 57 + ..._Network_UtilityServerAPI.EmailResponse.md | 29 + ...derDataStore.SinglePlanetDataStoreEvent.md | 22 + .../Frontend_Components_Email.EmailCTAMode.md | 22 + ...icationManager.NotificationManagerEvent.md | 15 + ...me_NotificationManager.NotificationType.md | 225 ++ ...Frontend_Game_WindowManager.CursorState.md | 29 + ...Frontend_Game_WindowManager.TooltipName.md | 358 +++ ...d_Game_WindowManager.WindowManagerEvent.md | 43 + ...d_Pages_GameLandingPage.InitRenderState.md | 29 + ...end_Pages_LandingPage.LandingPageZIndex.md | 29 + ...Pages_UnsubscribePage.LandingPageZIndex.md | 29 + ...ers_GameRenderer_EngineTypes.AttribType.md | 22 + ...erers_GameRenderer_EngineTypes.DrawMode.md | 29 + ...s_GameRenderer_EngineTypes.RenderZIndex.md | 57 + ...rers_GameRenderer_EngineTypes.TextAlign.md | 29 + ...ers_GameRenderer_EngineTypes.TextAnchor.md | 29 + ...rs_GameRenderer_EngineTypes.UniformType.md | 50 + ...derer_Entities_PerlinUtils.PerlinOctave.md | 29 + ...end_Utils_BrowserChecks.Incompatibility.md | 50 + docs/enums/Frontend_Utils_Hats.HatType.md | 78 + ...tend_Utils_SettingsHooks.AutoGasSetting.md | 29 + .../Frontend_Utils_SettingsHooks.Setting.md | 151 + ...d_Utils_TerminalTypes.TerminalTextStyle.md | 71 + ...Frontend_Utils_UIEmitter.UIEmitterEvent.md | 169 + ...ontend_Utils_constants.GameWindowZIndex.md | 36 + .../Frontend_Views_ModalPane.ModalName.md | 141 + ...ews_PlanetNotifications.PlanetNotifType.md | 43 + ...est_api_ContractsAPITypes.ContractEvent.md | 99 + ...api_ContractsAPITypes.ContractsAPIEvent.md | 92 + ...orest_api_ContractsAPITypes.InitArgIdxs.md | 64 + ...orest_api_ContractsAPITypes.MoveArgIdxs.md | 99 + ..._api_ContractsAPITypes.PlanetEventType.md} | 6 +- ...st_api_ContractsAPITypes.UpgradeArgIdxs.md | 22 + ...rkforest_api_ContractsAPITypes.ZKArgIdx.md | 36 + ...est_api_contractsapitypes.contractevent.md | 99 - ...api_contractsapitypes.contractsapievent.md | 92 - ...orest_api_contractsapitypes.initargidxs.md | 64 - ...orest_api_contractsapitypes.moveargidxs.md | 99 - ...st_api_contractsapitypes.upgradeargidxs.md | 22 - ...rkforest_api_contractsapitypes.zkargidx.md | 36 - .../_types_global_GlobalTypes.StatIdx.md | 43 + .../_types_global_globaltypes.statidx.md | 43 - ...melogic_artifactutils.artifactfilecolor.md | 22 - ..._gamelogic_gamemanager.gamemanagerevent.md | 50 - ...elogic_gameuimanager.gameuimanagerevent.md | 22 - ...ic_tutorialmanager.tutorialmanagerevent.md | 15 - ...gamelogic_tutorialmanager.tutorialstate.md | 92 - ..._miner_miningpatterns.miningpatterntype.md | 57 - ..._network_utilityserverapi.emailresponse.md | 29 - ...derdatastore.singleplanetdatastoreevent.md | 22 - .../frontend_components_email.emailctamode.md | 22 - ...icationmanager.notificationmanagerevent.md | 15 - ...me_notificationmanager.notificationtype.md | 120 - ...frontend_game_windowmanager.cursorstate.md | 29 - ...frontend_game_windowmanager.tooltipname.md | 358 --- ...d_game_windowmanager.windowmanagerevent.md | 43 - ...d_pages_gamelandingpage.initrenderstate.md | 29 - ...end_pages_landingpage.landingpagezindex.md | 29 - ...pages_unsubscribepage.landingpagezindex.md | 29 - ...ers_gamerenderer_enginetypes.attribtype.md | 22 - ...erers_gamerenderer_enginetypes.drawmode.md | 29 - ...s_gamerenderer_enginetypes.renderzindex.md | 57 - ...rers_gamerenderer_enginetypes.textalign.md | 29 - ...ers_gamerenderer_enginetypes.textanchor.md | 29 - ...rs_gamerenderer_enginetypes.uniformtype.md | 50 - ...derer_entities_perlinutils.perlinoctave.md | 29 - ...end_utils_browserchecks.incompatibility.md | 50 - ...ontend_utils_constants.gamewindowzindex.md | 36 - docs/enums/frontend_utils_hats.hattype.md | 78 - ...tend_utils_settingshooks.autogassetting.md | 29 - .../frontend_utils_settingshooks.setting.md | 151 - ...d_utils_terminaltypes.terminaltextstyle.md | 71 - ...frontend_utils_uiemitter.uiemitterevent.md | 169 - .../frontend_views_modalpane.modalname.md | 141 - ...ews_planetnotifications.planetnotiftype.md | 43 - ...ckend_GameLogic_ArrivalUtils.PlanetDiff.md | 35 + ...ameLogic_ArtifactUtils.RenderedArtifact.md | 245 ++ ...ialGameStateDownloader.InitialGameState.md | 127 + ...Logic_ViewportEntities.PlanetRenderInfo.md | 22 + ...ackend_GameLogic_ViewportEntities.Radii.md | 22 + ...es_DiagnosticUpdater.DiagnosticUpdater.md} | 20 +- ...kend_Miner_MiningPatterns.MiningPattern.md | 47 + ...d_Network_TxExecutor.PendingTransaction.md | 22 + ...kend_Network_TxExecutor.QueuedTxRequest.md | 114 + ...ins_EmbeddedPluginLoader.EmbeddedPlugin.md | 31 + ...end_Plugins_PluginProcess.PluginProcess.md | 76 + ...ugins_SerializedPlugin.SerializedPlugin.md | 48 + .../Backend_Utils_Coordinates.CanvasCoords.md | 22 + ...end_Utils_UtilsTypes.PlanetCosmeticInfo.md | 155 + .../Frontend_Components_Btn.BtnProps.md | 50 + ...ponents_TextLoadingBar.LoadingBarHandle.md | 25 + ...ntend_Panes_DiagnosticsPane.Diagnostics.md | 85 + ...enderer_WebGL_WebGLLibTypes.Attributes.md} | 4 +- ...eRenderer_WebGL_WebGLLibTypes.Uniforms.md} | 4 +- .../Frontend_Utils_EmitterUtils.Diff.md | 32 + .../Frontend_Views_Share.ShareProps.md | 50 + .../Frontend_Views_Terminal.TerminalHandle.md | 223 ++ .../Frontend_Views_Terminal.TerminalProps.md | 15 + ...rkforest_api_ChunkStoreTypes.ChunkStore.md | 33 + ...rest_api_ChunkStoreTypes.PersistedChunk.md | 47 + ...t_api_ChunkStoreTypes.PersistedLocation.md | 46 + ...api_ContractsAPITypes.ContractConstants.md | 244 ++ ...rkforest_api_chunkstoretypes.chunkstore.md | 35 - ...rest_api_chunkstoretypes.persistedchunk.md | 47 - ...t_api_chunkstoretypes.persistedlocation.md | 46 - ...api_contractsapitypes.contractconstants.md | 244 -- ...s_global_GlobalTypes.MinerWorkerMessage.md | 92 + .../_types_global_GlobalTypes.Rectangle.md | 26 + ..._global_GlobalTypes.RevealCountdownInfo.md | 29 + ...s_global_globaltypes.minerworkermessage.md | 92 - .../_types_global_globaltypes.rectangle.md | 26 - ..._global_globaltypes.revealcountdowninfo.md | 29 - ...amelogic_artifactutils.renderedartifact.md | 203 -- ...ialgamestatedownloader.initialgamestate.md | 127 - ...logic_viewportentities.planetrenderinfo.md | 22 - ...ackend_gamelogic_viewportentities.radii.md | 22 - ...kend_miner_miningpatterns.miningpattern.md | 46 - ...d_network_txexecutor.pendingtransaction.md | 22 - ...kend_network_txexecutor.queuedtxrequest.md | 119 - ...ins_embeddedpluginloader.embeddedplugin.md | 31 - ...end_plugins_pluginprocess.pluginprocess.md | 84 - ...ugins_serializedplugin.serializedplugin.md | 48 - .../backend_utils_coordinates.canvascoords.md | 22 - ...end_utils_utilstypes.planetcosmeticinfo.md | 155 - .../frontend_components_btn.btnprops.md | 50 - ...ponents_textloadingbar.loadingbarhandle.md | 27 - ...ntend_panes_diagnosticspane.diagnostics.md | 85 - .../frontend_views_share.shareprops.md | 54 - .../frontend_views_terminal.terminalhandle.md | 251 -- .../frontend_views_terminal.terminalprops.md | 15 - .../modules/Backend_GameLogic_ArrivalUtils.md | 178 ++ .../Backend_GameLogic_ArtifactUtils.md | 321 ++ .../Backend_GameLogic_ContractCaller.md | 7 + ...i.md => Backend_GameLogic_ContractsAPI.md} | 2 +- .../Backend_GameLogic_ConversationManager.md | 7 + docs/modules/Backend_GameLogic_GameManager.md | 11 + ...ts.md => Backend_GameLogic_GameObjects.md} | 2 +- .../Backend_GameLogic_GameUIManager.md | 11 + ...nd_GameLogic_InitialGameStateDownloader.md | 11 + ...map.md => Backend_GameLogic_LayeredMap.md} | 2 +- ...ckend_GameLogic_PaidConversationManager.md | 7 + .../Backend_GameLogic_PluginManager.md | 8 + .../Backend_GameLogic_TutorialManager.md | 12 + .../Backend_GameLogic_ViewportEntities.md | 12 + .../Backend_Interfaces_DiagnosticUpdater.md | 7 + ...nkutils.md => Backend_Miner_ChunkUtils.md} | 86 +- docs/modules/Backend_Miner_MinerManager.md | 12 + docs/modules/Backend_Miner_MiningPatterns.md | 16 + docs/modules/Backend_Miner_permutation.md | 40 + ...hainapi.md => Backend_Network_ChainAPI.md} | 16 +- .../Backend_Network_ConversationAPI.md | 103 + ...on.md => Backend_Network_EthConnection.md} | 2 +- ...gger.md => Backend_Network_EventLogger.md} | 2 +- .../modules/Backend_Network_LeaderboardApi.md | 17 + docs/modules/Backend_Network_MessageAPI.md | 57 + ...ackend_Network_ThrottledConcurrentQueue.md | 7 + docs/modules/Backend_Network_TxExecutor.md | 12 + .../Backend_Network_UtilityServerAPI.md | 136 + .../Backend_Plugins_EmbeddedPluginLoader.md | 21 + docs/modules/Backend_Plugins_PluginProcess.md | 7 + ...e.md => Backend_Plugins_PluginTemplate.md} | 4 +- .../Backend_Plugins_SerializedPlugin.md | 17 + .../Backend_Procedural_ArtifactProcgen.md | 126 + ...l_noise.md => Backend_Procedural_Noise.md} | 2 +- .../Backend_Procedural_ProcgenConsts.md | 99 + .../Backend_Procedural_ProcgenUtils.md | 38 + ...acery.md => Backend_Procedural_tracery.md} | 4 +- .../Backend_Procedural_tracery_modifiers.md | 25 + ...> Backend_Storage_PersistentChunkStore.md} | 2 +- .../Backend_Storage_ReaderDataStore.md | 11 + docs/modules/Backend_Utils_Animation.md | 93 + ...waiter.md => Backend_Utils_BlockWaiter.md} | 2 +- docs/modules/Backend_Utils_Coordinates.md | 103 + ...er.md => Backend_Utils_SnarkArgsHelper.md} | 2 +- docs/modules/Backend_Utils_TypeAssertions.md | 244 ++ docs/modules/Backend_Utils_Utils.md | 485 +++ docs/modules/Backend_Utils_UtilsTypes.md | 21 + ...ls_wrapper.md => Backend_Utils_Wrapper.md} | 2 +- .../Frontend_Components_AncientLabel.md | 38 + .../Frontend_Components_ArtifactImage.md | 37 + .../modules/Frontend_Components_BiomeAnims.md | 34 + docs/modules/Frontend_Components_Btn.md | 27 + docs/modules/Frontend_Components_Button.md | 23 + docs/modules/Frontend_Components_CoreUI.md | 114 + docs/modules/Frontend_Components_Corner.md | 23 + .../Frontend_Components_DisplayGasPrices.md | 24 + docs/modules/Frontend_Components_Email.md | 28 + docs/modules/Frontend_Components_FlexRows.md | 13 + ...nd_Components_GameLandingPageComponents.md | 86 + ...rontend_Components_GameWindowComponents.md | 66 + docs/modules/Frontend_Components_Hoverable.md | 37 + .../modules/Frontend_Components_IconButton.md | 13 + docs/modules/Frontend_Components_Icons.md | 1112 +++++++ docs/modules/Frontend_Components_Input.md | 20 + ...ontend_Components_Labels_ArtifactLabels.md | 124 + .../Frontend_Components_Labels_BiomeLabels.md | 110 + ...rontend_Components_Labels_KeywordLabels.md | 50 + .../Frontend_Components_Labels_Labels.md | 24 + .../Frontend_Components_Labels_LavaLabel.md | 27 + ...ntend_Components_Labels_LegendaryLabel.md} | 4 +- .../Frontend_Components_Labels_MythicLabel.md | 13 + ...Frontend_Components_Labels_PlanetLabels.md | 353 ++ ...nd_Components_Labels_SpacetimeRipLabel.md} | 4 +- ...ontend_Components_Labels_WastelandLabel.md | 27 + .../Frontend_Components_LoadingSpinner.md | 25 + .../Frontend_Components_PlanetPreview.md | 45 + docs/modules/Frontend_Components_ReadMore.md | 25 + .../Frontend_Components_RemoteModal.md | 31 + docs/modules/Frontend_Components_Text.md | 382 +++ .../Frontend_Components_TextLoadingBar.md | 38 + .../Frontend_Components_TextPreview.md | 27 + ...il.md => Frontend_Components_TimeUntil.md} | 14 +- ...ontent.md => Frontend_Copy_HelpContent.md} | 8 +- ...md => Frontend_Game_ControllableCanvas.md} | 8 +- .../Frontend_Game_NotificationManager.md | 34 + docs/modules/Frontend_Game_Popups.md | 26 + docs/modules/Frontend_Game_Viewport.md | 21 + .../Frontend_Game_ViewportAnimation.md | 8 + docs/modules/Frontend_Game_WindowManager.md | 30 + ...end_pages_app.md => Frontend_Pages_App.md} | 10 +- ....md => Frontend_Pages_ConversationTest.md} | 8 +- .../modules/Frontend_Pages_GameLandingPage.md | 21 + ...gifmaker.md => Frontend_Pages_GifMaker.md} | 12 +- docs/modules/Frontend_Pages_LandingPage.md | 21 + ...gpage.md => Frontend_Pages_LoadingPage.md} | 8 +- docs/modules/Frontend_Pages_PreviewPage.md | 17 + docs/modules/Frontend_Pages_ShareArtifact.md | 23 + docs/modules/Frontend_Pages_SharePlanet.md | 23 + ...d => Frontend_Pages_TestArtifactImages.md} | 8 +- docs/modules/Frontend_Pages_TxConfirmPopup.md | 23 + .../modules/Frontend_Pages_UnsubscribePage.md | 21 + docs/modules/Frontend_Pages_ValhallaPage.md | 17 + ...ctConversation_ArtifactConversationPane.md | 25 + ...actConversation_ConversationSuggestions.md | 26 + .../Frontend_Panes_ArtifactDetailsPane.md | 64 + ...ane.md => Frontend_Panes_BroadcastPane.md} | 12 +- docs/modules/Frontend_Panes_CoordsPane.md | 17 + .../modules/Frontend_Panes_DiagnosticsPane.md | 28 + docs/modules/Frontend_Panes_ExplorePane.md | 17 + ...s_hatpane.md => Frontend_Panes_HatPane.md} | 12 +- ...helppane.md => Frontend_Panes_HelpPane.md} | 12 +- .../modules/Frontend_Panes_HoverPlanetPane.md | 17 + .../modules/Frontend_Panes_LeaderboardPane.md | 42 + ...s_ManagePlanetArtifacts_ArtifactActions.md | 33 + ..._ManagePlanetArtifacts_ArtifactListItem.md | 26 + ...nes_ManagePlanetArtifacts_ArtifactsList.md | 27 + ...ontend_Panes_ManagePlanetArtifacts_Find.md | 28 + ...s_ManagePlanetArtifacts_ManageArtifacts.md | 36 + ...anetArtifacts_ManagePlanetArtifactsPane.md | 29 + ...nd_Panes_ManagePlanetArtifacts_Prospect.md | 27 + ...tend_Panes_ManagePlanetArtifacts_SortBy.md | 25 + ..._ManagePlanetArtifacts_UpgradeStatsView.md | 26 + docs/modules/Frontend_Panes_OnboardingPane.md | 24 + ...idArtifactConversation_ConversationInfo.md | 24 + ...s_PaidArtifactConversation_CurrencyView.md | 17 + ...nversation_PaidArtifactConversationPane.md | 25 + ...md => Frontend_Panes_PlanetContextPane.md} | 10 +- .../Frontend_Panes_PlanetDetailsPane.md | 25 + docs/modules/Frontend_Panes_PlanetDexPane.md | 42 + .../Frontend_Panes_PlayerArtifactsPane.md | 25 + ...ne.md => Frontend_Panes_PlayerInfoPane.md} | 12 +- .../Frontend_Panes_PluginEditorPane.md | 32 + ...md => Frontend_Panes_PluginLibraryPane.md} | 16 +- ...epane.md => Frontend_Panes_PrivatePane.md} | 12 +- docs/modules/Frontend_Panes_SettingsPane.md | 26 + docs/modules/Frontend_Panes_Tooltip.md | 34 + docs/modules/Frontend_Panes_TooltipPanes.md | 420 +++ docs/modules/Frontend_Panes_TutorialPane.md | 24 + ...md => Frontend_Panes_TwitterVerifyPane.md} | 12 +- ...d => Frontend_Panes_UpgradeDetailsPane.md} | 12 +- docs/modules/Frontend_Panes_WikiPane.md | 24 + ...d => Frontend_Panes_WithdrawSilverPane.md} | 12 +- docs/modules/Frontend_Panes_ZoomPane.md | 17 + ...nd_Renderers_Artifacts_ArtifactRenderer.md | 52 + ...end_Renderers_GameRenderer_EngineConsts.md | 60 + ...tend_Renderers_GameRenderer_EngineTypes.md | 108 + ...tend_Renderers_GameRenderer_EngineUtils.md | 28 + ...GameRenderer_Entities_AsteroidRenderer.md} | 2 +- ...meRenderer_Entities_BackgroundRenderer.md} | 2 +- ...ers_GameRenderer_Entities_BeltRenderer.md} | 2 +- ...eRenderer_Entities_BlackDomainRenderer.md} | 2 +- ...s_GameRenderer_Entities_CircleRenderer.md} | 2 +- ...ers_GameRenderer_Entities_LineRenderer.md} | 2 +- ...ers_GameRenderer_Entities_MaskRenderer.md} | 2 +- ..._GameRenderer_Entities_MineBodyRenderer.md | 7 + ...ers_GameRenderer_Entities_MineRenderer.md} | 2 +- ...rs_GameRenderer_Entities_PerlinRenderer.md | 7 + ...erers_GameRenderer_Entities_PerlinUtils.md | 153 + ...eRenderer_Entities_PlanetRenderManager.md} | 2 +- ...s_GameRenderer_Entities_PlanetRenderer.md} | 2 +- ...ameRenderer_Entities_QuasarBodyRenderer.md | 7 + ...GameRenderer_Entities_QuasarRayRenderer.md | 7 + ...rs_GameRenderer_Entities_QuasarRenderer.md | 7 + ...ers_GameRenderer_Entities_RectRenderer.md} | 2 +- ...ers_GameRenderer_Entities_RingRenderer.md} | 2 +- ...ers_GameRenderer_Entities_RuinsRenderer.md | 7 + ...eRenderer_Entities_SpacetimeRipRenderer.md | 7 + ...rs_GameRenderer_Entities_SpriteRenderer.md | 7 + ...ers_GameRenderer_Entities_TextRenderer.md} | 2 +- ...s_GameRenderer_Entities_VoyageRenderer.md} | 2 +- ..._GameRenderer_Entities_WormholeRenderer.md | 7 + ...nderers_GameRenderer_Overlay2DRenderer.md} | 2 +- ...s_GameRenderer_Programs_AsteroidProgram.md | 53 + ...erers_GameRenderer_Programs_BeltProgram.md | 78 + ...ameRenderer_Programs_BlackDomainProgram.md | 38 + ...ers_GameRenderer_Programs_CircleProgram.md | 45 + ...rers_GameRenderer_Programs_GlassProgram.md | 71 + ...erers_GameRenderer_Programs_LineProgram.md | 40 + ...erers_GameRenderer_Programs_MaskProgram.md | 30 + ...erers_GameRenderer_Programs_MineProgram.md | 53 + ...ers_GameRenderer_Programs_PerlinProgram.md | 71 + ...ers_GameRenderer_Programs_PlanetProgram.md | 171 + ...GameRenderer_Programs_QuasarBodyProgram.md | 43 + ..._GameRenderer_Programs_QuasarRayProgram.md | 43 + ...erers_GameRenderer_Programs_RectProgram.md | 50 + ...erers_GameRenderer_Programs_RingProgram.md | 78 + ...rers_GameRenderer_Programs_RuinsProgram.md | 53 + ...meRenderer_Programs_SpacetimeRipProgram.md | 58 + ...ers_GameRenderer_Programs_SpriteProgram.md | 63 + ...erers_GameRenderer_Programs_TextProgram.md | 43 + ...ontend_Renderers_GameRenderer_Renderer.md} | 2 +- ...d_Renderers_GameRenderer_TextureManager.md | 166 + ...tend_Renderers_GameRenderer_UIRenderer.md} | 2 +- ...enderers_GameRenderer_WebGL_AttribArray.md | 17 + ...erers_GameRenderer_WebGL_AttribManager.md} | 2 +- ...derers_GameRenderer_WebGL_GameGLManager.md | 7 + ...rers_GameRenderer_WebGL_GenericRenderer.md | 7 + ...derers_GameRenderer_WebGL_ProgramUtils.md} | 2 +- ...derers_GameRenderer_WebGL_ShaderMixins.md} | 2 +- ...derers_GameRenderer_WebGL_WebGLLibTypes.md | 72 + ...derers_GameRenderer_WebGL_WebGLManager.md} | 2 +- ...r.md => Frontend_Renderers_GifRenderer.md} | 2 +- .../Frontend_Renderers_LandingPageCanvas.md | 28 + ...nderers_PlanetscapeRenderer_PathProgram.md | 70 + ...erers_PlanetscapeRenderer_PathRenderer.md} | 2 +- ...nderers_PlanetscapeRenderer_PlanetIcons.md | 24 + ...nderers_PlanetscapeRenderer_PlanetScape.md | 41 + ...PlanetscapeRenderer_PlanetScapeRenderer.md | 7 + docs/modules/Frontend_Styles_Colors.md | 41 + docs/modules/Frontend_Styles_Mixins.md | 24 + docs/modules/Frontend_Styles_colors.md | 29 + docs/modules/Frontend_Styles_dfstyles.md | 88 + ...Frontend_Styles_tailwind_config.export_.md | 3 + .../Frontend_Styles_tailwind_config.md | 25 + docs/modules/Frontend_Utils_AppHooks.md | 247 ++ docs/modules/Frontend_Utils_BrowserChecks.md | 76 + docs/modules/Frontend_Utils_EmitterHooks.md | 104 + docs/modules/Frontend_Utils_EmitterUtils.md | 194 ++ docs/modules/Frontend_Utils_Hats.md | 71 + ...utils_hooks.md => Frontend_Utils_Hooks.md} | 14 +- docs/modules/Frontend_Utils_KeyEmitters.md | 34 + ...mitter.md => Frontend_Utils_Monomitter.md} | 50 +- docs/modules/Frontend_Utils_SettingsHooks.md | 287 ++ .../Frontend_Utils_ShortcutConstants.md | 62 + docs/modules/Frontend_Utils_TerminalTypes.md | 7 + ...meutils.md => Frontend_Utils_TimeUtils.md} | 10 +- docs/modules/Frontend_Utils_UIEmitter.md | 11 + docs/modules/Frontend_Utils_constants.md | 58 + ...=> Frontend_Utils_createDefinedContext.md} | 8 +- docs/modules/Frontend_Views_ArtifactLink.md | 26 + .../modules/Frontend_Views_DFErrorBoundary.md | 7 + docs/modules/Frontend_Views_DarkForestTips.md | 28 + docs/modules/Frontend_Views_EmojiPicker.md | 25 + .../Frontend_Views_EmojiPlanetNotification.md | 24 + ....md => Frontend_Views_GameWindowLayout.md} | 8 +- .../Frontend_Views_GenericErrorBoundary.md | 7 + docs/modules/Frontend_Views_Leaderboard.md | 17 + docs/modules/Frontend_Views_MenuBar.md | 37 + docs/modules/Frontend_Views_ModalIcon.md | 313 ++ docs/modules/Frontend_Views_ModalPane.md | 47 + docs/modules/Frontend_Views_Notifications.md | 17 + .../modules/Frontend_Views_OwnedPluginView.md | 52 + docs/modules/Frontend_Views_PlanetCard.md | 26 + .../Frontend_Views_PlanetCardComponents.md | 165 + docs/modules/Frontend_Views_PlanetLink.md | 25 + .../Frontend_Views_PlanetNotifications.md | 61 + docs/modules/Frontend_Views_SendResources.md | 24 + ...views_share.md => Frontend_Views_Share.md} | 16 +- docs/modules/Frontend_Views_SortableTable.md | 34 + docs/modules/Frontend_Views_TabbedView.md | 29 + docs/modules/Frontend_Views_Table.md | 36 + docs/modules/Frontend_Views_Terminal.md | 18 + docs/modules/Frontend_Views_TopBar.md | 27 + docs/modules/Frontend_Views_UpgradePreview.md | 27 + docs/modules/Frontend_Views_WithdrawSilver.md | 24 + .../_types_darkforest_api_ChunkStoreTypes.md | 30 + ..._types_darkforest_api_ContractsAPITypes.md | 76 + ...s_darkforest_api_UtilityServerAPITypes.md} | 8 +- .../_types_darkforest_api_chunkstoretypes.md | 30 - ..._types_darkforest_api_contractsapitypes.md | 76 - ...__darkforest_eth_contracts_abis___json_.md | 15 + ...erTypes.__darkforest_eth_snarks___wasm_.md | 15 + ...erTypes.__darkforest_eth_snarks___zkey_.md | 15 + ... => _types_file_loader_FileWorkerTypes.md} | 6 +- ...__darkforest_eth_contracts_abis___json_.md | 15 - ...ertypes.__darkforest_eth_snarks___wasm_.md | 15 - ...ertypes.__darkforest_eth_snarks___zkey_.md | 15 - docs/modules/_types_global_GlobalTypes.md | 102 + docs/modules/_types_global_globals.md | 1 - docs/modules/_types_global_globaltypes.md | 98 - ...md => _types_worker_loader_WorkerTypes.md} | 2 +- .../modules/backend_gamelogic_arrivalutils.md | 156 - .../backend_gamelogic_artifactutils.md | 287 -- .../backend_gamelogic_contractcaller.md | 7 - .../backend_gamelogic_conversationmanager.md | 7 - docs/modules/backend_gamelogic_gamemanager.md | 11 - .../backend_gamelogic_gameuimanager.md | 11 - ...nd_gamelogic_initialgamestatedownloader.md | 11 - ...ckend_gamelogic_paidconversationmanager.md | 7 - .../backend_gamelogic_pluginmanager.md | 8 - .../backend_gamelogic_tutorialmanager.md | 12 - .../backend_gamelogic_viewportentities.md | 12 - .../backend_interfaces_diagnosticupdater.md | 7 - docs/modules/backend_miner_miner_worker.md | 1 - docs/modules/backend_miner_minermanager.md | 12 - docs/modules/backend_miner_miningpatterns.md | 16 - docs/modules/backend_miner_permutation.md | 25 - .../backend_network_conversationapi.md | 93 - .../modules/backend_network_leaderboardapi.md | 15 - docs/modules/backend_network_messageapi.md | 51 - ...ackend_network_throttledconcurrentqueue.md | 7 - docs/modules/backend_network_txexecutor.md | 12 - .../backend_network_utilityserverapi.md | 122 - .../backend_plugins_embeddedpluginloader.md | 19 - docs/modules/backend_plugins_pluginprocess.md | 7 - .../backend_plugins_serializedplugin.md | 17 - .../backend_procedural_artifactprocgen.md | 116 - .../backend_procedural_procgenconsts.md | 99 - .../backend_procedural_procgenutils.md | 38 - .../backend_procedural_tracery_modifiers.md | 25 - .../backend_storage_readerdatastore.md | 11 - docs/modules/backend_utils_animation.md | 83 - docs/modules/backend_utils_coordinates.md | 93 - docs/modules/backend_utils_typeassertions.md | 216 -- docs/modules/backend_utils_utils.md | 435 --- docs/modules/backend_utils_utilstypes.md | 17 - .../frontend_components_ancientlabel.md | 34 - .../frontend_components_artifactimage.md | 35 - .../modules/frontend_components_biomeanims.md | 34 - docs/modules/frontend_components_btn.md | 25 - docs/modules/frontend_components_button.md | 21 - docs/modules/frontend_components_coreui.md | 112 - docs/modules/frontend_components_corner.md | 21 - .../frontend_components_displaygasprices.md | 22 - docs/modules/frontend_components_email.md | 26 - docs/modules/frontend_components_flexrows.md | 13 - ...nd_components_gamelandingpagecomponents.md | 78 - ...rontend_components_gamewindowcomponents.md | 66 - docs/modules/frontend_components_hoverable.md | 35 - .../modules/frontend_components_iconbutton.md | 13 - docs/modules/frontend_components_icons.md | 514 --- docs/modules/frontend_components_input.md | 20 - ...ontend_components_labels_artifactlabels.md | 112 - .../frontend_components_labels_biomelabels.md | 100 - ...rontend_components_labels_keywordlabels.md | 42 - .../frontend_components_labels_labels.md | 22 - .../frontend_components_labels_lavalabel.md | 25 - .../frontend_components_labels_mythiclabel.md | 13 - ...frontend_components_labels_planetlabels.md | 315 -- ...ontend_components_labels_wastelandlabel.md | 25 - .../frontend_components_loadingspinner.md | 23 - .../frontend_components_planetpreview.md | 41 - docs/modules/frontend_components_readmore.md | 23 - .../frontend_components_remotemodal.md | 29 - docs/modules/frontend_components_text.md | 350 -- .../frontend_components_textloadingbar.md | 36 - .../frontend_components_textpreview.md | 25 - docs/modules/frontend_entrypoints.md | 1 - .../frontend_game_notificationmanager.md | 34 - docs/modules/frontend_game_popups.md | 24 - docs/modules/frontend_game_viewport.md | 19 - .../frontend_game_viewportanimation.md | 8 - docs/modules/frontend_game_windowmanager.md | 30 - .../modules/frontend_pages_gamelandingpage.md | 19 - docs/modules/frontend_pages_landingpage.md | 19 - docs/modules/frontend_pages_previewpage.md | 15 - docs/modules/frontend_pages_shareartifact.md | 21 - docs/modules/frontend_pages_shareplanet.md | 21 - docs/modules/frontend_pages_txconfirmpopup.md | 21 - .../modules/frontend_pages_unsubscribepage.md | 19 - docs/modules/frontend_pages_valhallapage.md | 15 - ...ctconversation_artifactconversationpane.md | 23 - ...actconversation_conversationsuggestions.md | 24 - .../frontend_panes_artifactdetailspane.md | 58 - docs/modules/frontend_panes_coordspane.md | 15 - .../modules/frontend_panes_diagnosticspane.md | 26 - docs/modules/frontend_panes_explorepane.md | 15 - .../modules/frontend_panes_hoverplanetpane.md | 15 - .../modules/frontend_panes_leaderboardpane.md | 38 - ...s_manageplanetartifacts_artifactactions.md | 31 - ..._manageplanetartifacts_artifactlistitem.md | 24 - ...nes_manageplanetartifacts_artifactslist.md | 25 - ...ontend_panes_manageplanetartifacts_find.md | 26 - ...s_manageplanetartifacts_manageartifacts.md | 34 - ...anetartifacts_manageplanetartifactspane.md | 27 - ...nd_panes_manageplanetartifacts_prospect.md | 25 - ...tend_panes_manageplanetartifacts_sortby.md | 23 - ..._manageplanetartifacts_upgradestatsview.md | 24 - docs/modules/frontend_panes_onboardingpane.md | 22 - ...idartifactconversation_conversationinfo.md | 22 - ...s_paidartifactconversation_currencyview.md | 15 - ...nversation_paidartifactconversationpane.md | 23 - .../frontend_panes_planetdetailspane.md | 23 - docs/modules/frontend_panes_planetdexpane.md | 38 - .../frontend_panes_playerartifactspane.md | 23 - .../frontend_panes_plugineditorpane.md | 30 - docs/modules/frontend_panes_settingspane.md | 24 - docs/modules/frontend_panes_tooltip.md | 30 - docs/modules/frontend_panes_tooltippanes.md | 346 -- docs/modules/frontend_panes_tutorialpane.md | 22 - docs/modules/frontend_panes_wikipane.md | 22 - docs/modules/frontend_panes_zoompane.md | 15 - ...nd_renderers_artifacts_artifactrenderer.md | 52 - ...end_renderers_gamerenderer_engineconsts.md | 60 - ...tend_renderers_gamerenderer_enginetypes.md | 108 - ...tend_renderers_gamerenderer_engineutils.md | 26 - ..._gamerenderer_entities_minebodyrenderer.md | 7 - ...rs_gamerenderer_entities_perlinrenderer.md | 7 - ...erers_gamerenderer_entities_perlinutils.md | 139 - ...amerenderer_entities_quasarbodyrenderer.md | 7 - ...gamerenderer_entities_quasarrayrenderer.md | 7 - ...rs_gamerenderer_entities_quasarrenderer.md | 7 - ...ers_gamerenderer_entities_ruinsrenderer.md | 7 - ...erenderer_entities_spacetimeriprenderer.md | 7 - ...rs_gamerenderer_entities_spriterenderer.md | 7 - ..._gamerenderer_entities_wormholerenderer.md | 7 - ...s_gamerenderer_programs_asteroidprogram.md | 53 - ...erers_gamerenderer_programs_beltprogram.md | 76 - ...amerenderer_programs_blackdomainprogram.md | 38 - ...ers_gamerenderer_programs_circleprogram.md | 45 - ...rers_gamerenderer_programs_glassprogram.md | 69 - ...erers_gamerenderer_programs_lineprogram.md | 40 - ...erers_gamerenderer_programs_maskprogram.md | 30 - ...erers_gamerenderer_programs_mineprogram.md | 53 - ...rers_gamerenderer_programs_noiseprogram.md | 1 - ...ers_gamerenderer_programs_perlinprogram.md | 71 - ...ers_gamerenderer_programs_planetprogram.md | 159 - ...gamerenderer_programs_quasarbodyprogram.md | 43 - ..._gamerenderer_programs_quasarrayprogram.md | 43 - ...erers_gamerenderer_programs_rectprogram.md | 50 - ...erers_gamerenderer_programs_ringprogram.md | 76 - ...rers_gamerenderer_programs_ruinsprogram.md | 53 - ...merenderer_programs_spacetimeripprogram.md | 58 - ...ers_gamerenderer_programs_spriteprogram.md | 63 - ...erers_gamerenderer_programs_textprogram.md | 43 - ...d_renderers_gamerenderer_texturemanager.md | 156 - ...enderers_gamerenderer_webgl_attribarray.md | 17 - ...derers_gamerenderer_webgl_gameglmanager.md | 7 - ...rers_gamerenderer_webgl_genericrenderer.md | 7 - ...derers_gamerenderer_webgl_webgllibtypes.md | 72 - .../frontend_renderers_landingpagecanvas.md | 24 - ...nderers_planetscaperenderer_pathprogram.md | 68 - ...nderers_planetscaperenderer_planeticons.md | 22 - ...nderers_planetscaperenderer_planetscape.md | 39 - ...planetscaperenderer_planetscaperenderer.md | 7 - docs/modules/frontend_styles_colors.md | 29 - docs/modules/frontend_styles_dfstyles.md | 88 - docs/modules/frontend_styles_mixins.md | 22 - ...frontend_styles_tailwind_config.export_.md | 3 - .../frontend_styles_tailwind_config.md | 25 - docs/modules/frontend_utils_apphooks.md | 221 -- docs/modules/frontend_utils_browserchecks.md | 64 - docs/modules/frontend_utils_constants.md | 58 - docs/modules/frontend_utils_emitterhooks.md | 96 - docs/modules/frontend_utils_emitterutils.md | 125 - docs/modules/frontend_utils_hats.md | 67 - docs/modules/frontend_utils_keyemitters.md | 34 - docs/modules/frontend_utils_settingshooks.md | 263 -- .../frontend_utils_shortcutconstants.md | 62 - docs/modules/frontend_utils_terminaltypes.md | 7 - docs/modules/frontend_utils_uiemitter.md | 11 - docs/modules/frontend_views_artifactlink.md | 24 - docs/modules/frontend_views_darkforesttips.md | 24 - .../modules/frontend_views_dferrorboundary.md | 7 - docs/modules/frontend_views_emojipicker.md | 23 - .../frontend_views_emojiplanetnotification.md | 22 - .../frontend_views_genericerrorboundary.md | 7 - docs/modules/frontend_views_leaderboard.md | 15 - docs/modules/frontend_views_menubar.md | 35 - docs/modules/frontend_views_modalicon.md | 279 -- docs/modules/frontend_views_modalpane.md | 45 - docs/modules/frontend_views_notifications.md | 15 - .../modules/frontend_views_ownedpluginview.md | 44 - docs/modules/frontend_views_planetcard.md | 24 - .../frontend_views_planetcardcomponents.md | 159 - docs/modules/frontend_views_planetlink.md | 23 - .../frontend_views_planetnotifications.md | 57 - docs/modules/frontend_views_sendresources.md | 22 - docs/modules/frontend_views_sortabletable.md | 32 - docs/modules/frontend_views_tabbedview.md | 27 - docs/modules/frontend_views_table.md | 34 - docs/modules/frontend_views_terminal.md | 18 - docs/modules/frontend_views_topbar.md | 25 - docs/modules/frontend_views_upgradepreview.md | 25 - docs/modules/frontend_views_withdrawsilver.md | 22 - last_updated.txt | 2 +- package.json | 24 +- public/icons/alerts/artifacts/find.svg | 1 + public/icons/alerts/artifacts/prospect.svg | 1 + public/icons/alerts/backgrounds/1.svg | 1 + public/icons/alerts/backgrounds/2.svg | 1 + public/icons/alerts/biomes/corrupted.svg | 1 + public/icons/alerts/biomes/desert.svg | 1 + public/icons/alerts/biomes/forest.svg | 1 + public/icons/alerts/biomes/grassland.svg | 1 + public/icons/alerts/biomes/ice.svg | 1 + public/icons/alerts/biomes/lava.svg | 1 + public/icons/alerts/biomes/ocean.svg | 1 + public/icons/alerts/biomes/swamp.svg | 1 + public/icons/alerts/biomes/tundra.svg | 1 + public/icons/alerts/biomes/wasteland.svg | 1 + public/icons/alerts/borders/1.svg | 1 + public/icons/alerts/borders/2.svg | 1 + public/icons/alerts/combat/metplayer.svg | 1 + public/icons/alerts/combat/pirates.svg | 1 + public/icons/alerts/combat/planetattacked.svg | 1 + public/icons/alerts/combat/planetlost.svg | 1 + public/icons/alerts/combat/planetwon.svg | 1 + public/icons/alerts/combat/playerfound.svg | 1 + public/icons/alerts/generic/generic.svg | 1 + public/icons/alerts/planettypes/asteroid.svg | 1 + public/icons/alerts/planettypes/planet.svg | 1 + public/icons/alerts/planettypes/quasar.svg | 1 + public/icons/alerts/planettypes/ruins.svg | 1 + .../icons/alerts/planettypes/tradingpost.svg | 1 + public/icons/alerts/spacetypes/alert_-19.svg | 1 + public/icons/alerts/spacetypes/deadspace.svg | 1 + public/icons/alerts/spacetypes/deepspace.svg | 1 + public/icons/alerts/spacetypes/space.svg | 1 + public/icons/alerts/transactions/accepted.svg | 1 + .../icons/alerts/transactions/confirmed.svg | 1 + public/icons/alerts/transactions/declined.svg | 1 + .../icons/alerts/transactions/initialized.svg | 1 + src/Backend/GameLogic/ArrivalUtils.ts | 18 +- src/Backend/GameLogic/ArtifactUtils.ts | 27 +- src/Backend/GameLogic/GameManager.ts | 77 +- src/Backend/GameLogic/GameObjects.ts | 72 +- src/Backend/GameLogic/GameUIManager.ts | 8 +- src/Backend/GameLogic/LayeredMap.ts | 5 +- src/Backend/GameLogic/TutorialManager.ts | 4 +- src/Backend/GameLogic/ViewportEntities.ts | 5 +- src/Backend/Miner/MinerManager.ts | 2 +- src/Backend/Miner/MiningPatterns.ts | 2 +- src/Backend/Network/TxExecutor.ts | 2 +- src/Backend/Network/UtilityServerAPI.ts | 2 +- src/Backend/Procedural/ProcgenUtils.ts | 59 +- src/Backend/Storage/PersistentChunkStore.ts | 4 +- src/Backend/Storage/ReaderDataStore.ts | 4 +- src/Backend/Utils/UtilsTypes.ts | 10 +- src/Frontend/Components/Email.tsx | 2 +- src/Frontend/Components/Icons.tsx | 136 + src/Frontend/Game/NotificationManager.tsx | 237 +- src/Frontend/Game/WindowManager.ts | 6 +- src/Frontend/Pages/GameLandingPage.tsx | 4 +- src/Frontend/Pages/PreviewPage.tsx | 3 +- src/Frontend/Pages/TestArtifactImages.tsx | 38 +- src/Frontend/Pages/UnsubscribePage.tsx | 2 +- src/Frontend/Panes/OnboardingPane.tsx | 2 +- .../Renderers/Artifacts/ArtifactRenderer.ts | 9 +- .../Renderers/GameRenderer/EngineTypes.ts | 12 +- .../GameRenderer/Entities/MineRenderer.ts | 5 +- .../GameRenderer/Entities/PerlinUtils.ts | 2 +- .../Renderers/GameRenderer/TextureManager.ts | 19 +- src/Frontend/Renderers/GifRenderer.ts | 24 +- .../PlanetscapeRenderer/PlanetIcons.tsx | 6 +- src/Frontend/Styles/Colors.tsx | 68 +- src/Frontend/Styles/dfstyles.ts | 5 +- src/Frontend/Utils/BrowserChecks.ts | 2 +- src/Frontend/Utils/EmitterUtils.ts | 63 +- src/Frontend/Utils/Hats.ts | 2 +- src/Frontend/Utils/SettingsHooks.tsx | 4 +- src/Frontend/Utils/TerminalTypes.ts | 2 +- src/Frontend/Utils/UIEmitter.ts | 2 +- src/Frontend/Views/ModalPane.tsx | 2 +- src/Frontend/Views/Notifications.tsx | 2 +- src/Frontend/Views/PlanetNotifications.tsx | 2 +- src/Frontend/Views/SendResources.tsx | 2 +- .../darkforest/api/ContractsAPITypes.ts | 14 +- src/_types/global/GlobalTypes.ts | 2 +- yarn.lock | 434 ++- 840 files changed, 40232 insertions(+), 35389 deletions(-) create mode 100644 docs/classes/Backend_GameLogic_ContractCaller.ContractCaller.md create mode 100644 docs/classes/Backend_GameLogic_ContractsAPI.default.md create mode 100644 docs/classes/Backend_GameLogic_ConversationManager.ConversationManager.md create mode 100644 docs/classes/Backend_GameLogic_GameManager.default.md create mode 100644 docs/classes/Backend_GameLogic_GameObjects.GameObjects.md create mode 100644 docs/classes/Backend_GameLogic_GameUIManager.default.md create mode 100644 docs/classes/Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md create mode 100644 docs/classes/Backend_GameLogic_LayeredMap.LayeredMap.md create mode 100644 docs/classes/Backend_GameLogic_PaidConversationManager.PaidConversationManager.md create mode 100644 docs/classes/Backend_GameLogic_PluginManager.PluginManager.md create mode 100644 docs/classes/Backend_GameLogic_PluginManager.ProcessInfo.md create mode 100644 docs/classes/Backend_GameLogic_TutorialManager.default.md create mode 100644 docs/classes/Backend_GameLogic_ViewportEntities.ViewportEntities.md create mode 100644 docs/classes/Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md create mode 100644 docs/classes/Backend_Miner_MinerManager.default.md create mode 100644 docs/classes/Backend_Miner_MiningPatterns.SpiralPattern.md create mode 100644 docs/classes/Backend_Miner_MiningPatterns.SwissCheesePattern.md create mode 100644 docs/classes/Backend_Network_EthConnection.default.md create mode 100644 docs/classes/Backend_Network_EventLogger.EventLogger.md create mode 100644 docs/classes/Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md create mode 100644 docs/classes/Backend_Network_TxExecutor.TxExecutor.md create mode 100644 docs/classes/Backend_Procedural_Noise.default.md create mode 100644 docs/classes/Backend_Procedural_ProcgenUtils.ProcgenUtils.md create mode 100644 docs/classes/Backend_Storage_PersistentChunkStore.default.md create mode 100644 docs/classes/Backend_Storage_ReaderDataStore.default.md create mode 100644 docs/classes/Backend_Utils_BlockWaiter.BlockWaiter.md create mode 100644 docs/classes/Backend_Utils_SnarkArgsHelper.default.md rename docs/classes/{backend_utils_wrapper.wrapper.md => Backend_Utils_Wrapper.Wrapper.md} (57%) create mode 100644 docs/classes/Frontend_Game_NotificationManager.default.md create mode 100644 docs/classes/Frontend_Game_Viewport.default.md create mode 100644 docs/classes/Frontend_Game_ViewportAnimation.AnimationManager.md create mode 100644 docs/classes/Frontend_Game_ViewportAnimation.ViewportAnimation.md create mode 100644 docs/classes/Frontend_Game_WindowManager.default.md create mode 100644 docs/classes/Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_EngineUtils.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.WormholeRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_Renderer.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md rename docs/classes/{frontend_renderers_gamerenderer_webgl_attribmanager.default.md => Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md} (53%) create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.default.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md create mode 100644 docs/classes/Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md create mode 100644 docs/classes/Frontend_Renderers_GifRenderer.GifRenderer.md create mode 100644 docs/classes/Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md create mode 100644 docs/classes/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md create mode 100644 docs/classes/Frontend_Utils_UIEmitter.default.md create mode 100644 docs/classes/Frontend_Views_DFErrorBoundary.DFErrorBoundary.md create mode 100644 docs/classes/Frontend_Views_GenericErrorBoundary.GenericErrorBoundary.md create mode 100644 docs/classes/Frontend_Views_OwnedPluginView.OwnedPluginView.md create mode 100644 docs/classes/_types_global_GlobalTypes.Chunk.md delete mode 100644 docs/classes/_types_global_globaltypes.chunk.md create mode 100644 docs/classes/_types_worker_loader_WorkerTypes.default.md delete mode 100644 docs/classes/_types_worker_loader_workertypes.default.md delete mode 100644 docs/classes/backend_gamelogic_contractcaller.contractcaller.md delete mode 100644 docs/classes/backend_gamelogic_contractsapi.default.md delete mode 100644 docs/classes/backend_gamelogic_conversationmanager.conversationmanager.md delete mode 100644 docs/classes/backend_gamelogic_gamemanager.default.md delete mode 100644 docs/classes/backend_gamelogic_gameobjects.gameobjects.md delete mode 100644 docs/classes/backend_gamelogic_gameuimanager.default.md delete mode 100644 docs/classes/backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md delete mode 100644 docs/classes/backend_gamelogic_layeredmap.layeredmap.md delete mode 100644 docs/classes/backend_gamelogic_paidconversationmanager.paidconversationmanager.md delete mode 100644 docs/classes/backend_gamelogic_pluginmanager.pluginmanager.md delete mode 100644 docs/classes/backend_gamelogic_pluginmanager.processinfo.md delete mode 100644 docs/classes/backend_gamelogic_tutorialmanager.default.md delete mode 100644 docs/classes/backend_gamelogic_viewportentities.viewportentities.md delete mode 100644 docs/classes/backend_miner_minermanager.default.md delete mode 100644 docs/classes/backend_miner_minermanager.homeplanetminerchunkstore.md delete mode 100644 docs/classes/backend_miner_miningpatterns.spiralpattern.md delete mode 100644 docs/classes/backend_miner_miningpatterns.swisscheesepattern.md delete mode 100644 docs/classes/backend_network_ethconnection.default.md delete mode 100644 docs/classes/backend_network_eventlogger.eventlogger.md delete mode 100644 docs/classes/backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md delete mode 100644 docs/classes/backend_network_txexecutor.txexecutor.md delete mode 100644 docs/classes/backend_procedural_noise.default.md delete mode 100644 docs/classes/backend_procedural_procgenutils.procgenutils.md delete mode 100644 docs/classes/backend_storage_persistentchunkstore.default.md delete mode 100644 docs/classes/backend_storage_readerdatastore.default.md delete mode 100644 docs/classes/backend_utils_blockwaiter.blockwaiter.md delete mode 100644 docs/classes/backend_utils_snarkargshelper.default.md delete mode 100644 docs/classes/frontend_game_notificationmanager.default.md delete mode 100644 docs/classes/frontend_game_viewport.default.md delete mode 100644 docs/classes/frontend_game_viewportanimation.animationmanager.md delete mode 100644 docs/classes/frontend_game_viewportanimation.viewportanimation.md delete mode 100644 docs/classes/frontend_game_windowmanager.default.md delete mode 100644 docs/classes/frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_engineutils.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_beltrenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_circlerenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_linerenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_maskrenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_planetrenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_planetrendermanager.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_rectrenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_ringrenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_textrenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_voyagerenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_overlay2drenderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_renderer.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_uirenderer.uirenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_webgl_programutils.default.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md delete mode 100644 docs/classes/frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md delete mode 100644 docs/classes/frontend_renderers_gifrenderer.gifrenderer.md delete mode 100644 docs/classes/frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md delete mode 100644 docs/classes/frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md delete mode 100644 docs/classes/frontend_utils_uiemitter.default.md delete mode 100644 docs/classes/frontend_views_dferrorboundary.dferrorboundary.md delete mode 100644 docs/classes/frontend_views_genericerrorboundary.genericerrorboundary.md delete mode 100644 docs/classes/frontend_views_ownedpluginview.ownedpluginview.md create mode 100644 docs/enums/Backend_GameLogic_ArtifactUtils.ArtifactFileColor.md create mode 100644 docs/enums/Backend_GameLogic_GameManager.GameManagerEvent.md create mode 100644 docs/enums/Backend_GameLogic_GameUIManager.GameUIManagerEvent.md create mode 100644 docs/enums/Backend_GameLogic_TutorialManager.TutorialManagerEvent.md create mode 100644 docs/enums/Backend_GameLogic_TutorialManager.TutorialState.md rename docs/enums/{backend_miner_minermanager.minermanagerevent.md => Backend_Miner_MinerManager.MinerManagerEvent.md} (50%) create mode 100644 docs/enums/Backend_Miner_MiningPatterns.MiningPatternType.md create mode 100644 docs/enums/Backend_Network_UtilityServerAPI.EmailResponse.md create mode 100644 docs/enums/Backend_Storage_ReaderDataStore.SinglePlanetDataStoreEvent.md create mode 100644 docs/enums/Frontend_Components_Email.EmailCTAMode.md create mode 100644 docs/enums/Frontend_Game_NotificationManager.NotificationManagerEvent.md create mode 100644 docs/enums/Frontend_Game_NotificationManager.NotificationType.md create mode 100644 docs/enums/Frontend_Game_WindowManager.CursorState.md create mode 100644 docs/enums/Frontend_Game_WindowManager.TooltipName.md create mode 100644 docs/enums/Frontend_Game_WindowManager.WindowManagerEvent.md create mode 100644 docs/enums/Frontend_Pages_GameLandingPage.InitRenderState.md create mode 100644 docs/enums/Frontend_Pages_LandingPage.LandingPageZIndex.md create mode 100644 docs/enums/Frontend_Pages_UnsubscribePage.LandingPageZIndex.md create mode 100644 docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md create mode 100644 docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md create mode 100644 docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md create mode 100644 docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md create mode 100644 docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAnchor.md create mode 100644 docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md create mode 100644 docs/enums/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.PerlinOctave.md create mode 100644 docs/enums/Frontend_Utils_BrowserChecks.Incompatibility.md create mode 100644 docs/enums/Frontend_Utils_Hats.HatType.md create mode 100644 docs/enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md create mode 100644 docs/enums/Frontend_Utils_SettingsHooks.Setting.md create mode 100644 docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md create mode 100644 docs/enums/Frontend_Utils_UIEmitter.UIEmitterEvent.md create mode 100644 docs/enums/Frontend_Utils_constants.GameWindowZIndex.md create mode 100644 docs/enums/Frontend_Views_ModalPane.ModalName.md create mode 100644 docs/enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md create mode 100644 docs/enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md create mode 100644 docs/enums/_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md create mode 100644 docs/enums/_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md create mode 100644 docs/enums/_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md rename docs/enums/{_types_darkforest_api_contractsapitypes.planeteventtype.md => _types_darkforest_api_ContractsAPITypes.PlanetEventType.md} (59%) create mode 100644 docs/enums/_types_darkforest_api_ContractsAPITypes.UpgradeArgIdxs.md create mode 100644 docs/enums/_types_darkforest_api_ContractsAPITypes.ZKArgIdx.md delete mode 100644 docs/enums/_types_darkforest_api_contractsapitypes.contractevent.md delete mode 100644 docs/enums/_types_darkforest_api_contractsapitypes.contractsapievent.md delete mode 100644 docs/enums/_types_darkforest_api_contractsapitypes.initargidxs.md delete mode 100644 docs/enums/_types_darkforest_api_contractsapitypes.moveargidxs.md delete mode 100644 docs/enums/_types_darkforest_api_contractsapitypes.upgradeargidxs.md delete mode 100644 docs/enums/_types_darkforest_api_contractsapitypes.zkargidx.md create mode 100644 docs/enums/_types_global_GlobalTypes.StatIdx.md delete mode 100644 docs/enums/_types_global_globaltypes.statidx.md delete mode 100644 docs/enums/backend_gamelogic_artifactutils.artifactfilecolor.md delete mode 100644 docs/enums/backend_gamelogic_gamemanager.gamemanagerevent.md delete mode 100644 docs/enums/backend_gamelogic_gameuimanager.gameuimanagerevent.md delete mode 100644 docs/enums/backend_gamelogic_tutorialmanager.tutorialmanagerevent.md delete mode 100644 docs/enums/backend_gamelogic_tutorialmanager.tutorialstate.md delete mode 100644 docs/enums/backend_miner_miningpatterns.miningpatterntype.md delete mode 100644 docs/enums/backend_network_utilityserverapi.emailresponse.md delete mode 100644 docs/enums/backend_storage_readerdatastore.singleplanetdatastoreevent.md delete mode 100644 docs/enums/frontend_components_email.emailctamode.md delete mode 100644 docs/enums/frontend_game_notificationmanager.notificationmanagerevent.md delete mode 100644 docs/enums/frontend_game_notificationmanager.notificationtype.md delete mode 100644 docs/enums/frontend_game_windowmanager.cursorstate.md delete mode 100644 docs/enums/frontend_game_windowmanager.tooltipname.md delete mode 100644 docs/enums/frontend_game_windowmanager.windowmanagerevent.md delete mode 100644 docs/enums/frontend_pages_gamelandingpage.initrenderstate.md delete mode 100644 docs/enums/frontend_pages_landingpage.landingpagezindex.md delete mode 100644 docs/enums/frontend_pages_unsubscribepage.landingpagezindex.md delete mode 100644 docs/enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md delete mode 100644 docs/enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md delete mode 100644 docs/enums/frontend_renderers_gamerenderer_enginetypes.renderzindex.md delete mode 100644 docs/enums/frontend_renderers_gamerenderer_enginetypes.textalign.md delete mode 100644 docs/enums/frontend_renderers_gamerenderer_enginetypes.textanchor.md delete mode 100644 docs/enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md delete mode 100644 docs/enums/frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md delete mode 100644 docs/enums/frontend_utils_browserchecks.incompatibility.md delete mode 100644 docs/enums/frontend_utils_constants.gamewindowzindex.md delete mode 100644 docs/enums/frontend_utils_hats.hattype.md delete mode 100644 docs/enums/frontend_utils_settingshooks.autogassetting.md delete mode 100644 docs/enums/frontend_utils_settingshooks.setting.md delete mode 100644 docs/enums/frontend_utils_terminaltypes.terminaltextstyle.md delete mode 100644 docs/enums/frontend_utils_uiemitter.uiemitterevent.md delete mode 100644 docs/enums/frontend_views_modalpane.modalname.md delete mode 100644 docs/enums/frontend_views_planetnotifications.planetnotiftype.md create mode 100644 docs/interfaces/Backend_GameLogic_ArrivalUtils.PlanetDiff.md create mode 100644 docs/interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md create mode 100644 docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md create mode 100644 docs/interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md create mode 100644 docs/interfaces/Backend_GameLogic_ViewportEntities.Radii.md rename docs/interfaces/{backend_interfaces_diagnosticupdater.diagnosticupdater.md => Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md} (55%) create mode 100644 docs/interfaces/Backend_Miner_MiningPatterns.MiningPattern.md create mode 100644 docs/interfaces/Backend_Network_TxExecutor.PendingTransaction.md create mode 100644 docs/interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md create mode 100644 docs/interfaces/Backend_Plugins_EmbeddedPluginLoader.EmbeddedPlugin.md create mode 100644 docs/interfaces/Backend_Plugins_PluginProcess.PluginProcess.md create mode 100644 docs/interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md create mode 100644 docs/interfaces/Backend_Utils_Coordinates.CanvasCoords.md create mode 100644 docs/interfaces/Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md create mode 100644 docs/interfaces/Frontend_Components_Btn.BtnProps.md create mode 100644 docs/interfaces/Frontend_Components_TextLoadingBar.LoadingBarHandle.md create mode 100644 docs/interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md rename docs/interfaces/{frontend_renderers_gamerenderer_webgl_webgllibtypes.attributes.md => Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Attributes.md} (53%) rename docs/interfaces/{frontend_renderers_gamerenderer_webgl_webgllibtypes.uniforms.md => Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Uniforms.md} (52%) create mode 100644 docs/interfaces/Frontend_Utils_EmitterUtils.Diff.md create mode 100644 docs/interfaces/Frontend_Views_Share.ShareProps.md create mode 100644 docs/interfaces/Frontend_Views_Terminal.TerminalHandle.md create mode 100644 docs/interfaces/Frontend_Views_Terminal.TerminalProps.md create mode 100644 docs/interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md create mode 100644 docs/interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md create mode 100644 docs/interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md create mode 100644 docs/interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md delete mode 100644 docs/interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md delete mode 100644 docs/interfaces/_types_darkforest_api_chunkstoretypes.persistedchunk.md delete mode 100644 docs/interfaces/_types_darkforest_api_chunkstoretypes.persistedlocation.md delete mode 100644 docs/interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md create mode 100644 docs/interfaces/_types_global_GlobalTypes.MinerWorkerMessage.md create mode 100644 docs/interfaces/_types_global_GlobalTypes.Rectangle.md create mode 100644 docs/interfaces/_types_global_GlobalTypes.RevealCountdownInfo.md delete mode 100644 docs/interfaces/_types_global_globaltypes.minerworkermessage.md delete mode 100644 docs/interfaces/_types_global_globaltypes.rectangle.md delete mode 100644 docs/interfaces/_types_global_globaltypes.revealcountdowninfo.md delete mode 100644 docs/interfaces/backend_gamelogic_artifactutils.renderedartifact.md delete mode 100644 docs/interfaces/backend_gamelogic_initialgamestatedownloader.initialgamestate.md delete mode 100644 docs/interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md delete mode 100644 docs/interfaces/backend_gamelogic_viewportentities.radii.md delete mode 100644 docs/interfaces/backend_miner_miningpatterns.miningpattern.md delete mode 100644 docs/interfaces/backend_network_txexecutor.pendingtransaction.md delete mode 100644 docs/interfaces/backend_network_txexecutor.queuedtxrequest.md delete mode 100644 docs/interfaces/backend_plugins_embeddedpluginloader.embeddedplugin.md delete mode 100644 docs/interfaces/backend_plugins_pluginprocess.pluginprocess.md delete mode 100644 docs/interfaces/backend_plugins_serializedplugin.serializedplugin.md delete mode 100644 docs/interfaces/backend_utils_coordinates.canvascoords.md delete mode 100644 docs/interfaces/backend_utils_utilstypes.planetcosmeticinfo.md delete mode 100644 docs/interfaces/frontend_components_btn.btnprops.md delete mode 100644 docs/interfaces/frontend_components_textloadingbar.loadingbarhandle.md delete mode 100644 docs/interfaces/frontend_panes_diagnosticspane.diagnostics.md delete mode 100644 docs/interfaces/frontend_views_share.shareprops.md delete mode 100644 docs/interfaces/frontend_views_terminal.terminalhandle.md delete mode 100644 docs/interfaces/frontend_views_terminal.terminalprops.md create mode 100644 docs/modules/Backend_GameLogic_ArrivalUtils.md create mode 100644 docs/modules/Backend_GameLogic_ArtifactUtils.md create mode 100644 docs/modules/Backend_GameLogic_ContractCaller.md rename docs/modules/{backend_gamelogic_contractsapi.md => Backend_GameLogic_ContractsAPI.md} (55%) create mode 100644 docs/modules/Backend_GameLogic_ConversationManager.md create mode 100644 docs/modules/Backend_GameLogic_GameManager.md rename docs/modules/{backend_gamelogic_gameobjects.md => Backend_GameLogic_GameObjects.md} (57%) create mode 100644 docs/modules/Backend_GameLogic_GameUIManager.md create mode 100644 docs/modules/Backend_GameLogic_InitialGameStateDownloader.md rename docs/modules/{backend_gamelogic_layeredmap.md => Backend_GameLogic_LayeredMap.md} (55%) create mode 100644 docs/modules/Backend_GameLogic_PaidConversationManager.md create mode 100644 docs/modules/Backend_GameLogic_PluginManager.md create mode 100644 docs/modules/Backend_GameLogic_TutorialManager.md create mode 100644 docs/modules/Backend_GameLogic_ViewportEntities.md create mode 100644 docs/modules/Backend_Interfaces_DiagnosticUpdater.md rename docs/modules/{backend_miner_chunkutils.md => Backend_Miner_ChunkUtils.md} (54%) create mode 100644 docs/modules/Backend_Miner_MinerManager.md create mode 100644 docs/modules/Backend_Miner_MiningPatterns.md create mode 100644 docs/modules/Backend_Miner_permutation.md rename docs/modules/{backend_network_chainapi.md => Backend_Network_ChainAPI.md} (55%) create mode 100644 docs/modules/Backend_Network_ConversationAPI.md rename docs/modules/{backend_network_ethconnection.md => Backend_Network_EthConnection.md} (54%) rename docs/modules/{backend_network_eventlogger.md => Backend_Network_EventLogger.md} (55%) create mode 100644 docs/modules/Backend_Network_LeaderboardApi.md create mode 100644 docs/modules/Backend_Network_MessageAPI.md create mode 100644 docs/modules/Backend_Network_ThrottledConcurrentQueue.md create mode 100644 docs/modules/Backend_Network_TxExecutor.md create mode 100644 docs/modules/Backend_Network_UtilityServerAPI.md create mode 100644 docs/modules/Backend_Plugins_EmbeddedPluginLoader.md create mode 100644 docs/modules/Backend_Plugins_PluginProcess.md rename docs/modules/{backend_plugins_plugintemplate.md => Backend_Plugins_PluginTemplate.md} (53%) create mode 100644 docs/modules/Backend_Plugins_SerializedPlugin.md create mode 100644 docs/modules/Backend_Procedural_ArtifactProcgen.md rename docs/modules/{backend_procedural_noise.md => Backend_Procedural_Noise.md} (54%) create mode 100644 docs/modules/Backend_Procedural_ProcgenConsts.md create mode 100644 docs/modules/Backend_Procedural_ProcgenUtils.md rename docs/modules/{backend_procedural_tracery.md => Backend_Procedural_tracery.md} (57%) create mode 100644 docs/modules/Backend_Procedural_tracery_modifiers.md rename docs/modules/{backend_storage_persistentchunkstore.md => Backend_Storage_PersistentChunkStore.md} (58%) create mode 100644 docs/modules/Backend_Storage_ReaderDataStore.md create mode 100644 docs/modules/Backend_Utils_Animation.md rename docs/modules/{backend_utils_blockwaiter.md => Backend_Utils_BlockWaiter.md} (54%) create mode 100644 docs/modules/Backend_Utils_Coordinates.md rename docs/modules/{backend_utils_snarkargshelper.md => Backend_Utils_SnarkArgsHelper.md} (54%) create mode 100644 docs/modules/Backend_Utils_TypeAssertions.md create mode 100644 docs/modules/Backend_Utils_Utils.md create mode 100644 docs/modules/Backend_Utils_UtilsTypes.md rename docs/modules/{backend_utils_wrapper.md => Backend_Utils_Wrapper.md} (54%) create mode 100644 docs/modules/Frontend_Components_AncientLabel.md create mode 100644 docs/modules/Frontend_Components_ArtifactImage.md create mode 100644 docs/modules/Frontend_Components_BiomeAnims.md create mode 100644 docs/modules/Frontend_Components_Btn.md create mode 100644 docs/modules/Frontend_Components_Button.md create mode 100644 docs/modules/Frontend_Components_CoreUI.md create mode 100644 docs/modules/Frontend_Components_Corner.md create mode 100644 docs/modules/Frontend_Components_DisplayGasPrices.md create mode 100644 docs/modules/Frontend_Components_Email.md create mode 100644 docs/modules/Frontend_Components_FlexRows.md create mode 100644 docs/modules/Frontend_Components_GameLandingPageComponents.md create mode 100644 docs/modules/Frontend_Components_GameWindowComponents.md create mode 100644 docs/modules/Frontend_Components_Hoverable.md create mode 100644 docs/modules/Frontend_Components_IconButton.md create mode 100644 docs/modules/Frontend_Components_Icons.md create mode 100644 docs/modules/Frontend_Components_Input.md create mode 100644 docs/modules/Frontend_Components_Labels_ArtifactLabels.md create mode 100644 docs/modules/Frontend_Components_Labels_BiomeLabels.md create mode 100644 docs/modules/Frontend_Components_Labels_KeywordLabels.md create mode 100644 docs/modules/Frontend_Components_Labels_Labels.md create mode 100644 docs/modules/Frontend_Components_Labels_LavaLabel.md rename docs/modules/{frontend_components_labels_legendarylabel.md => Frontend_Components_Labels_LegendaryLabel.md} (50%) create mode 100644 docs/modules/Frontend_Components_Labels_MythicLabel.md create mode 100644 docs/modules/Frontend_Components_Labels_PlanetLabels.md rename docs/modules/{frontend_components_labels_spacetimeriplabel.md => Frontend_Components_Labels_SpacetimeRipLabel.md} (52%) create mode 100644 docs/modules/Frontend_Components_Labels_WastelandLabel.md create mode 100644 docs/modules/Frontend_Components_LoadingSpinner.md create mode 100644 docs/modules/Frontend_Components_PlanetPreview.md create mode 100644 docs/modules/Frontend_Components_ReadMore.md create mode 100644 docs/modules/Frontend_Components_RemoteModal.md create mode 100644 docs/modules/Frontend_Components_Text.md create mode 100644 docs/modules/Frontend_Components_TextLoadingBar.md create mode 100644 docs/modules/Frontend_Components_TextPreview.md rename docs/modules/{frontend_components_timeuntil.md => Frontend_Components_TimeUntil.md} (54%) rename docs/modules/{frontend_copy_helpcontent.md => Frontend_Copy_HelpContent.md} (51%) rename docs/modules/{frontend_game_controllablecanvas.md => Frontend_Game_ControllableCanvas.md} (50%) create mode 100644 docs/modules/Frontend_Game_NotificationManager.md create mode 100644 docs/modules/Frontend_Game_Popups.md create mode 100644 docs/modules/Frontend_Game_Viewport.md create mode 100644 docs/modules/Frontend_Game_ViewportAnimation.md create mode 100644 docs/modules/Frontend_Game_WindowManager.md rename docs/modules/{frontend_pages_app.md => Frontend_Pages_App.md} (50%) rename docs/modules/{frontend_pages_conversationtest.md => Frontend_Pages_ConversationTest.md} (50%) create mode 100644 docs/modules/Frontend_Pages_GameLandingPage.md rename docs/modules/{frontend_pages_gifmaker.md => Frontend_Pages_GifMaker.md} (60%) create mode 100644 docs/modules/Frontend_Pages_LandingPage.md rename docs/modules/{frontend_pages_loadingpage.md => Frontend_Pages_LoadingPage.md} (50%) create mode 100644 docs/modules/Frontend_Pages_PreviewPage.md create mode 100644 docs/modules/Frontend_Pages_ShareArtifact.md create mode 100644 docs/modules/Frontend_Pages_SharePlanet.md rename docs/modules/{frontend_pages_testartifactimages.md => Frontend_Pages_TestArtifactImages.md} (51%) create mode 100644 docs/modules/Frontend_Pages_TxConfirmPopup.md create mode 100644 docs/modules/Frontend_Pages_UnsubscribePage.md create mode 100644 docs/modules/Frontend_Pages_ValhallaPage.md create mode 100644 docs/modules/Frontend_Panes_ArtifactConversation_ArtifactConversationPane.md create mode 100644 docs/modules/Frontend_Panes_ArtifactConversation_ConversationSuggestions.md create mode 100644 docs/modules/Frontend_Panes_ArtifactDetailsPane.md rename docs/modules/{frontend_panes_broadcastpane.md => Frontend_Panes_BroadcastPane.md} (50%) create mode 100644 docs/modules/Frontend_Panes_CoordsPane.md create mode 100644 docs/modules/Frontend_Panes_DiagnosticsPane.md create mode 100644 docs/modules/Frontend_Panes_ExplorePane.md rename docs/modules/{frontend_panes_hatpane.md => Frontend_Panes_HatPane.md} (51%) rename docs/modules/{frontend_panes_helppane.md => Frontend_Panes_HelpPane.md} (50%) create mode 100644 docs/modules/Frontend_Panes_HoverPlanetPane.md create mode 100644 docs/modules/Frontend_Panes_LeaderboardPane.md create mode 100644 docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactActions.md create mode 100644 docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactListItem.md create mode 100644 docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactsList.md create mode 100644 docs/modules/Frontend_Panes_ManagePlanetArtifacts_Find.md create mode 100644 docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManageArtifacts.md create mode 100644 docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md create mode 100644 docs/modules/Frontend_Panes_ManagePlanetArtifacts_Prospect.md create mode 100644 docs/modules/Frontend_Panes_ManagePlanetArtifacts_SortBy.md create mode 100644 docs/modules/Frontend_Panes_ManagePlanetArtifacts_UpgradeStatsView.md create mode 100644 docs/modules/Frontend_Panes_OnboardingPane.md create mode 100644 docs/modules/Frontend_Panes_PaidArtifactConversation_ConversationInfo.md create mode 100644 docs/modules/Frontend_Panes_PaidArtifactConversation_CurrencyView.md create mode 100644 docs/modules/Frontend_Panes_PaidArtifactConversation_PaidArtifactConversationPane.md rename docs/modules/{frontend_panes_planetcontextpane.md => Frontend_Panes_PlanetContextPane.md} (51%) create mode 100644 docs/modules/Frontend_Panes_PlanetDetailsPane.md create mode 100644 docs/modules/Frontend_Panes_PlanetDexPane.md create mode 100644 docs/modules/Frontend_Panes_PlayerArtifactsPane.md rename docs/modules/{frontend_panes_playerinfopane.md => Frontend_Panes_PlayerInfoPane.md} (50%) create mode 100644 docs/modules/Frontend_Panes_PluginEditorPane.md rename docs/modules/{frontend_panes_pluginlibrarypane.md => Frontend_Panes_PluginLibraryPane.md} (52%) rename docs/modules/{frontend_panes_privatepane.md => Frontend_Panes_PrivatePane.md} (50%) create mode 100644 docs/modules/Frontend_Panes_SettingsPane.md create mode 100644 docs/modules/Frontend_Panes_Tooltip.md create mode 100644 docs/modules/Frontend_Panes_TooltipPanes.md create mode 100644 docs/modules/Frontend_Panes_TutorialPane.md rename docs/modules/{frontend_panes_twitterverifypane.md => Frontend_Panes_TwitterVerifyPane.md} (51%) rename docs/modules/{frontend_panes_upgradedetailspane.md => Frontend_Panes_UpgradeDetailsPane.md} (51%) create mode 100644 docs/modules/Frontend_Panes_WikiPane.md rename docs/modules/{frontend_panes_withdrawsilverpane.md => Frontend_Panes_WithdrawSilverPane.md} (51%) create mode 100644 docs/modules/Frontend_Panes_ZoomPane.md create mode 100644 docs/modules/Frontend_Renderers_Artifacts_ArtifactRenderer.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_EngineConsts.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_EngineTypes.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_EngineUtils.md rename docs/modules/{frontend_renderers_gamerenderer_entities_asteroidrenderer.md => Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.md} (52%) rename docs/modules/{frontend_renderers_gamerenderer_entities_backgroundrenderer.md => Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.md} (52%) rename docs/modules/{frontend_renderers_gamerenderer_entities_beltrenderer.md => Frontend_Renderers_GameRenderer_Entities_BeltRenderer.md} (52%) rename docs/modules/{frontend_renderers_gamerenderer_entities_blackdomainrenderer.md => Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.md} (52%) rename docs/modules/{frontend_renderers_gamerenderer_entities_circlerenderer.md => Frontend_Renderers_GameRenderer_Entities_CircleRenderer.md} (52%) rename docs/modules/{frontend_renderers_gamerenderer_entities_linerenderer.md => Frontend_Renderers_GameRenderer_Entities_LineRenderer.md} (52%) rename docs/modules/{frontend_renderers_gamerenderer_entities_maskrenderer.md => Frontend_Renderers_GameRenderer_Entities_MaskRenderer.md} (52%) create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.md rename docs/modules/{frontend_renderers_gamerenderer_entities_minerenderer.md => Frontend_Renderers_GameRenderer_Entities_MineRenderer.md} (50%) create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md rename docs/modules/{frontend_renderers_gamerenderer_entities_planetrendermanager.md => Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.md} (52%) rename docs/modules/{frontend_renderers_gamerenderer_entities_planetrenderer.md => Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.md} (52%) create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.md rename docs/modules/{frontend_renderers_gamerenderer_entities_rectrenderer.md => Frontend_Renderers_GameRenderer_Entities_RectRenderer.md} (52%) rename docs/modules/{frontend_renderers_gamerenderer_entities_ringrenderer.md => Frontend_Renderers_GameRenderer_Entities_RingRenderer.md} (52%) create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.md rename docs/modules/{frontend_renderers_gamerenderer_entities_textrenderer.md => Frontend_Renderers_GameRenderer_Entities_TextRenderer.md} (52%) rename docs/modules/{frontend_renderers_gamerenderer_entities_voyagerenderer.md => Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.md} (52%) create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.md rename docs/modules/{frontend_renderers_gamerenderer_overlay2drenderer.md => Frontend_Renderers_GameRenderer_Overlay2DRenderer.md} (53%) create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_AsteroidProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_BeltProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_BlackDomainProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_CircleProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_GlassProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_LineProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_MaskProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_MineProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_PerlinProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_QuasarBodyProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_QuasarRayProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_RectProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_RingProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_RuinsProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_SpacetimeRipProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_SpriteProgram.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_Programs_TextProgram.md rename docs/modules/{frontend_renderers_gamerenderer_renderer.md => Frontend_Renderers_GameRenderer_Renderer.md} (60%) create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_TextureManager.md rename docs/modules/{frontend_renderers_gamerenderer_uirenderer.md => Frontend_Renderers_GameRenderer_UIRenderer.md} (51%) create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_WebGL_AttribArray.md rename docs/modules/{frontend_renderers_gamerenderer_webgl_attribmanager.md => Frontend_Renderers_GameRenderer_WebGL_AttribManager.md} (52%) create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.md create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.md rename docs/modules/{frontend_renderers_gamerenderer_webgl_programutils.md => Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.md} (53%) rename docs/modules/{frontend_renderers_gamerenderer_webgl_shadermixins.md => Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.md} (50%) create mode 100644 docs/modules/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md rename docs/modules/{frontend_renderers_gamerenderer_webgl_webglmanager.md => Frontend_Renderers_GameRenderer_WebGL_WebGLManager.md} (50%) rename docs/modules/{frontend_renderers_gifrenderer.md => Frontend_Renderers_GifRenderer.md} (57%) create mode 100644 docs/modules/Frontend_Renderers_LandingPageCanvas.md create mode 100644 docs/modules/Frontend_Renderers_PlanetscapeRenderer_PathProgram.md rename docs/modules/{frontend_renderers_planetscaperenderer_pathrenderer.md => Frontend_Renderers_PlanetscapeRenderer_PathRenderer.md} (50%) create mode 100644 docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetIcons.md create mode 100644 docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScape.md create mode 100644 docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.md create mode 100644 docs/modules/Frontend_Styles_Colors.md create mode 100644 docs/modules/Frontend_Styles_Mixins.md create mode 100644 docs/modules/Frontend_Styles_colors.md create mode 100644 docs/modules/Frontend_Styles_dfstyles.md create mode 100644 docs/modules/Frontend_Styles_tailwind_config.export_.md create mode 100644 docs/modules/Frontend_Styles_tailwind_config.md create mode 100644 docs/modules/Frontend_Utils_AppHooks.md create mode 100644 docs/modules/Frontend_Utils_BrowserChecks.md create mode 100644 docs/modules/Frontend_Utils_EmitterHooks.md create mode 100644 docs/modules/Frontend_Utils_EmitterUtils.md create mode 100644 docs/modules/Frontend_Utils_Hats.md rename docs/modules/{frontend_utils_hooks.md => Frontend_Utils_Hooks.md} (54%) create mode 100644 docs/modules/Frontend_Utils_KeyEmitters.md rename docs/modules/{frontend_utils_monomitter.md => Frontend_Utils_Monomitter.md} (59%) create mode 100644 docs/modules/Frontend_Utils_SettingsHooks.md create mode 100644 docs/modules/Frontend_Utils_ShortcutConstants.md create mode 100644 docs/modules/Frontend_Utils_TerminalTypes.md rename docs/modules/{frontend_utils_timeutils.md => Frontend_Utils_TimeUtils.md} (51%) create mode 100644 docs/modules/Frontend_Utils_UIEmitter.md create mode 100644 docs/modules/Frontend_Utils_constants.md rename docs/modules/{frontend_utils_createdefinedcontext.md => Frontend_Utils_createDefinedContext.md} (71%) create mode 100644 docs/modules/Frontend_Views_ArtifactLink.md create mode 100644 docs/modules/Frontend_Views_DFErrorBoundary.md create mode 100644 docs/modules/Frontend_Views_DarkForestTips.md create mode 100644 docs/modules/Frontend_Views_EmojiPicker.md create mode 100644 docs/modules/Frontend_Views_EmojiPlanetNotification.md rename docs/modules/{frontend_views_gamewindowlayout.md => Frontend_Views_GameWindowLayout.md} (50%) create mode 100644 docs/modules/Frontend_Views_GenericErrorBoundary.md create mode 100644 docs/modules/Frontend_Views_Leaderboard.md create mode 100644 docs/modules/Frontend_Views_MenuBar.md create mode 100644 docs/modules/Frontend_Views_ModalIcon.md create mode 100644 docs/modules/Frontend_Views_ModalPane.md create mode 100644 docs/modules/Frontend_Views_Notifications.md create mode 100644 docs/modules/Frontend_Views_OwnedPluginView.md create mode 100644 docs/modules/Frontend_Views_PlanetCard.md create mode 100644 docs/modules/Frontend_Views_PlanetCardComponents.md create mode 100644 docs/modules/Frontend_Views_PlanetLink.md create mode 100644 docs/modules/Frontend_Views_PlanetNotifications.md create mode 100644 docs/modules/Frontend_Views_SendResources.md rename docs/modules/{frontend_views_share.md => Frontend_Views_Share.md} (64%) create mode 100644 docs/modules/Frontend_Views_SortableTable.md create mode 100644 docs/modules/Frontend_Views_TabbedView.md create mode 100644 docs/modules/Frontend_Views_Table.md create mode 100644 docs/modules/Frontend_Views_Terminal.md create mode 100644 docs/modules/Frontend_Views_TopBar.md create mode 100644 docs/modules/Frontend_Views_UpgradePreview.md create mode 100644 docs/modules/Frontend_Views_WithdrawSilver.md create mode 100644 docs/modules/_types_darkforest_api_ChunkStoreTypes.md create mode 100644 docs/modules/_types_darkforest_api_ContractsAPITypes.md rename docs/modules/{_types_darkforest_api_utilityserverapitypes.md => _types_darkforest_api_UtilityServerAPITypes.md} (50%) delete mode 100644 docs/modules/_types_darkforest_api_chunkstoretypes.md delete mode 100644 docs/modules/_types_darkforest_api_contractsapitypes.md create mode 100644 docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_contracts_abis___json_.md create mode 100644 docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___wasm_.md create mode 100644 docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___zkey_.md rename docs/modules/{_types_file_loader_fileworkertypes.md => _types_file_loader_FileWorkerTypes.md} (62%) delete mode 100644 docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_contracts_abis___json_.md delete mode 100644 docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_snarks___wasm_.md delete mode 100644 docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_snarks___zkey_.md create mode 100644 docs/modules/_types_global_GlobalTypes.md delete mode 100644 docs/modules/_types_global_globals.md delete mode 100644 docs/modules/_types_global_globaltypes.md rename docs/modules/{_types_worker_loader_workertypes.md => _types_worker_loader_WorkerTypes.md} (56%) delete mode 100644 docs/modules/backend_gamelogic_arrivalutils.md delete mode 100644 docs/modules/backend_gamelogic_artifactutils.md delete mode 100644 docs/modules/backend_gamelogic_contractcaller.md delete mode 100644 docs/modules/backend_gamelogic_conversationmanager.md delete mode 100644 docs/modules/backend_gamelogic_gamemanager.md delete mode 100644 docs/modules/backend_gamelogic_gameuimanager.md delete mode 100644 docs/modules/backend_gamelogic_initialgamestatedownloader.md delete mode 100644 docs/modules/backend_gamelogic_paidconversationmanager.md delete mode 100644 docs/modules/backend_gamelogic_pluginmanager.md delete mode 100644 docs/modules/backend_gamelogic_tutorialmanager.md delete mode 100644 docs/modules/backend_gamelogic_viewportentities.md delete mode 100644 docs/modules/backend_interfaces_diagnosticupdater.md delete mode 100644 docs/modules/backend_miner_miner_worker.md delete mode 100644 docs/modules/backend_miner_minermanager.md delete mode 100644 docs/modules/backend_miner_miningpatterns.md delete mode 100644 docs/modules/backend_miner_permutation.md delete mode 100644 docs/modules/backend_network_conversationapi.md delete mode 100644 docs/modules/backend_network_leaderboardapi.md delete mode 100644 docs/modules/backend_network_messageapi.md delete mode 100644 docs/modules/backend_network_throttledconcurrentqueue.md delete mode 100644 docs/modules/backend_network_txexecutor.md delete mode 100644 docs/modules/backend_network_utilityserverapi.md delete mode 100644 docs/modules/backend_plugins_embeddedpluginloader.md delete mode 100644 docs/modules/backend_plugins_pluginprocess.md delete mode 100644 docs/modules/backend_plugins_serializedplugin.md delete mode 100644 docs/modules/backend_procedural_artifactprocgen.md delete mode 100644 docs/modules/backend_procedural_procgenconsts.md delete mode 100644 docs/modules/backend_procedural_procgenutils.md delete mode 100644 docs/modules/backend_procedural_tracery_modifiers.md delete mode 100644 docs/modules/backend_storage_readerdatastore.md delete mode 100644 docs/modules/backend_utils_animation.md delete mode 100644 docs/modules/backend_utils_coordinates.md delete mode 100644 docs/modules/backend_utils_typeassertions.md delete mode 100644 docs/modules/backend_utils_utils.md delete mode 100644 docs/modules/backend_utils_utilstypes.md delete mode 100644 docs/modules/frontend_components_ancientlabel.md delete mode 100644 docs/modules/frontend_components_artifactimage.md delete mode 100644 docs/modules/frontend_components_biomeanims.md delete mode 100644 docs/modules/frontend_components_btn.md delete mode 100644 docs/modules/frontend_components_button.md delete mode 100644 docs/modules/frontend_components_coreui.md delete mode 100644 docs/modules/frontend_components_corner.md delete mode 100644 docs/modules/frontend_components_displaygasprices.md delete mode 100644 docs/modules/frontend_components_email.md delete mode 100644 docs/modules/frontend_components_flexrows.md delete mode 100644 docs/modules/frontend_components_gamelandingpagecomponents.md delete mode 100644 docs/modules/frontend_components_gamewindowcomponents.md delete mode 100644 docs/modules/frontend_components_hoverable.md delete mode 100644 docs/modules/frontend_components_iconbutton.md delete mode 100644 docs/modules/frontend_components_icons.md delete mode 100644 docs/modules/frontend_components_input.md delete mode 100644 docs/modules/frontend_components_labels_artifactlabels.md delete mode 100644 docs/modules/frontend_components_labels_biomelabels.md delete mode 100644 docs/modules/frontend_components_labels_keywordlabels.md delete mode 100644 docs/modules/frontend_components_labels_labels.md delete mode 100644 docs/modules/frontend_components_labels_lavalabel.md delete mode 100644 docs/modules/frontend_components_labels_mythiclabel.md delete mode 100644 docs/modules/frontend_components_labels_planetlabels.md delete mode 100644 docs/modules/frontend_components_labels_wastelandlabel.md delete mode 100644 docs/modules/frontend_components_loadingspinner.md delete mode 100644 docs/modules/frontend_components_planetpreview.md delete mode 100644 docs/modules/frontend_components_readmore.md delete mode 100644 docs/modules/frontend_components_remotemodal.md delete mode 100644 docs/modules/frontend_components_text.md delete mode 100644 docs/modules/frontend_components_textloadingbar.md delete mode 100644 docs/modules/frontend_components_textpreview.md delete mode 100644 docs/modules/frontend_entrypoints.md delete mode 100644 docs/modules/frontend_game_notificationmanager.md delete mode 100644 docs/modules/frontend_game_popups.md delete mode 100644 docs/modules/frontend_game_viewport.md delete mode 100644 docs/modules/frontend_game_viewportanimation.md delete mode 100644 docs/modules/frontend_game_windowmanager.md delete mode 100644 docs/modules/frontend_pages_gamelandingpage.md delete mode 100644 docs/modules/frontend_pages_landingpage.md delete mode 100644 docs/modules/frontend_pages_previewpage.md delete mode 100644 docs/modules/frontend_pages_shareartifact.md delete mode 100644 docs/modules/frontend_pages_shareplanet.md delete mode 100644 docs/modules/frontend_pages_txconfirmpopup.md delete mode 100644 docs/modules/frontend_pages_unsubscribepage.md delete mode 100644 docs/modules/frontend_pages_valhallapage.md delete mode 100644 docs/modules/frontend_panes_artifactconversation_artifactconversationpane.md delete mode 100644 docs/modules/frontend_panes_artifactconversation_conversationsuggestions.md delete mode 100644 docs/modules/frontend_panes_artifactdetailspane.md delete mode 100644 docs/modules/frontend_panes_coordspane.md delete mode 100644 docs/modules/frontend_panes_diagnosticspane.md delete mode 100644 docs/modules/frontend_panes_explorepane.md delete mode 100644 docs/modules/frontend_panes_hoverplanetpane.md delete mode 100644 docs/modules/frontend_panes_leaderboardpane.md delete mode 100644 docs/modules/frontend_panes_manageplanetartifacts_artifactactions.md delete mode 100644 docs/modules/frontend_panes_manageplanetartifacts_artifactlistitem.md delete mode 100644 docs/modules/frontend_panes_manageplanetartifacts_artifactslist.md delete mode 100644 docs/modules/frontend_panes_manageplanetartifacts_find.md delete mode 100644 docs/modules/frontend_panes_manageplanetartifacts_manageartifacts.md delete mode 100644 docs/modules/frontend_panes_manageplanetartifacts_manageplanetartifactspane.md delete mode 100644 docs/modules/frontend_panes_manageplanetartifacts_prospect.md delete mode 100644 docs/modules/frontend_panes_manageplanetartifacts_sortby.md delete mode 100644 docs/modules/frontend_panes_manageplanetartifacts_upgradestatsview.md delete mode 100644 docs/modules/frontend_panes_onboardingpane.md delete mode 100644 docs/modules/frontend_panes_paidartifactconversation_conversationinfo.md delete mode 100644 docs/modules/frontend_panes_paidartifactconversation_currencyview.md delete mode 100644 docs/modules/frontend_panes_paidartifactconversation_paidartifactconversationpane.md delete mode 100644 docs/modules/frontend_panes_planetdetailspane.md delete mode 100644 docs/modules/frontend_panes_planetdexpane.md delete mode 100644 docs/modules/frontend_panes_playerartifactspane.md delete mode 100644 docs/modules/frontend_panes_plugineditorpane.md delete mode 100644 docs/modules/frontend_panes_settingspane.md delete mode 100644 docs/modules/frontend_panes_tooltip.md delete mode 100644 docs/modules/frontend_panes_tooltippanes.md delete mode 100644 docs/modules/frontend_panes_tutorialpane.md delete mode 100644 docs/modules/frontend_panes_wikipane.md delete mode 100644 docs/modules/frontend_panes_zoompane.md delete mode 100644 docs/modules/frontend_renderers_artifacts_artifactrenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_engineconsts.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_enginetypes.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_engineutils.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_entities_minebodyrenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_entities_perlinrenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_entities_perlinutils.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_entities_quasarrayrenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_entities_quasarrenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_entities_ruinsrenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_entities_spriterenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_entities_wormholerenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_asteroidprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_beltprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_blackdomainprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_circleprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_glassprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_lineprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_maskprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_mineprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_noiseprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_perlinprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_planetprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_quasarbodyprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_quasarrayprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_rectprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_ringprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_ruinsprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_spacetimeripprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_spriteprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_programs_textprogram.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_texturemanager.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_webgl_attribarray.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_webgl_gameglmanager.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_webgl_genericrenderer.md delete mode 100644 docs/modules/frontend_renderers_gamerenderer_webgl_webgllibtypes.md delete mode 100644 docs/modules/frontend_renderers_landingpagecanvas.md delete mode 100644 docs/modules/frontend_renderers_planetscaperenderer_pathprogram.md delete mode 100644 docs/modules/frontend_renderers_planetscaperenderer_planeticons.md delete mode 100644 docs/modules/frontend_renderers_planetscaperenderer_planetscape.md delete mode 100644 docs/modules/frontend_renderers_planetscaperenderer_planetscaperenderer.md delete mode 100644 docs/modules/frontend_styles_colors.md delete mode 100644 docs/modules/frontend_styles_dfstyles.md delete mode 100644 docs/modules/frontend_styles_mixins.md delete mode 100644 docs/modules/frontend_styles_tailwind_config.export_.md delete mode 100644 docs/modules/frontend_styles_tailwind_config.md delete mode 100644 docs/modules/frontend_utils_apphooks.md delete mode 100644 docs/modules/frontend_utils_browserchecks.md delete mode 100644 docs/modules/frontend_utils_constants.md delete mode 100644 docs/modules/frontend_utils_emitterhooks.md delete mode 100644 docs/modules/frontend_utils_emitterutils.md delete mode 100644 docs/modules/frontend_utils_hats.md delete mode 100644 docs/modules/frontend_utils_keyemitters.md delete mode 100644 docs/modules/frontend_utils_settingshooks.md delete mode 100644 docs/modules/frontend_utils_shortcutconstants.md delete mode 100644 docs/modules/frontend_utils_terminaltypes.md delete mode 100644 docs/modules/frontend_utils_uiemitter.md delete mode 100644 docs/modules/frontend_views_artifactlink.md delete mode 100644 docs/modules/frontend_views_darkforesttips.md delete mode 100644 docs/modules/frontend_views_dferrorboundary.md delete mode 100644 docs/modules/frontend_views_emojipicker.md delete mode 100644 docs/modules/frontend_views_emojiplanetnotification.md delete mode 100644 docs/modules/frontend_views_genericerrorboundary.md delete mode 100644 docs/modules/frontend_views_leaderboard.md delete mode 100644 docs/modules/frontend_views_menubar.md delete mode 100644 docs/modules/frontend_views_modalicon.md delete mode 100644 docs/modules/frontend_views_modalpane.md delete mode 100644 docs/modules/frontend_views_notifications.md delete mode 100644 docs/modules/frontend_views_ownedpluginview.md delete mode 100644 docs/modules/frontend_views_planetcard.md delete mode 100644 docs/modules/frontend_views_planetcardcomponents.md delete mode 100644 docs/modules/frontend_views_planetlink.md delete mode 100644 docs/modules/frontend_views_planetnotifications.md delete mode 100644 docs/modules/frontend_views_sendresources.md delete mode 100644 docs/modules/frontend_views_sortabletable.md delete mode 100644 docs/modules/frontend_views_tabbedview.md delete mode 100644 docs/modules/frontend_views_table.md delete mode 100644 docs/modules/frontend_views_terminal.md delete mode 100644 docs/modules/frontend_views_topbar.md delete mode 100644 docs/modules/frontend_views_upgradepreview.md delete mode 100644 docs/modules/frontend_views_withdrawsilver.md create mode 100644 public/icons/alerts/artifacts/find.svg create mode 100644 public/icons/alerts/artifacts/prospect.svg create mode 100644 public/icons/alerts/backgrounds/1.svg create mode 100644 public/icons/alerts/backgrounds/2.svg create mode 100644 public/icons/alerts/biomes/corrupted.svg create mode 100644 public/icons/alerts/biomes/desert.svg create mode 100644 public/icons/alerts/biomes/forest.svg create mode 100644 public/icons/alerts/biomes/grassland.svg create mode 100644 public/icons/alerts/biomes/ice.svg create mode 100644 public/icons/alerts/biomes/lava.svg create mode 100644 public/icons/alerts/biomes/ocean.svg create mode 100644 public/icons/alerts/biomes/swamp.svg create mode 100644 public/icons/alerts/biomes/tundra.svg create mode 100644 public/icons/alerts/biomes/wasteland.svg create mode 100644 public/icons/alerts/borders/1.svg create mode 100644 public/icons/alerts/borders/2.svg create mode 100644 public/icons/alerts/combat/metplayer.svg create mode 100644 public/icons/alerts/combat/pirates.svg create mode 100644 public/icons/alerts/combat/planetattacked.svg create mode 100644 public/icons/alerts/combat/planetlost.svg create mode 100644 public/icons/alerts/combat/planetwon.svg create mode 100644 public/icons/alerts/combat/playerfound.svg create mode 100644 public/icons/alerts/generic/generic.svg create mode 100644 public/icons/alerts/planettypes/asteroid.svg create mode 100644 public/icons/alerts/planettypes/planet.svg create mode 100644 public/icons/alerts/planettypes/quasar.svg create mode 100644 public/icons/alerts/planettypes/ruins.svg create mode 100644 public/icons/alerts/planettypes/tradingpost.svg create mode 100644 public/icons/alerts/spacetypes/alert_-19.svg create mode 100644 public/icons/alerts/spacetypes/deadspace.svg create mode 100644 public/icons/alerts/spacetypes/deepspace.svg create mode 100644 public/icons/alerts/spacetypes/space.svg create mode 100644 public/icons/alerts/transactions/accepted.svg create mode 100644 public/icons/alerts/transactions/confirmed.svg create mode 100644 public/icons/alerts/transactions/declined.svg create mode 100644 public/icons/alerts/transactions/initialized.svg diff --git a/docs/README.md b/docs/README.md index d79f21cc..5d4e7363 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,267 +4,263 @@ ### Modules -- [Backend/GameLogic/ArrivalUtils](modules/backend_gamelogic_arrivalutils.md) -- [Backend/GameLogic/ArtifactUtils](modules/backend_gamelogic_artifactutils.md) -- [Backend/GameLogic/ContractCaller](modules/backend_gamelogic_contractcaller.md) -- [Backend/GameLogic/ContractsAPI](modules/backend_gamelogic_contractsapi.md) -- [Backend/GameLogic/ConversationManager](modules/backend_gamelogic_conversationmanager.md) -- [Backend/GameLogic/GameManager](modules/backend_gamelogic_gamemanager.md) -- [Backend/GameLogic/GameObjects](modules/backend_gamelogic_gameobjects.md) -- [Backend/GameLogic/GameUIManager](modules/backend_gamelogic_gameuimanager.md) -- [Backend/GameLogic/InitialGameStateDownloader](modules/backend_gamelogic_initialgamestatedownloader.md) -- [Backend/GameLogic/LayeredMap](modules/backend_gamelogic_layeredmap.md) -- [Backend/GameLogic/PaidConversationManager](modules/backend_gamelogic_paidconversationmanager.md) -- [Backend/GameLogic/PluginManager](modules/backend_gamelogic_pluginmanager.md) -- [Backend/GameLogic/TutorialManager](modules/backend_gamelogic_tutorialmanager.md) -- [Backend/GameLogic/ViewportEntities](modules/backend_gamelogic_viewportentities.md) -- [Backend/Interfaces/DiagnosticUpdater](modules/backend_interfaces_diagnosticupdater.md) -- [Backend/Miner/ChunkUtils](modules/backend_miner_chunkutils.md) -- [Backend/Miner/MinerManager](modules/backend_miner_minermanager.md) -- [Backend/Miner/MiningPatterns](modules/backend_miner_miningpatterns.md) -- [Backend/Miner/miner.worker](modules/backend_miner_miner_worker.md) -- [Backend/Miner/permutation](modules/backend_miner_permutation.md) -- [Backend/Network/ChainAPI](modules/backend_network_chainapi.md) -- [Backend/Network/ConversationAPI](modules/backend_network_conversationapi.md) -- [Backend/Network/EthConnection](modules/backend_network_ethconnection.md) -- [Backend/Network/EventLogger](modules/backend_network_eventlogger.md) -- [Backend/Network/LeaderboardApi](modules/backend_network_leaderboardapi.md) -- [Backend/Network/MessageAPI](modules/backend_network_messageapi.md) -- [Backend/Network/ThrottledConcurrentQueue](modules/backend_network_throttledconcurrentqueue.md) -- [Backend/Network/TxExecutor](modules/backend_network_txexecutor.md) -- [Backend/Network/UtilityServerAPI](modules/backend_network_utilityserverapi.md) -- [Backend/Plugins/EmbeddedPluginLoader](modules/backend_plugins_embeddedpluginloader.md) -- [Backend/Plugins/PluginProcess](modules/backend_plugins_pluginprocess.md) -- [Backend/Plugins/PluginTemplate](modules/backend_plugins_plugintemplate.md) -- [Backend/Plugins/SerializedPlugin](modules/backend_plugins_serializedplugin.md) -- [Backend/Procedural/ArtifactProcgen](modules/backend_procedural_artifactprocgen.md) -- [Backend/Procedural/Noise](modules/backend_procedural_noise.md) -- [Backend/Procedural/ProcgenConsts](modules/backend_procedural_procgenconsts.md) -- [Backend/Procedural/ProcgenUtils](modules/backend_procedural_procgenutils.md) -- [Backend/Procedural/tracery](modules/backend_procedural_tracery.md) -- [Backend/Procedural/tracery-modifiers](modules/backend_procedural_tracery_modifiers.md) -- [Backend/Storage/PersistentChunkStore](modules/backend_storage_persistentchunkstore.md) -- [Backend/Storage/ReaderDataStore](modules/backend_storage_readerdatastore.md) -- [Backend/Utils/Animation](modules/backend_utils_animation.md) -- [Backend/Utils/BlockWaiter](modules/backend_utils_blockwaiter.md) -- [Backend/Utils/Coordinates](modules/backend_utils_coordinates.md) -- [Backend/Utils/SnarkArgsHelper](modules/backend_utils_snarkargshelper.md) -- [Backend/Utils/TypeAssertions](modules/backend_utils_typeassertions.md) -- [Backend/Utils/Utils](modules/backend_utils_utils.md) -- [Backend/Utils/UtilsTypes](modules/backend_utils_utilstypes.md) -- [Backend/Utils/Wrapper](modules/backend_utils_wrapper.md) -- [Frontend/Components/AncientLabel](modules/frontend_components_ancientlabel.md) -- [Frontend/Components/ArtifactImage](modules/frontend_components_artifactimage.md) -- [Frontend/Components/BiomeAnims](modules/frontend_components_biomeanims.md) -- [Frontend/Components/Btn](modules/frontend_components_btn.md) -- [Frontend/Components/Button](modules/frontend_components_button.md) -- [Frontend/Components/CoreUI](modules/frontend_components_coreui.md) -- [Frontend/Components/Corner](modules/frontend_components_corner.md) -- [Frontend/Components/DisplayGasPrices](modules/frontend_components_displaygasprices.md) -- [Frontend/Components/Email](modules/frontend_components_email.md) -- [Frontend/Components/FlexRows](modules/frontend_components_flexrows.md) -- [Frontend/Components/GameLandingPageComponents](modules/frontend_components_gamelandingpagecomponents.md) -- [Frontend/Components/GameWindowComponents](modules/frontend_components_gamewindowcomponents.md) -- [Frontend/Components/Hoverable](modules/frontend_components_hoverable.md) -- [Frontend/Components/IconButton](modules/frontend_components_iconbutton.md) -- [Frontend/Components/Icons](modules/frontend_components_icons.md) -- [Frontend/Components/Input](modules/frontend_components_input.md) -- [Frontend/Components/Labels/ArtifactLabels](modules/frontend_components_labels_artifactlabels.md) -- [Frontend/Components/Labels/BiomeLabels](modules/frontend_components_labels_biomelabels.md) -- [Frontend/Components/Labels/KeywordLabels](modules/frontend_components_labels_keywordlabels.md) -- [Frontend/Components/Labels/Labels](modules/frontend_components_labels_labels.md) -- [Frontend/Components/Labels/LavaLabel](modules/frontend_components_labels_lavalabel.md) -- [Frontend/Components/Labels/LegendaryLabel](modules/frontend_components_labels_legendarylabel.md) -- [Frontend/Components/Labels/MythicLabel](modules/frontend_components_labels_mythiclabel.md) -- [Frontend/Components/Labels/PlanetLabels](modules/frontend_components_labels_planetlabels.md) -- [Frontend/Components/Labels/SpacetimeRipLabel](modules/frontend_components_labels_spacetimeriplabel.md) -- [Frontend/Components/Labels/WastelandLabel](modules/frontend_components_labels_wastelandlabel.md) -- [Frontend/Components/LoadingSpinner](modules/frontend_components_loadingspinner.md) -- [Frontend/Components/PlanetPreview](modules/frontend_components_planetpreview.md) -- [Frontend/Components/ReadMore](modules/frontend_components_readmore.md) -- [Frontend/Components/RemoteModal](modules/frontend_components_remotemodal.md) -- [Frontend/Components/Text](modules/frontend_components_text.md) -- [Frontend/Components/TextLoadingBar](modules/frontend_components_textloadingbar.md) -- [Frontend/Components/TextPreview](modules/frontend_components_textpreview.md) -- [Frontend/Components/TimeUntil](modules/frontend_components_timeuntil.md) -- [Frontend/Copy/HelpContent](modules/frontend_copy_helpcontent.md) -- [Frontend/EntryPoints](modules/frontend_entrypoints.md) -- [Frontend/Game/ControllableCanvas](modules/frontend_game_controllablecanvas.md) -- [Frontend/Game/NotificationManager](modules/frontend_game_notificationmanager.md) -- [Frontend/Game/Popups](modules/frontend_game_popups.md) -- [Frontend/Game/Viewport](modules/frontend_game_viewport.md) -- [Frontend/Game/ViewportAnimation](modules/frontend_game_viewportanimation.md) -- [Frontend/Game/WindowManager](modules/frontend_game_windowmanager.md) -- [Frontend/Pages/App](modules/frontend_pages_app.md) -- [Frontend/Pages/ConversationTest](modules/frontend_pages_conversationtest.md) -- [Frontend/Pages/GameLandingPage](modules/frontend_pages_gamelandingpage.md) -- [Frontend/Pages/GifMaker](modules/frontend_pages_gifmaker.md) -- [Frontend/Pages/LandingPage](modules/frontend_pages_landingpage.md) -- [Frontend/Pages/LoadingPage](modules/frontend_pages_loadingpage.md) -- [Frontend/Pages/PreviewPage](modules/frontend_pages_previewpage.md) -- [Frontend/Pages/ShareArtifact](modules/frontend_pages_shareartifact.md) -- [Frontend/Pages/SharePlanet](modules/frontend_pages_shareplanet.md) -- [Frontend/Pages/TestArtifactImages](modules/frontend_pages_testartifactimages.md) -- [Frontend/Pages/TxConfirmPopup](modules/frontend_pages_txconfirmpopup.md) -- [Frontend/Pages/UnsubscribePage](modules/frontend_pages_unsubscribepage.md) -- [Frontend/Pages/ValhallaPage](modules/frontend_pages_valhallapage.md) -- [Frontend/Panes/ArtifactConversation/ArtifactConversationPane](modules/frontend_panes_artifactconversation_artifactconversationpane.md) -- [Frontend/Panes/ArtifactConversation/ConversationSuggestions](modules/frontend_panes_artifactconversation_conversationsuggestions.md) -- [Frontend/Panes/ArtifactDetailsPane](modules/frontend_panes_artifactdetailspane.md) -- [Frontend/Panes/BroadcastPane](modules/frontend_panes_broadcastpane.md) -- [Frontend/Panes/CoordsPane](modules/frontend_panes_coordspane.md) -- [Frontend/Panes/DiagnosticsPane](modules/frontend_panes_diagnosticspane.md) -- [Frontend/Panes/ExplorePane](modules/frontend_panes_explorepane.md) -- [Frontend/Panes/HatPane](modules/frontend_panes_hatpane.md) -- [Frontend/Panes/HelpPane](modules/frontend_panes_helppane.md) -- [Frontend/Panes/HoverPlanetPane](modules/frontend_panes_hoverplanetpane.md) -- [Frontend/Panes/LeaderboardPane](modules/frontend_panes_leaderboardpane.md) -- [Frontend/Panes/ManagePlanetArtifacts/ArtifactActions](modules/frontend_panes_manageplanetartifacts_artifactactions.md) -- [Frontend/Panes/ManagePlanetArtifacts/ArtifactListItem](modules/frontend_panes_manageplanetartifacts_artifactlistitem.md) -- [Frontend/Panes/ManagePlanetArtifacts/ArtifactsList](modules/frontend_panes_manageplanetartifacts_artifactslist.md) -- [Frontend/Panes/ManagePlanetArtifacts/Find](modules/frontend_panes_manageplanetartifacts_find.md) -- [Frontend/Panes/ManagePlanetArtifacts/ManageArtifacts](modules/frontend_panes_manageplanetartifacts_manageartifacts.md) -- [Frontend/Panes/ManagePlanetArtifacts/ManagePlanetArtifactsPane](modules/frontend_panes_manageplanetartifacts_manageplanetartifactspane.md) -- [Frontend/Panes/ManagePlanetArtifacts/Prospect](modules/frontend_panes_manageplanetartifacts_prospect.md) -- [Frontend/Panes/ManagePlanetArtifacts/SortBy](modules/frontend_panes_manageplanetartifacts_sortby.md) -- [Frontend/Panes/ManagePlanetArtifacts/UpgradeStatsView](modules/frontend_panes_manageplanetartifacts_upgradestatsview.md) -- [Frontend/Panes/OnboardingPane](modules/frontend_panes_onboardingpane.md) -- [Frontend/Panes/PaidArtifactConversation/ConversationInfo](modules/frontend_panes_paidartifactconversation_conversationinfo.md) -- [Frontend/Panes/PaidArtifactConversation/CurrencyView](modules/frontend_panes_paidartifactconversation_currencyview.md) -- [Frontend/Panes/PaidArtifactConversation/PaidArtifactConversationPane](modules/frontend_panes_paidartifactconversation_paidartifactconversationpane.md) -- [Frontend/Panes/PlanetContextPane](modules/frontend_panes_planetcontextpane.md) -- [Frontend/Panes/PlanetDetailsPane](modules/frontend_panes_planetdetailspane.md) -- [Frontend/Panes/PlanetDexPane](modules/frontend_panes_planetdexpane.md) -- [Frontend/Panes/PlayerArtifactsPane](modules/frontend_panes_playerartifactspane.md) -- [Frontend/Panes/PlayerInfoPane](modules/frontend_panes_playerinfopane.md) -- [Frontend/Panes/PluginEditorPane](modules/frontend_panes_plugineditorpane.md) -- [Frontend/Panes/PluginLibraryPane](modules/frontend_panes_pluginlibrarypane.md) -- [Frontend/Panes/PrivatePane](modules/frontend_panes_privatepane.md) -- [Frontend/Panes/SettingsPane](modules/frontend_panes_settingspane.md) -- [Frontend/Panes/Tooltip](modules/frontend_panes_tooltip.md) -- [Frontend/Panes/TooltipPanes](modules/frontend_panes_tooltippanes.md) -- [Frontend/Panes/TutorialPane](modules/frontend_panes_tutorialpane.md) -- [Frontend/Panes/TwitterVerifyPane](modules/frontend_panes_twitterverifypane.md) -- [Frontend/Panes/UpgradeDetailsPane](modules/frontend_panes_upgradedetailspane.md) -- [Frontend/Panes/WikiPane](modules/frontend_panes_wikipane.md) -- [Frontend/Panes/WithdrawSilverPane](modules/frontend_panes_withdrawsilverpane.md) -- [Frontend/Panes/ZoomPane](modules/frontend_panes_zoompane.md) -- [Frontend/Renderers/Artifacts/ArtifactRenderer](modules/frontend_renderers_artifacts_artifactrenderer.md) -- [Frontend/Renderers/GameRenderer/EngineConsts](modules/frontend_renderers_gamerenderer_engineconsts.md) -- [Frontend/Renderers/GameRenderer/EngineTypes](modules/frontend_renderers_gamerenderer_enginetypes.md) -- [Frontend/Renderers/GameRenderer/EngineUtils](modules/frontend_renderers_gamerenderer_engineutils.md) -- [Frontend/Renderers/GameRenderer/Entities/AsteroidRenderer](modules/frontend_renderers_gamerenderer_entities_asteroidrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/BackgroundRenderer](modules/frontend_renderers_gamerenderer_entities_backgroundrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/BeltRenderer](modules/frontend_renderers_gamerenderer_entities_beltrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/BlackDomainRenderer](modules/frontend_renderers_gamerenderer_entities_blackdomainrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/CircleRenderer](modules/frontend_renderers_gamerenderer_entities_circlerenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/LineRenderer](modules/frontend_renderers_gamerenderer_entities_linerenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/MaskRenderer](modules/frontend_renderers_gamerenderer_entities_maskrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/MineBodyRenderer](modules/frontend_renderers_gamerenderer_entities_minebodyrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/MineRenderer](modules/frontend_renderers_gamerenderer_entities_minerenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/PerlinRenderer](modules/frontend_renderers_gamerenderer_entities_perlinrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/PerlinUtils](modules/frontend_renderers_gamerenderer_entities_perlinutils.md) -- [Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager](modules/frontend_renderers_gamerenderer_entities_planetrendermanager.md) -- [Frontend/Renderers/GameRenderer/Entities/PlanetRenderer](modules/frontend_renderers_gamerenderer_entities_planetrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/QuasarBodyRenderer](modules/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/QuasarRayRenderer](modules/frontend_renderers_gamerenderer_entities_quasarrayrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/QuasarRenderer](modules/frontend_renderers_gamerenderer_entities_quasarrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/RectRenderer](modules/frontend_renderers_gamerenderer_entities_rectrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/RingRenderer](modules/frontend_renderers_gamerenderer_entities_ringrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/RuinsRenderer](modules/frontend_renderers_gamerenderer_entities_ruinsrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer](modules/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/SpriteRenderer](modules/frontend_renderers_gamerenderer_entities_spriterenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/TextRenderer](modules/frontend_renderers_gamerenderer_entities_textrenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/VoyageRenderer](modules/frontend_renderers_gamerenderer_entities_voyagerenderer.md) -- [Frontend/Renderers/GameRenderer/Entities/WormholeRenderer](modules/frontend_renderers_gamerenderer_entities_wormholerenderer.md) -- [Frontend/Renderers/GameRenderer/Overlay2DRenderer](modules/frontend_renderers_gamerenderer_overlay2drenderer.md) -- [Frontend/Renderers/GameRenderer/Programs/AsteroidProgram](modules/frontend_renderers_gamerenderer_programs_asteroidprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/BeltProgram](modules/frontend_renderers_gamerenderer_programs_beltprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/BlackDomainProgram](modules/frontend_renderers_gamerenderer_programs_blackdomainprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/CircleProgram](modules/frontend_renderers_gamerenderer_programs_circleprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/GlassProgram](modules/frontend_renderers_gamerenderer_programs_glassprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/LineProgram](modules/frontend_renderers_gamerenderer_programs_lineprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/MaskProgram](modules/frontend_renderers_gamerenderer_programs_maskprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/MineProgram](modules/frontend_renderers_gamerenderer_programs_mineprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/NoiseProgram](modules/frontend_renderers_gamerenderer_programs_noiseprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/PerlinProgram](modules/frontend_renderers_gamerenderer_programs_perlinprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/PlanetProgram](modules/frontend_renderers_gamerenderer_programs_planetprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/QuasarBodyProgram](modules/frontend_renderers_gamerenderer_programs_quasarbodyprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/QuasarRayProgram](modules/frontend_renderers_gamerenderer_programs_quasarrayprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/RectProgram](modules/frontend_renderers_gamerenderer_programs_rectprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/RingProgram](modules/frontend_renderers_gamerenderer_programs_ringprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/RuinsProgram](modules/frontend_renderers_gamerenderer_programs_ruinsprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/SpacetimeRipProgram](modules/frontend_renderers_gamerenderer_programs_spacetimeripprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/SpriteProgram](modules/frontend_renderers_gamerenderer_programs_spriteprogram.md) -- [Frontend/Renderers/GameRenderer/Programs/TextProgram](modules/frontend_renderers_gamerenderer_programs_textprogram.md) -- [Frontend/Renderers/GameRenderer/Renderer](modules/frontend_renderers_gamerenderer_renderer.md) -- [Frontend/Renderers/GameRenderer/TextureManager](modules/frontend_renderers_gamerenderer_texturemanager.md) -- [Frontend/Renderers/GameRenderer/UIRenderer](modules/frontend_renderers_gamerenderer_uirenderer.md) -- [Frontend/Renderers/GameRenderer/WebGL/AttribArray](modules/frontend_renderers_gamerenderer_webgl_attribarray.md) -- [Frontend/Renderers/GameRenderer/WebGL/AttribManager](modules/frontend_renderers_gamerenderer_webgl_attribmanager.md) -- [Frontend/Renderers/GameRenderer/WebGL/GameGLManager](modules/frontend_renderers_gamerenderer_webgl_gameglmanager.md) -- [Frontend/Renderers/GameRenderer/WebGL/GenericRenderer](modules/frontend_renderers_gamerenderer_webgl_genericrenderer.md) -- [Frontend/Renderers/GameRenderer/WebGL/ProgramUtils](modules/frontend_renderers_gamerenderer_webgl_programutils.md) -- [Frontend/Renderers/GameRenderer/WebGL/ShaderMixins](modules/frontend_renderers_gamerenderer_webgl_shadermixins.md) -- [Frontend/Renderers/GameRenderer/WebGL/WebGLLibTypes](modules/frontend_renderers_gamerenderer_webgl_webgllibtypes.md) -- [Frontend/Renderers/GameRenderer/WebGL/WebGLManager](modules/frontend_renderers_gamerenderer_webgl_webglmanager.md) -- [Frontend/Renderers/GifRenderer](modules/frontend_renderers_gifrenderer.md) -- [Frontend/Renderers/LandingPageCanvas](modules/frontend_renderers_landingpagecanvas.md) -- [Frontend/Renderers/PlanetscapeRenderer/PathProgram](modules/frontend_renderers_planetscaperenderer_pathprogram.md) -- [Frontend/Renderers/PlanetscapeRenderer/PathRenderer](modules/frontend_renderers_planetscaperenderer_pathrenderer.md) -- [Frontend/Renderers/PlanetscapeRenderer/PlanetIcons](modules/frontend_renderers_planetscaperenderer_planeticons.md) -- [Frontend/Renderers/PlanetscapeRenderer/PlanetScape](modules/frontend_renderers_planetscaperenderer_planetscape.md) -- [Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer](modules/frontend_renderers_planetscaperenderer_planetscaperenderer.md) -- [Frontend/Styles/Colors](modules/frontend_styles_colors.md) -- [Frontend/Styles/Mixins](modules/frontend_styles_mixins.md) -- [Frontend/Styles/colors](modules/frontend_styles_colors.md) -- [Frontend/Styles/dfstyles](modules/frontend_styles_dfstyles.md) -- [Frontend/Styles/tailwind.config](modules/frontend_styles_tailwind_config.md) -- [Frontend/Utils/AppHooks](modules/frontend_utils_apphooks.md) -- [Frontend/Utils/BrowserChecks](modules/frontend_utils_browserchecks.md) -- [Frontend/Utils/EmitterHooks](modules/frontend_utils_emitterhooks.md) -- [Frontend/Utils/EmitterUtils](modules/frontend_utils_emitterutils.md) -- [Frontend/Utils/Hats](modules/frontend_utils_hats.md) -- [Frontend/Utils/Hooks](modules/frontend_utils_hooks.md) -- [Frontend/Utils/KeyEmitters](modules/frontend_utils_keyemitters.md) -- [Frontend/Utils/Monomitter](modules/frontend_utils_monomitter.md) -- [Frontend/Utils/SettingsHooks](modules/frontend_utils_settingshooks.md) -- [Frontend/Utils/ShortcutConstants](modules/frontend_utils_shortcutconstants.md) -- [Frontend/Utils/TerminalTypes](modules/frontend_utils_terminaltypes.md) -- [Frontend/Utils/TimeUtils](modules/frontend_utils_timeutils.md) -- [Frontend/Utils/UIEmitter](modules/frontend_utils_uiemitter.md) -- [Frontend/Utils/constants](modules/frontend_utils_constants.md) -- [Frontend/Utils/createDefinedContext](modules/frontend_utils_createdefinedcontext.md) -- [Frontend/Views/ArtifactLink](modules/frontend_views_artifactlink.md) -- [Frontend/Views/DFErrorBoundary](modules/frontend_views_dferrorboundary.md) -- [Frontend/Views/DarkForestTips](modules/frontend_views_darkforesttips.md) -- [Frontend/Views/EmojiPicker](modules/frontend_views_emojipicker.md) -- [Frontend/Views/EmojiPlanetNotification](modules/frontend_views_emojiplanetnotification.md) -- [Frontend/Views/GameWindowLayout](modules/frontend_views_gamewindowlayout.md) -- [Frontend/Views/GenericErrorBoundary](modules/frontend_views_genericerrorboundary.md) -- [Frontend/Views/Leaderboard](modules/frontend_views_leaderboard.md) -- [Frontend/Views/MenuBar](modules/frontend_views_menubar.md) -- [Frontend/Views/ModalIcon](modules/frontend_views_modalicon.md) -- [Frontend/Views/ModalPane](modules/frontend_views_modalpane.md) -- [Frontend/Views/Notifications](modules/frontend_views_notifications.md) -- [Frontend/Views/OwnedPluginView](modules/frontend_views_ownedpluginview.md) -- [Frontend/Views/PlanetCard](modules/frontend_views_planetcard.md) -- [Frontend/Views/PlanetCardComponents](modules/frontend_views_planetcardcomponents.md) -- [Frontend/Views/PlanetLink](modules/frontend_views_planetlink.md) -- [Frontend/Views/PlanetNotifications](modules/frontend_views_planetnotifications.md) -- [Frontend/Views/SendResources](modules/frontend_views_sendresources.md) -- [Frontend/Views/Share](modules/frontend_views_share.md) -- [Frontend/Views/SortableTable](modules/frontend_views_sortabletable.md) -- [Frontend/Views/TabbedView](modules/frontend_views_tabbedview.md) -- [Frontend/Views/Table](modules/frontend_views_table.md) -- [Frontend/Views/Terminal](modules/frontend_views_terminal.md) -- [Frontend/Views/TopBar](modules/frontend_views_topbar.md) -- [Frontend/Views/UpgradePreview](modules/frontend_views_upgradepreview.md) -- [Frontend/Views/WithdrawSilver](modules/frontend_views_withdrawsilver.md) -- [\_types/darkforest/api/ChunkStoreTypes](modules/_types_darkforest_api_chunkstoretypes.md) -- [\_types/darkforest/api/ContractsAPITypes](modules/_types_darkforest_api_contractsapitypes.md) -- [\_types/darkforest/api/UtilityServerAPITypes](modules/_types_darkforest_api_utilityserverapitypes.md) -- [\_types/file-loader/FileWorkerTypes](modules/_types_file_loader_fileworkertypes.md) -- [\_types/global/GlobalTypes](modules/_types_global_globaltypes.md) -- [\_types/global/globals](modules/_types_global_globals.md) -- [\_types/worker-loader/WorkerTypes](modules/_types_worker_loader_workertypes.md) +- [Backend/GameLogic/ArrivalUtils](modules/Backend_GameLogic_ArrivalUtils.md) +- [Backend/GameLogic/ArtifactUtils](modules/Backend_GameLogic_ArtifactUtils.md) +- [Backend/GameLogic/ContractCaller](modules/Backend_GameLogic_ContractCaller.md) +- [Backend/GameLogic/ContractsAPI](modules/Backend_GameLogic_ContractsAPI.md) +- [Backend/GameLogic/ConversationManager](modules/Backend_GameLogic_ConversationManager.md) +- [Backend/GameLogic/GameManager](modules/Backend_GameLogic_GameManager.md) +- [Backend/GameLogic/GameObjects](modules/Backend_GameLogic_GameObjects.md) +- [Backend/GameLogic/GameUIManager](modules/Backend_GameLogic_GameUIManager.md) +- [Backend/GameLogic/InitialGameStateDownloader](modules/Backend_GameLogic_InitialGameStateDownloader.md) +- [Backend/GameLogic/LayeredMap](modules/Backend_GameLogic_LayeredMap.md) +- [Backend/GameLogic/PaidConversationManager](modules/Backend_GameLogic_PaidConversationManager.md) +- [Backend/GameLogic/PluginManager](modules/Backend_GameLogic_PluginManager.md) +- [Backend/GameLogic/TutorialManager](modules/Backend_GameLogic_TutorialManager.md) +- [Backend/GameLogic/ViewportEntities](modules/Backend_GameLogic_ViewportEntities.md) +- [Backend/Interfaces/DiagnosticUpdater](modules/Backend_Interfaces_DiagnosticUpdater.md) +- [Backend/Miner/ChunkUtils](modules/Backend_Miner_ChunkUtils.md) +- [Backend/Miner/MinerManager](modules/Backend_Miner_MinerManager.md) +- [Backend/Miner/MiningPatterns](modules/Backend_Miner_MiningPatterns.md) +- [Backend/Miner/permutation](modules/Backend_Miner_permutation.md) +- [Backend/Network/ChainAPI](modules/Backend_Network_ChainAPI.md) +- [Backend/Network/ConversationAPI](modules/Backend_Network_ConversationAPI.md) +- [Backend/Network/EthConnection](modules/Backend_Network_EthConnection.md) +- [Backend/Network/EventLogger](modules/Backend_Network_EventLogger.md) +- [Backend/Network/LeaderboardApi](modules/Backend_Network_LeaderboardApi.md) +- [Backend/Network/MessageAPI](modules/Backend_Network_MessageAPI.md) +- [Backend/Network/ThrottledConcurrentQueue](modules/Backend_Network_ThrottledConcurrentQueue.md) +- [Backend/Network/TxExecutor](modules/Backend_Network_TxExecutor.md) +- [Backend/Network/UtilityServerAPI](modules/Backend_Network_UtilityServerAPI.md) +- [Backend/Plugins/EmbeddedPluginLoader](modules/Backend_Plugins_EmbeddedPluginLoader.md) +- [Backend/Plugins/PluginProcess](modules/Backend_Plugins_PluginProcess.md) +- [Backend/Plugins/PluginTemplate](modules/Backend_Plugins_PluginTemplate.md) +- [Backend/Plugins/SerializedPlugin](modules/Backend_Plugins_SerializedPlugin.md) +- [Backend/Procedural/ArtifactProcgen](modules/Backend_Procedural_ArtifactProcgen.md) +- [Backend/Procedural/Noise](modules/Backend_Procedural_Noise.md) +- [Backend/Procedural/ProcgenConsts](modules/Backend_Procedural_ProcgenConsts.md) +- [Backend/Procedural/ProcgenUtils](modules/Backend_Procedural_ProcgenUtils.md) +- [Backend/Procedural/tracery](modules/Backend_Procedural_tracery.md) +- [Backend/Procedural/tracery-modifiers](modules/Backend_Procedural_tracery_modifiers.md) +- [Backend/Storage/PersistentChunkStore](modules/Backend_Storage_PersistentChunkStore.md) +- [Backend/Storage/ReaderDataStore](modules/Backend_Storage_ReaderDataStore.md) +- [Backend/Utils/Animation](modules/Backend_Utils_Animation.md) +- [Backend/Utils/BlockWaiter](modules/Backend_Utils_BlockWaiter.md) +- [Backend/Utils/Coordinates](modules/Backend_Utils_Coordinates.md) +- [Backend/Utils/SnarkArgsHelper](modules/Backend_Utils_SnarkArgsHelper.md) +- [Backend/Utils/TypeAssertions](modules/Backend_Utils_TypeAssertions.md) +- [Backend/Utils/Utils](modules/Backend_Utils_Utils.md) +- [Backend/Utils/UtilsTypes](modules/Backend_Utils_UtilsTypes.md) +- [Backend/Utils/Wrapper](modules/Backend_Utils_Wrapper.md) +- [Frontend/Components/AncientLabel](modules/Frontend_Components_AncientLabel.md) +- [Frontend/Components/ArtifactImage](modules/Frontend_Components_ArtifactImage.md) +- [Frontend/Components/BiomeAnims](modules/Frontend_Components_BiomeAnims.md) +- [Frontend/Components/Btn](modules/Frontend_Components_Btn.md) +- [Frontend/Components/Button](modules/Frontend_Components_Button.md) +- [Frontend/Components/CoreUI](modules/Frontend_Components_CoreUI.md) +- [Frontend/Components/Corner](modules/Frontend_Components_Corner.md) +- [Frontend/Components/DisplayGasPrices](modules/Frontend_Components_DisplayGasPrices.md) +- [Frontend/Components/Email](modules/Frontend_Components_Email.md) +- [Frontend/Components/FlexRows](modules/Frontend_Components_FlexRows.md) +- [Frontend/Components/GameLandingPageComponents](modules/Frontend_Components_GameLandingPageComponents.md) +- [Frontend/Components/GameWindowComponents](modules/Frontend_Components_GameWindowComponents.md) +- [Frontend/Components/Hoverable](modules/Frontend_Components_Hoverable.md) +- [Frontend/Components/IconButton](modules/Frontend_Components_IconButton.md) +- [Frontend/Components/Icons](modules/Frontend_Components_Icons.md) +- [Frontend/Components/Input](modules/Frontend_Components_Input.md) +- [Frontend/Components/Labels/ArtifactLabels](modules/Frontend_Components_Labels_ArtifactLabels.md) +- [Frontend/Components/Labels/BiomeLabels](modules/Frontend_Components_Labels_BiomeLabels.md) +- [Frontend/Components/Labels/KeywordLabels](modules/Frontend_Components_Labels_KeywordLabels.md) +- [Frontend/Components/Labels/Labels](modules/Frontend_Components_Labels_Labels.md) +- [Frontend/Components/Labels/LavaLabel](modules/Frontend_Components_Labels_LavaLabel.md) +- [Frontend/Components/Labels/LegendaryLabel](modules/Frontend_Components_Labels_LegendaryLabel.md) +- [Frontend/Components/Labels/MythicLabel](modules/Frontend_Components_Labels_MythicLabel.md) +- [Frontend/Components/Labels/PlanetLabels](modules/Frontend_Components_Labels_PlanetLabels.md) +- [Frontend/Components/Labels/SpacetimeRipLabel](modules/Frontend_Components_Labels_SpacetimeRipLabel.md) +- [Frontend/Components/Labels/WastelandLabel](modules/Frontend_Components_Labels_WastelandLabel.md) +- [Frontend/Components/LoadingSpinner](modules/Frontend_Components_LoadingSpinner.md) +- [Frontend/Components/PlanetPreview](modules/Frontend_Components_PlanetPreview.md) +- [Frontend/Components/ReadMore](modules/Frontend_Components_ReadMore.md) +- [Frontend/Components/RemoteModal](modules/Frontend_Components_RemoteModal.md) +- [Frontend/Components/Text](modules/Frontend_Components_Text.md) +- [Frontend/Components/TextLoadingBar](modules/Frontend_Components_TextLoadingBar.md) +- [Frontend/Components/TextPreview](modules/Frontend_Components_TextPreview.md) +- [Frontend/Components/TimeUntil](modules/Frontend_Components_TimeUntil.md) +- [Frontend/Copy/HelpContent](modules/Frontend_Copy_HelpContent.md) +- [Frontend/Game/ControllableCanvas](modules/Frontend_Game_ControllableCanvas.md) +- [Frontend/Game/NotificationManager](modules/Frontend_Game_NotificationManager.md) +- [Frontend/Game/Popups](modules/Frontend_Game_Popups.md) +- [Frontend/Game/Viewport](modules/Frontend_Game_Viewport.md) +- [Frontend/Game/ViewportAnimation](modules/Frontend_Game_ViewportAnimation.md) +- [Frontend/Game/WindowManager](modules/Frontend_Game_WindowManager.md) +- [Frontend/Pages/App](modules/Frontend_Pages_App.md) +- [Frontend/Pages/ConversationTest](modules/Frontend_Pages_ConversationTest.md) +- [Frontend/Pages/GameLandingPage](modules/Frontend_Pages_GameLandingPage.md) +- [Frontend/Pages/GifMaker](modules/Frontend_Pages_GifMaker.md) +- [Frontend/Pages/LandingPage](modules/Frontend_Pages_LandingPage.md) +- [Frontend/Pages/LoadingPage](modules/Frontend_Pages_LoadingPage.md) +- [Frontend/Pages/PreviewPage](modules/Frontend_Pages_PreviewPage.md) +- [Frontend/Pages/ShareArtifact](modules/Frontend_Pages_ShareArtifact.md) +- [Frontend/Pages/SharePlanet](modules/Frontend_Pages_SharePlanet.md) +- [Frontend/Pages/TestArtifactImages](modules/Frontend_Pages_TestArtifactImages.md) +- [Frontend/Pages/TxConfirmPopup](modules/Frontend_Pages_TxConfirmPopup.md) +- [Frontend/Pages/UnsubscribePage](modules/Frontend_Pages_UnsubscribePage.md) +- [Frontend/Pages/ValhallaPage](modules/Frontend_Pages_ValhallaPage.md) +- [Frontend/Panes/ArtifactConversation/ArtifactConversationPane](modules/Frontend_Panes_ArtifactConversation_ArtifactConversationPane.md) +- [Frontend/Panes/ArtifactConversation/ConversationSuggestions](modules/Frontend_Panes_ArtifactConversation_ConversationSuggestions.md) +- [Frontend/Panes/ArtifactDetailsPane](modules/Frontend_Panes_ArtifactDetailsPane.md) +- [Frontend/Panes/BroadcastPane](modules/Frontend_Panes_BroadcastPane.md) +- [Frontend/Panes/CoordsPane](modules/Frontend_Panes_CoordsPane.md) +- [Frontend/Panes/DiagnosticsPane](modules/Frontend_Panes_DiagnosticsPane.md) +- [Frontend/Panes/ExplorePane](modules/Frontend_Panes_ExplorePane.md) +- [Frontend/Panes/HatPane](modules/Frontend_Panes_HatPane.md) +- [Frontend/Panes/HelpPane](modules/Frontend_Panes_HelpPane.md) +- [Frontend/Panes/HoverPlanetPane](modules/Frontend_Panes_HoverPlanetPane.md) +- [Frontend/Panes/LeaderboardPane](modules/Frontend_Panes_LeaderboardPane.md) +- [Frontend/Panes/ManagePlanetArtifacts/ArtifactActions](modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactActions.md) +- [Frontend/Panes/ManagePlanetArtifacts/ArtifactListItem](modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactListItem.md) +- [Frontend/Panes/ManagePlanetArtifacts/ArtifactsList](modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactsList.md) +- [Frontend/Panes/ManagePlanetArtifacts/Find](modules/Frontend_Panes_ManagePlanetArtifacts_Find.md) +- [Frontend/Panes/ManagePlanetArtifacts/ManageArtifacts](modules/Frontend_Panes_ManagePlanetArtifacts_ManageArtifacts.md) +- [Frontend/Panes/ManagePlanetArtifacts/ManagePlanetArtifactsPane](modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md) +- [Frontend/Panes/ManagePlanetArtifacts/Prospect](modules/Frontend_Panes_ManagePlanetArtifacts_Prospect.md) +- [Frontend/Panes/ManagePlanetArtifacts/SortBy](modules/Frontend_Panes_ManagePlanetArtifacts_SortBy.md) +- [Frontend/Panes/ManagePlanetArtifacts/UpgradeStatsView](modules/Frontend_Panes_ManagePlanetArtifacts_UpgradeStatsView.md) +- [Frontend/Panes/OnboardingPane](modules/Frontend_Panes_OnboardingPane.md) +- [Frontend/Panes/PaidArtifactConversation/ConversationInfo](modules/Frontend_Panes_PaidArtifactConversation_ConversationInfo.md) +- [Frontend/Panes/PaidArtifactConversation/CurrencyView](modules/Frontend_Panes_PaidArtifactConversation_CurrencyView.md) +- [Frontend/Panes/PaidArtifactConversation/PaidArtifactConversationPane](modules/Frontend_Panes_PaidArtifactConversation_PaidArtifactConversationPane.md) +- [Frontend/Panes/PlanetContextPane](modules/Frontend_Panes_PlanetContextPane.md) +- [Frontend/Panes/PlanetDetailsPane](modules/Frontend_Panes_PlanetDetailsPane.md) +- [Frontend/Panes/PlanetDexPane](modules/Frontend_Panes_PlanetDexPane.md) +- [Frontend/Panes/PlayerArtifactsPane](modules/Frontend_Panes_PlayerArtifactsPane.md) +- [Frontend/Panes/PlayerInfoPane](modules/Frontend_Panes_PlayerInfoPane.md) +- [Frontend/Panes/PluginEditorPane](modules/Frontend_Panes_PluginEditorPane.md) +- [Frontend/Panes/PluginLibraryPane](modules/Frontend_Panes_PluginLibraryPane.md) +- [Frontend/Panes/PrivatePane](modules/Frontend_Panes_PrivatePane.md) +- [Frontend/Panes/SettingsPane](modules/Frontend_Panes_SettingsPane.md) +- [Frontend/Panes/Tooltip](modules/Frontend_Panes_Tooltip.md) +- [Frontend/Panes/TooltipPanes](modules/Frontend_Panes_TooltipPanes.md) +- [Frontend/Panes/TutorialPane](modules/Frontend_Panes_TutorialPane.md) +- [Frontend/Panes/TwitterVerifyPane](modules/Frontend_Panes_TwitterVerifyPane.md) +- [Frontend/Panes/UpgradeDetailsPane](modules/Frontend_Panes_UpgradeDetailsPane.md) +- [Frontend/Panes/WikiPane](modules/Frontend_Panes_WikiPane.md) +- [Frontend/Panes/WithdrawSilverPane](modules/Frontend_Panes_WithdrawSilverPane.md) +- [Frontend/Panes/ZoomPane](modules/Frontend_Panes_ZoomPane.md) +- [Frontend/Renderers/Artifacts/ArtifactRenderer](modules/Frontend_Renderers_Artifacts_ArtifactRenderer.md) +- [Frontend/Renderers/GameRenderer/EngineConsts](modules/Frontend_Renderers_GameRenderer_EngineConsts.md) +- [Frontend/Renderers/GameRenderer/EngineTypes](modules/Frontend_Renderers_GameRenderer_EngineTypes.md) +- [Frontend/Renderers/GameRenderer/EngineUtils](modules/Frontend_Renderers_GameRenderer_EngineUtils.md) +- [Frontend/Renderers/GameRenderer/Entities/AsteroidRenderer](modules/Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/BackgroundRenderer](modules/Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/BeltRenderer](modules/Frontend_Renderers_GameRenderer_Entities_BeltRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/BlackDomainRenderer](modules/Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/CircleRenderer](modules/Frontend_Renderers_GameRenderer_Entities_CircleRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/LineRenderer](modules/Frontend_Renderers_GameRenderer_Entities_LineRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/MaskRenderer](modules/Frontend_Renderers_GameRenderer_Entities_MaskRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/MineBodyRenderer](modules/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/MineRenderer](modules/Frontend_Renderers_GameRenderer_Entities_MineRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/PerlinRenderer](modules/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/PerlinUtils](modules/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md) +- [Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager](modules/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.md) +- [Frontend/Renderers/GameRenderer/Entities/PlanetRenderer](modules/Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/QuasarBodyRenderer](modules/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/QuasarRayRenderer](modules/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/QuasarRenderer](modules/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/RectRenderer](modules/Frontend_Renderers_GameRenderer_Entities_RectRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/RingRenderer](modules/Frontend_Renderers_GameRenderer_Entities_RingRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/RuinsRenderer](modules/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer](modules/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/SpriteRenderer](modules/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/TextRenderer](modules/Frontend_Renderers_GameRenderer_Entities_TextRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/VoyageRenderer](modules/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.md) +- [Frontend/Renderers/GameRenderer/Entities/WormholeRenderer](modules/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.md) +- [Frontend/Renderers/GameRenderer/Overlay2DRenderer](modules/Frontend_Renderers_GameRenderer_Overlay2DRenderer.md) +- [Frontend/Renderers/GameRenderer/Programs/AsteroidProgram](modules/Frontend_Renderers_GameRenderer_Programs_AsteroidProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/BeltProgram](modules/Frontend_Renderers_GameRenderer_Programs_BeltProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/BlackDomainProgram](modules/Frontend_Renderers_GameRenderer_Programs_BlackDomainProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/CircleProgram](modules/Frontend_Renderers_GameRenderer_Programs_CircleProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/GlassProgram](modules/Frontend_Renderers_GameRenderer_Programs_GlassProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/LineProgram](modules/Frontend_Renderers_GameRenderer_Programs_LineProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/MaskProgram](modules/Frontend_Renderers_GameRenderer_Programs_MaskProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/MineProgram](modules/Frontend_Renderers_GameRenderer_Programs_MineProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/PerlinProgram](modules/Frontend_Renderers_GameRenderer_Programs_PerlinProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/PlanetProgram](modules/Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/QuasarBodyProgram](modules/Frontend_Renderers_GameRenderer_Programs_QuasarBodyProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/QuasarRayProgram](modules/Frontend_Renderers_GameRenderer_Programs_QuasarRayProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/RectProgram](modules/Frontend_Renderers_GameRenderer_Programs_RectProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/RingProgram](modules/Frontend_Renderers_GameRenderer_Programs_RingProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/RuinsProgram](modules/Frontend_Renderers_GameRenderer_Programs_RuinsProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/SpacetimeRipProgram](modules/Frontend_Renderers_GameRenderer_Programs_SpacetimeRipProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/SpriteProgram](modules/Frontend_Renderers_GameRenderer_Programs_SpriteProgram.md) +- [Frontend/Renderers/GameRenderer/Programs/TextProgram](modules/Frontend_Renderers_GameRenderer_Programs_TextProgram.md) +- [Frontend/Renderers/GameRenderer/Renderer](modules/Frontend_Renderers_GameRenderer_Renderer.md) +- [Frontend/Renderers/GameRenderer/TextureManager](modules/Frontend_Renderers_GameRenderer_TextureManager.md) +- [Frontend/Renderers/GameRenderer/UIRenderer](modules/Frontend_Renderers_GameRenderer_UIRenderer.md) +- [Frontend/Renderers/GameRenderer/WebGL/AttribArray](modules/Frontend_Renderers_GameRenderer_WebGL_AttribArray.md) +- [Frontend/Renderers/GameRenderer/WebGL/AttribManager](modules/Frontend_Renderers_GameRenderer_WebGL_AttribManager.md) +- [Frontend/Renderers/GameRenderer/WebGL/GameGLManager](modules/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.md) +- [Frontend/Renderers/GameRenderer/WebGL/GenericRenderer](modules/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.md) +- [Frontend/Renderers/GameRenderer/WebGL/ProgramUtils](modules/Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.md) +- [Frontend/Renderers/GameRenderer/WebGL/ShaderMixins](modules/Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.md) +- [Frontend/Renderers/GameRenderer/WebGL/WebGLLibTypes](modules/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md) +- [Frontend/Renderers/GameRenderer/WebGL/WebGLManager](modules/Frontend_Renderers_GameRenderer_WebGL_WebGLManager.md) +- [Frontend/Renderers/GifRenderer](modules/Frontend_Renderers_GifRenderer.md) +- [Frontend/Renderers/LandingPageCanvas](modules/Frontend_Renderers_LandingPageCanvas.md) +- [Frontend/Renderers/PlanetscapeRenderer/PathProgram](modules/Frontend_Renderers_PlanetscapeRenderer_PathProgram.md) +- [Frontend/Renderers/PlanetscapeRenderer/PathRenderer](modules/Frontend_Renderers_PlanetscapeRenderer_PathRenderer.md) +- [Frontend/Renderers/PlanetscapeRenderer/PlanetIcons](modules/Frontend_Renderers_PlanetscapeRenderer_PlanetIcons.md) +- [Frontend/Renderers/PlanetscapeRenderer/PlanetScape](modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScape.md) +- [Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer](modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.md) +- [Frontend/Styles/Colors](modules/Frontend_Styles_Colors.md) +- [Frontend/Styles/Mixins](modules/Frontend_Styles_Mixins.md) +- [Frontend/Styles/colors](modules/Frontend_Styles_colors.md) +- [Frontend/Styles/dfstyles](modules/Frontend_Styles_dfstyles.md) +- [Frontend/Styles/tailwind.config](modules/Frontend_Styles_tailwind_config.md) +- [Frontend/Utils/AppHooks](modules/Frontend_Utils_AppHooks.md) +- [Frontend/Utils/BrowserChecks](modules/Frontend_Utils_BrowserChecks.md) +- [Frontend/Utils/EmitterHooks](modules/Frontend_Utils_EmitterHooks.md) +- [Frontend/Utils/EmitterUtils](modules/Frontend_Utils_EmitterUtils.md) +- [Frontend/Utils/Hats](modules/Frontend_Utils_Hats.md) +- [Frontend/Utils/Hooks](modules/Frontend_Utils_Hooks.md) +- [Frontend/Utils/KeyEmitters](modules/Frontend_Utils_KeyEmitters.md) +- [Frontend/Utils/Monomitter](modules/Frontend_Utils_Monomitter.md) +- [Frontend/Utils/SettingsHooks](modules/Frontend_Utils_SettingsHooks.md) +- [Frontend/Utils/ShortcutConstants](modules/Frontend_Utils_ShortcutConstants.md) +- [Frontend/Utils/TerminalTypes](modules/Frontend_Utils_TerminalTypes.md) +- [Frontend/Utils/TimeUtils](modules/Frontend_Utils_TimeUtils.md) +- [Frontend/Utils/UIEmitter](modules/Frontend_Utils_UIEmitter.md) +- [Frontend/Utils/constants](modules/Frontend_Utils_constants.md) +- [Frontend/Utils/createDefinedContext](modules/Frontend_Utils_createDefinedContext.md) +- [Frontend/Views/ArtifactLink](modules/Frontend_Views_ArtifactLink.md) +- [Frontend/Views/DFErrorBoundary](modules/Frontend_Views_DFErrorBoundary.md) +- [Frontend/Views/DarkForestTips](modules/Frontend_Views_DarkForestTips.md) +- [Frontend/Views/EmojiPicker](modules/Frontend_Views_EmojiPicker.md) +- [Frontend/Views/EmojiPlanetNotification](modules/Frontend_Views_EmojiPlanetNotification.md) +- [Frontend/Views/GameWindowLayout](modules/Frontend_Views_GameWindowLayout.md) +- [Frontend/Views/GenericErrorBoundary](modules/Frontend_Views_GenericErrorBoundary.md) +- [Frontend/Views/Leaderboard](modules/Frontend_Views_Leaderboard.md) +- [Frontend/Views/MenuBar](modules/Frontend_Views_MenuBar.md) +- [Frontend/Views/ModalIcon](modules/Frontend_Views_ModalIcon.md) +- [Frontend/Views/ModalPane](modules/Frontend_Views_ModalPane.md) +- [Frontend/Views/Notifications](modules/Frontend_Views_Notifications.md) +- [Frontend/Views/OwnedPluginView](modules/Frontend_Views_OwnedPluginView.md) +- [Frontend/Views/PlanetCard](modules/Frontend_Views_PlanetCard.md) +- [Frontend/Views/PlanetCardComponents](modules/Frontend_Views_PlanetCardComponents.md) +- [Frontend/Views/PlanetLink](modules/Frontend_Views_PlanetLink.md) +- [Frontend/Views/PlanetNotifications](modules/Frontend_Views_PlanetNotifications.md) +- [Frontend/Views/SendResources](modules/Frontend_Views_SendResources.md) +- [Frontend/Views/Share](modules/Frontend_Views_Share.md) +- [Frontend/Views/SortableTable](modules/Frontend_Views_SortableTable.md) +- [Frontend/Views/TabbedView](modules/Frontend_Views_TabbedView.md) +- [Frontend/Views/Table](modules/Frontend_Views_Table.md) +- [Frontend/Views/Terminal](modules/Frontend_Views_Terminal.md) +- [Frontend/Views/TopBar](modules/Frontend_Views_TopBar.md) +- [Frontend/Views/UpgradePreview](modules/Frontend_Views_UpgradePreview.md) +- [Frontend/Views/WithdrawSilver](modules/Frontend_Views_WithdrawSilver.md) +- [\_types/darkforest/api/ChunkStoreTypes](modules/_types_darkforest_api_ChunkStoreTypes.md) +- [\_types/darkforest/api/ContractsAPITypes](modules/_types_darkforest_api_ContractsAPITypes.md) +- [\_types/darkforest/api/UtilityServerAPITypes](modules/_types_darkforest_api_UtilityServerAPITypes.md) +- [\_types/file-loader/FileWorkerTypes](modules/_types_file_loader_FileWorkerTypes.md) +- [\_types/global/GlobalTypes](modules/_types_global_GlobalTypes.md) +- [\_types/worker-loader/WorkerTypes](modules/_types_worker_loader_WorkerTypes.md) diff --git a/docs/classes/Backend_GameLogic_ContractCaller.ContractCaller.md b/docs/classes/Backend_GameLogic_ContractCaller.ContractCaller.md new file mode 100644 index 00000000..4c1fd92e --- /dev/null +++ b/docs/classes/Backend_GameLogic_ContractCaller.ContractCaller.md @@ -0,0 +1,83 @@ +# Class: ContractCaller + +[Backend/GameLogic/ContractCaller](../modules/Backend_GameLogic_ContractCaller.md).ContractCaller + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_ContractCaller.ContractCaller.md#constructor) + +### Properties + +- [callQueue](Backend_GameLogic_ContractCaller.ContractCaller.md#callqueue) +- [diagnosticsUpdater](Backend_GameLogic_ContractCaller.ContractCaller.md#diagnosticsupdater) +- [MAX_RETRIES](Backend_GameLogic_ContractCaller.ContractCaller.md#max_retries) + +### Methods + +- [makeCall](Backend_GameLogic_ContractCaller.ContractCaller.md#makecall) +- [setDiagnosticUpdater](Backend_GameLogic_ContractCaller.ContractCaller.md#setdiagnosticupdater) + +## Constructors + +### constructor + +• **new ContractCaller**() + +## Properties + +### callQueue + +• `Private` `Readonly` **callQueue**: [`ThrottledConcurrentQueue`](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md) + +--- + +### diagnosticsUpdater + +• `Private` `Optional` **diagnosticsUpdater**: [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) + +--- + +### MAX_RETRIES + +▪ `Static` `Private` `Readonly` **MAX_RETRIES**: `12` + +## Methods + +### makeCall + +▸ **makeCall**<`T`\>(`contractViewFunction`, `args?`): `Promise`<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | Default value | +| :--------------------- | :----------------------- | :------------ | +| `contractViewFunction` | `ContractFunction`<`T`\> | `undefined` | +| `args` | `unknown`[] | `[]` | + +#### Returns + +`Promise`<`T`\> + +--- + +### setDiagnosticUpdater + +▸ **setDiagnosticUpdater**(`diagnosticUpdater?`): `void` + +#### Parameters + +| Name | Type | +| :------------------- | :--------------------------------------------------------------------------------------------- | +| `diagnosticUpdater?` | [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) | + +#### Returns + +`void` diff --git a/docs/classes/Backend_GameLogic_ContractsAPI.default.md b/docs/classes/Backend_GameLogic_ContractsAPI.default.md new file mode 100644 index 00000000..b2e9ec30 --- /dev/null +++ b/docs/classes/Backend_GameLogic_ContractsAPI.default.md @@ -0,0 +1,810 @@ +# Class: default + +[Backend/GameLogic/ContractsAPI](../modules/Backend_GameLogic_ContractsAPI.md).default + +Roughly contains methods that map 1:1 with functions that live +in the contract. + +## Hierarchy + +- `EventEmitter` + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_ContractsAPI.default.md#constructor) + +### Properties + +- [contractCaller](Backend_GameLogic_ContractsAPI.default.md#contractcaller) +- [coreContract](Backend_GameLogic_ContractsAPI.default.md#corecontract) +- [diagnosticsUpdater](Backend_GameLogic_ContractsAPI.default.md#diagnosticsupdater) +- [ethConnection](Backend_GameLogic_ContractsAPI.default.md#ethconnection) +- [gettersContract](Backend_GameLogic_ContractsAPI.default.md#getterscontract) +- [gptCreditContract](Backend_GameLogic_ContractsAPI.default.md#gptcreditcontract) +- [txRequestExecutor](Backend_GameLogic_ContractsAPI.default.md#txrequestexecutor) + +### Methods + +- [activateArtifact](Backend_GameLogic_ContractsAPI.default.md#activateartifact) +- [bulkGetArtifacts](Backend_GameLogic_ContractsAPI.default.md#bulkgetartifacts) +- [bulkGetArtifactsOnPlanets](Backend_GameLogic_ContractsAPI.default.md#bulkgetartifactsonplanets) +- [bulkGetPlanets](Backend_GameLogic_ContractsAPI.default.md#bulkgetplanets) +- [buyGPTCredits](Backend_GameLogic_ContractsAPI.default.md#buygptcredits) +- [buyHat](Backend_GameLogic_ContractsAPI.default.md#buyhat) +- [deactivateArtifact](Backend_GameLogic_ContractsAPI.default.md#deactivateartifact) +- [depositArtifact](Backend_GameLogic_ContractsAPI.default.md#depositartifact) +- [destroy](Backend_GameLogic_ContractsAPI.default.md#destroy) +- [findArtifact](Backend_GameLogic_ContractsAPI.default.md#findartifact) +- [getAccount](Backend_GameLogic_ContractsAPI.default.md#getaccount) +- [getAllArrivals](Backend_GameLogic_ContractsAPI.default.md#getallarrivals) +- [getArrival](Backend_GameLogic_ContractsAPI.default.md#getarrival) +- [getArrivalsForPlanet](Backend_GameLogic_ContractsAPI.default.md#getarrivalsforplanet) +- [getArtifactById](Backend_GameLogic_ContractsAPI.default.md#getartifactbyid) +- [getBalance](Backend_GameLogic_ContractsAPI.default.md#getbalance) +- [getConstants](Backend_GameLogic_ContractsAPI.default.md#getconstants) +- [getContractAddress](Backend_GameLogic_ContractsAPI.default.md#getcontractaddress) +- [getContractBalance](Backend_GameLogic_ContractsAPI.default.md#getcontractbalance) +- [getGPTCreditBalance](Backend_GameLogic_ContractsAPI.default.md#getgptcreditbalance) +- [getGPTCreditPriceEther](Backend_GameLogic_ContractsAPI.default.md#getgptcreditpriceether) +- [getPlanetById](Backend_GameLogic_ContractsAPI.default.md#getplanetbyid) +- [getPlayerArtifacts](Backend_GameLogic_ContractsAPI.default.md#getplayerartifacts) +- [getPlayerById](Backend_GameLogic_ContractsAPI.default.md#getplayerbyid) +- [getPlayers](Backend_GameLogic_ContractsAPI.default.md#getplayers) +- [getRevealedCoordsByIdIfExists](Backend_GameLogic_ContractsAPI.default.md#getrevealedcoordsbyidifexists) +- [getRevealedPlanetsCoords](Backend_GameLogic_ContractsAPI.default.md#getrevealedplanetscoords) +- [getTokenMintEndTimestamp](Backend_GameLogic_ContractsAPI.default.md#gettokenmintendtimestamp) +- [getTouchedPlanetIds](Backend_GameLogic_ContractsAPI.default.md#gettouchedplanetids) +- [getWorldRadius](Backend_GameLogic_ContractsAPI.default.md#getworldradius) +- [initializePlayer](Backend_GameLogic_ContractsAPI.default.md#initializeplayer) +- [makeCall](Backend_GameLogic_ContractsAPI.default.md#makecall) +- [move](Backend_GameLogic_ContractsAPI.default.md#move) +- [prospectPlanet](Backend_GameLogic_ContractsAPI.default.md#prospectplanet) +- [removeEventListeners](Backend_GameLogic_ContractsAPI.default.md#removeeventlisteners) +- [reveal](Backend_GameLogic_ContractsAPI.default.md#reveal) +- [setDiagnosticUpdater](Backend_GameLogic_ContractsAPI.default.md#setdiagnosticupdater) +- [setupEventListeners](Backend_GameLogic_ContractsAPI.default.md#setupeventlisteners) +- [transferOwnership](Backend_GameLogic_ContractsAPI.default.md#transferownership) +- [upgradePlanet](Backend_GameLogic_ContractsAPI.default.md#upgradeplanet) +- [waitFor](Backend_GameLogic_ContractsAPI.default.md#waitfor) +- [withdrawArtifact](Backend_GameLogic_ContractsAPI.default.md#withdrawartifact) +- [withdrawSilver](Backend_GameLogic_ContractsAPI.default.md#withdrawsilver) +- [create](Backend_GameLogic_ContractsAPI.default.md#create) + +## Constructors + +### constructor + +• `Private` **new default**(`ethConnection`, `coreContract`, `gettersContract`, `gptCreditContract`, `nonce`) + +#### Parameters + +| Name | Type | +| :------------------ | :---------------------------------------------------- | +| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | +| `coreContract` | `DarkForestCore` | +| `gettersContract` | `DarkForestGetters` | +| `gptCreditContract` | `DarkForestGPTCredit` | +| `nonce` | `number` | + +#### Overrides + +EventEmitter.constructor + +## Properties + +### contractCaller + +• `Private` `Readonly` **contractCaller**: [`ContractCaller`](Backend_GameLogic_ContractCaller.ContractCaller.md) + +--- + +### coreContract + +• `Private` **coreContract**: `DarkForestCore` + +--- + +### diagnosticsUpdater + +• `Private` `Optional` **diagnosticsUpdater**: [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) + +--- + +### ethConnection + +• `Private` **ethConnection**: [`default`](Backend_Network_EthConnection.default.md) + +--- + +### gettersContract + +• `Private` **gettersContract**: `DarkForestGetters` + +--- + +### gptCreditContract + +• `Private` **gptCreditContract**: `DarkForestGPTCredit` + +--- + +### txRequestExecutor + +• `Private` `Readonly` **txRequestExecutor**: `undefined` \| [`TxExecutor`](Backend_Network_TxExecutor.TxExecutor.md) + +## Methods + +### activateArtifact + +▸ **activateArtifact**(`action`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :------- | :---------------------------- | +| `action` | `UnconfirmedActivateArtifact` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### bulkGetArtifacts + +▸ **bulkGetArtifacts**(`artifactIds`, `onProgress?`): `Promise`<`Artifact`[]\> + +#### Parameters + +| Name | Type | +| :------------ | :---------------------------------------- | +| `artifactIds` | `ArtifactId`[] | +| `onProgress?` | (`fractionCompleted`: `number`) => `void` | + +#### Returns + +`Promise`<`Artifact`[]\> + +--- + +### bulkGetArtifactsOnPlanets + +▸ **bulkGetArtifactsOnPlanets**(`locationIds`, `onProgress?`): `Promise`<`Artifact`[][]\> + +#### Parameters + +| Name | Type | +| :------------ | :---------------------------------------- | +| `locationIds` | `LocationId`[] | +| `onProgress?` | (`fractionCompleted`: `number`) => `void` | + +#### Returns + +`Promise`<`Artifact`[][]\> + +--- + +### bulkGetPlanets + +▸ **bulkGetPlanets**(`toLoadPlanets`, `onProgressPlanet?`, `onProgressMetadata?`): `Promise`<`Map`<`LocationId`, `Planet`\>\> + +#### Parameters + +| Name | Type | +| :-------------------- | :---------------------------------------- | +| `toLoadPlanets` | `LocationId`[] | +| `onProgressPlanet?` | (`fractionCompleted`: `number`) => `void` | +| `onProgressMetadata?` | (`fractionCompleted`: `number`) => `void` | + +#### Returns + +`Promise`<`Map`<`LocationId`, `Planet`\>\> + +--- + +### buyGPTCredits + +▸ **buyGPTCredits**(`amount`, `actionId`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `amount` | `number` | +| `actionId` | `string` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### buyHat + +▸ **buyHat**(`planetIdDecStr`, `currentHatLevel`, `actionId`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :---------------- | :------- | +| `planetIdDecStr` | `string` | +| `currentHatLevel` | `number` | +| `actionId` | `string` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### deactivateArtifact + +▸ **deactivateArtifact**(`action`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :------- | :------------------------------ | +| `action` | `UnconfirmedDeactivateArtifact` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### depositArtifact + +▸ **depositArtifact**(`action`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :------- | :--------------------------- | +| `action` | `UnconfirmedDepositArtifact` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### destroy + +▸ **destroy**(): `void` + +#### Returns + +`void` + +--- + +### findArtifact + +▸ **findArtifact**(`location`, `biomeSnarkArgs`, `actionId`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :--------------- | :------------------------------- | +| `location` | `WorldLocation` | +| `biomeSnarkArgs` | `BiomebaseSnarkContractCallArgs` | +| `actionId` | `string` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### getAccount + +▸ **getAccount**(): `EthAddress` + +#### Returns + +`EthAddress` + +--- + +### getAllArrivals + +▸ **getAllArrivals**(`planetsToLoad`, `onProgress?`): `Promise`<`QueuedArrival`[]\> + +#### Parameters + +| Name | Type | +| :-------------- | :---------------------------------------- | +| `planetsToLoad` | `LocationId`[] | +| `onProgress?` | (`fractionCompleted`: `number`) => `void` | + +#### Returns + +`Promise`<`QueuedArrival`[]\> + +--- + +### getArrival + +▸ **getArrival**(`arrivalId`): `Promise`<`undefined` \| `QueuedArrival`\> + +#### Parameters + +| Name | Type | +| :---------- | :------- | +| `arrivalId` | `number` | + +#### Returns + +`Promise`<`undefined` \| `QueuedArrival`\> + +--- + +### getArrivalsForPlanet + +▸ **getArrivalsForPlanet**(`planetId`): `Promise`<`QueuedArrival`[]\> + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`Promise`<`QueuedArrival`[]\> + +--- + +### getArtifactById + +▸ **getArtifactById**(`artifactId`): `Promise`<`undefined` \| `Artifact`\> + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`Promise`<`undefined` \| `Artifact`\> + +--- + +### getBalance + +▸ **getBalance**(): `Promise`<`number`\> + +#### Returns + +`Promise`<`number`\> + +--- + +### getConstants + +▸ **getConstants**(): `Promise`<[`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md)\> + +#### Returns + +`Promise`<[`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md)\> + +--- + +### getContractAddress + +▸ **getContractAddress**(): `EthAddress` + +#### Returns + +`EthAddress` + +--- + +### getContractBalance + +▸ **getContractBalance**(): `Promise`<`number`\> + +#### Returns + +`Promise`<`number`\> + +--- + +### getGPTCreditBalance + +▸ **getGPTCreditBalance**(`address`): `Promise`<`number`\> + +#### Parameters + +| Name | Type | +| :-------- | :----------- | +| `address` | `EthAddress` | + +#### Returns + +`Promise`<`number`\> + +--- + +### getGPTCreditPriceEther + +▸ **getGPTCreditPriceEther**(): `Promise`<`number`\> + +#### Returns + +`Promise`<`number`\> + +--- + +### getPlanetById + +▸ **getPlanetById**(`planetId`): `Promise`<`undefined` \| `Planet`\> + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`Promise`<`undefined` \| `Planet`\> + +--- + +### getPlayerArtifacts + +▸ **getPlayerArtifacts**(`playerId`, `onProgress?`): `Promise`<`Artifact`[]\> + +#### Parameters + +| Name | Type | +| :------------ | :------------------------------ | +| `playerId` | `EthAddress` | +| `onProgress?` | (`percent`: `number`) => `void` | + +#### Returns + +`Promise`<`Artifact`[]\> + +--- + +### getPlayerById + +▸ **getPlayerById**(`playerId`): `Promise`<`undefined` \| `Player`\> + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `playerId` | `EthAddress` | + +#### Returns + +`Promise`<`undefined` \| `Player`\> + +--- + +### getPlayers + +▸ **getPlayers**(`onProgress?`): `Promise`<`Map`<`string`, `Player`\>\> + +#### Parameters + +| Name | Type | +| :------------ | :---------------------------------------- | +| `onProgress?` | (`fractionCompleted`: `number`) => `void` | + +#### Returns + +`Promise`<`Map`<`string`, `Player`\>\> + +--- + +### getRevealedCoordsByIdIfExists + +▸ **getRevealedCoordsByIdIfExists**(`planetId`): `Promise`<`undefined` \| `RevealedCoords`\> + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`Promise`<`undefined` \| `RevealedCoords`\> + +--- + +### getRevealedPlanetsCoords + +▸ **getRevealedPlanetsCoords**(`startingAt`, `onProgressIds?`, `onProgressCoords?`): `Promise`<`RevealedCoords`[]\> + +#### Parameters + +| Name | Type | +| :------------------ | :---------------------------------------- | +| `startingAt` | `number` | +| `onProgressIds?` | (`fractionCompleted`: `number`) => `void` | +| `onProgressCoords?` | (`fractionCompleted`: `number`) => `void` | + +#### Returns + +`Promise`<`RevealedCoords`[]\> + +--- + +### getTokenMintEndTimestamp + +▸ **getTokenMintEndTimestamp**(): `Promise`<`number`\> + +#### Returns + +`Promise`<`number`\> + +--- + +### getTouchedPlanetIds + +▸ **getTouchedPlanetIds**(`startingAt`, `onProgress?`): `Promise`<`LocationId`[]\> + +#### Parameters + +| Name | Type | +| :------------ | :---------------------------------------- | +| `startingAt` | `number` | +| `onProgress?` | (`fractionCompleted`: `number`) => `void` | + +#### Returns + +`Promise`<`LocationId`[]\> + +--- + +### getWorldRadius + +▸ **getWorldRadius**(): `Promise`<`number`\> + +#### Returns + +`Promise`<`number`\> + +--- + +### initializePlayer + +▸ **initializePlayer**(`args`, `action`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :------- | :-------------------------- | +| `args` | `InitSnarkContractCallArgs` | +| `action` | `UnconfirmedInit` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### makeCall + +▸ `Private` **makeCall**<`T`\>(`contractViewFunction`, `args?`): `Promise`<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | Default value | +| :--------------------- | :----------------------- | :------------ | +| `contractViewFunction` | `ContractFunction`<`T`\> | `undefined` | +| `args` | `unknown`[] | `[]` | + +#### Returns + +`Promise`<`T`\> + +--- + +### move + +▸ **move**(`actionId`, `snarkArgs`, `shipsMoved`, `silverMoved`, `artifactMoved?`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------- | +| `actionId` | `string` | +| `snarkArgs` | `MoveSnarkContractCallArgs` | +| `shipsMoved` | `number` | +| `silverMoved` | `number` | +| `artifactMoved?` | `ArtifactId` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### prospectPlanet + +▸ **prospectPlanet**(`planetId`, `actionId`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | +| `actionId` | `string` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### removeEventListeners + +▸ **removeEventListeners**(): `void` + +#### Returns + +`void` + +--- + +### reveal + +▸ **reveal**(`args`, `action`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :------- | :---------------------------- | +| `args` | `RevealSnarkContractCallArgs` | +| `action` | `UnconfirmedReveal` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### setDiagnosticUpdater + +▸ **setDiagnosticUpdater**(`diagnosticUpdater?`): `void` + +#### Parameters + +| Name | Type | +| :------------------- | :--------------------------------------------------------------------------------------------- | +| `diagnosticUpdater?` | [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) | + +#### Returns + +`void` + +--- + +### setupEventListeners + +▸ **setupEventListeners**(): `void` + +#### Returns + +`void` + +--- + +### transferOwnership + +▸ **transferOwnership**(`planetId`, `newOwner`, `actionId`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | +| `newOwner` | `EthAddress` | +| `actionId` | `string` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### upgradePlanet + +▸ **upgradePlanet**(`args`, `actionId`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------------------------------------------- | +| `args` | [`UpgradeArgs`](../modules/_types_darkforest_api_ContractsAPITypes.md#upgradeargs) | +| `actionId` | `string` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### waitFor + +▸ **waitFor**(`submitted`, `receiptPromise`): `Promise`<`TransactionReceipt`\> + +Given an unconfirmed (but submitted) transaction, emits the appropriate +[ContractsAPIEvent](../enums/_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md). + +#### Parameters + +| Name | Type | +| :--------------- | :------------------------------- | +| `submitted` | `SubmittedTx` | +| `receiptPromise` | `Promise`<`TransactionReceipt`\> | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### withdrawArtifact + +▸ **withdrawArtifact**(`action`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :------- | :---------------------------- | +| `action` | `UnconfirmedWithdrawArtifact` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### withdrawSilver + +▸ **withdrawSilver**(`action`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :------- | :-------------------------- | +| `action` | `UnconfirmedWithdrawSilver` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + +### create + +▸ `Static` **create**(`ethConnection`): `Promise`<[`default`](Backend_GameLogic_ContractsAPI.default.md)\> + +#### Parameters + +| Name | Type | +| :-------------- | :---------------------------------------------------- | +| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | + +#### Returns + +`Promise`<[`default`](Backend_GameLogic_ContractsAPI.default.md)\> diff --git a/docs/classes/Backend_GameLogic_ConversationManager.ConversationManager.md b/docs/classes/Backend_GameLogic_ConversationManager.ConversationManager.md new file mode 100644 index 00000000..eac476ab --- /dev/null +++ b/docs/classes/Backend_GameLogic_ConversationManager.ConversationManager.md @@ -0,0 +1,155 @@ +# Class: ConversationManager + +[Backend/GameLogic/ConversationManager](../modules/Backend_GameLogic_ConversationManager.md).ConversationManager + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_ConversationManager.ConversationManager.md#constructor) + +### Properties + +- [artifact](Backend_GameLogic_ConversationManager.ConversationManager.md#artifact) +- [artifactId](Backend_GameLogic_ConversationManager.ConversationManager.md#artifactid) +- [conversation](Backend_GameLogic_ConversationManager.ConversationManager.md#conversation) +- [setConversation](Backend_GameLogic_ConversationManager.ConversationManager.md#setconversation) +- [setLoading](Backend_GameLogic_ConversationManager.ConversationManager.md#setloading) +- [terminal](Backend_GameLogic_ConversationManager.ConversationManager.md#terminal) +- [username](Backend_GameLogic_ConversationManager.ConversationManager.md#username) + +### Methods + +- [printClean](Backend_GameLogic_ConversationManager.ConversationManager.md#printclean) +- [printLastMessage](Backend_GameLogic_ConversationManager.ConversationManager.md#printlastmessage) +- [start](Backend_GameLogic_ConversationManager.ConversationManager.md#start) + +## Constructors + +### constructor + +• **new ConversationManager**(`terminal`, `setConversation`, `setLoading`, `artifactType`, `artifactRarity`) + +#### Parameters + +| Name | Type | +| :---------------- | :-------------------------------------------------------------------------------------------------------------- | +| `terminal` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | +| `setConversation` | (`conversation`: `Conversation`) => `void` | +| `setLoading` | (`loading`: `boolean`) => `void` | +| `artifactType` | `ArtifactType` | +| `artifactRarity` | `ArtifactRarity` | + +## Properties + +### artifact + +• `Private` **artifact**: `ConversationArtifact` + +--- + +### artifactId + +• `Private` **artifactId**: `string` + +--- + +### conversation + +• `Private` **conversation**: `Conversation` + +--- + +### setConversation + +• `Private` **setConversation**: (`conversation`: `Conversation`) => `void` + +#### Type declaration + +▸ (`conversation`): `void` + +##### Parameters + +| Name | Type | +| :------------- | :------------- | +| `conversation` | `Conversation` | + +##### Returns + +`void` + +--- + +### setLoading + +• `Private` **setLoading**: (`loading`: `boolean`) => `void` + +#### Type declaration + +▸ (`loading`): `void` + +##### Parameters + +| Name | Type | +| :-------- | :-------- | +| `loading` | `boolean` | + +##### Returns + +`void` + +--- + +### terminal + +• `Private` **terminal**: `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> + +--- + +### username + +• `Private` **username**: `string` + +## Methods + +### printClean + +▸ `Private` **printClean**(`message`, `style?`, `hoverContents?`): `void` + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------------------------------------------------------- | +| `message` | `string` | +| `style?` | [`TerminalTextStyle`](../enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md) | +| `hoverContents?` | () => `Element` | + +#### Returns + +`void` + +--- + +### printLastMessage + +▸ `Private` **printLastMessage**(`message`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :-------- | +| `message` | `Message` | + +#### Returns + +`void` + +--- + +### start + +▸ **start**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> diff --git a/docs/classes/Backend_GameLogic_GameManager.default.md b/docs/classes/Backend_GameLogic_GameManager.default.md new file mode 100644 index 00000000..633f201d --- /dev/null +++ b/docs/classes/Backend_GameLogic_GameManager.default.md @@ -0,0 +1,2836 @@ +# Class: default + +[Backend/GameLogic/GameManager](../modules/Backend_GameLogic_GameManager.md).default + +## Hierarchy + +- `EventEmitter` + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_GameManager.default.md#constructor) + +### Properties + +- [account](Backend_GameLogic_GameManager.default.md#account) +- [balance](Backend_GameLogic_GameManager.default.md#balance) +- [balanceInterval](Backend_GameLogic_GameManager.default.md#balanceinterval) +- [contractConstants](Backend_GameLogic_GameManager.default.md#contractconstants) +- [contractsAPI](Backend_GameLogic_GameManager.default.md#contractsapi) +- [diagnostics](Backend_GameLogic_GameManager.default.md#diagnostics) +- [endTimeSeconds](Backend_GameLogic_GameManager.default.md#endtimeseconds) +- [entityStore](Backend_GameLogic_GameManager.default.md#entitystore) +- [ethConnection](Backend_GameLogic_GameManager.default.md#ethconnection) +- [gptCreditPriceEther](Backend_GameLogic_GameManager.default.md#gptcreditpriceether) +- [gptCreditPriceEtherEmitter$](Backend_GameLogic_GameManager.default.md#gptcreditpriceetheremitter$) +- [hashConfig](Backend_GameLogic_GameManager.default.md#hashconfig) +- [hashRate](Backend_GameLogic_GameManager.default.md#hashrate) +- [homeLocation](Backend_GameLogic_GameManager.default.md#homelocation) +- [minerManager](Backend_GameLogic_GameManager.default.md#minermanager) +- [myBalance$](Backend_GameLogic_GameManager.default.md#mybalance$) +- [myGPTCredits](Backend_GameLogic_GameManager.default.md#mygptcredits) +- [myGPTCredits$](Backend_GameLogic_GameManager.default.md#mygptcredits$) +- [persistentChunkStore](Backend_GameLogic_GameManager.default.md#persistentchunkstore) +- [planetHashMimc](Backend_GameLogic_GameManager.default.md#planethashmimc) +- [playerInterval](Backend_GameLogic_GameManager.default.md#playerinterval) +- [players](Backend_GameLogic_GameManager.default.md#players) +- [settingsSubscription](Backend_GameLogic_GameManager.default.md#settingssubscription) +- [snarkHelper](Backend_GameLogic_GameManager.default.md#snarkhelper) +- [terminal](Backend_GameLogic_GameManager.default.md#terminal) +- [useMockHash](Backend_GameLogic_GameManager.default.md#usemockhash) +- [worldRadius](Backend_GameLogic_GameManager.default.md#worldradius) + +### Accessors + +- [planetRarity](Backend_GameLogic_GameManager.default.md#planetrarity) + +### Methods + +- [activateArtifact](Backend_GameLogic_GameManager.default.md#activateartifact) +- [addAccount](Backend_GameLogic_GameManager.default.md#addaccount) +- [addNewChunk](Backend_GameLogic_GameManager.default.md#addnewchunk) +- [biomebasePerlin](Backend_GameLogic_GameManager.default.md#biomebaseperlin) +- [bulkAddNewChunks](Backend_GameLogic_GameManager.default.md#bulkaddnewchunks) +- [bulkHardRefreshPlanets](Backend_GameLogic_GameManager.default.md#bulkhardrefreshplanets) +- [buyGPTCredits](Backend_GameLogic_GameManager.default.md#buygptcredits) +- [buyHat](Backend_GameLogic_GameManager.default.md#buyhat) +- [checkGameHasEnded](Backend_GameLogic_GameManager.default.md#checkgamehasended) +- [clearEmoji](Backend_GameLogic_GameManager.default.md#clearemoji) +- [deactivateArtifact](Backend_GameLogic_GameManager.default.md#deactivateartifact) +- [depositArtifact](Backend_GameLogic_GameManager.default.md#depositartifact) +- [destroy](Backend_GameLogic_GameManager.default.md#destroy) +- [findArtifact](Backend_GameLogic_GameManager.default.md#findartifact) +- [getAccount](Backend_GameLogic_GameManager.default.md#getaccount) +- [getActiveArtifact](Backend_GameLogic_GameManager.default.md#getactiveartifact) +- [getAllOwnedPlanets](Backend_GameLogic_GameManager.default.md#getallownedplanets) +- [getAllPlanets](Backend_GameLogic_GameManager.default.md#getallplanets) +- [getAllPlayers](Backend_GameLogic_GameManager.default.md#getallplayers) +- [getAllVoyages](Backend_GameLogic_GameManager.default.md#getallvoyages) +- [getArtifactMap](Backend_GameLogic_GameManager.default.md#getartifactmap) +- [getArtifactUpdated$](Backend_GameLogic_GameManager.default.md#getartifactupdated$) +- [getArtifactWithId](Backend_GameLogic_GameManager.default.md#getartifactwithid) +- [getArtifactsWithIds](Backend_GameLogic_GameManager.default.md#getartifactswithids) +- [getChunk](Backend_GameLogic_GameManager.default.md#getchunk) +- [getChunkStore](Backend_GameLogic_GameManager.default.md#getchunkstore) +- [getConstructors](Backend_GameLogic_GameManager.default.md#getconstructors) +- [getContractAddress](Backend_GameLogic_GameManager.default.md#getcontractaddress) +- [getContractConstants](Backend_GameLogic_GameManager.default.md#getcontractconstants) +- [getConversation](Backend_GameLogic_GameManager.default.md#getconversation) +- [getCurrentlyExploringChunk](Backend_GameLogic_GameManager.default.md#getcurrentlyexploringchunk) +- [getDiagnostics](Backend_GameLogic_GameManager.default.md#getdiagnostics) +- [getDist](Backend_GameLogic_GameManager.default.md#getdist) +- [getDistCoords](Backend_GameLogic_GameManager.default.md#getdistcoords) +- [getEndTimeSeconds](Backend_GameLogic_GameManager.default.md#getendtimeseconds) +- [getEnergyArrivingForMove](Backend_GameLogic_GameManager.default.md#getenergyarrivingformove) +- [getEnergyCurveAtPercent](Backend_GameLogic_GameManager.default.md#getenergycurveatpercent) +- [getEnergyNeededForMove](Backend_GameLogic_GameManager.default.md#getenergyneededformove) +- [getEnergyOfPlayer](Backend_GameLogic_GameManager.default.md#getenergyofplayer) +- [getEthConnection](Backend_GameLogic_GameManager.default.md#getethconnection) +- [getExploredChunks](Backend_GameLogic_GameManager.default.md#getexploredchunks) +- [getGameObjects](Backend_GameLogic_GameManager.default.md#getgameobjects) +- [getGptCreditBalanceEmitter](Backend_GameLogic_GameManager.default.md#getgptcreditbalanceemitter) +- [getGptCreditPriceEmitter](Backend_GameLogic_GameManager.default.md#getgptcreditpriceemitter) +- [getHashConfig](Backend_GameLogic_GameManager.default.md#gethashconfig) +- [getHashesPerSec](Backend_GameLogic_GameManager.default.md#gethashespersec) +- [getHomeCoords](Backend_GameLogic_GameManager.default.md#gethomecoords) +- [getHomeHash](Backend_GameLogic_GameManager.default.md#gethomehash) +- [getIsBuyingCreditsEmitter](Backend_GameLogic_GameManager.default.md#getisbuyingcreditsemitter) +- [getLocationOfPlanet](Backend_GameLogic_GameManager.default.md#getlocationofplanet) +- [getMaxMoveDist](Backend_GameLogic_GameManager.default.md#getmaxmovedist) +- [getMiningPattern](Backend_GameLogic_GameManager.default.md#getminingpattern) +- [getMyArtifactMap](Backend_GameLogic_GameManager.default.md#getmyartifactmap) +- [getMyArtifacts](Backend_GameLogic_GameManager.default.md#getmyartifacts) +- [getMyArtifactsUpdated$](Backend_GameLogic_GameManager.default.md#getmyartifactsupdated$) +- [getMyBalance](Backend_GameLogic_GameManager.default.md#getmybalance) +- [getMyBalanceEmitter](Backend_GameLogic_GameManager.default.md#getmybalanceemitter) +- [getMyPlanetMap](Backend_GameLogic_GameManager.default.md#getmyplanetmap) +- [getMyPlanets](Backend_GameLogic_GameManager.default.md#getmyplanets) +- [getMyPlanetsUpdated$](Backend_GameLogic_GameManager.default.md#getmyplanetsupdated$) +- [getMyScore](Backend_GameLogic_GameManager.default.md#getmyscore) +- [getNextBroadcastAvailableTimestamp](Backend_GameLogic_GameManager.default.md#getnextbroadcastavailabletimestamp) +- [getNextRevealCountdownInfo](Backend_GameLogic_GameManager.default.md#getnextrevealcountdowninfo) +- [getNotificationsManager](Backend_GameLogic_GameManager.default.md#getnotificationsmanager) +- [getPerlinThresholds](Backend_GameLogic_GameManager.default.md#getperlinthresholds) +- [getPlanetLevel](Backend_GameLogic_GameManager.default.md#getplanetlevel) +- [getPlanetMap](Backend_GameLogic_GameManager.default.md#getplanetmap) +- [getPlanetRarity](Backend_GameLogic_GameManager.default.md#getplanetrarity) +- [getPlanetUpdated$](Backend_GameLogic_GameManager.default.md#getplanetupdated$) +- [getPlanetWithCoords](Backend_GameLogic_GameManager.default.md#getplanetwithcoords) +- [getPlanetWithId](Backend_GameLogic_GameManager.default.md#getplanetwithid) +- [getPlanetsInRange](Backend_GameLogic_GameManager.default.md#getplanetsinrange) +- [getPlanetsInWorldRectangle](Backend_GameLogic_GameManager.default.md#getplanetsinworldrectangle) +- [getPlanetsWithIds](Backend_GameLogic_GameManager.default.md#getplanetswithids) +- [getPrivateKey](Backend_GameLogic_GameManager.default.md#getprivatekey) +- [getProcgenUtils](Backend_GameLogic_GameManager.default.md#getprocgenutils) +- [getRandomHomePlanetCoords](Backend_GameLogic_GameManager.default.md#getrandomhomeplanetcoords) +- [getRevealedLocations](Backend_GameLogic_GameManager.default.md#getrevealedlocations) +- [getSignedTwitter](Backend_GameLogic_GameManager.default.md#getsignedtwitter) +- [getSilverCurveAtPercent](Backend_GameLogic_GameManager.default.md#getsilvercurveatpercent) +- [getSilverOfPlayer](Backend_GameLogic_GameManager.default.md#getsilverofplayer) +- [getStalePlanetWithId](Backend_GameLogic_GameManager.default.md#getstaleplanetwithid) +- [getTemperature](Backend_GameLogic_GameManager.default.md#gettemperature) +- [getTimeForMove](Backend_GameLogic_GameManager.default.md#gettimeformove) +- [getTokenMintEndTimeSeconds](Backend_GameLogic_GameManager.default.md#gettokenmintendtimeseconds) +- [getTwitter](Backend_GameLogic_GameManager.default.md#gettwitter) +- [getUIEventEmitter](Backend_GameLogic_GameManager.default.md#getuieventemitter) +- [getUnconfirmedMoves](Backend_GameLogic_GameManager.default.md#getunconfirmedmoves) +- [getUnconfirmedUpgrades](Backend_GameLogic_GameManager.default.md#getunconfirmedupgrades) +- [getUnconfirmedWormholeActivations](Backend_GameLogic_GameManager.default.md#getunconfirmedwormholeactivations) +- [getUniverseTotalEnergy](Backend_GameLogic_GameManager.default.md#getuniversetotalenergy) +- [getUpgrade](Backend_GameLogic_GameManager.default.md#getupgrade) +- [getWithdrawnSilverOfPlayer](Backend_GameLogic_GameManager.default.md#getwithdrawnsilverofplayer) +- [getWorldRadius](Backend_GameLogic_GameManager.default.md#getworldradius) +- [getWorldSilver](Backend_GameLogic_GameManager.default.md#getworldsilver) +- [getWormholeFactors](Backend_GameLogic_GameManager.default.md#getwormholefactors) +- [getWormholes](Backend_GameLogic_GameManager.default.md#getwormholes) +- [handleTxIntent](Backend_GameLogic_GameManager.default.md#handletxintent) +- [hardRefreshArtifact](Backend_GameLogic_GameManager.default.md#hardrefreshartifact) +- [hardRefreshPlanet](Backend_GameLogic_GameManager.default.md#hardrefreshplanet) +- [hardRefreshPlayer](Backend_GameLogic_GameManager.default.md#hardrefreshplayer) +- [hasJoinedGame](Backend_GameLogic_GameManager.default.md#hasjoinedgame) +- [hasMinedChunk](Backend_GameLogic_GameManager.default.md#hasminedchunk) +- [initMiningManager](Backend_GameLogic_GameManager.default.md#initminingmanager) +- [isMining](Backend_GameLogic_GameManager.default.md#ismining) +- [isPlanetMineable](Backend_GameLogic_GameManager.default.md#isplanetmineable) +- [isRoundOver](Backend_GameLogic_GameManager.default.md#isroundover) +- [joinGame](Backend_GameLogic_GameManager.default.md#joingame) +- [loadContract](Backend_GameLogic_GameManager.default.md#loadcontract) +- [loadPlugins](Backend_GameLogic_GameManager.default.md#loadplugins) +- [locationFromCoords](Backend_GameLogic_GameManager.default.md#locationfromcoords) +- [move](Backend_GameLogic_GameManager.default.md#move) +- [onTxConfirmed](Backend_GameLogic_GameManager.default.md#ontxconfirmed) +- [onTxIntentFail](Backend_GameLogic_GameManager.default.md#ontxintentfail) +- [onTxReverted](Backend_GameLogic_GameManager.default.md#ontxreverted) +- [onTxSubmit](Backend_GameLogic_GameManager.default.md#ontxsubmit) +- [prospectPlanet](Backend_GameLogic_GameManager.default.md#prospectplanet) +- [refreshMyGPTCredits](Backend_GameLogic_GameManager.default.md#refreshmygptcredits) +- [refreshServerPlanetStates](Backend_GameLogic_GameManager.default.md#refreshserverplanetstates) +- [refreshTwitters](Backend_GameLogic_GameManager.default.md#refreshtwitters) +- [revealLocation](Backend_GameLogic_GameManager.default.md#reveallocation) +- [savePlugins](Backend_GameLogic_GameManager.default.md#saveplugins) +- [setMinerCores](Backend_GameLogic_GameManager.default.md#setminercores) +- [setMiningPattern](Backend_GameLogic_GameManager.default.md#setminingpattern) +- [setPlanetEmoji](Backend_GameLogic_GameManager.default.md#setplanetemoji) +- [setRadius](Backend_GameLogic_GameManager.default.md#setradius) +- [setSnarkCacheSize](Backend_GameLogic_GameManager.default.md#setsnarkcachesize) +- [signMessage](Backend_GameLogic_GameManager.default.md#signmessage) +- [softRefreshPlanet](Backend_GameLogic_GameManager.default.md#softrefreshplanet) +- [spaceTypeFromPerlin](Backend_GameLogic_GameManager.default.md#spacetypefromperlin) +- [spaceTypePerlin](Backend_GameLogic_GameManager.default.md#spacetypeperlin) +- [startConversation](Backend_GameLogic_GameManager.default.md#startconversation) +- [startExplore](Backend_GameLogic_GameManager.default.md#startexplore) +- [stepConversation](Backend_GameLogic_GameManager.default.md#stepconversation) +- [stopExplore](Backend_GameLogic_GameManager.default.md#stopexplore) +- [submitPlanetMessage](Backend_GameLogic_GameManager.default.md#submitplanetmessage) +- [transferOwnership](Backend_GameLogic_GameManager.default.md#transferownership) +- [updateDiagnostics](Backend_GameLogic_GameManager.default.md#updatediagnostics) +- [upgrade](Backend_GameLogic_GameManager.default.md#upgrade) +- [verifyMessage](Backend_GameLogic_GameManager.default.md#verifymessage) +- [verifyTwitter](Backend_GameLogic_GameManager.default.md#verifytwitter) +- [waitForPlanet](Backend_GameLogic_GameManager.default.md#waitforplanet) +- [withdrawArtifact](Backend_GameLogic_GameManager.default.md#withdrawartifact) +- [withdrawSilver](Backend_GameLogic_GameManager.default.md#withdrawsilver) +- [create](Backend_GameLogic_GameManager.default.md#create) + +## Constructors + +### constructor + +• `Private` **new default**(`terminal`, `account`, `balance`, `players`, `touchedPlanets`, `allTouchedPlanetIds`, `revealedCoords`, `worldRadius`, `unprocessedArrivals`, `unprocessedPlanetArrivalIds`, `contractsAPI`, `contractConstants`, `persistentChunkStore`, `snarkHelper`, `homeLocation`, `useMockHash`, `artifacts`, `ethConnection`, `gptCreditPriceEther`, `myGPTCredits`) + +#### Parameters + +| Name | Type | +| :---------------------------- | :-------------------------------------------------------------------------------------------------------------- | +| `terminal` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | +| `account` | `undefined` \| `EthAddress` | +| `balance` | `number` | +| `players` | `Map`<`string`, `Player`\> | +| `touchedPlanets` | `Map`<`LocationId`, `Planet`\> | +| `allTouchedPlanetIds` | `Set`<`LocationId`\> | +| `revealedCoords` | `Map`<`LocationId`, `RevealedCoords`\> | +| `worldRadius` | `number` | +| `unprocessedArrivals` | `Map`<`VoyageId`, `QueuedArrival`\> | +| `unprocessedPlanetArrivalIds` | `Map`<`LocationId`, `VoyageId`[]\> | +| `contractsAPI` | [`default`](Backend_GameLogic_ContractsAPI.default.md) | +| `contractConstants` | [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) | +| `persistentChunkStore` | [`default`](Backend_Storage_PersistentChunkStore.default.md) | +| `snarkHelper` | [`default`](Backend_Utils_SnarkArgsHelper.default.md) | +| `homeLocation` | `undefined` \| `WorldLocation` | +| `useMockHash` | `boolean` | +| `artifacts` | `Map`<`ArtifactId`, `Artifact`\> | +| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | +| `gptCreditPriceEther` | `number` | +| `myGPTCredits` | `number` | + +#### Overrides + +EventEmitter.constructor + +## Properties + +### account + +• `Private` `Readonly` **account**: `undefined` \| `EthAddress` + +The ethereum address of the player who is currently logged in. We support 'no account', +represented by `undefined` in the case when you want to simply load the game state from the +contract and view it without be able to make any moves. + +--- + +### balance + +• `Private` **balance**: `number` + +This is kept relatively up-to-date with the balance of the player's wallet on the latest block +of whatever blockchain we're connected to. + +**`todo`** move this into a new `PlayerState` class. + +--- + +### balanceInterval + +• `Private` **balanceInterval**: `Timeout` + +Handle to an interval that periodically refreshes the player's balance. + +**`todo`** move this into a new `PlayerState` class. + +--- + +### contractConstants + +• `Private` `Readonly` **contractConstants**: [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) + +Game parameters set by the contract. Stuff like perlin keys, which are important for mining the +correct universe, or the time multiplier, which allows us to tune how quickly voyages go. + +**`todo`** move this into a separate `GameConfiguration` class. + +--- + +### contractsAPI + +• `Private` `Readonly` **contractsAPI**: [`default`](Backend_GameLogic_ContractsAPI.default.md) + +Allows us to make contract calls, and execute transactions. Be careful about how you use this +guy. You don't want to cause your client to send an excessive amount of traffic to whatever +node you're connected to. + +Interacting with the blockchain isn't free, and we need to be mindful about about the way our +application interacts with the blockchain. The current rate limiting strategy consists of three +points: + +- data that needs to be fetched often should be fetched in bulk. +- rate limit smart contract calls (reads from the blockchain), implemented by + [ContractCaller](Backend_GameLogic_ContractCaller.ContractCaller.md) and transactions (writes to the blockchain on behalf of the player), + implemented by [TxExecutor](Backend_Network_TxExecutor.TxExecutor.md) via two separately tuned [ThrottledConcurrentQueue](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md)s. + +--- + +### diagnostics + +• `Private` **diagnostics**: [`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) + +Diagnostic information about the game. + +--- + +### endTimeSeconds + +• `Private` `Readonly` **endTimeSeconds**: `number` = `1643587533` + +**`todo`** change this to the correct timestamp each round. + +--- + +### entityStore + +• `Private` `Readonly` **entityStore**: [`GameObjects`](Backend_GameLogic_GameObjects.GameObjects.md) + +This variable contains the internal state of objects that live in the game world. + +--- + +### ethConnection + +• `Private` `Readonly` **ethConnection**: [`default`](Backend_Network_EthConnection.default.md) + +An interface to the blockchain that is a little bit lower-level than {@link ContractsAPI}. It +allows us to do basic operations such as wait for a transaction to complete, check the player's +address and balance, etc. + +--- + +### gptCreditPriceEther + +• `Private` **gptCreditPriceEther**: `number` + +Price of a single gpt credit, which buys you a single interaction with the GPT-powered AI +Artifact Chat Bots. + +**`todo`** move this into a new `GameConfiguration` class. + +--- + +### gptCreditPriceEtherEmitter$ + +• `Private` **gptCreditPriceEtherEmitter$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +Whenever the price of single GPT credit changes, we emit that event here. + +--- + +### hashConfig + +• `Private` `Readonly` **hashConfig**: [`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) + +Each round we change the hash configuration of the game. The hash configuration is download +from the blockchain, and essentially acts as a salt, permuting the universe into a unique +configuration for each new round. + +**`todo`** deduplicate this and `useMockHash` somehow. + +--- + +### hashRate + +• `Private` **hashRate**: `number` + +Continuously updated value representing the total hashes per second that the game is currently +mining the universe at. + +**`todo`** keep this in {@link MinerManager} + +--- + +### homeLocation + +• `Private` **homeLocation**: `undefined` \| `WorldLocation` + +The spawn location of the current player. + +**`todo,`** make this smarter somehow. It's really annoying to have to import world coordinates, and +get them wrong or something. Maybe we need to mark a planet, once it's been initialized +contract-side, as the homeworld of the user who initialized on it. That way, when you import a +new account into the game, and you import map data that contains your home planet, the client +would be able to automatically detect which planet is the player's home planet. + +**`todo`** move this into a new `PlayerState` class. + +--- + +### minerManager + +• `Private` `Optional` **minerManager**: [`default`](Backend_Miner_MinerManager.default.md) + +Manages the process of mining new space territory. + +--- + +### myBalance$ + +• `Private` **myBalance$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +Any time the balance of the player's address changes, we publish an event here. + +**`todo`** move this into a new `PlayerState` class. + +--- + +### myGPTCredits + +• `Private` **myGPTCredits**: `number` + +The total amount of GPT credits that belong to the current player. + +**`todo`** move this into a new `PlayerState` class. + +--- + +### myGPTCredits$ + +• `Private` **myGPTCredits$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +Whenever the amount of the GPT credits that this player owns changes, we publish an event here. + +**`todo`** move this into a new `PlayerState` class. + +--- + +### persistentChunkStore + +• `Private` `Readonly` **persistentChunkStore**: [`default`](Backend_Storage_PersistentChunkStore.default.md) + +An object that syncs any newly added or deleted chunks to the player's IndexedDB. + +**`todo`** it also persists other game data to IndexedDB. This class needs to be renamed `GameSaver` +or something like that. + +--- + +### planetHashMimc + +• `Private` `Readonly` **planetHashMimc**: (...`inputs`: `number`[]) => `BigInteger` + +The aforementioned hash function. In debug mode where `DISABLE_ZK_CHECKS` is on, we use a +faster hash function. Othewise, in production mode, use MiMC hash (https://byt3bit.github.io/primesym/). + +#### Type declaration + +▸ (...`inputs`): `BigInteger` + +The aforementioned hash function. In debug mode where `DISABLE_ZK_CHECKS` is on, we use a +faster hash function. Othewise, in production mode, use MiMC hash (https://byt3bit.github.io/primesym/). + +##### Parameters + +| Name | Type | +| :---------- | :--------- | +| `...inputs` | `number`[] | + +##### Returns + +`BigInteger` + +--- + +### playerInterval + +• `Private` **playerInterval**: `Timeout` + +Handle to an interval that periodically refreshes some information about the player from the +blockchain. + +**`todo`** move this into a new `PlayerState` class. + +--- + +### players + +• `Private` `Readonly` **players**: `Map`<`string`, `Player`\> + +Map from ethereum addresses to player objects. This isn't stored in [GameObjects](Backend_GameLogic_GameObjects.GameObjects.md), +because it's not techincally an entity that exists in the world. A player just controls planets +and artifacts that do exist in the world. + +**`todo`** move this into a new `Players` class. + +--- + +### settingsSubscription + +• `Private` **settingsSubscription**: `undefined` \| [`Subscription`](../modules/Frontend_Utils_Monomitter.md#subscription) + +Subscription to act on setting changes + +--- + +### snarkHelper + +• `Private` `Readonly` **snarkHelper**: [`default`](Backend_Utils_SnarkArgsHelper.default.md) + +Responsible for generating snark proofs. + +--- + +### terminal + +• `Private` `Readonly` **terminal**: `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> + +Kind of hacky, but we store a reference to the terminal that the player sees when the initially +load into the game. This is the same exact terminal that appears inside the collapsable right +bar of the game. + +--- + +### useMockHash + +• `Private` `Readonly` **useMockHash**: `boolean` + +In debug builds of the game, we can connect to a set of contracts deployed to a local +blockchain, which are tweaked to not verify planet hashes, meaning we can use a faster hash +function with similar properties to mimc. This allows us to mine the map faster in debug mode. + +**`todo`** move this into a separate `GameConfiguration` class. + +--- + +### worldRadius + +• `Private` **worldRadius**: `number` + +Sometimes the universe gets bigger... Sometimes it doesn't. + +**`todo`** move this into a new `GameConfiguration` class. + +## Accessors + +### planetRarity + +• `get` **planetRarity**(): `number` + +#### Returns + +`number` + +## Methods + +### activateArtifact + +▸ **activateArtifact**(`locationId`, `artifactId`, `wormholeTo`, `bypassChecks?`): [`default`](Backend_GameLogic_GameManager.default.md) + +#### Parameters + +| Name | Type | Default value | +| :------------- | :-------------------------- | :------------ | +| `locationId` | `LocationId` | `undefined` | +| `artifactId` | `ArtifactId` | `undefined` | +| `wormholeTo` | `undefined` \| `LocationId` | `undefined` | +| `bypassChecks` | `boolean` | `false` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### addAccount + +▸ **addAccount**(`coords`): `Promise`<`boolean`\> + +Initializes a new player's game to start at the given home planet. Must have already +initialized the player on the contract. + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`Promise`<`boolean`\> + +--- + +### addNewChunk + +▸ **addNewChunk**(`chunk`): [`default`](Backend_GameLogic_GameManager.default.md) + +Makes this game manager aware of a new chunk - which includes its location, size, +as well as all of the planets contained in that chunk. Causes the client to load +all of the information about those planets from the blockchain. + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### biomebasePerlin + +▸ **biomebasePerlin**(`coords`, `floor`): `number` + +Gets the biome perlin valie at the given location in the world. + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | +| `floor` | `boolean` | + +#### Returns + +`number` + +--- + +### bulkAddNewChunks + +▸ **bulkAddNewChunks**(`chunks`): `Promise`<`void`\> + +To add multiple chunks at once, use this function rather than `addNewChunk`, in order +to load all of the associated planet data in an efficient manner. + +#### Parameters + +| Name | Type | +| :------- | :---------------------------------------------- | +| `chunks` | [`Chunk`](_types_global_GlobalTypes.Chunk.md)[] | + +#### Returns + +`Promise`<`void`\> + +--- + +### bulkHardRefreshPlanets + +▸ `Private` **bulkHardRefreshPlanets**(`planetIds`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :---------- | :------------- | +| `planetIds` | `LocationId`[] | + +#### Returns + +`Promise`<`void`\> + +--- + +### buyGPTCredits + +▸ **buyGPTCredits**(`amount`): [`default`](Backend_GameLogic_GameManager.default.md) + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `amount` | `number` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### buyHat + +▸ **buyHat**(`planetId`, `_bypassChecks?`): [`default`](Backend_GameLogic_GameManager.default.md) + +Submits a transaction to the blockchain to buy a hat for the given planet. You +must own the planet. Warning costs real xdai. Hats are permanently locked to a +planet. They are purely cosmetic and a great way to BM your opponents or just +look your best. Just like in the real world, more money means more hat. + +#### Parameters + +| Name | Type | Default value | +| :-------------- | :----------- | :------------ | +| `planetId` | `LocationId` | `undefined` | +| `_bypassChecks` | `boolean` | `false` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### checkGameHasEnded + +▸ `Private` **checkGameHasEnded**(): `boolean` + +#### Returns + +`boolean` + +--- + +### clearEmoji + +▸ **clearEmoji**(`locationId`): `Promise`<`void`\> + +If you are the owner of this planet, you can delete the emoji that is hovering above the +planet. + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `locationId` | `LocationId` | + +#### Returns + +`Promise`<`void`\> + +--- + +### deactivateArtifact + +▸ **deactivateArtifact**(`locationId`, `artifactId`, `bypassChecks?`): `undefined` \| [`default`](Backend_GameLogic_GameManager.default.md) + +#### Parameters + +| Name | Type | Default value | +| :------------- | :----------- | :------------ | +| `locationId` | `LocationId` | `undefined` | +| `artifactId` | `ArtifactId` | `undefined` | +| `bypassChecks` | `boolean` | `false` | + +#### Returns + +`undefined` \| [`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### depositArtifact + +▸ **depositArtifact**(`locationId`, `artifactId`, `bypassChecks?`): [`default`](Backend_GameLogic_GameManager.default.md) + +Submits a transaction to the blockchain to deposit an artifact on a given planet. +You must own the planet and you must own the artifact directly (can't be locked in contract) + +#### Parameters + +| Name | Type | Default value | +| :------------- | :----------- | :------------ | +| `locationId` | `LocationId` | `undefined` | +| `artifactId` | `ArtifactId` | `undefined` | +| `bypassChecks` | `boolean` | `true` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### destroy + +▸ **destroy**(): `void` + +#### Returns + +`void` + +--- + +### findArtifact + +▸ **findArtifact**(`planetId`, `bypassChecks?`): [`default`](Backend_GameLogic_GameManager.default.md) + +Calls the contract to find an artifact on the given planet. + +#### Parameters + +| Name | Type | Default value | +| :------------- | :----------- | :------------ | +| `planetId` | `LocationId` | `undefined` | +| `bypassChecks` | `boolean` | `false` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### getAccount + +▸ **getAccount**(): `undefined` \| `EthAddress` + +Gets the address of the player logged into this game manager. + +#### Returns + +`undefined` \| `EthAddress` + +--- + +### getActiveArtifact + +▸ **getActiveArtifact**(`planet`): `undefined` \| `Artifact` + +Gets the active artifact on this planet, if one exists. + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`undefined` \| `Artifact` + +--- + +### getAllOwnedPlanets + +▸ **getAllOwnedPlanets**(): `Planet`[] + +Gets a list of planets that have an owner. + +#### Returns + +`Planet`[] + +--- + +### getAllPlanets + +▸ **getAllPlanets**(): `Iterable`<`Planet`\> + +Gets all planets. This means all planets that are in the contract, and also all +planets that have been mined locally. Does not update planets if they are stale. +NOT PERFORMANT - for scripting only. + +#### Returns + +`Iterable`<`Planet`\> + +--- + +### getAllPlayers + +▸ **getAllPlayers**(): `Player`[] + +Gets a list of all the players in the game (not just the ones you've +encounterd) + +#### Returns + +`Player`[] + +--- + +### getAllVoyages + +▸ **getAllVoyages**(): `QueuedArrival`[] + +Gets all voyages that have not completed. + +#### Returns + +`QueuedArrival`[] + +--- + +### getArtifactMap + +▸ **getArtifactMap**(): `Map`<`ArtifactId`, `Artifact`\> + +Return a reference to the artifact map + +#### Returns + +`Map`<`ArtifactId`, `Artifact`\> + +--- + +### getArtifactUpdated$ + +▸ **getArtifactUpdated$**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`ArtifactId`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`ArtifactId`\> + +--- + +### getArtifactWithId + +▸ **getArtifactWithId**(`artifactId`): `undefined` \| `Artifact` + +Gets the artifact with the given id. Null if no artifact with id exists. + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`undefined` \| `Artifact` + +--- + +### getArtifactsWithIds + +▸ **getArtifactsWithIds**(`artifactIds`): (`undefined` \| `Artifact`)[] + +Gets the artifacts with the given ids, including ones we know exist but haven't been loaded, +represented by `undefined`. + +#### Parameters + +| Name | Type | +| :------------ | :------------- | +| `artifactIds` | `ArtifactId`[] | + +#### Returns + +(`undefined` \| `Artifact`)[] + +--- + +### getChunk + +▸ **getChunk**(`chunkFootprint`): `undefined` \| [`Chunk`](_types_global_GlobalTypes.Chunk.md) + +#### Parameters + +| Name | Type | +| :--------------- | :------------------------------------------------------------------ | +| `chunkFootprint` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +`undefined` \| [`Chunk`](_types_global_GlobalTypes.Chunk.md) + +--- + +### getChunkStore + +▸ **getChunkStore**(): [`default`](Backend_Storage_PersistentChunkStore.default.md) + +#### Returns + +[`default`](Backend_Storage_PersistentChunkStore.default.md) + +--- + +### getConstructors + +▸ **getConstructors**(): `Object` + +Returns constructors of classes that may be useful for developing plugins. + +#### Returns + +`Object` + +| Name | Type | +| :------------------- | :-------------------------------------------------------------------------------- | +| `MinerManager` | typeof [`default`](Backend_Miner_MinerManager.default.md) | +| `SpiralPattern` | typeof [`SpiralPattern`](Backend_Miner_MiningPatterns.SpiralPattern.md) | +| `SwissCheesePattern` | typeof [`SwissCheesePattern`](Backend_Miner_MiningPatterns.SwissCheesePattern.md) | + +--- + +### getContractAddress + +▸ **getContractAddress**(): `EthAddress` + +Gets the address of the `DarkForestCore` contract, which is essentially +the 'backend' of the game. + +#### Returns + +`EthAddress` + +--- + +### getContractConstants + +▸ **getContractConstants**(): [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) + +#### Returns + +[`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) + +--- + +### getConversation + +▸ **getConversation**(`artifactId`): `Promise`<`undefined` \| `Conversation`\> + +Gets the GPT conversation with an artifact; undefined if there is none so far + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`Promise`<`undefined` \| `Conversation`\> + +--- + +### getCurrentlyExploringChunk + +▸ **getCurrentlyExploringChunk**(): `undefined` \| [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +Gets the rectangle bounding the chunk that the miner is currently in the process +of hashing. + +#### Returns + +`undefined` \| [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +--- + +### getDiagnostics + +▸ **getDiagnostics**(): [`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) + +Gets some diagnostic information about the game. Returns a copy, you can't modify it. + +#### Returns + +[`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) + +--- + +### getDist + +▸ **getDist**(`fromId`, `toId`): `number` + +Gets the distance between two planets. Throws an exception if you don't +know the location of either planet. + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `fromId` | `LocationId` | +| `toId` | `LocationId` | + +#### Returns + +`number` + +--- + +### getDistCoords + +▸ **getDistCoords**(`fromCoords`, `toCoords`): `number` + +Gets the distance between two coordinates in space. + +#### Parameters + +| Name | Type | +| :----------- | :------------ | +| `fromCoords` | `WorldCoords` | +| `toCoords` | `WorldCoords` | + +#### Returns + +`number` + +--- + +### getEndTimeSeconds + +▸ **getEndTimeSeconds**(): `number` + +The game ends at a particular time in the future - get this time measured +in seconds from the epoch. + +#### Returns + +`number` + +--- + +### getEnergyArrivingForMove + +▸ **getEnergyArrivingForMove**(`fromId`, `toId`, `distance`, `sentEnergy`): `number` + +Gets the amount of energy that would arrive if a voyage with the given parameters +was to occur. The toPlanet is optional, in case you want an estimate that doesn't include +wormhole speedups. + +#### Parameters + +| Name | Type | +| :----------- | :-------------------------- | +| `fromId` | `LocationId` | +| `toId` | `undefined` \| `LocationId` | +| `distance` | `undefined` \| `number` | +| `sentEnergy` | `number` | + +#### Returns + +`number` + +--- + +### getEnergyCurveAtPercent + +▸ **getEnergyCurveAtPercent**(`planet`, `percent`): `number` + +returns timestamp (seconds) that planet will reach percent% of energycap +time may be in the past + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `planet` | `Planet` | +| `percent` | `number` | + +#### Returns + +`number` + +--- + +### getEnergyNeededForMove + +▸ **getEnergyNeededForMove**(`fromId`, `toId`, `arrivingEnergy`): `number` + +Gets the amount of energy needed in order for a voyage from the given to the given +planet to arrive with your desired amount of energy. + +#### Parameters + +| Name | Type | +| :--------------- | :----------- | +| `fromId` | `LocationId` | +| `toId` | `LocationId` | +| `arrivingEnergy` | `number` | + +#### Returns + +`number` + +--- + +### getEnergyOfPlayer + +▸ **getEnergyOfPlayer**(`player`): `number` + +Gets the total amount of energy that lives on planets that the given player owns. + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `player` | `EthAddress` | + +#### Returns + +`number` + +--- + +### getEthConnection + +▸ **getEthConnection**(): [`default`](Backend_Network_EthConnection.default.md) + +#### Returns + +[`default`](Backend_Network_EthConnection.default.md) + +--- + +### getExploredChunks + +▸ **getExploredChunks**(): `Iterable`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> + +Gets all the map chunks that this client is aware of. Chunks may have come from +mining, or from importing map data. + +#### Returns + +`Iterable`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> + +--- + +### getGameObjects + +▸ **getGameObjects**(): [`GameObjects`](Backend_GameLogic_GameObjects.GameObjects.md) + +Gets a reference to the game's internal representation of the world state. This includes +voyages, planets, artifacts, and active wormholes, + +#### Returns + +[`GameObjects`](Backend_GameLogic_GameObjects.GameObjects.md) + +--- + +### getGptCreditBalanceEmitter + +▸ **getGptCreditBalanceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +--- + +### getGptCreditPriceEmitter + +▸ **getGptCreditPriceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +--- + +### getHashConfig + +▸ **getHashConfig**(): [`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) + +Gets the HASH CONFIG + +#### Returns + +[`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) + +--- + +### getHashesPerSec + +▸ **getHashesPerSec**(): `number` + +Gets the amount of hashes per second that the miner manager is calculating. + +#### Returns + +`number` + +--- + +### getHomeCoords + +▸ **getHomeCoords**(): `undefined` \| `WorldCoords` + +Gets the location of your home planet. + +#### Returns + +`undefined` \| `WorldCoords` + +--- + +### getHomeHash + +▸ **getHomeHash**(): `undefined` \| `LocationId` + +Gets the hash of the location of your home planet. + +#### Returns + +`undefined` \| `LocationId` + +--- + +### getIsBuyingCreditsEmitter + +▸ **getIsBuyingCreditsEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> + +--- + +### getLocationOfPlanet + +▸ **getLocationOfPlanet**(`planetId`): `undefined` \| `WorldLocation` + +Gets the location of the given planet. Returns undefined if the planet does not exist, or if +we do not know the location of this planet NOT update the planet if the planet is stale, +which means this function is fast. + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`undefined` \| `WorldLocation` + +--- + +### getMaxMoveDist + +▸ **getMaxMoveDist**(`planetId`, `sendingPercent`): `number` + +Gets the maximuim distance that you can send your energy from the given planet, +using the given percentage of that planet's current silver. + +#### Parameters + +| Name | Type | +| :--------------- | :----------- | +| `planetId` | `LocationId` | +| `sendingPercent` | `number` | + +#### Returns + +`number` + +--- + +### getMiningPattern + +▸ **getMiningPattern**(): `undefined` \| [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) + +Gets the mining pattern that the miner is currently using. + +#### Returns + +`undefined` \| [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) + +--- + +### getMyArtifactMap + +▸ **getMyArtifactMap**(): `Map`<`ArtifactId`, `Artifact`\> + +Return a reference to the map of my artifacts + +#### Returns + +`Map`<`ArtifactId`, `Artifact`\> + +--- + +### getMyArtifacts + +▸ **getMyArtifacts**(): `Artifact`[] + +gets both deposited artifacts that are on planets i own as well as artifacts i own + +#### Returns + +`Artifact`[] + +--- + +### getMyArtifactsUpdated$ + +▸ **getMyArtifactsUpdated$**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`ArtifactId`, `Artifact`\>\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`ArtifactId`, `Artifact`\>\> + +--- + +### getMyBalance + +▸ **getMyBalance**(): `number` + +Gets the balance of the account + +#### Returns + +`number` + +--- + +### getMyBalanceEmitter + +▸ **getMyBalanceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +--- + +### getMyPlanetMap + +▸ **getMyPlanetMap**(): `Map`<`LocationId`, `Planet`\> + +Return a reference to the map of my planets + +#### Returns + +`Map`<`LocationId`, `Planet`\> + +--- + +### getMyPlanets + +▸ **getMyPlanets**(): `Planet`[] + +Gets a list of the planets that the player logged into this `GameManager` owns. + +#### Returns + +`Planet`[] + +--- + +### getMyPlanetsUpdated$ + +▸ **getMyPlanetsUpdated$**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`LocationId`, `Planet`\>\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`LocationId`, `Planet`\>\> + +--- + +### getMyScore + +▸ **getMyScore**(): `number` + +Get the score of the currently logged-in account. + +#### Returns + +`number` + +--- + +### getNextBroadcastAvailableTimestamp + +▸ **getNextBroadcastAvailableTimestamp**(): `number` + +Gets the timestamp (ms) of the next time that we can broadcast the coordinates of a planet. + +#### Returns + +`number` + +--- + +### getNextRevealCountdownInfo + +▸ **getNextRevealCountdownInfo**(): [`RevealCountdownInfo`](../interfaces/_types_global_GlobalTypes.RevealCountdownInfo.md) + +Returns info about the next time you can broadcast coordinates + +#### Returns + +[`RevealCountdownInfo`](../interfaces/_types_global_GlobalTypes.RevealCountdownInfo.md) + +--- + +### getNotificationsManager + +▸ **getNotificationsManager**(): [`default`](Frontend_Game_NotificationManager.default.md) + +#### Returns + +[`default`](Frontend_Game_NotificationManager.default.md) + +--- + +### getPerlinThresholds + +▸ **getPerlinThresholds**(): [`number`, `number`, `number`] + +The perlin value at each coordinate determines the space type. There are four space +types, which means there are four ranges on the number line that correspond to +each space type. This function returns the boundary values between each of these +four ranges: `PERLIN_THRESHOLD_1`, `PERLIN_THRESHOLD_2`, `PERLIN_THRESHOLD_3`. + +#### Returns + +[`number`, `number`, `number`] + +--- + +### getPlanetLevel + +▸ **getPlanetLevel**(`planetId`): `undefined` \| `PlanetLevel` + +Gets the level of the given planet. Returns undefined if the planet does not exist. Does +NOT update the planet if the planet is stale, which means this function is fast. + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`undefined` \| `PlanetLevel` + +--- + +### getPlanetMap + +▸ **getPlanetMap**(): `Map`<`LocationId`, `Planet`\> + +Return a reference to the planet map + +#### Returns + +`Map`<`LocationId`, `Planet`\> + +--- + +### getPlanetRarity + +▸ **getPlanetRarity**(): `number` + +Gets the rarity of planets in the universe + +#### Returns + +`number` + +--- + +### getPlanetUpdated$ + +▸ **getPlanetUpdated$**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`LocationId`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`LocationId`\> + +--- + +### getPlanetWithCoords + +▸ **getPlanetWithCoords**(`coords`): `undefined` \| `Planet` + +Gets the planet that is located at the given coordinates. Returns undefined if not a valid +location or if no planet exists at location. If the planet needs to be updated (because +some time has passed since we last updated the planet), then updates that planet first. + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`undefined` \| `Planet` + +--- + +### getPlanetWithId + +▸ **getPlanetWithId**(`planetId`): `undefined` \| `Planet` + +Gets the planet with the given hash. Returns undefined if the planet is neither in the contract +nor has been discovered locally. If the planet needs to be updated (because some time has +passed since we last updated the planet), then updates that planet first. + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------- | +| `planetId` | `undefined` \| `LocationId` | + +#### Returns + +`undefined` \| `Planet` + +--- + +### getPlanetsInRange + +▸ **getPlanetsInRange**(`planetId`, `sendingPercent`): `Planet`[] + +Gets all the planets that you can reach with at least 1 energy from +the given planet. + +#### Parameters + +| Name | Type | +| :--------------- | :----------- | +| `planetId` | `LocationId` | +| `sendingPercent` | `number` | + +#### Returns + +`Planet`[] + +--- + +### getPlanetsInWorldRectangle + +▸ **getPlanetsInWorldRectangle**(`worldX`, `worldY`, `worldWidth`, `worldHeight`, `levels`, `planetLevelToRadii`, `updateIfStale?`): `LocatablePlanet`[] + +Gets the ids of all the planets that are both within the given bounding box (defined by its bottom +left coordinate, width, and height) in the world and of a level that was passed in via the +`planetLevels` parameter. + +#### Parameters + +| Name | Type | Default value | +| :------------------- | :------------------------------------------------------------------------------------- | :------------ | +| `worldX` | `number` | `undefined` | +| `worldY` | `number` | `undefined` | +| `worldWidth` | `number` | `undefined` | +| `worldHeight` | `number` | `undefined` | +| `levels` | `number`[] | `undefined` | +| `planetLevelToRadii` | `Map`<`number`, [`Radii`](../interfaces/Backend_GameLogic_ViewportEntities.Radii.md)\> | `undefined` | +| `updateIfStale` | `boolean` | `true` | + +#### Returns + +`LocatablePlanet`[] + +--- + +### getPlanetsWithIds + +▸ **getPlanetsWithIds**(`planetId`): `Planet`[] + +Gets a list of planets in the client's memory with the given ids. If a planet with the given id +doesn't exist, no entry for that planet will be returned in the result. + +#### Parameters + +| Name | Type | +| :--------- | :------------- | +| `planetId` | `LocationId`[] | + +#### Returns + +`Planet`[] + +--- + +### getPrivateKey + +▸ **getPrivateKey**(): `string` + +Gets the private key of the burner wallet used by this account. + +#### Returns + +`string` + +--- + +### getProcgenUtils + +▸ **getProcgenUtils**(): typeof [`ProcgenUtils`](Backend_Procedural_ProcgenUtils.ProcgenUtils.md) + +Helpful functions for getting the names, descriptions, and colors of in-game entities. + +#### Returns + +typeof [`ProcgenUtils`](Backend_Procedural_ProcgenUtils.ProcgenUtils.md) + +--- + +### getRandomHomePlanetCoords + +▸ `Private` **getRandomHomePlanetCoords**(): `Promise`<`WorldLocation`\> + +#### Returns + +`Promise`<`WorldLocation`\> + +--- + +### getRevealedLocations + +▸ **getRevealedLocations**(): `Map`<`LocationId`, `RevealedLocation`\> + +Gets a map of all location IDs whose coords have been publicly revealed + +#### Returns + +`Map`<`LocationId`, `RevealedLocation`\> + +--- + +### getSignedTwitter + +▸ **getSignedTwitter**(`twitter`): `Promise`<`string`\> + +Signs the given twitter handle with the private key of the current user. Used to +verify that the person who owns the Dark Forest account was the one that attempted +to link a twitter to their account. + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `twitter` | `string` | + +#### Returns + +`Promise`<`string`\> + +--- + +### getSilverCurveAtPercent + +▸ **getSilverCurveAtPercent**(`planet`, `percent`): `undefined` \| `number` + +returns timestamp (seconds) that planet will reach percent% of silcap if +doesn't produce silver, returns undefined if already over percent% of silcap, + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `planet` | `Planet` | +| `percent` | `number` | + +#### Returns + +`undefined` \| `number` + +--- + +### getSilverOfPlayer + +▸ **getSilverOfPlayer**(`player`): `number` + +Gets the total amount of silver that lives on planets that the given player owns. + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `player` | `EthAddress` | + +#### Returns + +`number` + +--- + +### getStalePlanetWithId + +▸ **getStalePlanetWithId**(`planetId`): `undefined` \| `Planet` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`undefined` \| `Planet` + +--- + +### getTemperature + +▸ **getTemperature**(`coords`): `number` + +Gets the temperature of a given location. + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`number` + +--- + +### getTimeForMove + +▸ **getTimeForMove**(`fromId`, `toId`): `number` + +Gets the amount of time, in seconds that a voyage between from the first to the +second planet would take. + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `fromId` | `LocationId` | +| `toId` | `LocationId` | + +#### Returns + +`number` + +--- + +### getTokenMintEndTimeSeconds + +▸ **getTokenMintEndTimeSeconds**(): `number` + +Dark Forest tokens can only be minted up to a certain time - get this time measured in seconds from epoch. + +#### Returns + +`number` + +--- + +### getTwitter + +▸ **getTwitter**(`address`): `undefined` \| `string` + +Gets the twitter handle of the given ethereum account which is associated +with Dark Forest. + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------- | +| `address` | `undefined` \| `EthAddress` | + +#### Returns + +`undefined` \| `string` + +--- + +### getUIEventEmitter + +▸ **getUIEventEmitter**(): [`default`](Frontend_Utils_UIEmitter.default.md) + +Helpful for listening to user input events. + +#### Returns + +[`default`](Frontend_Utils_UIEmitter.default.md) + +--- + +### getUnconfirmedMoves + +▸ **getUnconfirmedMoves**(): `UnconfirmedMove`[] + +Gets all moves that this client has queued to be uploaded to the contract, but +have not been successfully confirmed yet. + +#### Returns + +`UnconfirmedMove`[] + +--- + +### getUnconfirmedUpgrades + +▸ **getUnconfirmedUpgrades**(): `UnconfirmedUpgrade`[] + +Gets all upgrades that this client has queued to be uploaded to the contract, but +have not been successfully confirmed yet. + +#### Returns + +`UnconfirmedUpgrade`[] + +--- + +### getUnconfirmedWormholeActivations + +▸ **getUnconfirmedWormholeActivations**(): `UnconfirmedActivateArtifact`[] + +#### Returns + +`UnconfirmedActivateArtifact`[] + +--- + +### getUniverseTotalEnergy + +▸ **getUniverseTotalEnergy**(): `number` + +Gets the total amount of energy that lives on a planet that somebody owns. + +#### Returns + +`number` + +--- + +### getUpgrade + +▸ **getUpgrade**(`branch`, `level`): `Upgrade` + +Returns the upgrade that would be applied to a planet given a particular +upgrade branch (defense, range, speed) and level of upgrade. + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `branch` | `number` | +| `level` | `number` | + +#### Returns + +`Upgrade` + +--- + +### getWithdrawnSilverOfPlayer + +▸ **getWithdrawnSilverOfPlayer**(`addr`): `number` + +#### Parameters + +| Name | Type | +| :----- | :----------- | +| `addr` | `EthAddress` | + +#### Returns + +`number` + +--- + +### getWorldRadius + +▸ **getWorldRadius**(): `number` + +Gets the radius of the playable area of the universe. + +#### Returns + +`number` + +--- + +### getWorldSilver + +▸ **getWorldSilver**(): `number` + +Gets the total amount of silver that lives on a planet that somebody owns. + +#### Returns + +`number` + +--- + +### getWormholeFactors + +▸ **getWormholeFactors**(`fromPlanet`, `toPlanet`): `undefined` \| { `distanceFactor`: `number` ; `speedFactor`: `number` } + +If there's an active artifact on either of these planets which happens to be a wormhole which +is active and targetting the other planet, return the wormhole boost which is greater. Values +represent a multiplier. + +#### Parameters + +| Name | Type | +| :----------- | :------- | +| `fromPlanet` | `Planet` | +| `toPlanet` | `Planet` | + +#### Returns + +`undefined` \| { `distanceFactor`: `number` ; `speedFactor`: `number` } + +--- + +### getWormholes + +▸ **getWormholes**(): `Iterable`<[`Wormhole`](../modules/_types_global_GlobalTypes.md#wormhole)\> + +#### Returns + +`Iterable`<[`Wormhole`](../modules/_types_global_GlobalTypes.md#wormhole)\> + +--- + +### handleTxIntent + +▸ `Private` **handleTxIntent**(`txIntent`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +`void` + +--- + +### hardRefreshArtifact + +▸ `Private` **hardRefreshArtifact**(`artifactId`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`Promise`<`void`\> + +--- + +### hardRefreshPlanet + +▸ `Private` **hardRefreshPlanet**(`planetId`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`Promise`<`void`\> + +--- + +### hardRefreshPlayer + +▸ `Private` **hardRefreshPlayer**(`address`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :-------- | :----------- | +| `address` | `EthAddress` | + +#### Returns + +`Promise`<`void`\> + +--- + +### hasJoinedGame + +▸ **hasJoinedGame**(): `boolean` + +Whether or not this client has successfully found and landed on a home planet. + +#### Returns + +`boolean` + +--- + +### hasMinedChunk + +▸ **hasMinedChunk**(`chunkLocation`): `boolean` + +Whether or not the given rectangle has been mined. + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------------------ | +| `chunkLocation` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +`boolean` + +--- + +### initMiningManager + +▸ `Private` **initMiningManager**(`homeCoords`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :------------ | +| `homeCoords` | `WorldCoords` | + +#### Returns + +`void` + +--- + +### isMining + +▸ **isMining**(): `boolean` + +Whether or not the miner is currently exploring space. + +#### Returns + +`boolean` + +--- + +### isPlanetMineable + +▸ **isPlanetMineable**(`p`): `boolean` + +Whether or not the given planet is capable of minting an artifact. + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `p` | `Planet` | + +#### Returns + +`boolean` + +--- + +### isRoundOver + +▸ **isRoundOver**(): `boolean` + +Returns whether or not the current round has ended. + +#### Returns + +`boolean` + +--- + +### joinGame + +▸ **joinGame**(`beforeRetry`): [`default`](Backend_GameLogic_GameManager.default.md) + +Attempts to join the game. Should not be called once you've already joined. + +#### Parameters + +| Name | Type | +| :------------ | :-------------------------------------- | +| `beforeRetry` | (`e`: `Error`) => `Promise`<`boolean`\> | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### loadContract + +▸ **loadContract**(`contractAddress`, `contractABI`): `Promise`<`Contract`\> + +Returns an instance of a `Contract` from the ethersjs library. This is the library we use to +connect to the blockchain. For documentation about how `Contract` works, see: +https://docs.ethers.io/v5/api/contract/contract/ + +#### Parameters + +| Name | Type | +| :---------------- | :------------------ | +| `contractAddress` | `string` | +| `contractABI` | `ContractInterface` | + +#### Returns + +`Promise`<`Contract`\> + +--- + +### loadPlugins + +▸ **loadPlugins**(): `Promise`<[`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[]\> + +Load the serialized versions of all the plugins that this player has. + +#### Returns + +`Promise`<[`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[]\> + +--- + +### locationFromCoords + +▸ `Private` **locationFromCoords**(`coords`): `WorldLocation` + +computes the WorldLocation object corresponding to a set of coordinates +very slow since it actually calculates the hash; do not use in render loop + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`WorldLocation` + +--- + +### move + +▸ **move**(`from`, `to`, `forces`, `silver`, `artifactMoved?`, `bypassChecks?`): [`default`](Backend_GameLogic_GameManager.default.md) + +Submits a transaction to the blockchain to move the given amount of resources from +the given planet to the given planet. + +#### Parameters + +| Name | Type | Default value | +| :--------------- | :----------- | :------------ | +| `from` | `LocationId` | `undefined` | +| `to` | `LocationId` | `undefined` | +| `forces` | `number` | `undefined` | +| `silver` | `number` | `undefined` | +| `artifactMoved?` | `ArtifactId` | `undefined` | +| `bypassChecks` | `boolean` | `false` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### onTxConfirmed + +▸ `Private` **onTxConfirmed**(`unminedTx`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :------------ | +| `unminedTx` | `SubmittedTx` | + +#### Returns + +`void` + +--- + +### onTxIntentFail + +▸ `Private` **onTxIntentFail**(`txIntent`, `e`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | +| `e` | `Error` | + +#### Returns + +`void` + +--- + +### onTxReverted + +▸ `Private` **onTxReverted**(`unminedTx`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :------------ | +| `unminedTx` | `SubmittedTx` | + +#### Returns + +`void` + +--- + +### onTxSubmit + +▸ `Private` **onTxSubmit**(`unminedTx`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :------------ | +| `unminedTx` | `SubmittedTx` | + +#### Returns + +`void` + +--- + +### prospectPlanet + +▸ **prospectPlanet**(`planetId`, `bypassChecks?`): `Promise`<`undefined` \| [`default`](Backend_GameLogic_GameManager.default.md)\> + +#### Parameters + +| Name | Type | Default value | +| :------------- | :----------- | :------------ | +| `planetId` | `LocationId` | `undefined` | +| `bypassChecks` | `boolean` | `false` | + +#### Returns + +`Promise`<`undefined` \| [`default`](Backend_GameLogic_GameManager.default.md)\> + +--- + +### refreshMyGPTCredits + +▸ `Private` **refreshMyGPTCredits**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +--- + +### refreshServerPlanetStates + +▸ **refreshServerPlanetStates**(`planetIds`): `Promise`<`void`\> + +We have two locations which planet state can live: on the server, and on the blockchain. We use +the blockchain for the 'physics' of the universe, and the webserver for optional 'add-on' +features, which are cryptographically secure, but live off-chain. + +This function loads the planet states which live on the server. Plays nicely with our +notifications system and sets the appropriate loading state values on the planet. + +#### Parameters + +| Name | Type | +| :---------- | :------------- | +| `planetIds` | `LocationId`[] | + +#### Returns + +`Promise`<`void`\> + +--- + +### refreshTwitters + +▸ `Private` **refreshTwitters**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +--- + +### revealLocation + +▸ **revealLocation**(`planetId`): [`default`](Backend_GameLogic_GameManager.default.md) + +Reveals a planet's location on-chain. + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### savePlugins + +▸ **savePlugins**(`savedPlugins`): `Promise`<`void`\> + +Overwrites all the saved plugins to equal the given array of plugins. + +#### Parameters + +| Name | Type | +| :------------- | :----------------------------------------------------------------------------------------- | +| `savedPlugins` | [`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[] | + +#### Returns + +`Promise`<`void`\> + +--- + +### setMinerCores + +▸ **setMinerCores**(`nCores`): `void` + +Set the amount of cores to mine the universe with. More cores equals faster! + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `nCores` | `number` | + +#### Returns + +`void` + +--- + +### setMiningPattern + +▸ **setMiningPattern**(`pattern`): `void` + +Sets the mining pattern of the miner. This kills the old miner and starts this one. + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------- | +| `pattern` | [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) | + +#### Returns + +`void` + +--- + +### setPlanetEmoji + +▸ **setPlanetEmoji**(`locationId`, `emojiStr`): `Promise`<`void`\> + +If you are the owner of this planet, you can set an 'emoji' to hover above the planet. +`emojiStr` must be a string that contains a single emoji, otherwise this function will throw an +error. + +The emoji is stored off-chain in a postgres database. We verify planet ownership via a contract +call from the webserver, and by verifying that the request to add (or remove) an emoji from a +planet was signed by the owner. + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `locationId` | `LocationId` | +| `emojiStr` | `string` | + +#### Returns + +`Promise`<`void`\> + +--- + +### setRadius + +▸ `Private` **setRadius**(`worldRadius`): `void` + +#### Parameters + +| Name | Type | +| :------------ | :------- | +| `worldRadius` | `number` | + +#### Returns + +`void` + +--- + +### setSnarkCacheSize + +▸ **setSnarkCacheSize**(`size`): `void` + +Changes the amount of move snark proofs that are cached. + +#### Parameters + +| Name | Type | +| :----- | :------- | +| `size` | `number` | + +#### Returns + +`void` + +--- + +### signMessage + +▸ `Private` **signMessage**<`T`\>(`obj`): `Promise`<`SignedMessage`<`T`\>\> + +Returns a signed version of this message. + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | +| :---- | :--- | +| `obj` | `T` | + +#### Returns + +`Promise`<`SignedMessage`<`T`\>\> + +--- + +### softRefreshPlanet + +▸ `Private` **softRefreshPlanet**(`planetId`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`Promise`<`void`\> + +--- + +### spaceTypeFromPerlin + +▸ **spaceTypeFromPerlin**(`perlin`): `SpaceType` + +Each coordinate lives in a particular type of space, determined by a smooth random +function called 'perlin noise. + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `perlin` | `number` | + +#### Returns + +`SpaceType` + +--- + +### spaceTypePerlin + +▸ **spaceTypePerlin**(`coords`, `floor`): `number` + +Gets the perlin value at the given location in the world. SpaceType is based +on this value. + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | +| `floor` | `boolean` | + +#### Returns + +`number` + +--- + +### startConversation + +▸ **startConversation**(`artifactId`): `Promise`<`Conversation`\> + +Starts a GPT conversation with an artifact + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`Promise`<`Conversation`\> + +--- + +### startExplore + +▸ **startExplore**(): `void` + +Starts the miner. + +#### Returns + +`void` + +--- + +### stepConversation + +▸ **stepConversation**(`artifactId`, `message`): `Promise`<`Conversation`\> + +Sends a message to an artifact you are having a GPT conversation with + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | +| `message` | `string` | + +#### Returns + +`Promise`<`Conversation`\> + +--- + +### stopExplore + +▸ **stopExplore**(): `void` + +Stops the miner. + +#### Returns + +`void` + +--- + +### submitPlanetMessage + +▸ `Private` **submitPlanetMessage**(`locationId`, `type`, `body`): `Promise`<`void`\> + +The planet emoji feature is built on top of a more general 'Planet Message' system, which +allows players to upload pieces of data called 'Message's to planets that they own. Emojis are +just one type of message. Their implementation leaves the door open to more off-chain data. + +#### Parameters + +| Name | Type | +| :----------- | :------------------ | +| `locationId` | `LocationId` | +| `type` | `PlanetMessageType` | +| `body` | `unknown` | + +#### Returns + +`Promise`<`void`\> + +--- + +### transferOwnership + +▸ **transferOwnership**(`planetId`, `newOwner`, `bypassChecks?`): [`default`](Backend_GameLogic_GameManager.default.md) + +#### Parameters + +| Name | Type | Default value | +| :------------- | :----------- | :------------ | +| `planetId` | `LocationId` | `undefined` | +| `newOwner` | `EthAddress` | `undefined` | +| `bypassChecks` | `boolean` | `false` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### updateDiagnostics + +▸ **updateDiagnostics**(`updateFn`): `void` + +Updates the diagnostic info of the game using the supplied function. Ideally, each spot in the +codebase that would like to record a metric is able to update its specific metric in a +convenient manner. + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------------------------------------------------------------------------- | +| `updateFn` | (`d`: [`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md)) => `void` | + +#### Returns + +`void` + +--- + +### upgrade + +▸ **upgrade**(`planetId`, `branch`, `_bypassChecks?`): [`default`](Backend_GameLogic_GameManager.default.md) + +Submits a transaction to the blockchain to upgrade the given planet with the given +upgrade branch. You must own the planet, and have enough silver on it to complete +the upgrade. + +#### Parameters + +| Name | Type | Default value | +| :-------------- | :----------- | :------------ | +| `planetId` | `LocationId` | `undefined` | +| `branch` | `number` | `undefined` | +| `_bypassChecks` | `boolean` | `false` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### verifyMessage + +▸ `Private` **verifyMessage**(`message`): `Promise`<`boolean`\> + +Checks that a message signed by {@link GameManager#signMessage} was signed by the address that +it claims it was signed by. + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------- | +| `message` | `SignedMessage`<`unknown`\> | + +#### Returns + +`Promise`<`boolean`\> + +--- + +### verifyTwitter + +▸ **verifyTwitter**(`twitter`): `Promise`<`boolean`\> + +Once you have posted the verificatoin tweet - complete the twitter-account-linking +process by telling the Dark Forest webserver to look at that tweet. + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `twitter` | `string` | + +#### Returns + +`Promise`<`boolean`\> + +--- + +### waitForPlanet + +▸ **waitForPlanet**<`T`\>(`locationId`, `predicate`): `Promise`<`T`\> + +Listen for changes to a planet take action, +eg. +waitForPlanet("yourAsteroidId", ({current}) => current.silverCap / current.silver > 90) +.then(() => { +// Send Silver to nearby planet +}) + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------------------------------- | +| `locationId` | `LocationId` | A locationId to watch for updates | +| `predicate` | (`__namedParameters`: [`Diff`](../interfaces/Frontend_Utils_EmitterUtils.Diff.md)<`Planet`\>) => `undefined` \| `T` | a function that accepts a Diff and should return a truth-y value, value will be passed to promise.resolve() | + +#### Returns + +`Promise`<`T`\> + +a promise that will resolve with results returned from the predicate function + +--- + +### withdrawArtifact + +▸ **withdrawArtifact**(`locationId`, `artifactId`, `bypassChecks?`): [`default`](Backend_GameLogic_GameManager.default.md) + +Withdraws the artifact that is locked up on the given planet. + +#### Parameters + +| Name | Type | Default value | +| :------------- | :----------- | :------------ | +| `locationId` | `LocationId` | `undefined` | +| `artifactId` | `ArtifactId` | `undefined` | +| `bypassChecks` | `boolean` | `true` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### withdrawSilver + +▸ **withdrawSilver**(`locationId`, `amount`, `bypassChecks?`): `undefined` \| [`default`](Backend_GameLogic_GameManager.default.md) + +#### Parameters + +| Name | Type | Default value | +| :------------- | :----------- | :------------ | +| `locationId` | `LocationId` | `undefined` | +| `amount` | `number` | `undefined` | +| `bypassChecks` | `boolean` | `false` | + +#### Returns + +`undefined` \| [`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### create + +▸ `Static` **create**(`ethConnection`, `terminal`): `Promise`<[`default`](Backend_GameLogic_GameManager.default.md)\> + +#### Parameters + +| Name | Type | +| :-------------- | :-------------------------------------------------------------------------------------------------------------- | +| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | +| `terminal` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | + +#### Returns + +`Promise`<[`default`](Backend_GameLogic_GameManager.default.md)\> diff --git a/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md b/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md new file mode 100644 index 00000000..fd0cd0c5 --- /dev/null +++ b/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md @@ -0,0 +1,1246 @@ +# Class: GameObjects + +[Backend/GameLogic/GameObjects](../modules/Backend_GameLogic_GameObjects.md).GameObjects + +Representation of the objects which exist in the world. + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_GameObjects.GameObjects.md#constructor) + +### Properties + +- [address](Backend_GameLogic_GameObjects.GameObjects.md#address) +- [arrivals](Backend_GameLogic_GameObjects.GameObjects.md#arrivals) +- [artifactUpdated$](Backend_GameLogic_GameObjects.GameObjects.md#artifactupdated$) +- [artifacts](Backend_GameLogic_GameObjects.GameObjects.md#artifacts) +- [contractConstants](Backend_GameLogic_GameObjects.GameObjects.md#contractconstants) +- [coordsToLocation](Backend_GameLogic_GameObjects.GameObjects.md#coordstolocation) +- [isBuyingCredits$](Backend_GameLogic_GameObjects.GameObjects.md#isbuyingcredits$) +- [layeredMap](Backend_GameLogic_GameObjects.GameObjects.md#layeredmap) +- [myArtifacts](Backend_GameLogic_GameObjects.GameObjects.md#myartifacts) +- [myArtifactsUpdated$](Backend_GameLogic_GameObjects.GameObjects.md#myartifactsupdated$) +- [myPlanets](Backend_GameLogic_GameObjects.GameObjects.md#myplanets) +- [myPlanetsUpdated$](Backend_GameLogic_GameObjects.GameObjects.md#myplanetsupdated$) +- [planetArrivalIds](Backend_GameLogic_GameObjects.GameObjects.md#planetarrivalids) +- [planetLocationMap](Backend_GameLogic_GameObjects.GameObjects.md#planetlocationmap) +- [planetUpdated$](Backend_GameLogic_GameObjects.GameObjects.md#planetupdated$) +- [planets](Backend_GameLogic_GameObjects.GameObjects.md#planets) +- [revealedLocations](Backend_GameLogic_GameObjects.GameObjects.md#revealedlocations) +- [touchedPlanetIds](Backend_GameLogic_GameObjects.GameObjects.md#touchedplanetids) +- [unconfirmedBuyGPTCredits](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedbuygptcredits) +- [unconfirmedBuyHats](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedbuyhats) +- [unconfirmedMoves](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedmoves) +- [unconfirmedPlanetTransfers](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedplanettransfers) +- [unconfirmedReveal](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedreveal) +- [unconfirmedUpgrades](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedupgrades) +- [unconfirmedWormholeActivations](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedwormholeactivations) +- [wormholes](Backend_GameLogic_GameObjects.GameObjects.md#wormholes) + +### Methods + +- [addPlanetLocation](Backend_GameLogic_GameObjects.GameObjects.md#addplanetlocation) +- [calculateSilverSpent](Backend_GameLogic_GameObjects.GameObjects.md#calculatesilverspent) +- [clearOldArrivals](Backend_GameLogic_GameObjects.GameObjects.md#clearoldarrivals) +- [clearUnconfirmedTxIntent](Backend_GameLogic_GameObjects.GameObjects.md#clearunconfirmedtxintent) +- [defaultPlanetFromLocation](Backend_GameLogic_GameObjects.GameObjects.md#defaultplanetfromlocation) +- [emitArrivalNotifications](Backend_GameLogic_GameObjects.GameObjects.md#emitarrivalnotifications) +- [getAllOwnedPlanets](Backend_GameLogic_GameObjects.GameObjects.md#getallownedplanets) +- [getAllPlanets](Backend_GameLogic_GameObjects.GameObjects.md#getallplanets) +- [getAllPlanetsMap](Backend_GameLogic_GameObjects.GameObjects.md#getallplanetsmap) +- [getAllVoyages](Backend_GameLogic_GameObjects.GameObjects.md#getallvoyages) +- [getArtifactById](Backend_GameLogic_GameObjects.GameObjects.md#getartifactbyid) +- [getArtifactController](Backend_GameLogic_GameObjects.GameObjects.md#getartifactcontroller) +- [getArtifactMap](Backend_GameLogic_GameObjects.GameObjects.md#getartifactmap) +- [getArtifactsOnPlanetsOwnedBy](Backend_GameLogic_GameObjects.GameObjects.md#getartifactsonplanetsownedby) +- [getArtifactsOwnedBy](Backend_GameLogic_GameObjects.GameObjects.md#getartifactsownedby) +- [getBiome](Backend_GameLogic_GameObjects.GameObjects.md#getbiome) +- [getEnergyCurveAtPercent](Backend_GameLogic_GameObjects.GameObjects.md#getenergycurveatpercent) +- [getIsBuyingCreditsEmitter](Backend_GameLogic_GameObjects.GameObjects.md#getisbuyingcreditsemitter) +- [getLocationOfPlanet](Backend_GameLogic_GameObjects.GameObjects.md#getlocationofplanet) +- [getMyArtifactMap](Backend_GameLogic_GameObjects.GameObjects.md#getmyartifactmap) +- [getMyPlanetMap](Backend_GameLogic_GameObjects.GameObjects.md#getmyplanetmap) +- [getPlanetArtifacts](Backend_GameLogic_GameObjects.GameObjects.md#getplanetartifacts) +- [getPlanetDetailLevel](Backend_GameLogic_GameObjects.GameObjects.md#getplanetdetaillevel) +- [getPlanetLevel](Backend_GameLogic_GameObjects.GameObjects.md#getplanetlevel) +- [getPlanetMap](Backend_GameLogic_GameObjects.GameObjects.md#getplanetmap) +- [getPlanetWithCoords](Backend_GameLogic_GameObjects.GameObjects.md#getplanetwithcoords) +- [getPlanetWithId](Backend_GameLogic_GameObjects.GameObjects.md#getplanetwithid) +- [getPlanetWithLocation](Backend_GameLogic_GameObjects.GameObjects.md#getplanetwithlocation) +- [getPlanetsInWorldRectangle](Backend_GameLogic_GameObjects.GameObjects.md#getplanetsinworldrectangle) +- [getRevealedLocations](Backend_GameLogic_GameObjects.GameObjects.md#getrevealedlocations) +- [getSilverCurveAtPercent](Backend_GameLogic_GameObjects.GameObjects.md#getsilvercurveatpercent) +- [getUnconfirmedBuyGPTCredits](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedbuygptcredits) +- [getUnconfirmedMoves](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedmoves) +- [getUnconfirmedReveal](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedreveal) +- [getUnconfirmedUpgrades](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedupgrades) +- [getUnconfirmedWormholeActivations](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedwormholeactivations) +- [getWormholes](Backend_GameLogic_GameObjects.GameObjects.md#getwormholes) +- [isPlanetInContract](Backend_GameLogic_GameObjects.GameObjects.md#isplanetincontract) +- [markLocationRevealed](Backend_GameLogic_GameObjects.GameObjects.md#marklocationrevealed) +- [onTxIntent](Backend_GameLogic_GameObjects.GameObjects.md#ontxintent) +- [planetLevelFromHexPerlin](Backend_GameLogic_GameObjects.GameObjects.md#planetlevelfromhexperlin) +- [planetTypeFromHexPerlin](Backend_GameLogic_GameObjects.GameObjects.md#planettypefromhexperlin) +- [processArrivalsForPlanet](Backend_GameLogic_GameObjects.GameObjects.md#processarrivalsforplanet) +- [replaceArtifactFromContractData](Backend_GameLogic_GameObjects.GameObjects.md#replaceartifactfromcontractdata) +- [replaceArtifactsFromContractData](Backend_GameLogic_GameObjects.GameObjects.md#replaceartifactsfromcontractdata) +- [replacePlanetFromContractData](Backend_GameLogic_GameObjects.GameObjects.md#replaceplanetfromcontractdata) +- [setArtifact](Backend_GameLogic_GameObjects.GameObjects.md#setartifact) +- [setPlanet](Backend_GameLogic_GameObjects.GameObjects.md#setplanet) +- [spaceTypeFromPerlin](Backend_GameLogic_GameObjects.GameObjects.md#spacetypefromperlin) +- [updatePlanet](Backend_GameLogic_GameObjects.GameObjects.md#updateplanet) +- [updatePlanetIfStale](Backend_GameLogic_GameObjects.GameObjects.md#updateplanetifstale) +- [updateScore](Backend_GameLogic_GameObjects.GameObjects.md#updatescore) +- [getSilverNeeded](Backend_GameLogic_GameObjects.GameObjects.md#getsilverneeded) +- [planetCanUpgrade](Backend_GameLogic_GameObjects.GameObjects.md#planetcanupgrade) + +## Constructors + +### constructor + +• **new GameObjects**(`address`, `touchedPlanets`, `allTouchedPlanetIds`, `revealedLocations`, `artifacts`, `allChunks`, `unprocessedArrivals`, `unprocessedPlanetArrivalIds`, `contractConstants`, `worldRadius`) + +#### Parameters + +| Name | Type | +| :---------------------------- | :------------------------------------------------------------------------------------------------ | +| `address` | `undefined` \| `EthAddress` | +| `touchedPlanets` | `Map`<`LocationId`, `Planet`\> | +| `allTouchedPlanetIds` | `Set`<`LocationId`\> | +| `revealedLocations` | `Map`<`LocationId`, `RevealedLocation`\> | +| `artifacts` | `Map`<`ArtifactId`, `Artifact`\> | +| `allChunks` | `Iterable`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> | +| `unprocessedArrivals` | `Map`<`VoyageId`, `QueuedArrival`\> | +| `unprocessedPlanetArrivalIds` | `Map`<`LocationId`, `VoyageId`[]\> | +| `contractConstants` | [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) | +| `worldRadius` | `number` | + +## Properties + +### address + +• `Private` `Readonly` **address**: `undefined` \| `EthAddress` + +This address of the player that is currently logged in. + +**`todo`** move this, along with all other objects relating to the currently logged-on player into a +new field: {@code player: PlayerInfo} + +--- + +### arrivals + +• `Private` `Readonly` **arrivals**: `Map`<`VoyageId`, `ArrivalWithTimer`\> + +Map of arrivals to timers that fire when an arrival arrives, in case that handler needs to be +cancelled for whatever reason. + +--- + +### artifactUpdated$ + +• `Readonly` **artifactUpdated$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`ArtifactId`\> + +Event emitter which publishes whenever an artifact has been updated. + +--- + +### artifacts + +• `Private` `Readonly` **artifacts**: `Map`<`ArtifactId`, `Artifact`\> + +Cached index of all known artifact data. + +**`see`** The same warning applys as the one on [GameObjects.planets](Backend_GameLogic_GameObjects.GameObjects.md#planets) + +--- + +### contractConstants + +• `Private` `Readonly` **contractConstants**: [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) + +Some of the game's parameters are downloaded from the blockchain. This allows the client to be +flexible, and connect to any compatible set of Dark Forest contracts, download the parameters, +and join the game, taking into account the unique configuration of those specific Dark Forest +contracts. + +--- + +### coordsToLocation + +• `Private` `Readonly` **coordsToLocation**: `Map`<`CoordsString`, `WorldLocation`\> + +Map from a stringified representation of an x-y coordinate to an object that contains some more +information about the world at that location. + +--- + +### isBuyingCredits$ + +• `Readonly` **isBuyingCredits$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> + +Event emitter which publishes whenever the player begins and finishes (whether with a success +or an error) buying gpt credits. + +**`todo`** move into `PlayerInfo` + +--- + +### layeredMap + +• `Private` `Readonly` **layeredMap**: [`LayeredMap`](Backend_GameLogic_LayeredMap.LayeredMap.md) + +This is a data structure that allows us to efficiently calculate which planets are visible on +the player's screen given the viewport's position and size. + +--- + +### myArtifacts + +• `Private` `Readonly` **myArtifacts**: `Map`<`ArtifactId`, `Artifact`\> + +Cached index of artifacts owned by the player. + +**`see`** The same warning applys as the one on [GameObjects.planets](Backend_GameLogic_GameObjects.GameObjects.md#planets) + +--- + +### myArtifactsUpdated$ + +• `Readonly` **myArtifactsUpdated$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`ArtifactId`, `Artifact`\>\> + +Whenever one of the player's artifacts are updated, this event emitter publishes. See +[GameObjects.myPlanetsUpdated$](Backend_GameLogic_GameObjects.GameObjects.md#myplanetsupdated$) for more info. + +--- + +### myPlanets + +• `Private` `Readonly` **myPlanets**: `Map`<`LocationId`, `Planet`\> + +Cached index of planets owned by the player. + +**`see`** The same warning applys as the one on [GameObjects.planets](Backend_GameLogic_GameObjects.GameObjects.md#planets) + +--- + +### myPlanetsUpdated$ + +• `Readonly` **myPlanetsUpdated$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`LocationId`, `Planet`\>\> + +Whenever a planet is updated, we publish to this event with a reference to a map from location +id to planet. We need to rethink this event emitter because it currently publishes every time +that any planet is updated, and if a lot of them are updated at once (which i think is the case +once every two minutes) then this event emitter will publish a shitton of events. +TODO: rethink this + +--- + +### planetArrivalIds + +• `Private` `Readonly` **planetArrivalIds**: `Map`<`LocationId`, `VoyageId`[]\> + +Map from a location id (think of it as the unique id of each planet) to all the ids of the +voyages that are arriving on that planet. These include both the player's own voyages, and also +any potential invader's voyages. + +--- + +### planetLocationMap + +• `Private` `Readonly` **planetLocationMap**: `Map`<`LocationId`, `WorldLocation`\> + +Map from location id (unique id of each planet) to some information about the location at which +this planet is located, if this client happens to know the coordinates of this planet. + +--- + +### planetUpdated$ + +• `Readonly` **planetUpdated$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`LocationId`\> + +Event emitter which publishes whenever a planet is updated. + +--- + +### planets + +• `Private` `Readonly` **planets**: `Map`<`LocationId`, `Planet`\> + +Cached index of all known planet data. + +Warning! + +This should NEVER be set to directly! Any time you want to update a planet, you must call the +{@link GameObjects#setPlanet()} function. Following this rule enables us to reliably notify +other parts of the client when a particular object has been updated. TODO: what is the best way +to do this? + +**`todo`** extract the pattern we're using for the field tuples + +- {planets, myPlanets, myPlanetsUpdated, planetUpdated$} +- {artifacts, myArtifacts, myArtifactsUpdated, artifactUpdated$} + +into some sort of class. + +--- + +### revealedLocations + +• `Private` `Readonly` **revealedLocations**: `Map`<`LocationId`, `RevealedLocation`\> + +Map from location ids to, if that location id has been revealed on-chain, the world coordinates +of that location id, as well as some extra information regarding the circumstances of the +revealing of this planet. + +--- + +### touchedPlanetIds + +• `Private` `Readonly` **touchedPlanetIds**: `Set`<`LocationId`\> + +Set of all planet ids that we know have been interacted-with on-chain. + +--- + +### unconfirmedBuyGPTCredits + +• `Private` `Optional` **unconfirmedBuyGPTCredits**: `UnconfirmedBuyGPTCredits` + +--- + +### unconfirmedBuyHats + +• `Private` `Readonly` **unconfirmedBuyHats**: `Record`<`string`, `UnconfirmedBuyHat`\> + +--- + +### unconfirmedMoves + +• `Private` `Readonly` **unconfirmedMoves**: `Record`<`string`, `UnconfirmedMove`\> + +--- + +### unconfirmedPlanetTransfers + +• `Private` `Readonly` **unconfirmedPlanetTransfers**: `Record`<`string`, `UnconfirmedPlanetTransfer`\> + +--- + +### unconfirmedReveal + +• `Private` `Optional` **unconfirmedReveal**: `UnconfirmedReveal` + +The following set of fields represent actions which the user has initiated on the blockchain, +and have not yet completed. The nature of the blockchain is that transactions could take up to +several minutes to confirm (depending on network congestion). This means that we need to make +it clear to players that the action that they have initiated is indeed in progress, and that +something is actually happening. See `Prospect.tsx` for example. + +The storage and retrieval of unconfirmed transactions could, and +probablu should be abstracted into some sort of class which keeps in sync both _these_ fields +and each of these fields counterparts in their corresponding entity objects (Planet, Artifact, +etc.) + +**`todo`** these are good candidates for being in the `PlayerInfo` class. + +--- + +### unconfirmedUpgrades + +• `Private` `Readonly` **unconfirmedUpgrades**: `Record`<`string`, `UnconfirmedUpgrade`\> + +--- + +### unconfirmedWormholeActivations + +• `Private` `Readonly` **unconfirmedWormholeActivations**: `UnconfirmedActivateArtifact`[] + +--- + +### wormholes + +• `Private` `Readonly` **wormholes**: `Map`<`ArtifactId`, [`Wormhole`](../modules/_types_global_GlobalTypes.md#wormhole)\> + +Map from artifact ids to wormholes. + +## Methods + +### addPlanetLocation + +▸ **addPlanetLocation**(`planetLocation`): `void` + +Called when we load chunk data into memory (on startup), when we're loading all revealed locations (on startup), +when miner has mined a new chunk while exploring, and when a planet's location is revealed onchain during the course of play +Adds a WorldLocation to the planetLocationMap, making it known to the player locally +Sets an unsynced default planet in the PlanetMap this.planets +IMPORTANT: This is the only way a LocatablePlanet gets constructed +IMPORTANT: Idempotent + +#### Parameters + +| Name | Type | +| :--------------- | :-------------- | +| `planetLocation` | `WorldLocation` | + +#### Returns + +`void` + +--- + +### calculateSilverSpent + +▸ `Private` **calculateSilverSpent**(`planet`): `number` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`number` + +--- + +### clearOldArrivals + +▸ `Private` **clearOldArrivals**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### clearUnconfirmedTxIntent + +▸ **clearUnconfirmedTxIntent**(`txIntent`): `void` + +Whenever a transaction that the user initiated either succeeds or fails, we need to clear the +fact that it was in progress from the event's corresponding entities. For example, whenever a +transaction that sends a voyage from one planet to another either succeeds or fails, we need to +remove the dashed line that connected them. + +Making sure that we never miss something here is very tedious. + +**`todo`** Make this less tedious. + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +`void` + +--- + +### defaultPlanetFromLocation + +▸ `Private` **defaultPlanetFromLocation**(`location`): `LocatablePlanet` + +returns the data for an unowned, untouched planet at location +most planets in the game are untouched and not stored in the contract, +so we need to generate their data optimistically in the client + +#### Parameters + +| Name | Type | +| :--------- | :-------------- | +| `location` | `WorldLocation` | + +#### Returns + +`LocatablePlanet` + +--- + +### emitArrivalNotifications + +▸ `Private` **emitArrivalNotifications**(`__namedParameters`): `void` + +Emit notifications based on a planet's state change + +#### Parameters + +| Name | Type | +| :------------------ | :------------------------------------------------------------------------- | +| `__namedParameters` | [`PlanetDiff`](../interfaces/Backend_GameLogic_ArrivalUtils.PlanetDiff.md) | + +#### Returns + +`void` + +--- + +### getAllOwnedPlanets + +▸ **getAllOwnedPlanets**(): `Planet`[] + +Returns all the planets in the game which this client is aware of that have an owner, as a map +from their id to the planet + +**`tutorial`** For plugin developers! + +**`see`** Warning in {@link GameObjects.getAllPlanets()} + +#### Returns + +`Planet`[] + +--- + +### getAllPlanets + +▸ **getAllPlanets**(): `Iterable`<`Planet`\> + +Returns all planets in the game. + +Warning! Simply iterating over this is not performant, and is meant for scripting. + +**`tutorial`** For plugin developers! + +#### Returns + +`Iterable`<`Planet`\> + +--- + +### getAllPlanetsMap + +▸ **getAllPlanetsMap**(): `Map`<`LocationId`, `Planet`\> + +Returns all planets in the game, as a map from their location id to the planet. + +**`tutorial`** For plugin developers! + +**`see`** Warning in {@link GameObjects.getAllPlanets()} + +#### Returns + +`Map`<`LocationId`, `Planet`\> + +--- + +### getAllVoyages + +▸ **getAllVoyages**(): `QueuedArrival`[] + +Returns all voyages that are scheduled to arrive at some point in the future. + +**`tutorial`** For plugin developers! + +**`see`** Warning in {@link GameObjects.getAllPlanets()} + +#### Returns + +`QueuedArrival`[] + +--- + +### getArtifactById + +▸ **getArtifactById**(`artifactId`): `undefined` \| `Artifact` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`undefined` \| `Artifact` + +--- + +### getArtifactController + +▸ **getArtifactController**(`artifactId`): `undefined` \| `EthAddress` + +Returns the EthAddress of the player who can control the owner: +if the artifact is on a planet, this is the owner of the planet +if the artifact is on a voyage, this is the initiator of the voyage +if the artifact is not on either, then it is the owner of the artifact NFT + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`undefined` \| `EthAddress` + +--- + +### getArtifactMap + +▸ **getArtifactMap**(): `Map`<`ArtifactId`, `Artifact`\> + +#### Returns + +`Map`<`ArtifactId`, `Artifact`\> + +--- + +### getArtifactsOnPlanetsOwnedBy + +▸ **getArtifactsOnPlanetsOwnedBy**(`addr`): `Artifact`[] + +#### Parameters + +| Name | Type | +| :----- | :----------- | +| `addr` | `EthAddress` | + +#### Returns + +`Artifact`[] + +--- + +### getArtifactsOwnedBy + +▸ **getArtifactsOwnedBy**(`addr`): `Artifact`[] + +#### Parameters + +| Name | Type | +| :----- | :----------- | +| `addr` | `EthAddress` | + +#### Returns + +`Artifact`[] + +--- + +### getBiome + +▸ `Private` **getBiome**(`loc`): `Biome` + +#### Parameters + +| Name | Type | +| :---- | :-------------- | +| `loc` | `WorldLocation` | + +#### Returns + +`Biome` + +--- + +### getEnergyCurveAtPercent + +▸ **getEnergyCurveAtPercent**(`planet`, `percent`): `number` + +returns timestamp (seconds) that planet will reach percent% of energycap +time may be in the past + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `planet` | `Planet` | +| `percent` | `number` | + +#### Returns + +`number` + +--- + +### getIsBuyingCreditsEmitter + +▸ **getIsBuyingCreditsEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> + +--- + +### getLocationOfPlanet + +▸ **getLocationOfPlanet**(`planetId`): `undefined` \| `WorldLocation` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`undefined` \| `WorldLocation` + +--- + +### getMyArtifactMap + +▸ **getMyArtifactMap**(): `Map`<`ArtifactId`, `Artifact`\> + +#### Returns + +`Map`<`ArtifactId`, `Artifact`\> + +--- + +### getMyPlanetMap + +▸ **getMyPlanetMap**(): `Map`<`LocationId`, `Planet`\> + +#### Returns + +`Map`<`LocationId`, `Planet`\> + +--- + +### getPlanetArtifacts + +▸ **getPlanetArtifacts**(`planetId`): `Artifact`[] + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`Artifact`[] + +--- + +### getPlanetDetailLevel + +▸ **getPlanetDetailLevel**(`planetId`): `undefined` \| `number` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`undefined` \| `number` + +--- + +### getPlanetLevel + +▸ **getPlanetLevel**(`planetId`): `undefined` \| `PlanetLevel` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`undefined` \| `PlanetLevel` + +--- + +### getPlanetMap + +▸ **getPlanetMap**(): `Map`<`LocationId`, `Planet`\> + +#### Returns + +`Map`<`LocationId`, `Planet`\> + +--- + +### getPlanetWithCoords + +▸ **getPlanetWithCoords**(`coords`): `undefined` \| `Planet` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`undefined` \| `Planet` + +--- + +### getPlanetWithId + +▸ **getPlanetWithId**(`planetId`, `updateIfStale?`): `undefined` \| `Planet` + +#### Parameters + +| Name | Type | Default value | +| :-------------- | :----------- | :------------ | +| `planetId` | `LocationId` | `undefined` | +| `updateIfStale` | `boolean` | `true` | + +#### Returns + +`undefined` \| `Planet` + +--- + +### getPlanetWithLocation + +▸ **getPlanetWithLocation**(`location`): `undefined` \| `Planet` + +#### Parameters + +| Name | Type | +| :--------- | :-------------- | +| `location` | `WorldLocation` | + +#### Returns + +`undefined` \| `Planet` + +--- + +### getPlanetsInWorldRectangle + +▸ **getPlanetsInWorldRectangle**(`worldX`, `worldY`, `worldWidth`, `worldHeight`, `levels`, `planetLevelToRadii`, `updateIfStale?`): `LocatablePlanet`[] + +Gets the ids of all the planets that are both within the given bounding box (defined by its bottom +left coordinate, width, and height) in the world and of a level that was passed in via the +`planetLevels` parameter. + +#### Parameters + +| Name | Type | Default value | +| :------------------- | :------------------------------------------------------------------------------------- | :------------ | +| `worldX` | `number` | `undefined` | +| `worldY` | `number` | `undefined` | +| `worldWidth` | `number` | `undefined` | +| `worldHeight` | `number` | `undefined` | +| `levels` | `number`[] | `undefined` | +| `planetLevelToRadii` | `Map`<`number`, [`Radii`](../interfaces/Backend_GameLogic_ViewportEntities.Radii.md)\> | `undefined` | +| `updateIfStale` | `boolean` | `true` | + +#### Returns + +`LocatablePlanet`[] + +--- + +### getRevealedLocations + +▸ **getRevealedLocations**(): `Map`<`LocationId`, `RevealedLocation`\> + +#### Returns + +`Map`<`LocationId`, `RevealedLocation`\> + +--- + +### getSilverCurveAtPercent + +▸ **getSilverCurveAtPercent**(`planet`, `percent`): `undefined` \| `number` + +returns timestamp (seconds) that planet will reach percent% of silcap if +doesn't produce silver, returns undefined if already over percent% of silcap, +returns undefined + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `planet` | `Planet` | +| `percent` | `number` | + +#### Returns + +`undefined` \| `number` + +--- + +### getUnconfirmedBuyGPTCredits + +▸ **getUnconfirmedBuyGPTCredits**(): `undefined` \| `UnconfirmedBuyGPTCredits` + +#### Returns + +`undefined` \| `UnconfirmedBuyGPTCredits` + +--- + +### getUnconfirmedMoves + +▸ **getUnconfirmedMoves**(): `UnconfirmedMove`[] + +#### Returns + +`UnconfirmedMove`[] + +--- + +### getUnconfirmedReveal + +▸ **getUnconfirmedReveal**(): `undefined` \| `UnconfirmedReveal` + +#### Returns + +`undefined` \| `UnconfirmedReveal` + +--- + +### getUnconfirmedUpgrades + +▸ **getUnconfirmedUpgrades**(): `UnconfirmedUpgrade`[] + +#### Returns + +`UnconfirmedUpgrade`[] + +--- + +### getUnconfirmedWormholeActivations + +▸ **getUnconfirmedWormholeActivations**(): `UnconfirmedActivateArtifact`[] + +#### Returns + +`UnconfirmedActivateArtifact`[] + +--- + +### getWormholes + +▸ **getWormholes**(): `Iterable`<[`Wormhole`](../modules/_types_global_GlobalTypes.md#wormhole)\> + +#### Returns + +`Iterable`<[`Wormhole`](../modules/_types_global_GlobalTypes.md#wormhole)\> + +--- + +### isPlanetInContract + +▸ **isPlanetInContract**(`planetId`): `boolean` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`boolean` + +--- + +### markLocationRevealed + +▸ **markLocationRevealed**(`revealedLocation`): `void` + +#### Parameters + +| Name | Type | +| :----------------- | :----------------- | +| `revealedLocation` | `RevealedLocation` | + +#### Returns + +`void` + +--- + +### onTxIntent + +▸ **onTxIntent**(`txIntent`): `void` + +We call this function whenever the user requests that we send a transaction to the blockchain +with their localstorage wallet. You can think of it as one of the hubs which connects +`GameObjects` to the rest of the world. + +Inside this function, we update the relevant internal game objects to reflect that the user has +requested a particular action. Additionally, we publish the appropriate events to the relevant +[Monomitter](../modules/Frontend_Utils_Monomitter.md#monomitter) instances that are stored in this class. + +In the case of something like prospecting for an artifact, this allows us to display a spinner +text which says "Prospecting..." + +In the case of the user sending energy from one planet to another planet, this allows us to +display a dashed line between the two planets in their new voyage. + +Whenever we update an entity, we must do it via that entity's type's corresponding +`set` function, in order for us to publish these events. + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +`void` + +--- + +### planetLevelFromHexPerlin + +▸ **planetLevelFromHexPerlin**(`hex`, `perlin`): `PlanetLevel` + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `hex` | `LocationId` | +| `perlin` | `number` | + +#### Returns + +`PlanetLevel` + +--- + +### planetTypeFromHexPerlin + +▸ **planetTypeFromHexPerlin**(`hex`, `perlin`): `PlanetType` + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `hex` | `LocationId` | +| `perlin` | `number` | + +#### Returns + +`PlanetType` + +--- + +### processArrivalsForPlanet + +▸ `Private` **processArrivalsForPlanet**(`planetId`, `arrivals`): `ArrivalWithTimer`[] + +#### Parameters + +| Name | Type | +| :--------- | :---------------- | +| `planetId` | `LocationId` | +| `arrivals` | `QueuedArrival`[] | + +#### Returns + +`ArrivalWithTimer`[] + +--- + +### replaceArtifactFromContractData + +▸ **replaceArtifactFromContractData**(`artifact`): `void` + +received some artifact data from the contract. update our stores + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `artifact` | `Artifact` | + +#### Returns + +`void` + +--- + +### replaceArtifactsFromContractData + +▸ **replaceArtifactsFromContractData**(`artifacts`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :---------------------- | +| `artifacts` | `Iterable`<`Artifact`\> | + +#### Returns + +`void` + +--- + +### replacePlanetFromContractData + +▸ **replacePlanetFromContractData**(`planet`, `updatedArrivals?`, `updatedArtifactsOnPlanet?`, `revealedLocation?`): `void` + +received some planet data from the contract. update our stores + +#### Parameters + +| Name | Type | +| :-------------------------- | :----------------- | +| `planet` | `Planet` | +| `updatedArrivals?` | `QueuedArrival`[] | +| `updatedArtifactsOnPlanet?` | `ArtifactId`[] | +| `revealedLocation?` | `RevealedLocation` | + +#### Returns + +`void` + +--- + +### setArtifact + +▸ `Private` **setArtifact**(`artifact`): `void` + +Set an artifact into our cached store. Should ALWAYS call this when setting an artifact. +`this.artifacts` and `this.myArtifacts` should NEVER be accessed directly! +This function also handles managing artifact update messages and indexing the map of owned artifacts. + +#### Parameters + +| Name | Type | Description | +| :--------- | :--------- | :------------------ | +| `artifact` | `Artifact` | the artifact to set | + +#### Returns + +`void` + +--- + +### setPlanet + +▸ `Private` **setPlanet**(`planet`): `void` + +Set a planet into our cached store. Should ALWAYS call this when setting a planet. +`this.planets` and `this.myPlanets` should NEVER be accessed directly! +This function also handles managing planet update messages and indexing the map of owned planets. + +#### Parameters + +| Name | Type | Description | +| :------- | :------- | :---------------- | +| `planet` | `Planet` | the planet to set | + +#### Returns + +`void` + +--- + +### spaceTypeFromPerlin + +▸ **spaceTypeFromPerlin**(`perlin`): `SpaceType` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `perlin` | `number` | + +#### Returns + +`SpaceType` + +--- + +### updatePlanet + +▸ **updatePlanet**(`id`, `updateFn`): `void` + +Given a planet id, update the state of the given planet by calling the given update function. +If the planet was updated, then also publish the appropriate event. + +#### Parameters + +| Name | Type | +| :--------- | :------------------------ | +| `id` | `LocationId` | +| `updateFn` | (`p`: `Planet`) => `void` | + +#### Returns + +`void` + +--- + +### updatePlanetIfStale + +▸ `Private` **updatePlanetIfStale**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### updateScore + +▸ `Private` **updateScore**(`planetId`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`void` + +--- + +### getSilverNeeded + +▸ `Static` **getSilverNeeded**(`planet`): `number` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`number` + +--- + +### planetCanUpgrade + +▸ `Static` **planetCanUpgrade**(`planet`): `boolean` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`boolean` diff --git a/docs/classes/Backend_GameLogic_GameUIManager.default.md b/docs/classes/Backend_GameLogic_GameUIManager.default.md new file mode 100644 index 00000000..38a1332f --- /dev/null +++ b/docs/classes/Backend_GameLogic_GameUIManager.default.md @@ -0,0 +1,2330 @@ +# Class: default + +[Backend/GameLogic/GameUIManager](../modules/Backend_GameLogic_GameUIManager.md).default + +## Hierarchy + +- `EventEmitter` + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_GameUIManager.default.md#constructor) + +### Properties + +- [artifactSending](Backend_GameLogic_GameUIManager.default.md#artifactsending) +- [extraMinerLocations](Backend_GameLogic_GameUIManager.default.md#extraminerlocations) +- [forcesSending](Backend_GameLogic_GameUIManager.default.md#forcessending) +- [gameManager](Backend_GameLogic_GameUIManager.default.md#gamemanager) +- [hoverPlanet$](Backend_GameLogic_GameUIManager.default.md#hoverplanet$) +- [hoverPlanetId$](Backend_GameLogic_GameUIManager.default.md#hoverplanetid$) +- [isChoosingTargetPlanet](Backend_GameLogic_GameUIManager.default.md#ischoosingtargetplanet) +- [isSending](Backend_GameLogic_GameUIManager.default.md#issending) +- [minerLocation](Backend_GameLogic_GameUIManager.default.md#minerlocation) +- [mouseDownOverCoords](Backend_GameLogic_GameUIManager.default.md#mousedownovercoords) +- [mouseDownOverPlanet](Backend_GameLogic_GameUIManager.default.md#mousedownoverplanet) +- [mouseHoveringOverCoords](Backend_GameLogic_GameUIManager.default.md#mousehoveringovercoords) +- [mouseHoveringOverPlanet](Backend_GameLogic_GameUIManager.default.md#mousehoveringoverplanet) +- [myArtifacts$](Backend_GameLogic_GameUIManager.default.md#myartifacts$) +- [onChooseTargetPlanet](Backend_GameLogic_GameUIManager.default.md#onchoosetargetplanet) +- [plugins](Backend_GameLogic_GameUIManager.default.md#plugins) +- [previousSelectedPlanet](Backend_GameLogic_GameUIManager.default.md#previousselectedplanet) +- [radiusMap](Backend_GameLogic_GameUIManager.default.md#radiusmap) +- [selectedArtifact$](Backend_GameLogic_GameUIManager.default.md#selectedartifact$) +- [selectedArtifactId$](Backend_GameLogic_GameUIManager.default.md#selectedartifactid$) +- [selectedCoords](Backend_GameLogic_GameUIManager.default.md#selectedcoords) +- [selectedPlanet](Backend_GameLogic_GameUIManager.default.md#selectedplanet) +- [selectedPlanet$](Backend_GameLogic_GameUIManager.default.md#selectedplanet$) +- [selectedPlanetId$](Backend_GameLogic_GameUIManager.default.md#selectedplanetid$) +- [sendingCoords](Backend_GameLogic_GameUIManager.default.md#sendingcoords) +- [sendingPlanet](Backend_GameLogic_GameUIManager.default.md#sendingplanet) +- [silverSending](Backend_GameLogic_GameUIManager.default.md#silversending) +- [terminal](Backend_GameLogic_GameUIManager.default.md#terminal) +- [viewportEntities](Backend_GameLogic_GameUIManager.default.md#viewportentities) + +### Methods + +- [activateArtifact](Backend_GameLogic_GameUIManager.default.md#activateartifact) +- [addAccount](Backend_GameLogic_GameUIManager.default.md#addaccount) +- [addNewChunk](Backend_GameLogic_GameUIManager.default.md#addnewchunk) +- [bulkAddNewChunks](Backend_GameLogic_GameUIManager.default.md#bulkaddnewchunks) +- [buyGPTCredits](Backend_GameLogic_GameUIManager.default.md#buygptcredits) +- [buyHat](Backend_GameLogic_GameUIManager.default.md#buyhat) +- [centerCoords](Backend_GameLogic_GameUIManager.default.md#centercoords) +- [centerLocationId](Backend_GameLogic_GameUIManager.default.md#centerlocationid) +- [centerPlanet](Backend_GameLogic_GameUIManager.default.md#centerplanet) +- [deactivateArtifact](Backend_GameLogic_GameUIManager.default.md#deactivateartifact) +- [depositArtifact](Backend_GameLogic_GameUIManager.default.md#depositartifact) +- [destroy](Backend_GameLogic_GameUIManager.default.md#destroy) +- [discoverBiome](Backend_GameLogic_GameUIManager.default.md#discoverbiome) +- [findArtifact](Backend_GameLogic_GameUIManager.default.md#findartifact) +- [generateVerificationTweet](Backend_GameLogic_GameUIManager.default.md#generateverificationtweet) +- [getAccount](Backend_GameLogic_GameUIManager.default.md#getaccount) +- [getAllMinerLocations](Backend_GameLogic_GameUIManager.default.md#getallminerlocations) +- [getAllOwnedPlanets](Backend_GameLogic_GameUIManager.default.md#getallownedplanets) +- [getAllPlayers](Backend_GameLogic_GameUIManager.default.md#getallplayers) +- [getAllVoyages](Backend_GameLogic_GameUIManager.default.md#getallvoyages) +- [getArtifactMap](Backend_GameLogic_GameUIManager.default.md#getartifactmap) +- [getArtifactPlanet](Backend_GameLogic_GameUIManager.default.md#getartifactplanet) +- [getArtifactSending](Backend_GameLogic_GameUIManager.default.md#getartifactsending) +- [getArtifactWithId](Backend_GameLogic_GameUIManager.default.md#getartifactwithid) +- [getArtifactsWithIds](Backend_GameLogic_GameUIManager.default.md#getartifactswithids) +- [getBiomeKey](Backend_GameLogic_GameUIManager.default.md#getbiomekey) +- [getBiomePerlin](Backend_GameLogic_GameUIManager.default.md#getbiomeperlin) +- [getBooleanSetting](Backend_GameLogic_GameUIManager.default.md#getbooleansetting) +- [getChunk](Backend_GameLogic_GameUIManager.default.md#getchunk) +- [getContractAddress](Backend_GameLogic_GameUIManager.default.md#getcontractaddress) +- [getContractConstants](Backend_GameLogic_GameUIManager.default.md#getcontractconstants) +- [getConversation](Backend_GameLogic_GameUIManager.default.md#getconversation) +- [getDiagnostics](Backend_GameLogic_GameUIManager.default.md#getdiagnostics) +- [getDiscoverBiomeName](Backend_GameLogic_GameUIManager.default.md#getdiscoverbiomename) +- [getDistCoords](Backend_GameLogic_GameUIManager.default.md#getdistcoords) +- [getEndTimeSeconds](Backend_GameLogic_GameUIManager.default.md#getendtimeseconds) +- [getEnergyArrivingForMove](Backend_GameLogic_GameUIManager.default.md#getenergyarrivingformove) +- [getEnergyCurveAtPercent](Backend_GameLogic_GameUIManager.default.md#getenergycurveatpercent) +- [getEnergyOfPlayer](Backend_GameLogic_GameUIManager.default.md#getenergyofplayer) +- [getEthConnection](Backend_GameLogic_GameUIManager.default.md#getethconnection) +- [getExploredChunks](Backend_GameLogic_GameUIManager.default.md#getexploredchunks) +- [getForcesSending](Backend_GameLogic_GameUIManager.default.md#getforcessending) +- [getGameManager](Backend_GameLogic_GameUIManager.default.md#getgamemanager) +- [getGameObjects](Backend_GameLogic_GameUIManager.default.md#getgameobjects) +- [getGptCreditBalanceEmitter](Backend_GameLogic_GameUIManager.default.md#getgptcreditbalanceemitter) +- [getGptCreditPriceEmitter](Backend_GameLogic_GameUIManager.default.md#getgptcreditpriceemitter) +- [getHashConfig](Backend_GameLogic_GameUIManager.default.md#gethashconfig) +- [getHashesPerSec](Backend_GameLogic_GameUIManager.default.md#gethashespersec) +- [getHomeCoords](Backend_GameLogic_GameUIManager.default.md#gethomecoords) +- [getHomeHash](Backend_GameLogic_GameUIManager.default.md#gethomehash) +- [getHomePlanet](Backend_GameLogic_GameUIManager.default.md#gethomeplanet) +- [getHoveringOverCoords](Backend_GameLogic_GameUIManager.default.md#gethoveringovercoords) +- [getHoveringOverPlanet](Backend_GameLogic_GameUIManager.default.md#gethoveringoverplanet) +- [getIsBuyingCreditsEmitter](Backend_GameLogic_GameUIManager.default.md#getisbuyingcreditsemitter) +- [getIsChoosingTargetPlanet](Backend_GameLogic_GameUIManager.default.md#getischoosingtargetplanet) +- [getIsHighPerfMode](Backend_GameLogic_GameUIManager.default.md#getishighperfmode) +- [getLocationOfPlanet](Backend_GameLogic_GameUIManager.default.md#getlocationofplanet) +- [getLocationsAndChunks](Backend_GameLogic_GameUIManager.default.md#getlocationsandchunks) +- [getMinerLocation](Backend_GameLogic_GameUIManager.default.md#getminerlocation) +- [getMiningPattern](Backend_GameLogic_GameUIManager.default.md#getminingpattern) +- [getMouseDownCoords](Backend_GameLogic_GameUIManager.default.md#getmousedowncoords) +- [getMouseDownPlanet](Backend_GameLogic_GameUIManager.default.md#getmousedownplanet) +- [getMyArtifactMap](Backend_GameLogic_GameUIManager.default.md#getmyartifactmap) +- [getMyArtifacts](Backend_GameLogic_GameUIManager.default.md#getmyartifacts) +- [getMyArtifactsNotOnPlanet](Backend_GameLogic_GameUIManager.default.md#getmyartifactsnotonplanet) +- [getMyBalance](Backend_GameLogic_GameUIManager.default.md#getmybalance) +- [getMyBalanceEmitter](Backend_GameLogic_GameUIManager.default.md#getmybalanceemitter) +- [getMyPlanetMap](Backend_GameLogic_GameUIManager.default.md#getmyplanetmap) +- [getMyScore](Backend_GameLogic_GameUIManager.default.md#getmyscore) +- [getNextBroadcastAvailableTimestamp](Backend_GameLogic_GameUIManager.default.md#getnextbroadcastavailabletimestamp) +- [getPerlinConfig](Backend_GameLogic_GameUIManager.default.md#getperlinconfig) +- [getPerlinThresholds](Backend_GameLogic_GameUIManager.default.md#getperlinthresholds) +- [getPlanetLevel](Backend_GameLogic_GameUIManager.default.md#getplanetlevel) +- [getPlanetMap](Backend_GameLogic_GameUIManager.default.md#getplanetmap) +- [getPlanetWithCoords](Backend_GameLogic_GameUIManager.default.md#getplanetwithcoords) +- [getPlanetWithId](Backend_GameLogic_GameUIManager.default.md#getplanetwithid) +- [getPlanetsInViewport](Backend_GameLogic_GameUIManager.default.md#getplanetsinviewport) +- [getPluginManager](Backend_GameLogic_GameUIManager.default.md#getpluginmanager) +- [getPreviousSelectedPlanet](Backend_GameLogic_GameUIManager.default.md#getpreviousselectedplanet) +- [getPrivateKey](Backend_GameLogic_GameUIManager.default.md#getprivatekey) +- [getRadiusOfPlanetLevel](Backend_GameLogic_GameUIManager.default.md#getradiusofplanetlevel) +- [getSelectedCoords](Backend_GameLogic_GameUIManager.default.md#getselectedcoords) +- [getSelectedPlanet](Backend_GameLogic_GameUIManager.default.md#getselectedplanet) +- [getSilverCurveAtPercent](Backend_GameLogic_GameUIManager.default.md#getsilvercurveatpercent) +- [getSilverOfPlayer](Backend_GameLogic_GameUIManager.default.md#getsilverofplayer) +- [getSilverSending](Backend_GameLogic_GameUIManager.default.md#getsilversending) +- [getSpaceTypePerlin](Backend_GameLogic_GameUIManager.default.md#getspacetypeperlin) +- [getStringSetting](Backend_GameLogic_GameUIManager.default.md#getstringsetting) +- [getTerminal](Backend_GameLogic_GameUIManager.default.md#getterminal) +- [getTwitter](Backend_GameLogic_GameUIManager.default.md#gettwitter) +- [getUnconfirmedMoves](Backend_GameLogic_GameUIManager.default.md#getunconfirmedmoves) +- [getUnconfirmedUpgrades](Backend_GameLogic_GameUIManager.default.md#getunconfirmedupgrades) +- [getUnconfirmedWormholeActivations](Backend_GameLogic_GameUIManager.default.md#getunconfirmedwormholeactivations) +- [getUniverseTotalEnergy](Backend_GameLogic_GameUIManager.default.md#getuniversetotalenergy) +- [getUpgrade](Backend_GameLogic_GameUIManager.default.md#getupgrade) +- [getViewport](Backend_GameLogic_GameUIManager.default.md#getviewport) +- [getWithdrawnSilverOfPlayer](Backend_GameLogic_GameUIManager.default.md#getwithdrawnsilverofplayer) +- [getWorldRadius](Backend_GameLogic_GameUIManager.default.md#getworldradius) +- [getWorldSilver](Backend_GameLogic_GameUIManager.default.md#getworldsilver) +- [getWormholes](Backend_GameLogic_GameUIManager.default.md#getwormholes) +- [hasMinedChunk](Backend_GameLogic_GameUIManager.default.md#hasminedchunk) +- [isCurrentlyRevealing](Backend_GameLogic_GameUIManager.default.md#iscurrentlyrevealing) +- [isMining](Backend_GameLogic_GameUIManager.default.md#ismining) +- [isOverOwnPlanet](Backend_GameLogic_GameUIManager.default.md#isoverownplanet) +- [isOwnedByMe](Backend_GameLogic_GameUIManager.default.md#isownedbyme) +- [isRoundOver](Backend_GameLogic_GameUIManager.default.md#isroundover) +- [joinGame](Backend_GameLogic_GameUIManager.default.md#joingame) +- [onDiscoveredChunk](Backend_GameLogic_GameUIManager.default.md#ondiscoveredchunk) +- [onEmitInitializedPlayer](Backend_GameLogic_GameUIManager.default.md#onemitinitializedplayer) +- [onEmitInitializedPlayerError](Backend_GameLogic_GameUIManager.default.md#onemitinitializedplayererror) +- [onMouseClick](Backend_GameLogic_GameUIManager.default.md#onmouseclick) +- [onMouseDown](Backend_GameLogic_GameUIManager.default.md#onmousedown) +- [onMouseMove](Backend_GameLogic_GameUIManager.default.md#onmousemove) +- [onMouseOut](Backend_GameLogic_GameUIManager.default.md#onmouseout) +- [onMouseUp](Backend_GameLogic_GameUIManager.default.md#onmouseup) +- [onSendCancel](Backend_GameLogic_GameUIManager.default.md#onsendcancel) +- [onSendInit](Backend_GameLogic_GameUIManager.default.md#onsendinit) +- [prospectPlanet](Backend_GameLogic_GameUIManager.default.md#prospectplanet) +- [removeExtraMinerLocation](Backend_GameLogic_GameUIManager.default.md#removeextraminerlocation) +- [revealLocation](Backend_GameLogic_GameUIManager.default.md#reveallocation) +- [setArtifactSending](Backend_GameLogic_GameUIManager.default.md#setartifactsending) +- [setExtraMinerLocation](Backend_GameLogic_GameUIManager.default.md#setextraminerlocation) +- [setForcesSending](Backend_GameLogic_GameUIManager.default.md#setforcessending) +- [setHoveringOverPlanet](Backend_GameLogic_GameUIManager.default.md#sethoveringoverplanet) +- [setMiningPattern](Backend_GameLogic_GameUIManager.default.md#setminingpattern) +- [setSelectedId](Backend_GameLogic_GameUIManager.default.md#setselectedid) +- [setSelectedPlanet](Backend_GameLogic_GameUIManager.default.md#setselectedplanet) +- [setSilverSending](Backend_GameLogic_GameUIManager.default.md#setsilversending) +- [spaceTypeFromPerlin](Backend_GameLogic_GameUIManager.default.md#spacetypefromperlin) +- [startConversation](Backend_GameLogic_GameUIManager.default.md#startconversation) +- [startExplore](Backend_GameLogic_GameUIManager.default.md#startexplore) +- [startWormholeFrom](Backend_GameLogic_GameUIManager.default.md#startwormholefrom) +- [stepConversation](Backend_GameLogic_GameUIManager.default.md#stepconversation) +- [stopExplore](Backend_GameLogic_GameUIManager.default.md#stopexplore) +- [updateDiagnostics](Backend_GameLogic_GameUIManager.default.md#updatediagnostics) +- [updateMouseHoveringOverCoords](Backend_GameLogic_GameUIManager.default.md#updatemousehoveringovercoords) +- [updatePlanets](Backend_GameLogic_GameUIManager.default.md#updateplanets) +- [upgrade](Backend_GameLogic_GameUIManager.default.md#upgrade) +- [verifyTwitter](Backend_GameLogic_GameUIManager.default.md#verifytwitter) +- [withdrawArtifact](Backend_GameLogic_GameUIManager.default.md#withdrawartifact) +- [withdrawSilver](Backend_GameLogic_GameUIManager.default.md#withdrawsilver) +- [create](Backend_GameLogic_GameUIManager.default.md#create) + +## Constructors + +### constructor + +• `Private` **new default**(`gameManager`, `terminalHandle`) + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------------------------------------------------------------------------------------- | +| `gameManager` | [`default`](Backend_GameLogic_GameManager.default.md) | +| `terminalHandle` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | + +#### Overrides + +EventEmitter.constructor + +## Properties + +### artifactSending + +• `Private` **artifactSending**: `Object` = `{}` + +#### Index signature + +▪ [key: `string`]: `Artifact` \| `undefined` + +--- + +### extraMinerLocations + +• `Private` **extraMinerLocations**: `WorldCoords`[] = `[]` + +--- + +### forcesSending + +• `Private` **forcesSending**: `Object` = `{}` + +#### Index signature + +▪ [key: `string`]: `number` + +--- + +### gameManager + +• `Private` `Readonly` **gameManager**: [`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### hoverPlanet$ + +• `Readonly` **hoverPlanet$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `Planet`\> + +--- + +### hoverPlanetId$ + +• `Readonly` **hoverPlanetId$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `LocationId`\> + +--- + +### isChoosingTargetPlanet + +• `Private` **isChoosingTargetPlanet**: `boolean` = `false` + +The Wormhole artifact requires you to choose a target planet. This value +indicates whether or not the player is currently selecting a target planet. + +--- + +### isSending + +• `Private` **isSending**: `boolean` = `false` + +--- + +### minerLocation + +• `Private` **minerLocation**: `undefined` \| `WorldCoords` + +--- + +### mouseDownOverCoords + +• `Private` **mouseDownOverCoords**: `undefined` \| `WorldCoords` + +--- + +### mouseDownOverPlanet + +• `Private` **mouseDownOverPlanet**: `undefined` \| `Planet` + +--- + +### mouseHoveringOverCoords + +• `Private` **mouseHoveringOverCoords**: `undefined` \| `WorldCoords` + +--- + +### mouseHoveringOverPlanet + +• `Private` **mouseHoveringOverPlanet**: `undefined` \| `Planet` + +--- + +### myArtifacts$ + +• `Readonly` **myArtifacts$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`ArtifactId`, `Artifact`\>\> + +--- + +### onChooseTargetPlanet + +• `Private` `Optional` **onChooseTargetPlanet**: (`planet`: `undefined` \| `LocatablePlanet`) => `void` + +#### Type declaration + +▸ (`planet`): `void` + +##### Parameters + +| Name | Type | +| :------- | :------------------------------- | +| `planet` | `undefined` \| `LocatablePlanet` | + +##### Returns + +`void` + +--- + +### plugins + +• `Private` **plugins**: [`PluginManager`](Backend_GameLogic_PluginManager.PluginManager.md) + +--- + +### previousSelectedPlanet + +• `Private` **previousSelectedPlanet**: `undefined` \| `Planet` + +--- + +### radiusMap + +• `Private` `Readonly` **radiusMap**: `Object` + +#### Index signature + +▪ [PlanetLevel: `number`]: `number` + +--- + +### selectedArtifact$ + +• `Readonly` **selectedArtifact$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `Artifact`\> + +--- + +### selectedArtifactId$ + +• `Readonly` **selectedArtifactId$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `ArtifactId`\> + +--- + +### selectedCoords + +• `Private` **selectedCoords**: `undefined` \| `WorldCoords` + +--- + +### selectedPlanet + +• `Private` **selectedPlanet**: `undefined` \| `Planet` + +--- + +### selectedPlanet$ + +• `Readonly` **selectedPlanet$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `Planet`\> + +--- + +### selectedPlanetId$ + +• `Readonly` **selectedPlanetId$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `LocationId`\> + +--- + +### sendingCoords + +• `Private` **sendingCoords**: `undefined` \| `WorldCoords` + +--- + +### sendingPlanet + +• `Private` **sendingPlanet**: `undefined` \| `Planet` + +--- + +### silverSending + +• `Private` **silverSending**: `Object` = `{}` + +#### Index signature + +▪ [key: `string`]: `number` + +--- + +### terminal + +• `Private` **terminal**: `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> + +--- + +### viewportEntities + +• `Private` **viewportEntities**: [`ViewportEntities`](Backend_GameLogic_ViewportEntities.ViewportEntities.md) + +## Methods + +### activateArtifact + +▸ **activateArtifact**(`locationId`, `id`, `wormholeTo?`): `void` + +#### Parameters + +| Name | Type | +| :------------ | :----------- | +| `locationId` | `LocationId` | +| `id` | `ArtifactId` | +| `wormholeTo?` | `LocationId` | + +#### Returns + +`void` + +--- + +### addAccount + +▸ **addAccount**(`coords`): `Promise`<`boolean`\> + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`Promise`<`boolean`\> + +--- + +### addNewChunk + +▸ **addNewChunk**(`chunk`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### bulkAddNewChunks + +▸ **bulkAddNewChunks**(`chunks`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :------- | :---------------------------------------------- | +| `chunks` | [`Chunk`](_types_global_GlobalTypes.Chunk.md)[] | + +#### Returns + +`Promise`<`void`\> + +--- + +### buyGPTCredits + +▸ **buyGPTCredits**(`amount`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `amount` | `number` | + +#### Returns + +`void` + +--- + +### buyHat + +▸ **buyHat**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### centerCoords + +▸ **centerCoords**(`coords`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`void` + +--- + +### centerLocationId + +▸ **centerLocationId**(`planetId`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`void` + +--- + +### centerPlanet + +▸ **centerPlanet**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`void` + +--- + +### deactivateArtifact + +▸ **deactivateArtifact**(`locationId`, `artifactId`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `locationId` | `LocationId` | +| `artifactId` | `ArtifactId` | + +#### Returns + +`void` + +--- + +### depositArtifact + +▸ **depositArtifact**(`locationId`, `artifactId`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `locationId` | `LocationId` | +| `artifactId` | `ArtifactId` | + +#### Returns + +`void` + +--- + +### destroy + +▸ **destroy**(): `void` + +#### Returns + +`void` + +--- + +### discoverBiome + +▸ **discoverBiome**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | + +#### Returns + +`void` + +--- + +### findArtifact + +▸ **findArtifact**(`planetId`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`void` + +--- + +### generateVerificationTweet + +▸ **generateVerificationTweet**(`twitter`): `Promise`<`string`\> + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `twitter` | `string` | + +#### Returns + +`Promise`<`string`\> + +--- + +### getAccount + +▸ **getAccount**(): `undefined` \| `EthAddress` + +#### Returns + +`undefined` \| `EthAddress` + +--- + +### getAllMinerLocations + +▸ **getAllMinerLocations**(): `WorldCoords`[] + +#### Returns + +`WorldCoords`[] + +--- + +### getAllOwnedPlanets + +▸ **getAllOwnedPlanets**(): `Planet`[] + +#### Returns + +`Planet`[] + +--- + +### getAllPlayers + +▸ **getAllPlayers**(): `Player`[] + +#### Returns + +`Player`[] + +--- + +### getAllVoyages + +▸ **getAllVoyages**(): `QueuedArrival`[] + +#### Returns + +`QueuedArrival`[] + +--- + +### getArtifactMap + +▸ **getArtifactMap**(): `Map`<`ArtifactId`, `Artifact`\> + +#### Returns + +`Map`<`ArtifactId`, `Artifact`\> + +--- + +### getArtifactPlanet + +▸ **getArtifactPlanet**(`artifact`): `undefined` \| `Planet` + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `artifact` | `Artifact` | + +#### Returns + +`undefined` \| `Planet` + +--- + +### getArtifactSending + +▸ **getArtifactSending**(`planetId`): `undefined` \| `Artifact` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`undefined` \| `Artifact` + +--- + +### getArtifactWithId + +▸ **getArtifactWithId**(`artifactId`): `undefined` \| `Artifact` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`undefined` \| `Artifact` + +--- + +### getArtifactsWithIds + +▸ **getArtifactsWithIds**(`artifactIds`): (`undefined` \| `Artifact`)[] + +#### Parameters + +| Name | Type | +| :------------ | :------------- | +| `artifactIds` | `ArtifactId`[] | + +#### Returns + +(`undefined` \| `Artifact`)[] + +--- + +### getBiomeKey + +▸ `Private` **getBiomeKey**(`biome`): `string` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `biome` | `Biome` | + +#### Returns + +`string` + +--- + +### getBiomePerlin + +▸ **getBiomePerlin**(`coords`, `floor`): `number` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | +| `floor` | `boolean` | + +#### Returns + +`number` + +--- + +### getBooleanSetting + +▸ **getBooleanSetting**(`setting`): `boolean` + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------ | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | + +#### Returns + +`boolean` + +--- + +### getChunk + +▸ **getChunk**(`chunkFootprint`): `undefined` \| [`Chunk`](_types_global_GlobalTypes.Chunk.md) + +#### Parameters + +| Name | Type | +| :--------------- | :------------------------------------------------------------------ | +| `chunkFootprint` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +`undefined` \| [`Chunk`](_types_global_GlobalTypes.Chunk.md) + +--- + +### getContractAddress + +▸ **getContractAddress**(): `EthAddress` + +#### Returns + +`EthAddress` + +--- + +### getContractConstants + +▸ **getContractConstants**(): [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) + +#### Returns + +[`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) + +--- + +### getConversation + +▸ **getConversation**(`artifactId`): `Promise`<`undefined` \| `Conversation`\> + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`Promise`<`undefined` \| `Conversation`\> + +--- + +### getDiagnostics + +▸ **getDiagnostics**(): [`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) + +#### Returns + +[`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) + +--- + +### getDiscoverBiomeName + +▸ **getDiscoverBiomeName**(`biome`): `string` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `biome` | `Biome` | + +#### Returns + +`string` + +--- + +### getDistCoords + +▸ **getDistCoords**(`from`, `to`): `number` + +#### Parameters + +| Name | Type | +| :----- | :------------ | +| `from` | `WorldCoords` | +| `to` | `WorldCoords` | + +#### Returns + +`number` + +--- + +### getEndTimeSeconds + +▸ **getEndTimeSeconds**(): `number` + +#### Returns + +`number` + +--- + +### getEnergyArrivingForMove + +▸ **getEnergyArrivingForMove**(`from`, `to`, `dist`, `energy`): `number` + +#### Parameters + +| Name | Type | +| :------- | :-------------------------- | +| `from` | `LocationId` | +| `to` | `undefined` \| `LocationId` | +| `dist` | `undefined` \| `number` | +| `energy` | `number` | + +#### Returns + +`number` + +--- + +### getEnergyCurveAtPercent + +▸ **getEnergyCurveAtPercent**(`planet`, `percent`): `number` + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `planet` | `Planet` | +| `percent` | `number` | + +#### Returns + +`number` + +--- + +### getEnergyOfPlayer + +▸ **getEnergyOfPlayer**(`player`): `number` + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `player` | `EthAddress` | + +#### Returns + +`number` + +--- + +### getEthConnection + +▸ **getEthConnection**(): [`default`](Backend_Network_EthConnection.default.md) + +#### Returns + +[`default`](Backend_Network_EthConnection.default.md) + +--- + +### getExploredChunks + +▸ **getExploredChunks**(): `Iterable`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> + +#### Returns + +`Iterable`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> + +--- + +### getForcesSending + +▸ **getForcesSending**(`planetId`): `number` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`number` + +--- + +### getGameManager + +▸ **getGameManager**(): [`default`](Backend_GameLogic_GameManager.default.md) + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### getGameObjects + +▸ **getGameObjects**(): [`GameObjects`](Backend_GameLogic_GameObjects.GameObjects.md) + +Gets a reference to the game's internal representation of the world state. Beware! Use this for +reading only, otherwise you might mess up the state of the game. You can try modifying the game +state in some way + +#### Returns + +[`GameObjects`](Backend_GameLogic_GameObjects.GameObjects.md) + +--- + +### getGptCreditBalanceEmitter + +▸ **getGptCreditBalanceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +--- + +### getGptCreditPriceEmitter + +▸ **getGptCreditPriceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +--- + +### getHashConfig + +▸ **getHashConfig**(): [`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) + +#### Returns + +[`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) + +--- + +### getHashesPerSec + +▸ **getHashesPerSec**(): `number` + +#### Returns + +`number` + +--- + +### getHomeCoords + +▸ **getHomeCoords**(): `WorldCoords` + +#### Returns + +`WorldCoords` + +--- + +### getHomeHash + +▸ **getHomeHash**(): `undefined` \| `LocationId` + +#### Returns + +`undefined` \| `LocationId` + +--- + +### getHomePlanet + +▸ **getHomePlanet**(): `undefined` \| `Planet` + +#### Returns + +`undefined` \| `Planet` + +--- + +### getHoveringOverCoords + +▸ **getHoveringOverCoords**(): `undefined` \| `WorldCoords` + +#### Returns + +`undefined` \| `WorldCoords` + +--- + +### getHoveringOverPlanet + +▸ **getHoveringOverPlanet**(): `undefined` \| `Planet` + +#### Returns + +`undefined` \| `Planet` + +--- + +### getIsBuyingCreditsEmitter + +▸ **getIsBuyingCreditsEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> + +--- + +### getIsChoosingTargetPlanet + +▸ **getIsChoosingTargetPlanet**(): `boolean` + +#### Returns + +`boolean` + +--- + +### getIsHighPerfMode + +▸ **getIsHighPerfMode**(): `boolean` + +#### Returns + +`boolean` + +--- + +### getLocationOfPlanet + +▸ **getLocationOfPlanet**(`planetId`): `undefined` \| `WorldLocation` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`undefined` \| `WorldLocation` + +--- + +### getLocationsAndChunks + +▸ **getLocationsAndChunks**(): `Object` + +#### Returns + +`Object` + +| Name | Type | +| :-------------- | :--------------------------------------------------------------------------------------------------------------- | +| `cachedPlanets` | `Map`<`LocationId`, [`PlanetRenderInfo`](../interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md)\> | +| `chunks` | `Set`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> | + +--- + +### getMinerLocation + +▸ **getMinerLocation**(): `undefined` \| `WorldCoords` + +#### Returns + +`undefined` \| `WorldCoords` + +--- + +### getMiningPattern + +▸ **getMiningPattern**(): `undefined` \| [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) + +#### Returns + +`undefined` \| [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) + +--- + +### getMouseDownCoords + +▸ **getMouseDownCoords**(): `undefined` \| `WorldCoords` + +#### Returns + +`undefined` \| `WorldCoords` + +--- + +### getMouseDownPlanet + +▸ **getMouseDownPlanet**(): `undefined` \| `Planet` + +#### Returns + +`undefined` \| `Planet` + +--- + +### getMyArtifactMap + +▸ **getMyArtifactMap**(): `Map`<`ArtifactId`, `Artifact`\> + +#### Returns + +`Map`<`ArtifactId`, `Artifact`\> + +--- + +### getMyArtifacts + +▸ **getMyArtifacts**(): `Artifact`[] + +#### Returns + +`Artifact`[] + +--- + +### getMyArtifactsNotOnPlanet + +▸ **getMyArtifactsNotOnPlanet**(): `Artifact`[] + +#### Returns + +`Artifact`[] + +--- + +### getMyBalance + +▸ **getMyBalance**(): `number` + +#### Returns + +`number` + +--- + +### getMyBalanceEmitter + +▸ **getMyBalanceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +#### Returns + +[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +--- + +### getMyPlanetMap + +▸ **getMyPlanetMap**(): `Map`<`LocationId`, `Planet`\> + +#### Returns + +`Map`<`LocationId`, `Planet`\> + +--- + +### getMyScore + +▸ **getMyScore**(): `number` + +#### Returns + +`number` + +--- + +### getNextBroadcastAvailableTimestamp + +▸ **getNextBroadcastAvailableTimestamp**(): `number` + +#### Returns + +`number` + +--- + +### getPerlinConfig + +▸ **getPerlinConfig**(`isBiome?`): `PerlinConfig` + +#### Parameters + +| Name | Type | Default value | +| :-------- | :-------- | :------------ | +| `isBiome` | `boolean` | `false` | + +#### Returns + +`PerlinConfig` + +--- + +### getPerlinThresholds + +▸ **getPerlinThresholds**(): [`number`, `number`, `number`] + +#### Returns + +[`number`, `number`, `number`] + +--- + +### getPlanetLevel + +▸ **getPlanetLevel**(`planetId`): `undefined` \| `PlanetLevel` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`undefined` \| `PlanetLevel` + +--- + +### getPlanetMap + +▸ **getPlanetMap**(): `Map`<`LocationId`, `Planet`\> + +#### Returns + +`Map`<`LocationId`, `Planet`\> + +--- + +### getPlanetWithCoords + +▸ **getPlanetWithCoords**(`coords`): `undefined` \| `Planet` + +#### Parameters + +| Name | Type | +| :------- | :--------------------------- | +| `coords` | `undefined` \| `WorldCoords` | + +#### Returns + +`undefined` \| `Planet` + +--- + +### getPlanetWithId + +▸ **getPlanetWithId**(`planetId`): `undefined` \| `Planet` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`undefined` \| `Planet` + +--- + +### getPlanetsInViewport + +▸ **getPlanetsInViewport**(): `Planet`[] + +#### Returns + +`Planet`[] + +--- + +### getPluginManager + +▸ **getPluginManager**(): [`PluginManager`](Backend_GameLogic_PluginManager.PluginManager.md) + +#### Returns + +[`PluginManager`](Backend_GameLogic_PluginManager.PluginManager.md) + +--- + +### getPreviousSelectedPlanet + +▸ **getPreviousSelectedPlanet**(): `undefined` \| `Planet` + +#### Returns + +`undefined` \| `Planet` + +--- + +### getPrivateKey + +▸ **getPrivateKey**(): `string` + +#### Returns + +`string` + +--- + +### getRadiusOfPlanetLevel + +▸ **getRadiusOfPlanetLevel**(`planetRarity`): `number` + +#### Parameters + +| Name | Type | +| :------------- | :------------ | +| `planetRarity` | `PlanetLevel` | + +#### Returns + +`number` + +--- + +### getSelectedCoords + +▸ **getSelectedCoords**(): `undefined` \| `WorldCoords` + +#### Returns + +`undefined` \| `WorldCoords` + +--- + +### getSelectedPlanet + +▸ **getSelectedPlanet**(): `undefined` \| `Planet` + +#### Returns + +`undefined` \| `Planet` + +--- + +### getSilverCurveAtPercent + +▸ **getSilverCurveAtPercent**(`planet`, `percent`): `undefined` \| `number` + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `planet` | `Planet` | +| `percent` | `number` | + +#### Returns + +`undefined` \| `number` + +--- + +### getSilverOfPlayer + +▸ **getSilverOfPlayer**(`player`): `number` + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `player` | `EthAddress` | + +#### Returns + +`number` + +--- + +### getSilverSending + +▸ **getSilverSending**(`planetId`): `number` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`number` + +--- + +### getSpaceTypePerlin + +▸ **getSpaceTypePerlin**(`coords`, `floor`): `number` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | +| `floor` | `boolean` | + +#### Returns + +`number` + +--- + +### getStringSetting + +▸ **getStringSetting**(`setting`): `undefined` \| `string` + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------ | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | + +#### Returns + +`undefined` \| `string` + +--- + +### getTerminal + +▸ **getTerminal**(): `undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md) + +#### Returns + +`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md) + +--- + +### getTwitter + +▸ **getTwitter**(`address`): `undefined` \| `string` + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------- | +| `address` | `undefined` \| `EthAddress` | + +#### Returns + +`undefined` \| `string` + +--- + +### getUnconfirmedMoves + +▸ **getUnconfirmedMoves**(): `UnconfirmedMove`[] + +**`todo`** delete this. now that [GameObjects](Backend_GameLogic_GameObjects.GameObjects.md) is publically accessible, we shouldn't need to +drill fields like this anymore. + +**`tutorial`** Plugin developers, please access fields like this with something like {@code df.getGameObjects().} + +**`deprecated`** + +#### Returns + +`UnconfirmedMove`[] + +--- + +### getUnconfirmedUpgrades + +▸ **getUnconfirmedUpgrades**(): `UnconfirmedUpgrade`[] + +#### Returns + +`UnconfirmedUpgrade`[] + +--- + +### getUnconfirmedWormholeActivations + +▸ **getUnconfirmedWormholeActivations**(): `UnconfirmedActivateArtifact`[] + +#### Returns + +`UnconfirmedActivateArtifact`[] + +--- + +### getUniverseTotalEnergy + +▸ **getUniverseTotalEnergy**(): `number` + +#### Returns + +`number` + +--- + +### getUpgrade + +▸ **getUpgrade**(`branch`, `level`): `Upgrade` + +#### Parameters + +| Name | Type | +| :------- | :------------------ | +| `branch` | `UpgradeBranchName` | +| `level` | `number` | + +#### Returns + +`Upgrade` + +--- + +### getViewport + +▸ **getViewport**(): [`default`](Frontend_Game_Viewport.default.md) + +#### Returns + +[`default`](Frontend_Game_Viewport.default.md) + +--- + +### getWithdrawnSilverOfPlayer + +▸ **getWithdrawnSilverOfPlayer**(`player`): `number` + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `player` | `EthAddress` | + +#### Returns + +`number` + +--- + +### getWorldRadius + +▸ **getWorldRadius**(): `number` + +#### Returns + +`number` + +--- + +### getWorldSilver + +▸ **getWorldSilver**(): `number` + +#### Returns + +`number` + +--- + +### getWormholes + +▸ **getWormholes**(): `Iterable`<[`Wormhole`](../modules/_types_global_GlobalTypes.md#wormhole)\> + +#### Returns + +`Iterable`<[`Wormhole`](../modules/_types_global_GlobalTypes.md#wormhole)\> + +--- + +### hasMinedChunk + +▸ **hasMinedChunk**(`chunkLocation`): `boolean` + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------------------ | +| `chunkLocation` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +`boolean` + +--- + +### isCurrentlyRevealing + +▸ **isCurrentlyRevealing**(): `boolean` + +#### Returns + +`boolean` + +--- + +### isMining + +▸ **isMining**(): `boolean` + +#### Returns + +`boolean` + +--- + +### isOverOwnPlanet + +▸ **isOverOwnPlanet**(`coords`): `undefined` \| `Planet` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`undefined` \| `Planet` + +--- + +### isOwnedByMe + +▸ **isOwnedByMe**(`planet`): `boolean` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`boolean` + +--- + +### isRoundOver + +▸ **isRoundOver**(): `boolean` + +#### Returns + +`boolean` + +--- + +### joinGame + +▸ **joinGame**(`beforeRetry`): [`default`](Backend_GameLogic_GameUIManager.default.md) + +#### Parameters + +| Name | Type | +| :------------ | :-------------------------------------- | +| `beforeRetry` | (`e`: `Error`) => `Promise`<`boolean`\> | + +#### Returns + +[`default`](Backend_GameLogic_GameUIManager.default.md) + +--- + +### onDiscoveredChunk + +▸ **onDiscoveredChunk**(`chunk`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### onEmitInitializedPlayer + +▸ `Private` **onEmitInitializedPlayer**(): `void` + +#### Returns + +`void` + +--- + +### onEmitInitializedPlayerError + +▸ `Private` **onEmitInitializedPlayerError**(`err`): `void` + +#### Parameters + +| Name | Type | +| :---- | :---------- | +| `err` | `ReactNode` | + +#### Returns + +`void` + +--- + +### onMouseClick + +▸ **onMouseClick**(`_coords`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------ | +| `_coords` | `WorldCoords` | + +#### Returns + +`void` + +--- + +### onMouseDown + +▸ **onMouseDown**(`coords`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`void` + +--- + +### onMouseMove + +▸ **onMouseMove**(`coords`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`void` + +--- + +### onMouseOut + +▸ **onMouseOut**(): `void` + +#### Returns + +`void` + +--- + +### onMouseUp + +▸ **onMouseUp**(`coords`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`void` + +--- + +### onSendCancel + +▸ **onSendCancel**(): `void` + +#### Returns + +`void` + +--- + +### onSendInit + +▸ **onSendInit**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`void` + +--- + +### prospectPlanet + +▸ **prospectPlanet**(`planetId`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`void` + +--- + +### removeExtraMinerLocation + +▸ **removeExtraMinerLocation**(`idx`): `void` + +#### Parameters + +| Name | Type | +| :---- | :------- | +| `idx` | `number` | + +#### Returns + +`void` + +--- + +### revealLocation + +▸ **revealLocation**(`locationId`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `locationId` | `LocationId` | + +#### Returns + +`void` + +--- + +### setArtifactSending + +▸ **setArtifactSending**(`planetId`, `artifact?`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :----------- | +| `planetId` | `LocationId` | +| `artifact?` | `Artifact` | + +#### Returns + +`void` + +--- + +### setExtraMinerLocation + +▸ **setExtraMinerLocation**(`idx`, `coords`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `idx` | `number` | +| `coords` | `WorldCoords` | + +#### Returns + +`void` + +--- + +### setForcesSending + +▸ **setForcesSending**(`planetId`, `percentage`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `planetId` | `LocationId` | +| `percentage` | `number` | + +#### Returns + +`void` + +--- + +### setHoveringOverPlanet + +▸ `Private` **setHoveringOverPlanet**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`void` + +--- + +### setMiningPattern + +▸ **setMiningPattern**(`pattern`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------- | +| `pattern` | [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) | + +#### Returns + +`void` + +--- + +### setSelectedId + +▸ **setSelectedId**(`id`): `void` + +#### Parameters + +| Name | Type | +| :--- | :----------- | +| `id` | `LocationId` | + +#### Returns + +`void` + +--- + +### setSelectedPlanet + +▸ **setSelectedPlanet**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`void` + +--- + +### setSilverSending + +▸ **setSilverSending**(`planetId`, `percentage`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `planetId` | `LocationId` | +| `percentage` | `number` | + +#### Returns + +`void` + +--- + +### spaceTypeFromPerlin + +▸ **spaceTypeFromPerlin**(`perlin`): `SpaceType` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `perlin` | `number` | + +#### Returns + +`SpaceType` + +--- + +### startConversation + +▸ **startConversation**(`artifactId`): `Promise`<`Conversation`\> + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`Promise`<`Conversation`\> + +--- + +### startExplore + +▸ **startExplore**(): `void` + +#### Returns + +`void` + +--- + +### startWormholeFrom + +▸ **startWormholeFrom**(`planet`): `Promise`<`undefined` \| `LocatablePlanet`\> + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | + +#### Returns + +`Promise`<`undefined` \| `LocatablePlanet`\> + +--- + +### stepConversation + +▸ **stepConversation**(`artifactId`, `message`): `Promise`<`Conversation`\> + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | +| `message` | `string` | + +#### Returns + +`Promise`<`Conversation`\> + +--- + +### stopExplore + +▸ **stopExplore**(): `void` + +#### Returns + +`void` + +--- + +### updateDiagnostics + +▸ **updateDiagnostics**(`updateFn`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------------------------------------------------------------------------- | +| `updateFn` | (`d`: [`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md)) => `void` | + +#### Returns + +`void` + +--- + +### updateMouseHoveringOverCoords + +▸ `Private` **updateMouseHoveringOverCoords**(`coords`): `WorldCoords` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`WorldCoords` + +--- + +### updatePlanets + +▸ `Private` **updatePlanets**(): `void` + +#### Returns + +`void` + +--- + +### upgrade + +▸ **upgrade**(`planet`, `branch`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | +| `branch` | `number` | + +#### Returns + +`void` + +--- + +### verifyTwitter + +▸ **verifyTwitter**(`twitter`): `Promise`<`boolean`\> + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `twitter` | `string` | + +#### Returns + +`Promise`<`boolean`\> + +--- + +### withdrawArtifact + +▸ **withdrawArtifact**(`locationId`, `artifactId`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `locationId` | `LocationId` | +| `artifactId` | `ArtifactId` | + +#### Returns + +`void` + +--- + +### withdrawSilver + +▸ **withdrawSilver**(`locationId`, `amount`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `locationId` | `LocationId` | +| `amount` | `number` | + +#### Returns + +`void` + +--- + +### create + +▸ `Static` **create**(`gameManager`, `terminalHandle`): `Promise`<[`default`](Backend_GameLogic_GameUIManager.default.md)\> + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------------------------------------------------------------------------------------- | +| `gameManager` | [`default`](Backend_GameLogic_GameManager.default.md) | +| `terminalHandle` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | + +#### Returns + +`Promise`<[`default`](Backend_GameLogic_GameUIManager.default.md)\> diff --git a/docs/classes/Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md b/docs/classes/Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md new file mode 100644 index 00000000..e7b3623a --- /dev/null +++ b/docs/classes/Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md @@ -0,0 +1,81 @@ +# Class: InitialGameStateDownloader + +[Backend/GameLogic/InitialGameStateDownloader](../modules/Backend_GameLogic_InitialGameStateDownloader.md).InitialGameStateDownloader + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md#constructor) + +### Properties + +- [terminal](Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md#terminal) + +### Methods + +- [download](Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md#download) +- [makeProgressListener](Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md#makeprogresslistener) + +## Constructors + +### constructor + +• **new InitialGameStateDownloader**(`terminal`) + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------------------------------------------------------- | +| `terminal` | [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md) | + +## Properties + +### terminal + +• `Private` **terminal**: [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md) + +## Methods + +### download + +▸ **download**(`contractsAPI`, `persistentChunkStore`): `Promise`<[`InitialGameState`](../interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md)\> + +#### Parameters + +| Name | Type | +| :--------------------- | :----------------------------------------------------------- | +| `contractsAPI` | [`default`](Backend_GameLogic_ContractsAPI.default.md) | +| `persistentChunkStore` | [`default`](Backend_Storage_PersistentChunkStore.default.md) | + +#### Returns + +`Promise`<[`InitialGameState`](../interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md)\> + +--- + +### makeProgressListener + +▸ `Private` **makeProgressListener**(`prettyEntityName`): (`percent`: `number`) => `void` + +#### Parameters + +| Name | Type | +| :----------------- | :------- | +| `prettyEntityName` | `string` | + +#### Returns + +`fn` + +▸ (`percent`): `void` + +##### Parameters + +| Name | Type | +| :-------- | :------- | +| `percent` | `number` | + +##### Returns + +`void` diff --git a/docs/classes/Backend_GameLogic_LayeredMap.LayeredMap.md b/docs/classes/Backend_GameLogic_LayeredMap.LayeredMap.md new file mode 100644 index 00000000..4cfad53d --- /dev/null +++ b/docs/classes/Backend_GameLogic_LayeredMap.LayeredMap.md @@ -0,0 +1,91 @@ +# Class: LayeredMap + +[Backend/GameLogic/LayeredMap](../modules/Backend_GameLogic_LayeredMap.md).LayeredMap + +Data structure which allows us to efficiently query for "which planets between level X and X + n +(for positive n) are present in the given world rectangle", as well as, in the future, "which +chunks are visible in the vieport". + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_LayeredMap.LayeredMap.md#constructor) + +### Properties + +- [insertedLocations](Backend_GameLogic_LayeredMap.LayeredMap.md#insertedlocations) +- [perLevelPlanetQuadtrees](Backend_GameLogic_LayeredMap.LayeredMap.md#perlevelplanetquadtrees) + +### Methods + +- [getPlanets](Backend_GameLogic_LayeredMap.LayeredMap.md#getplanets) +- [insertPlanet](Backend_GameLogic_LayeredMap.LayeredMap.md#insertplanet) + +## Constructors + +### constructor + +• **new LayeredMap**(`worldRadius`) + +#### Parameters + +| Name | Type | +| :------------ | :------- | +| `worldRadius` | `number` | + +## Properties + +### insertedLocations + +• `Private` **insertedLocations**: `Set`<`LocationId`\> + +--- + +### perLevelPlanetQuadtrees + +• `Private` **perLevelPlanetQuadtrees**: `Map`<`number`, `QuadTree`\> + +## Methods + +### getPlanets + +▸ **getPlanets**(`worldX`, `worldY`, `worldWidth`, `worldHeight`, `planetLevels`, `planetLevelToRadii`): `LocationId`[] + +Gets the ids of all the planets that are both within the given bounding box (defined by its bottom +left coordinate, width, and height) in the world and of a level that was passed in via the +`planetLevels` parameter. + +#### Parameters + +| Name | Type | +| :------------------- | :------------------------------------------------------------------------------------- | +| `worldX` | `number` | +| `worldY` | `number` | +| `worldWidth` | `number` | +| `worldHeight` | `number` | +| `planetLevels` | `number`[] | +| `planetLevelToRadii` | `Map`<`number`, [`Radii`](../interfaces/Backend_GameLogic_ViewportEntities.Radii.md)\> | + +#### Returns + +`LocationId`[] + +--- + +### insertPlanet + +▸ **insertPlanet**(`location`, `planetLevel`): `void` + +Records the fact that there is a planet at the given world location. + +#### Parameters + +| Name | Type | +| :------------ | :-------------- | +| `location` | `WorldLocation` | +| `planetLevel` | `number` | + +#### Returns + +`void` diff --git a/docs/classes/Backend_GameLogic_PaidConversationManager.PaidConversationManager.md b/docs/classes/Backend_GameLogic_PaidConversationManager.PaidConversationManager.md new file mode 100644 index 00000000..2808a614 --- /dev/null +++ b/docs/classes/Backend_GameLogic_PaidConversationManager.PaidConversationManager.md @@ -0,0 +1,170 @@ +# Class: PaidConversationManager + +[Backend/GameLogic/PaidConversationManager](../modules/Backend_GameLogic_PaidConversationManager.md).PaidConversationManager + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#constructor) + +### Properties + +- [artifact](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#artifact) +- [conversation](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#conversation) +- [gameUIManager](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#gameuimanager) +- [setConversation](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#setconversation) +- [setLoading](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#setloading) +- [terminal](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#terminal) + +### Methods + +- [getQuestionsRemaining](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#getquestionsremaining) +- [printAllMessages](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#printallmessages) +- [printClean](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#printclean) +- [printMessage](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#printmessage) +- [start](Backend_GameLogic_PaidConversationManager.PaidConversationManager.md#start) + +## Constructors + +### constructor + +• **new PaidConversationManager**(`gameUIManager`, `terminal`, `setConversation`, `setLoading`, `artifact`) + +#### Parameters + +| Name | Type | +| :---------------- | :-------------------------------------------------------------------------------------------------------------- | +| `gameUIManager` | [`default`](Backend_GameLogic_GameUIManager.default.md) | +| `terminal` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | +| `setConversation` | (`conversation`: `Conversation`) => `void` | +| `setLoading` | (`loading`: `boolean`) => `void` | +| `artifact` | `Artifact` | + +## Properties + +### artifact + +• `Private` **artifact**: `Artifact` + +--- + +### conversation + +• `Private` **conversation**: `undefined` \| `Conversation` + +--- + +### gameUIManager + +• `Private` **gameUIManager**: [`default`](Backend_GameLogic_GameUIManager.default.md) + +--- + +### setConversation + +• `Private` **setConversation**: (`conversation`: `undefined` \| `Conversation`) => `void` + +#### Type declaration + +▸ (`conversation`): `void` + +##### Parameters + +| Name | Type | +| :------------- | :---------------------------- | +| `conversation` | `undefined` \| `Conversation` | + +##### Returns + +`void` + +--- + +### setLoading + +• `Private` **setLoading**: (`loading`: `boolean`) => `void` + +#### Type declaration + +▸ (`loading`): `void` + +##### Parameters + +| Name | Type | +| :-------- | :-------- | +| `loading` | `boolean` | + +##### Returns + +`void` + +--- + +### terminal + +• `Private` **terminal**: `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> + +## Methods + +### getQuestionsRemaining + +▸ **getQuestionsRemaining**(): `undefined` \| `number` + +#### Returns + +`undefined` \| `number` + +--- + +### printAllMessages + +▸ `Private` **printAllMessages**(): `void` + +#### Returns + +`void` + +--- + +### printClean + +▸ `Private` **printClean**(`message`, `style?`, `hoverContents?`): `void` + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------------------------------------------------------- | +| `message` | `string` | +| `style?` | [`TerminalTextStyle`](../enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md) | +| `hoverContents?` | () => `Element` | + +#### Returns + +`void` + +--- + +### printMessage + +▸ `Private` **printMessage**(`message`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :-------- | +| `message` | `Message` | + +#### Returns + +`void` + +--- + +### start + +▸ **start**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> diff --git a/docs/classes/Backend_GameLogic_PluginManager.PluginManager.md b/docs/classes/Backend_GameLogic_PluginManager.PluginManager.md new file mode 100644 index 00000000..7b218c33 --- /dev/null +++ b/docs/classes/Backend_GameLogic_PluginManager.PluginManager.md @@ -0,0 +1,405 @@ +# Class: PluginManager + +[Backend/GameLogic/PluginManager](../modules/Backend_GameLogic_PluginManager.md).PluginManager + +This class keeps track of all the plugins that this player has loaded +into their game. Acts as a task manager, supports all CRUD operations +for plugins, as well as instantiating and destroying running plugins. +All library operations are also persisted to IndexDB. + +Important! Does not run plugins until the user clicks 'run' somewhere in +this UI. This is important, because if someone develops a buggy plugin, +it would suck if that bricked their game. + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_PluginManager.PluginManager.md#constructor) + +### Properties + +- [gameManager](Backend_GameLogic_PluginManager.PluginManager.md#gamemanager) +- [pluginLibrary](Backend_GameLogic_PluginManager.PluginManager.md#pluginlibrary) +- [pluginProcessInfos](Backend_GameLogic_PluginManager.PluginManager.md#pluginprocessinfos) +- [pluginProcesses](Backend_GameLogic_PluginManager.PluginManager.md#pluginprocesses) +- [plugins$](Backend_GameLogic_PluginManager.PluginManager.md#plugins$) + +### Methods + +- [addPluginToLibrary](Backend_GameLogic_PluginManager.PluginManager.md#addplugintolibrary) +- [deletePlugin](Backend_GameLogic_PluginManager.PluginManager.md#deleteplugin) +- [destroy](Backend_GameLogic_PluginManager.PluginManager.md#destroy) +- [drawAllRunningPlugins](Backend_GameLogic_PluginManager.PluginManager.md#drawallrunningplugins) +- [getAllProcessInfos](Backend_GameLogic_PluginManager.PluginManager.md#getallprocessinfos) +- [getLibrary](Backend_GameLogic_PluginManager.PluginManager.md#getlibrary) +- [getPluginFromLibrary](Backend_GameLogic_PluginManager.PluginManager.md#getpluginfromlibrary) +- [getProcessInfo](Backend_GameLogic_PluginManager.PluginManager.md#getprocessinfo) +- [hasPlugin](Backend_GameLogic_PluginManager.PluginManager.md#hasplugin) +- [load](Backend_GameLogic_PluginManager.PluginManager.md#load) +- [notifyPluginLibraryUpdated](Backend_GameLogic_PluginManager.PluginManager.md#notifypluginlibraryupdated) +- [onNewEmbeddedPlugins](Backend_GameLogic_PluginManager.PluginManager.md#onnewembeddedplugins) +- [overwritePlugin](Backend_GameLogic_PluginManager.PluginManager.md#overwriteplugin) +- [render](Backend_GameLogic_PluginManager.PluginManager.md#render) +- [reorderPlugins](Backend_GameLogic_PluginManager.PluginManager.md#reorderplugins) +- [spawn](Backend_GameLogic_PluginManager.PluginManager.md#spawn) +- [copy](Backend_GameLogic_PluginManager.PluginManager.md#copy) + +## Constructors + +### constructor + +• **new PluginManager**(`gameManager`) + +#### Parameters + +| Name | Type | +| :------------ | :---------------------------------------------------- | +| `gameManager` | [`default`](Backend_GameLogic_GameManager.default.md) | + +## Properties + +### gameManager + +• `Private` **gameManager**: [`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### pluginLibrary + +• `Private` **pluginLibrary**: [`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[] + +All the plugins in the player's library. Not all of the player's plugins +are running, and therefore not all exist in `pluginInstances`. +`PluginsManager` keeps this field in sync with the plugins the user has +saved in the IndexDB via {@link PersistentChunkStore} + +--- + +### pluginProcessInfos + +• `Private` **pluginProcessInfos**: `Record`<`string`, [`ProcessInfo`](Backend_GameLogic_PluginManager.ProcessInfo.md)\> + +parallel to pluginProcesses + +--- + +### pluginProcesses + +• `Private` **pluginProcesses**: `Record`<`string`, [`PluginProcess`](../interfaces/Backend_Plugins_PluginProcess.PluginProcess.md)\> + +Plugins that are currently loaded into the game, and are rendering into a +window. `PluginsManager` makes sure that when a plugin starts executing, it +is added into `pluginInstances`, and that once a plugin is unloaded, its +`.destroy()` method is called, and that the plugin is removed from +`pluginInstances`. + +--- + +### plugins$ + +• **plugins$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<[`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[]\> + +Event emitter that publishes whenever the set of plugins changes. + +## Methods + +### addPluginToLibrary + +▸ **addPluginToLibrary**(`id`, `name`, `code`): [`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md) + +adds a new plugin into the plugin library. + +#### Parameters + +| Name | Type | +| :----- | :-------------------------------------------------------------------- | +| `id` | [`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid) | +| `name` | `string` | +| `code` | `string` | + +#### Returns + +[`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md) + +--- + +### deletePlugin + +▸ **deletePlugin**(`pluginId`): `Promise`<`void`\> + +Remove the given plugin both from the player's library, and kills +the plugin if it is running. + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------------------------------------------------- | +| `pluginId` | [`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid) | + +#### Returns + +`Promise`<`void`\> + +--- + +### destroy + +▸ **destroy**(`id`): `void` + +If a plugin with the given id is running, call its `.destroy()` method, +and remove it from `pluginInstances`. Stop listening for new local plugins. + +#### Parameters + +| Name | Type | +| :--- | :-------------------------------------------------------------------- | +| `id` | [`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid) | + +#### Returns + +`void` + +--- + +### drawAllRunningPlugins + +▸ **drawAllRunningPlugins**(`ctx`): `void` + +For each currently running plugin, if the plugin has a 'draw' +function, then draw that plugin to the screen. + +#### Parameters + +| Name | Type | +| :---- | :------------------------- | +| `ctx` | `CanvasRenderingContext2D` | + +#### Returns + +`void` + +--- + +### getAllProcessInfos + +▸ **getAllProcessInfos**(): `Map`<[`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid), [`ProcessInfo`](Backend_GameLogic_PluginManager.ProcessInfo.md)\> + +Gets a map of all the currently running processes + +#### Returns + +`Map`<[`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid), [`ProcessInfo`](Backend_GameLogic_PluginManager.ProcessInfo.md)\> + +--- + +### getLibrary + +▸ **getLibrary**(): [`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[] + +Gets all the plugins in this player's library. + +#### Returns + +[`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[] + +--- + +### getPluginFromLibrary + +▸ **getPluginFromLibrary**(`id?`): `undefined` \| [`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md) + +Gets the serialized plugin with the given id from the player's plugin +library. `undefined` if no plugin exists. + +#### Parameters + +| Name | Type | +| :---- | :-------------------------------------------------------------------- | +| `id?` | [`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid) | + +#### Returns + +`undefined` \| [`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md) + +--- + +### getProcessInfo + +▸ **getProcessInfo**(`id`): [`ProcessInfo`](Backend_GameLogic_PluginManager.ProcessInfo.md) + +If this process has been started, gets its info + +#### Parameters + +| Name | Type | +| :--- | :-------------------------------------------------------------------- | +| `id` | [`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid) | + +#### Returns + +[`ProcessInfo`](Backend_GameLogic_PluginManager.ProcessInfo.md) + +--- + +### hasPlugin + +▸ `Private` **hasPlugin**(`plugin`): `boolean` + +#### Parameters + +| Name | Type | +| :------- | :--------------------------------------------------------------------------------------- | +| `plugin` | [`EmbeddedPlugin`](../interfaces/Backend_Plugins_EmbeddedPluginLoader.EmbeddedPlugin.md) | + +#### Returns + +`boolean` + +--- + +### load + +▸ **load**(): `Promise`<`void`\> + +Load all plugins from this disk into `pluginLibrary`. Insert the default +plugins into the player's library if the default plugins have never been +added before. Effectively idempotent after the first time you call it. + +#### Returns + +`Promise`<`void`\> + +--- + +### notifyPluginLibraryUpdated + +▸ `Private` **notifyPluginLibraryUpdated**(): `void` + +#### Returns + +`void` + +--- + +### onNewEmbeddedPlugins + +▸ `Private` **onNewEmbeddedPlugins**(`newPlugins`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------------------------------------------------------------------------------------- | +| `newPlugins` | [`EmbeddedPlugin`](../interfaces/Backend_Plugins_EmbeddedPluginLoader.EmbeddedPlugin.md)[] | + +#### Returns + +`void` + +--- + +### overwritePlugin + +▸ **overwritePlugin**(`newName`, `pluginCode`, `id`): `void` + +1. kills the plugin if it's running +2. edits the plugin-library version of this plugin +3. if a plugin was edited, save the plugin library to disk + +#### Parameters + +| Name | Type | +| :----------- | :-------------------------------------------------------------------- | +| `newName` | `string` | +| `pluginCode` | `string` | +| `id` | [`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid) | + +#### Returns + +`void` + +--- + +### render + +▸ **render**(`id`, `element`): `Promise`<`void`\> + +If this plugin's `render` method has not been called yet, then +call it! Remembers that this plugin has been rendered. + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------------------------------------------------- | +| `id` | [`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid) | +| `element` | `HTMLDivElement` | + +#### Returns + +`Promise`<`void`\> + +--- + +### reorderPlugins + +▸ **reorderPlugins**(`newPluginIdOrder`): `void` + +Reorders the current plugins. plugin ids in `newPluginIdOrder` must correspond +1:1 to plugins in the plugin library. + +#### Parameters + +| Name | Type | +| :----------------- | :--------- | +| `newPluginIdOrder` | `string`[] | + +#### Returns + +`void` + +--- + +### spawn + +▸ **spawn**(`id`): `Promise`<`undefined` \| [`PluginProcess`](../interfaces/Backend_Plugins_PluginProcess.PluginProcess.md)\> + +Either spawns the given plugin by evaluating its `pluginCode`, or +returns the already running plugin instance. If starting a plugin +throws an error then returns `undefined`. + +#### Parameters + +| Name | Type | +| :--- | :-------------------------------------------------------------------- | +| `id` | [`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid) | + +#### Returns + +`Promise`<`undefined` \| [`PluginProcess`](../interfaces/Backend_Plugins_PluginProcess.PluginProcess.md)\> + +--- + +### copy + +▸ `Static` `Private` **copy**<`T`\>(`plugin`): `T` + +To prevent users of this class from modifying our plugins library, +we return clones of the plugins. This should probably be a function +in a Utils file somewhere, but I thought I should leave a good comment +about why we return copies of the plugins from the library. + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | +| :------- | :--- | +| `plugin` | `T` | + +#### Returns + +`T` diff --git a/docs/classes/Backend_GameLogic_PluginManager.ProcessInfo.md b/docs/classes/Backend_GameLogic_PluginManager.ProcessInfo.md new file mode 100644 index 00000000..efa50cc6 --- /dev/null +++ b/docs/classes/Backend_GameLogic_PluginManager.ProcessInfo.md @@ -0,0 +1,36 @@ +# Class: ProcessInfo + +[Backend/GameLogic/PluginManager](../modules/Backend_GameLogic_PluginManager.md).ProcessInfo + +Represents book-keeping information about a running process. We keep it +separate from the process code, so that the plugin doesn't accidentally +overwrite this information. + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_PluginManager.ProcessInfo.md#constructor) + +### Properties + +- [hasError](Backend_GameLogic_PluginManager.ProcessInfo.md#haserror) +- [rendered](Backend_GameLogic_PluginManager.ProcessInfo.md#rendered) + +## Constructors + +### constructor + +• **new ProcessInfo**() + +## Properties + +### hasError + +• **hasError**: `boolean` = `false` + +--- + +### rendered + +• **rendered**: `boolean` = `false` diff --git a/docs/classes/Backend_GameLogic_TutorialManager.default.md b/docs/classes/Backend_GameLogic_TutorialManager.default.md new file mode 100644 index 00000000..fac02d47 --- /dev/null +++ b/docs/classes/Backend_GameLogic_TutorialManager.default.md @@ -0,0 +1,135 @@ +# Class: default + +[Backend/GameLogic/TutorialManager](../modules/Backend_GameLogic_TutorialManager.md).default + +## Hierarchy + +- `EventEmitter` + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_TutorialManager.default.md#constructor) + +### Properties + +- [tutorialState](Backend_GameLogic_TutorialManager.default.md#tutorialstate) +- [instance](Backend_GameLogic_TutorialManager.default.md#instance) + +### Methods + +- [acceptInput](Backend_GameLogic_TutorialManager.default.md#acceptinput) +- [advance](Backend_GameLogic_TutorialManager.default.md#advance) +- [complete](Backend_GameLogic_TutorialManager.default.md#complete) +- [reset](Backend_GameLogic_TutorialManager.default.md#reset) +- [setTutorialState](Backend_GameLogic_TutorialManager.default.md#settutorialstate) +- [getInstance](Backend_GameLogic_TutorialManager.default.md#getinstance) + +## Constructors + +### constructor + +• `Private` **new default**() + +#### Overrides + +EventEmitter.constructor + +## Properties + +### tutorialState + +• `Private` **tutorialState**: [`TutorialState`](../enums/Backend_GameLogic_TutorialManager.TutorialState.md) + +--- + +### instance + +▪ `Static` **instance**: [`default`](Backend_GameLogic_TutorialManager.default.md) + +## Methods + +### acceptInput + +▸ **acceptInput**(`state`): `void` + +#### Parameters + +| Name | Type | +| :------ | :----------------------------------------------------------------------------- | +| `state` | [`TutorialState`](../enums/Backend_GameLogic_TutorialManager.TutorialState.md) | + +#### Returns + +`void` + +--- + +### advance + +▸ `Private` **advance**(): `void` + +#### Returns + +`void` + +--- + +### complete + +▸ **complete**(`gameUiManager`): `void` + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------ | +| `gameUiManager` | [`default`](Backend_GameLogic_GameUIManager.default.md) | + +#### Returns + +`void` + +--- + +### reset + +▸ **reset**(`account`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------- | +| `account` | `undefined` \| `EthAddress` | + +#### Returns + +`void` + +--- + +### setTutorialState + +▸ `Private` **setTutorialState**(`newState`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :----------------------------------------------------------------------------- | +| `newState` | [`TutorialState`](../enums/Backend_GameLogic_TutorialManager.TutorialState.md) | + +#### Returns + +`void` + +--- + +### getInstance + +▸ `Static` **getInstance**(): [`default`](Backend_GameLogic_TutorialManager.default.md) + +#### Returns + +[`default`](Backend_GameLogic_TutorialManager.default.md) diff --git a/docs/classes/Backend_GameLogic_ViewportEntities.ViewportEntities.md b/docs/classes/Backend_GameLogic_ViewportEntities.ViewportEntities.md new file mode 100644 index 00000000..8eb366f2 --- /dev/null +++ b/docs/classes/Backend_GameLogic_ViewportEntities.ViewportEntities.md @@ -0,0 +1,231 @@ +# Class: ViewportEntities + +[Backend/GameLogic/ViewportEntities](../modules/Backend_GameLogic_ViewportEntities.md).ViewportEntities + +Efficiently calculates which planets are in the viewport, and allows you to find the nearest +visible planet to the mouse. + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_ViewportEntities.ViewportEntities.md#constructor) + +### Properties + +- [cachedExploredChunks](Backend_GameLogic_ViewportEntities.ViewportEntities.md#cachedexploredchunks) +- [cachedPlanets](Backend_GameLogic_ViewportEntities.ViewportEntities.md#cachedplanets) +- [cachedPlanetsAsList](Backend_GameLogic_ViewportEntities.ViewportEntities.md#cachedplanetsaslist) +- [gameManager](Backend_GameLogic_ViewportEntities.ViewportEntities.md#gamemanager) +- [uiManager](Backend_GameLogic_ViewportEntities.ViewportEntities.md#uimanager) + +### Methods + +- [getNearestVisiblePlanet](Backend_GameLogic_ViewportEntities.ViewportEntities.md#getnearestvisibleplanet) +- [getPlanetRadii](Backend_GameLogic_ViewportEntities.ViewportEntities.md#getplanetradii) +- [getPlanetsAndChunks](Backend_GameLogic_ViewportEntities.ViewportEntities.md#getplanetsandchunks) +- [getVisiblePlanetLevels](Backend_GameLogic_ViewportEntities.ViewportEntities.md#getvisibleplanetlevels) +- [loadPlanetMessages](Backend_GameLogic_ViewportEntities.ViewportEntities.md#loadplanetmessages) +- [recalculateViewportChunks](Backend_GameLogic_ViewportEntities.ViewportEntities.md#recalculateviewportchunks) +- [recalculateViewportPlanets](Backend_GameLogic_ViewportEntities.ViewportEntities.md#recalculateviewportplanets) +- [replacePlanets](Backend_GameLogic_ViewportEntities.ViewportEntities.md#replaceplanets) +- [startRefreshing](Backend_GameLogic_ViewportEntities.ViewportEntities.md#startrefreshing) +- [updateLocationsAndChunks](Backend_GameLogic_ViewportEntities.ViewportEntities.md#updatelocationsandchunks) + +## Constructors + +### constructor + +• **new ViewportEntities**(`gameManager`, `gameUIManager`) + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------ | +| `gameManager` | [`default`](Backend_GameLogic_GameManager.default.md) | +| `gameUIManager` | [`default`](Backend_GameLogic_GameUIManager.default.md) | + +## Properties + +### cachedExploredChunks + +• `Private` **cachedExploredChunks**: `Set`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> + +--- + +### cachedPlanets + +• `Private` **cachedPlanets**: `Map`<`LocationId`, [`PlanetRenderInfo`](../interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md)\> + +--- + +### cachedPlanetsAsList + +• `Private` **cachedPlanetsAsList**: [`PlanetRenderInfo`](../interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md)[] = `[]` + +--- + +### gameManager + +• `Private` `Readonly` **gameManager**: [`default`](Backend_GameLogic_GameManager.default.md) + +--- + +### uiManager + +• `Private` `Readonly` **uiManager**: [`default`](Backend_GameLogic_GameUIManager.default.md) + +## Methods + +### getNearestVisiblePlanet + +▸ **getNearestVisiblePlanet**(`coords`): `undefined` \| `LocatablePlanet` + +Gets the planet that is closest to the given coordinates. Filters out irrelevant planets +using the `radiusMap` parameter, which specifies how close a planet must be in order to +be returned from this function, given that planet's level. Smaller planets have a smaller +radius, and larger planets have a larger radius. + +If a smaller and a larger planet are both within respective radii of coords, the smaller +planet is returned. + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`undefined` \| `LocatablePlanet` + +--- + +### getPlanetRadii + +▸ `Private` **getPlanetRadii**(`viewport`): `Map`<`PlanetLevel`, [`Radii`](../interfaces/Backend_GameLogic_ViewportEntities.Radii.md)\> + +One entry per planet level - radius in screen pixels of that planet level given the current +viewport configuration, as well as the world radius. + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------- | +| `viewport` | [`default`](Frontend_Game_Viewport.default.md) | + +#### Returns + +`Map`<`PlanetLevel`, [`Radii`](../interfaces/Backend_GameLogic_ViewportEntities.Radii.md)\> + +--- + +### getPlanetsAndChunks + +▸ **getPlanetsAndChunks**(): `Object` + +#### Returns + +`Object` + +| Name | Type | +| :-------------- | :--------------------------------------------------------------------------------------------------------------- | +| `cachedPlanets` | `Map`<`LocationId`, [`PlanetRenderInfo`](../interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md)\> | +| `chunks` | `Set`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> | + +--- + +### getVisiblePlanetLevels + +▸ `Private` **getVisiblePlanetLevels**(`viewport`): `number`[] + +Returns a list of planet levels which, when rendered, would result in a planet that has a size +larger than one pixel. + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------- | +| `viewport` | [`default`](Frontend_Game_Viewport.default.md) | + +#### Returns + +`number`[] + +--- + +### loadPlanetMessages + +▸ `Private` **loadPlanetMessages**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +--- + +### recalculateViewportChunks + +▸ `Private` **recalculateViewportChunks**(`viewport`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------- | +| `viewport` | [`default`](Frontend_Game_Viewport.default.md) | + +#### Returns + +`void` + +--- + +### recalculateViewportPlanets + +▸ `Private` **recalculateViewportPlanets**(`viewport`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------- | +| `viewport` | [`default`](Frontend_Game_Viewport.default.md) | + +#### Returns + +`void` + +--- + +### replacePlanets + +▸ `Private` **replacePlanets**(`newPlanetsInViewport`): `void` + +#### Parameters + +| Name | Type | +| :--------------------- | :------------------ | +| `newPlanetsInViewport` | `LocatablePlanet`[] | + +#### Returns + +`void` + +--- + +### startRefreshing + +▸ **startRefreshing**(): `void` + +#### Returns + +`void` + +--- + +### updateLocationsAndChunks + +▸ `Private` **updateLocationsAndChunks**(): `void` + +#### Returns + +`void` diff --git a/docs/classes/Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md b/docs/classes/Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md new file mode 100644 index 00000000..74faf8aa --- /dev/null +++ b/docs/classes/Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md @@ -0,0 +1,99 @@ +# Class: HomePlanetMinerChunkStore + +[Backend/Miner/MinerManager](../modules/Backend_Miner_MinerManager.md).HomePlanetMinerChunkStore + +## Implements + +- [`ChunkStore`](../interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md) + +## Table of contents + +### Constructors + +- [constructor](Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md#constructor) + +### Properties + +- [initPerlinMax](Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md#initperlinmax) +- [initPerlinMin](Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md#initperlinmin) +- [minedChunkKeys](Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md#minedchunkkeys) +- [perlinOptions](Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md#perlinoptions) + +### Methods + +- [addChunk](Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md#addchunk) +- [hasMinedChunk](Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md#hasminedchunk) + +## Constructors + +### constructor + +• **new HomePlanetMinerChunkStore**(`initPerlinMin`, `initPerlinMax`, `hashConfig`) + +#### Parameters + +| Name | Type | +| :-------------- | :----------------------------------------------------------------- | +| `initPerlinMin` | `number` | +| `initPerlinMax` | `number` | +| `hashConfig` | [`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) | + +## Properties + +### initPerlinMax + +• `Private` **initPerlinMax**: `number` + +--- + +### initPerlinMin + +• `Private` **initPerlinMin**: `number` + +--- + +### minedChunkKeys + +• `Private` **minedChunkKeys**: `Set`<`string`\> + +--- + +### perlinOptions + +• `Private` **perlinOptions**: `PerlinConfig` + +## Methods + +### addChunk + +▸ **addChunk**(`exploredChunk`): `void` + +#### Parameters + +| Name | Type | +| :-------------- | :-------------------------------------------- | +| `exploredChunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### hasMinedChunk + +▸ **hasMinedChunk**(`chunkFootprint`): `boolean` + +#### Parameters + +| Name | Type | +| :--------------- | :------------------------------------------------------------------ | +| `chunkFootprint` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +`boolean` + +#### Implementation of + +[ChunkStore](../interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md).[hasMinedChunk](../interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md#hasminedchunk) diff --git a/docs/classes/Backend_Miner_MinerManager.default.md b/docs/classes/Backend_Miner_MinerManager.default.md new file mode 100644 index 00000000..92e96d49 --- /dev/null +++ b/docs/classes/Backend_Miner_MinerManager.default.md @@ -0,0 +1,441 @@ +# Class: default + +[Backend/Miner/MinerManager](../modules/Backend_Miner_MinerManager.md).default + +## Hierarchy + +- `EventEmitter` + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Backend_Miner_MinerManager.default.md#constructor) + +### Properties + +- [WorkerCtor](Backend_Miner_MinerManager.default.md#workerctor) +- [cores](Backend_Miner_MinerManager.default.md#cores) +- [currentJobId](Backend_Miner_MinerManager.default.md#currentjobid) +- [exploringChunk](Backend_Miner_MinerManager.default.md#exploringchunk) +- [exploringChunkStart](Backend_Miner_MinerManager.default.md#exploringchunkstart) +- [hashConfig](Backend_Miner_MinerManager.default.md#hashconfig) +- [isExploring](Backend_Miner_MinerManager.default.md#isexploring) +- [minedChunksStore](Backend_Miner_MinerManager.default.md#minedchunksstore) +- [minersComplete](Backend_Miner_MinerManager.default.md#minerscomplete) +- [miningPattern](Backend_Miner_MinerManager.default.md#miningpattern) +- [perlinOptions](Backend_Miner_MinerManager.default.md#perlinoptions) +- [planetRarity](Backend_Miner_MinerManager.default.md#planetrarity) +- [useMockHash](Backend_Miner_MinerManager.default.md#usemockhash) +- [workers](Backend_Miner_MinerManager.default.md#workers) +- [worldRadius](Backend_Miner_MinerManager.default.md#worldradius) + +### Methods + +- [chunkKeyToLocation](Backend_Miner_MinerManager.default.md#chunkkeytolocation) +- [chunkLocationToKey](Backend_Miner_MinerManager.default.md#chunklocationtokey) +- [destroy](Backend_Miner_MinerManager.default.md#destroy) +- [exploreNext](Backend_Miner_MinerManager.default.md#explorenext) +- [getCurrentlyExploringChunk](Backend_Miner_MinerManager.default.md#getcurrentlyexploringchunk) +- [getMiningPattern](Backend_Miner_MinerManager.default.md#getminingpattern) +- [initWorker](Backend_Miner_MinerManager.default.md#initworker) +- [isMining](Backend_Miner_MinerManager.default.md#ismining) +- [isValidExploreTarget](Backend_Miner_MinerManager.default.md#isvalidexploretarget) +- [nextValidExploreTarget](Backend_Miner_MinerManager.default.md#nextvalidexploretarget) +- [onDiscovered](Backend_Miner_MinerManager.default.md#ondiscovered) +- [sendMessageToWorkers](Backend_Miner_MinerManager.default.md#sendmessagetoworkers) +- [setCores](Backend_Miner_MinerManager.default.md#setcores) +- [setMiningPattern](Backend_Miner_MinerManager.default.md#setminingpattern) +- [setRadius](Backend_Miner_MinerManager.default.md#setradius) +- [startExplore](Backend_Miner_MinerManager.default.md#startexplore) +- [stopExplore](Backend_Miner_MinerManager.default.md#stopexplore) +- [create](Backend_Miner_MinerManager.default.md#create) + +## Constructors + +### constructor + +• `Private` **new default**(`minedChunksStore`, `miningPattern`, `worldRadius`, `planetRarity`, `hashConfig`, `useMockHash`, `WorkerCtor`) + +#### Parameters + +| Name | Type | +| :----------------- | :-------------------------------------------------------------------------------- | +| `minedChunksStore` | [`ChunkStore`](../interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md) | +| `miningPattern` | [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) | +| `worldRadius` | `number` | +| `planetRarity` | `number` | +| `hashConfig` | [`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) | +| `useMockHash` | `boolean` | +| `WorkerCtor` | typeof [`default`](_types_worker_loader_WorkerTypes.default.md) | + +#### Overrides + +EventEmitter.constructor + +## Properties + +### WorkerCtor + +• `Private` **WorkerCtor**: typeof [`default`](_types_worker_loader_WorkerTypes.default.md) + +--- + +### cores + +• `Private` **cores**: `number` = `1` + +--- + +### currentJobId + +• `Private` **currentJobId**: `number` = `0` + +--- + +### exploringChunk + +• `Private` **exploringChunk**: `Object` = `{}` + +#### Index signature + +▪ [chunkKey: `string`]: [`Chunk`](_types_global_GlobalTypes.Chunk.md) + +--- + +### exploringChunkStart + +• `Private` **exploringChunkStart**: `Object` = `{}` + +#### Index signature + +▪ [chunkKey: `string`]: `number` + +--- + +### hashConfig + +• `Private` **hashConfig**: [`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) + +--- + +### isExploring + +• `Private` **isExploring**: `boolean` = `false` + +--- + +### minedChunksStore + +• `Private` `Readonly` **minedChunksStore**: [`ChunkStore`](../interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md) + +--- + +### minersComplete + +• `Private` **minersComplete**: `Object` = `{}` + +#### Index signature + +▪ [chunkKey: `string`]: `number` + +--- + +### miningPattern + +• `Private` **miningPattern**: [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) + +--- + +### perlinOptions + +• `Private` **perlinOptions**: `PerlinConfig` + +--- + +### planetRarity + +• `Private` `Readonly` **planetRarity**: `number` + +--- + +### useMockHash + +• `Private` **useMockHash**: `boolean` + +--- + +### workers + +• `Private` **workers**: [`default`](_types_worker_loader_WorkerTypes.default.md)[] + +--- + +### worldRadius + +• `Private` **worldRadius**: `number` + +## Methods + +### chunkKeyToLocation + +▸ `Private` **chunkKeyToLocation**(`chunkKey`): `undefined` \| [[`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md), `number`] + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `chunkKey` | `string` | + +#### Returns + +`undefined` \| [[`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md), `number`] + +--- + +### chunkLocationToKey + +▸ `Private` **chunkLocationToKey**(`chunkLocation`, `jobId`): `string` + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------------------ | +| `chunkLocation` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | +| `jobId` | `number` | + +#### Returns + +`string` + +--- + +### destroy + +▸ **destroy**(): `void` + +#### Returns + +`void` + +--- + +### exploreNext + +▸ `Private` **exploreNext**(`fromChunk`, `jobId`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :------------------------------------------------------------------ | +| `fromChunk` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | +| `jobId` | `number` | + +#### Returns + +`void` + +--- + +### getCurrentlyExploringChunk + +▸ **getCurrentlyExploringChunk**(): `undefined` \| [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +#### Returns + +`undefined` \| [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +--- + +### getMiningPattern + +▸ **getMiningPattern**(): [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) + +#### Returns + +[`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) + +--- + +### initWorker + +▸ `Private` **initWorker**(`index`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------- | +| `index` | `number` | + +#### Returns + +`void` + +--- + +### isMining + +▸ **isMining**(): `boolean` + +#### Returns + +`boolean` + +--- + +### isValidExploreTarget + +▸ `Private` **isValidExploreTarget**(`chunkLocation`): `boolean` + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------------------ | +| `chunkLocation` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +`boolean` + +--- + +### nextValidExploreTarget + +▸ `Private` **nextValidExploreTarget**(`chunkLocation`, `jobId`): `Promise`<`undefined` \| [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md)\> + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------------------ | +| `chunkLocation` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | +| `jobId` | `number` | + +#### Returns + +`Promise`<`undefined` \| [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md)\> + +--- + +### onDiscovered + +▸ `Private` **onDiscovered**(`exploredChunk`, `jobId`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :-------------- | :-------------------------------------------- | +| `exploredChunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | +| `jobId` | `number` | + +#### Returns + +`Promise`<`void`\> + +--- + +### sendMessageToWorkers + +▸ `Private` **sendMessageToWorkers**(`chunkToExplore`, `jobId`): `void` + +#### Parameters + +| Name | Type | +| :--------------- | :------------------------------------------------------------------ | +| `chunkToExplore` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | +| `jobId` | `number` | + +#### Returns + +`void` + +--- + +### setCores + +▸ **setCores**(`nCores`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `nCores` | `number` | + +#### Returns + +`void` + +--- + +### setMiningPattern + +▸ **setMiningPattern**(`pattern`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------- | +| `pattern` | [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) | + +#### Returns + +`void` + +--- + +### setRadius + +▸ **setRadius**(`radius`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `radius` | `number` | + +#### Returns + +`void` + +--- + +### startExplore + +▸ **startExplore**(): `void` + +#### Returns + +`void` + +--- + +### stopExplore + +▸ **stopExplore**(): `void` + +#### Returns + +`void` + +--- + +### create + +▸ `Static` **create**(`chunkStore`, `miningPattern`, `worldRadius`, `planetRarity`, `hashConfig`, `useMockHash?`, `WorkerCtor?`): [`default`](Backend_Miner_MinerManager.default.md) + +#### Parameters + +| Name | Type | Default value | +| :-------------- | :-------------------------------------------------------------------------------- | :------------ | +| `chunkStore` | [`ChunkStore`](../interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md) | `undefined` | +| `miningPattern` | [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) | `undefined` | +| `worldRadius` | `number` | `undefined` | +| `planetRarity` | `number` | `undefined` | +| `hashConfig` | [`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) | `undefined` | +| `useMockHash` | `boolean` | `false` | +| `WorkerCtor` | typeof [`default`](_types_worker_loader_WorkerTypes.default.md) | `undefined` | + +#### Returns + +[`default`](Backend_Miner_MinerManager.default.md) diff --git a/docs/classes/Backend_Miner_MiningPatterns.SpiralPattern.md b/docs/classes/Backend_Miner_MiningPatterns.SpiralPattern.md new file mode 100644 index 00000000..65c2fdc7 --- /dev/null +++ b/docs/classes/Backend_Miner_MiningPatterns.SpiralPattern.md @@ -0,0 +1,82 @@ +# Class: SpiralPattern + +[Backend/Miner/MiningPatterns](../modules/Backend_Miner_MiningPatterns.md).SpiralPattern + +## Implements + +- [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) + +## Table of contents + +### Constructors + +- [constructor](Backend_Miner_MiningPatterns.SpiralPattern.md#constructor) + +### Properties + +- [chunkSideLength](Backend_Miner_MiningPatterns.SpiralPattern.md#chunksidelength) +- [fromChunk](Backend_Miner_MiningPatterns.SpiralPattern.md#fromchunk) +- [type](Backend_Miner_MiningPatterns.SpiralPattern.md#type) + +### Methods + +- [nextChunk](Backend_Miner_MiningPatterns.SpiralPattern.md#nextchunk) + +## Constructors + +### constructor + +• **new SpiralPattern**(`center`, `chunkSize`) + +#### Parameters + +| Name | Type | +| :---------- | :------------ | +| `center` | `WorldCoords` | +| `chunkSize` | `number` | + +## Properties + +### chunkSideLength + +• **chunkSideLength**: `number` + +--- + +### fromChunk + +• **fromChunk**: [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +#### Implementation of + +[MiningPattern](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md).[fromChunk](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md#fromchunk) + +--- + +### type + +• **type**: [`MiningPatternType`](../enums/Backend_Miner_MiningPatterns.MiningPatternType.md) + +#### Implementation of + +[MiningPattern](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md).[type](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md#type) + +## Methods + +### nextChunk + +▸ **nextChunk**(`chunk`): [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +#### Parameters + +| Name | Type | +| :------ | :------------------------------------------------------------------ | +| `chunk` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +[`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +#### Implementation of + +[MiningPattern](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md).[nextChunk](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md#nextchunk) diff --git a/docs/classes/Backend_Miner_MiningPatterns.SwissCheesePattern.md b/docs/classes/Backend_Miner_MiningPatterns.SwissCheesePattern.md new file mode 100644 index 00000000..7198c5e3 --- /dev/null +++ b/docs/classes/Backend_Miner_MiningPatterns.SwissCheesePattern.md @@ -0,0 +1,82 @@ +# Class: SwissCheesePattern + +[Backend/Miner/MiningPatterns](../modules/Backend_Miner_MiningPatterns.md).SwissCheesePattern + +## Implements + +- [`MiningPattern`](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) + +## Table of contents + +### Constructors + +- [constructor](Backend_Miner_MiningPatterns.SwissCheesePattern.md#constructor) + +### Properties + +- [chunkSideLength](Backend_Miner_MiningPatterns.SwissCheesePattern.md#chunksidelength) +- [fromChunk](Backend_Miner_MiningPatterns.SwissCheesePattern.md#fromchunk) +- [type](Backend_Miner_MiningPatterns.SwissCheesePattern.md#type) + +### Methods + +- [nextChunk](Backend_Miner_MiningPatterns.SwissCheesePattern.md#nextchunk) + +## Constructors + +### constructor + +• **new SwissCheesePattern**(`center`, `chunkSize`) + +#### Parameters + +| Name | Type | +| :---------- | :------------ | +| `center` | `WorldCoords` | +| `chunkSize` | `number` | + +## Properties + +### chunkSideLength + +• **chunkSideLength**: `number` + +--- + +### fromChunk + +• **fromChunk**: [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +#### Implementation of + +[MiningPattern](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md).[fromChunk](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md#fromchunk) + +--- + +### type + +• **type**: [`MiningPatternType`](../enums/Backend_Miner_MiningPatterns.MiningPatternType.md) + +#### Implementation of + +[MiningPattern](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md).[type](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md#type) + +## Methods + +### nextChunk + +▸ **nextChunk**(`chunk`): [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +#### Parameters + +| Name | Type | +| :------ | :------------------------------------------------------------------ | +| `chunk` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +[`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +#### Implementation of + +[MiningPattern](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md).[nextChunk](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md#nextchunk) diff --git a/docs/classes/Backend_Network_EthConnection.default.md b/docs/classes/Backend_Network_EthConnection.default.md new file mode 100644 index 00000000..b4b62739 --- /dev/null +++ b/docs/classes/Backend_Network_EthConnection.default.md @@ -0,0 +1,500 @@ +# Class: default + +[Backend/Network/EthConnection](../modules/Backend_Network_EthConnection.md).default + +Responsible for + +1. loading the contract +2. the in-memory wallet +3. connecting to the correct network + +## Hierarchy + +- `EventEmitter` + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Backend_Network_EthConnection.default.md#constructor) + +### Properties + +- [blockNumber](Backend_Network_EthConnection.default.md#blocknumber) +- [blockNumber$](Backend_Network_EthConnection.default.md#blocknumber$) +- [diagnosticsUpdater](Backend_Network_EthConnection.default.md#diagnosticsupdater) +- [gasPrices](Backend_Network_EthConnection.default.md#gasprices) +- [gasPrices$](Backend_Network_EthConnection.default.md#gasprices$) +- [knownAddresses](Backend_Network_EthConnection.default.md#knownaddresses) +- [provider](Backend_Network_EthConnection.default.md#provider) +- [rpcURL](Backend_Network_EthConnection.default.md#rpcurl) +- [signer](Backend_Network_EthConnection.default.md#signer) +- [XDAI_DEFAULT_URL](Backend_Network_EthConnection.default.md#xdai_default_url) + +### Methods + +- [addAccount](Backend_Network_EthConnection.default.md#addaccount) +- [adjustPollRateBasedOnVisibility](Backend_Network_EthConnection.default.md#adjustpollratebasedonvisibility) +- [getAddress](Backend_Network_EthConnection.default.md#getaddress) +- [getBalance](Backend_Network_EthConnection.default.md#getbalance) +- [getGasPriceGwei](Backend_Network_EthConnection.default.md#getgaspricegwei) +- [getGasPrices](Backend_Network_EthConnection.default.md#getgasprices) +- [getKnownAccounts](Backend_Network_EthConnection.default.md#getknownaccounts) +- [getNonce](Backend_Network_EthConnection.default.md#getnonce) +- [getPrivateKey](Backend_Network_EthConnection.default.md#getprivatekey) +- [getRpcEndpoint](Backend_Network_EthConnection.default.md#getrpcendpoint) +- [hasSigner](Backend_Network_EthConnection.default.md#hassigner) +- [isWhitelisted](Backend_Network_EthConnection.default.md#iswhitelisted) +- [loadContract](Backend_Network_EthConnection.default.md#loadcontract) +- [loadCoreContract](Backend_Network_EthConnection.default.md#loadcorecontract) +- [loadGPTCreditContract](Backend_Network_EthConnection.default.md#loadgptcreditcontract) +- [loadGettersContract](Backend_Network_EthConnection.default.md#loadgetterscontract) +- [loadWhitelistContract](Backend_Network_EthConnection.default.md#loadwhitelistcontract) +- [processEvents](Backend_Network_EthConnection.default.md#processevents) +- [refreshGasPrices](Backend_Network_EthConnection.default.md#refreshgasprices) +- [setAccount](Backend_Network_EthConnection.default.md#setaccount) +- [setDiagnosticUpdater](Backend_Network_EthConnection.default.md#setdiagnosticupdater) +- [setRpcEndpoint](Backend_Network_EthConnection.default.md#setrpcendpoint) +- [signMessage](Backend_Network_EthConnection.default.md#signmessage) +- [startPollingGasPrices](Backend_Network_EthConnection.default.md#startpollinggasprices) +- [subscribeToEvents](Backend_Network_EthConnection.default.md#subscribetoevents) +- [verifySignature](Backend_Network_EthConnection.default.md#verifysignature) +- [waitForTransaction](Backend_Network_EthConnection.default.md#waitfortransaction) + +## Constructors + +### constructor + +• **new default**() + +#### Overrides + +EventEmitter.constructor + +## Properties + +### blockNumber + +• `Private` **blockNumber**: `number` + +--- + +### blockNumber$ + +• `Readonly` **blockNumber$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> + +--- + +### diagnosticsUpdater + +• `Private` **diagnosticsUpdater**: `undefined` \| [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) + +--- + +### gasPrices + +• `Private` **gasPrices**: `GasPrices` + +--- + +### gasPrices$ + +• `Readonly` **gasPrices$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`GasPrices`\> + +--- + +### knownAddresses + +• `Private` **knownAddresses**: `EthAddress`[] + +--- + +### provider + +• `Private` **provider**: `JsonRpcProvider` + +--- + +### rpcURL + +• `Private` **rpcURL**: `string` + +--- + +### signer + +• `Private` **signer**: `undefined` \| `Wallet` + +--- + +### XDAI_DEFAULT_URL + +▪ `Static` `Private` `Readonly` **XDAI_DEFAULT_URL**: `string` + +## Methods + +### addAccount + +▸ **addAccount**(`skey`): `void` + +#### Parameters + +| Name | Type | +| :----- | :------- | +| `skey` | `string` | + +#### Returns + +`void` + +--- + +### adjustPollRateBasedOnVisibility + +▸ `Private` **adjustPollRateBasedOnVisibility**(): `void` + +#### Returns + +`void` + +--- + +### getAddress + +▸ **getAddress**(): `EthAddress` + +#### Returns + +`EthAddress` + +--- + +### getBalance + +▸ **getBalance**(`address`): `Promise`<`number`\> + +#### Parameters + +| Name | Type | +| :-------- | :----------- | +| `address` | `EthAddress` | + +#### Returns + +`Promise`<`number`\> + +--- + +### getGasPriceGwei + +▸ **getGasPriceGwei**(`txType`, `gasPrices`): `number` + +Get the gas price, measured in gwei, that we should send for a given transaction type, given +the current prices for transaction speeds, and given the user's gas price setting. + +#### Parameters + +| Name | Type | +| :---------- | :---------- | +| `txType` | `EthTxType` | +| `gasPrices` | `GasPrices` | + +#### Returns + +`number` + +--- + +### getGasPrices + +▸ **getGasPrices**(): `GasPrices` + +#### Returns + +`GasPrices` + +--- + +### getKnownAccounts + +▸ **getKnownAccounts**(): `EthAddress`[] + +#### Returns + +`EthAddress`[] + +--- + +### getNonce + +▸ **getNonce**(): `Promise`<`number`\> + +#### Returns + +`Promise`<`number`\> + +--- + +### getPrivateKey + +▸ **getPrivateKey**(): `string` + +#### Returns + +`string` + +--- + +### getRpcEndpoint + +▸ **getRpcEndpoint**(): `string` + +#### Returns + +`string` + +--- + +### hasSigner + +▸ **hasSigner**(): `boolean` + +#### Returns + +`boolean` + +--- + +### isWhitelisted + +▸ **isWhitelisted**(`address`): `Promise`<`boolean`\> + +#### Parameters + +| Name | Type | +| :-------- | :----------- | +| `address` | `EthAddress` | + +#### Returns + +`Promise`<`boolean`\> + +--- + +### loadContract + +▸ **loadContract**<`C`\>(`contractAddress`, `contractABI`): `Promise`<`C`\> + +#### Type parameters + +| Name | Type | +| :--- | :----------------------- | +| `C` | extends `Contract`<`C`\> | + +#### Parameters + +| Name | Type | +| :---------------- | :------------------ | +| `contractAddress` | `string` | +| `contractABI` | `ContractInterface` | + +#### Returns + +`Promise`<`C`\> + +--- + +### loadCoreContract + +▸ **loadCoreContract**(): `Promise`<`DarkForestCore`\> + +#### Returns + +`Promise`<`DarkForestCore`\> + +--- + +### loadGPTCreditContract + +▸ **loadGPTCreditContract**(): `Promise`<`DarkForestGPTCredit`\> + +#### Returns + +`Promise`<`DarkForestGPTCredit`\> + +--- + +### loadGettersContract + +▸ **loadGettersContract**(): `Promise`<`DarkForestGetters`\> + +#### Returns + +`Promise`<`DarkForestGetters`\> + +--- + +### loadWhitelistContract + +▸ **loadWhitelistContract**(): `Promise`<`Whitelist`\> + +#### Returns + +`Promise`<`Whitelist`\> + +--- + +### processEvents + +▸ `Private` **processEvents**(`startBlock`, `endBlock`, `eventFilter`, `contract`, `handlers`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :------------ | :----------------------------------------------------------------------------------------------------------------- | +| `startBlock` | `number` | +| `endBlock` | `number` | +| `eventFilter` | `EventFilter` | +| `contract` | `DarkForestCore` | +| `handlers` | `Partial`<`Record`<[`ContractEvent`](../enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md), `any`\>\> | + +#### Returns + +`Promise`<`void`\> + +--- + +### refreshGasPrices + +▸ `Private` **refreshGasPrices**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +--- + +### setAccount + +▸ **setAccount**(`address`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :----------- | +| `address` | `EthAddress` | + +#### Returns + +`void` + +--- + +### setDiagnosticUpdater + +▸ **setDiagnosticUpdater**(`diagnosticUpdater?`): `void` + +#### Parameters + +| Name | Type | +| :------------------- | :--------------------------------------------------------------------------------------------- | +| `diagnosticUpdater?` | [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) | + +#### Returns + +`void` + +--- + +### setRpcEndpoint + +▸ **setRpcEndpoint**(`url`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :---- | :------- | +| `url` | `string` | + +#### Returns + +`Promise`<`void`\> + +--- + +### signMessage + +▸ **signMessage**(`message`): `Promise`<`string`\> + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `message` | `string` | + +#### Returns + +`Promise`<`string`\> + +--- + +### startPollingGasPrices + +▸ `Private` **startPollingGasPrices**(): `void` + +#### Returns + +`void` + +--- + +### subscribeToEvents + +▸ **subscribeToEvents**(`contract`, `handlers`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :----------------------------------------------------------------------------------------------------------------- | +| `contract` | `DarkForestCore` | +| `handlers` | `Partial`<`Record`<[`ContractEvent`](../enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md), `any`\>\> | + +#### Returns + +`void` + +--- + +### verifySignature + +▸ **verifySignature**(`message`, `signature`, `address`): `boolean` + +#### Parameters + +| Name | Type | +| :---------- | :----------- | +| `message` | `string` | +| `signature` | `string` | +| `address` | `EthAddress` | + +#### Returns + +`boolean` + +--- + +### waitForTransaction + +▸ **waitForTransaction**(`txHash`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `txHash` | `string` | + +#### Returns + +`Promise`<`TransactionReceipt`\> diff --git a/docs/classes/Backend_Network_EventLogger.EventLogger.md b/docs/classes/Backend_Network_EventLogger.EventLogger.md new file mode 100644 index 00000000..8746eda6 --- /dev/null +++ b/docs/classes/Backend_Network_EventLogger.EventLogger.md @@ -0,0 +1,73 @@ +# Class: EventLogger + +[Backend/Network/EventLogger](../modules/Backend_Network_EventLogger.md).EventLogger + +## Table of contents + +### Constructors + +- [constructor](Backend_Network_EventLogger.EventLogger.md#constructor) + +### Properties + +- [instance](Backend_Network_EventLogger.EventLogger.md#instance) + +### Methods + +- [logEvent](Backend_Network_EventLogger.EventLogger.md#logevent) +- [augmentEvent](Backend_Network_EventLogger.EventLogger.md#augmentevent) +- [getInstance](Backend_Network_EventLogger.EventLogger.md#getinstance) + +## Constructors + +### constructor + +• **new EventLogger**() + +## Properties + +### instance + +▪ `Static` `Private` **instance**: [`EventLogger`](Backend_Network_EventLogger.EventLogger.md) + +## Methods + +### logEvent + +▸ **logEvent**(`event`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------- | +| `event` | `unknown` | + +#### Returns + +`void` + +--- + +### augmentEvent + +▸ `Static` **augmentEvent**(`event`): `Object` + +#### Parameters + +| Name | Type | +| :------ | :-------- | +| `event` | `unknown` | + +#### Returns + +`Object` + +--- + +### getInstance + +▸ `Static` **getInstance**(): [`EventLogger`](Backend_Network_EventLogger.EventLogger.md) + +#### Returns + +[`EventLogger`](Backend_Network_EventLogger.EventLogger.md) diff --git a/docs/classes/Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md b/docs/classes/Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md new file mode 100644 index 00000000..35cb0ed2 --- /dev/null +++ b/docs/classes/Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md @@ -0,0 +1,217 @@ +# Class: ThrottledConcurrentQueue + +[Backend/Network/ThrottledConcurrentQueue](../modules/Backend_Network_ThrottledConcurrentQueue.md).ThrottledConcurrentQueue + +A queue that executes promises with a max throughput, and optionally max +concurrency. + +## Table of contents + +### Constructors + +- [constructor](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#constructor) + +### Properties + +- [concurrency](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#concurrency) +- [executionTimeout](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#executiontimeout) +- [executionTimestamps](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#executiontimestamps) +- [invocationIntervalMs](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#invocationintervalms) +- [maxConcurrency](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#maxconcurrency) +- [taskQueue](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#taskqueue) + +### Methods + +- [add](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#add) +- [concurrencyQuotaRemaining](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#concurrencyquotaremaining) +- [deleteOutdatedExecutionTimestamps](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#deleteoutdatedexecutiontimestamps) +- [executeNextTasks](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#executenexttasks) +- [next](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#next) +- [nextPossibleExecution](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#nextpossibleexecution) +- [size](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#size) +- [throttleQuotaRemaining](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#throttlequotaremaining) + +## Constructors + +### constructor + +• **new ThrottledConcurrentQueue**(`maxInvocationsPerIntervalMs`, `invocationIntervalMs`, `maxConcurrency?`) + +#### Parameters + +| Name | Type | +| :---------------------------- | :------- | +| `maxInvocationsPerIntervalMs` | `number` | +| `invocationIntervalMs` | `number` | +| `maxConcurrency` | `number` | + +## Properties + +### concurrency + +• `Private` **concurrency**: `number` = `0` + +Amount of tasks being executed right now. + +--- + +### executionTimeout + +• `Private` **executionTimeout**: `Timeout` + +When we schedule an attempt at executing another task in the future, +we don't want to schedule it more than once. Therefore, we keep track +of this scheduled attempt. + +--- + +### executionTimestamps + +• `Private` **executionTimestamps**: `default`<`number`\> + +Each time a task is executed, record the start of its execution time. +Execution timestamps are removed when they become outdated. Used for +keeping the amount of executions under the throttle limit. + +--- + +### invocationIntervalMs + +• `Private` `Readonly` **invocationIntervalMs**: `number` + +The interval during which we only allow a certain maximum amount of tasks +to be executed. + +--- + +### maxConcurrency + +• `Private` `Readonly` **maxConcurrency**: `number` + +Maximum amount of tasks that can be executing at the same time. + +--- + +### taskQueue + +• `Private` **taskQueue**: `QueuedTask`<`unknown`\>[] = `[]` + +Queue of tasks to execute. Added to the front, popped off the back. + +## Methods + +### add + +▸ **add**<`T`\>(`generator`): `Promise`<`T`\> + +Adds a task to be executed at some point in the future. Returns a promise +that resolves when the task finishes successfully, and rejects when there +is an error. + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | Description | +| :---------- | :-------------------- | :------------------------------------------------------ | +| `generator` | () => `Promise`<`T`\> | a function that returns a promise representing the task | + +#### Returns + +`Promise`<`T`\> + +--- + +### concurrencyQuotaRemaining + +▸ `Private` **concurrencyQuotaRemaining**(): `number` + +At this moment, how many more tasks we could execute without exceeding the +concurrency quota. + +#### Returns + +`number` + +--- + +### deleteOutdatedExecutionTimestamps + +▸ `Private` **deleteOutdatedExecutionTimestamps**(): `void` + +Removes all task execution timestamps that are older than [[this.invocationIntervalMs]], +because those invocations have no bearing on whether or not we can execute another task. + +#### Returns + +`void` + +--- + +### executeNextTasks + +▸ `Private` **executeNextTasks**(): `Promise`<`void`\> + +Runs tasks until it's at either the throttle or concurrency limit. If there are more +tasks to be executed after that, schedules itself to execute again at the soonest +possible moment. + +#### Returns + +`Promise`<`void`\> + +--- + +### next + +▸ `Private` **next**(): `Promise`<`void`\> + +If there is a next task to execute, executes it. Records the time of execution in +[executionTimestamps](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#executiontimestamps). Increments and decrements concurrency counter. Neither throttles +nor limits concurrency. + +#### Returns + +`Promise`<`void`\> + +--- + +### nextPossibleExecution + +▸ `Private` **nextPossibleExecution**(): `undefined` \| `number` + +Returns the soonest possible time from now we could execute another task without going +over the throttle limit. + +#### Returns + +`undefined` \| `number` + +--- + +### size + +▸ **size**(): `number` + +Returns the amount of queued items, not including the ones that are being executed at this moment. + +#### Returns + +`number` + +--- + +### throttleQuotaRemaining + +▸ `Private` **throttleQuotaRemaining**(): `number` + +At this moment, how many more tasks we could execute without exceeding the +throttle quota. + +#### Returns + +`number` diff --git a/docs/classes/Backend_Network_TxExecutor.TxExecutor.md b/docs/classes/Backend_Network_TxExecutor.TxExecutor.md new file mode 100644 index 00000000..f50b3678 --- /dev/null +++ b/docs/classes/Backend_Network_TxExecutor.TxExecutor.md @@ -0,0 +1,181 @@ +# Class: TxExecutor + +[Backend/Network/TxExecutor](../modules/Backend_Network_TxExecutor.md).TxExecutor + +## Hierarchy + +- `EventEmitter` + + ↳ **`TxExecutor`** + +## Table of contents + +### Constructors + +- [constructor](Backend_Network_TxExecutor.TxExecutor.md#constructor) + +### Properties + +- [diagnosticsUpdater](Backend_Network_TxExecutor.TxExecutor.md#diagnosticsupdater) +- [eth](Backend_Network_TxExecutor.TxExecutor.md#eth) +- [lastTransaction](Backend_Network_TxExecutor.TxExecutor.md#lasttransaction) +- [nonce](Backend_Network_TxExecutor.TxExecutor.md#nonce) +- [txQueue](Backend_Network_TxExecutor.TxExecutor.md#txqueue) +- [MIN_BALANCE_ETH](Backend_Network_TxExecutor.TxExecutor.md#min_balance_eth) +- [NONCE_STALE_AFTER_MS](Backend_Network_TxExecutor.TxExecutor.md#nonce_stale_after_ms) +- [TX_SUBMIT_TIMEOUT](Backend_Network_TxExecutor.TxExecutor.md#tx_submit_timeout) + +### Methods + +- [checkBalance](Backend_Network_TxExecutor.TxExecutor.md#checkbalance) +- [execute](Backend_Network_TxExecutor.TxExecutor.md#execute) +- [makeRequest](Backend_Network_TxExecutor.TxExecutor.md#makerequest) +- [maybeUpdateNonce](Backend_Network_TxExecutor.TxExecutor.md#maybeupdatenonce) +- [setDiagnosticUpdater](Backend_Network_TxExecutor.TxExecutor.md#setdiagnosticupdater) + +## Constructors + +### constructor + +• **new TxExecutor**(`ethConnection`, `nonce`) + +#### Parameters + +| Name | Type | +| :-------------- | :---------------------------------------------------- | +| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | +| `nonce` | `number` | + +#### Overrides + +EventEmitter.constructor + +## Properties + +### diagnosticsUpdater + +• `Private` `Optional` **diagnosticsUpdater**: [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) + +--- + +### eth + +• `Private` **eth**: [`default`](Backend_Network_EthConnection.default.md) + +--- + +### lastTransaction + +• `Private` **lastTransaction**: `number` + +--- + +### nonce + +• `Private` **nonce**: `number` + +--- + +### txQueue + +• `Private` **txQueue**: [`ThrottledConcurrentQueue`](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md) + +--- + +### MIN_BALANCE_ETH + +▪ `Static` `Private` `Readonly` **MIN_BALANCE_ETH**: `0.002` + +don't allow users to submit txs if balance falls below + +--- + +### NONCE_STALE_AFTER_MS + +▪ `Static` `Private` `Readonly` **NONCE_STALE_AFTER_MS**: `number` + +we refresh the nonce if it hasn't been updated in this amount of time + +--- + +### TX_SUBMIT_TIMEOUT + +▪ `Static` `Private` `Readonly` **TX_SUBMIT_TIMEOUT**: `30000` + +tx is considered to have errored if haven't successfully +submitted to mempool within 30s + +## Methods + +### checkBalance + +▸ `Private` **checkBalance**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +--- + +### execute + +▸ `Private` **execute**(`txRequest`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :---------- | :------------------------------------------------------------------------------- | +| `txRequest` | [`QueuedTxRequest`](../interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md) | + +#### Returns + +`Promise`<`void`\> + +--- + +### makeRequest + +▸ **makeRequest**(`type`, `actionId`, `contract`, `args`, `overrides?`): [`PendingTransaction`](../interfaces/Backend_Network_TxExecutor.PendingTransaction.md) + +Schedules this transaction to execute once all of the transactions +ahead of it have completed. + +#### Parameters + +| Name | Type | +| :---------- | :------------------- | +| `type` | `EthTxType` | +| `actionId` | `string` | +| `contract` | `Contract` | +| `args` | `unknown`[] | +| `overrides` | `TransactionRequest` | + +#### Returns + +[`PendingTransaction`](../interfaces/Backend_Network_TxExecutor.PendingTransaction.md) + +--- + +### maybeUpdateNonce + +▸ `Private` **maybeUpdateNonce**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +--- + +### setDiagnosticUpdater + +▸ **setDiagnosticUpdater**(`diagnosticUpdater?`): `void` + +#### Parameters + +| Name | Type | +| :------------------- | :--------------------------------------------------------------------------------------------- | +| `diagnosticUpdater?` | [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) | + +#### Returns + +`void` diff --git a/docs/classes/Backend_Procedural_Noise.default.md b/docs/classes/Backend_Procedural_Noise.default.md new file mode 100644 index 00000000..a859aa73 --- /dev/null +++ b/docs/classes/Backend_Procedural_Noise.default.md @@ -0,0 +1,75 @@ +# Class: default + +[Backend/Procedural/Noise](../modules/Backend_Procedural_Noise.md).default + +## Table of contents + +### Constructors + +- [constructor](Backend_Procedural_Noise.default.md#constructor) + +### Properties + +- [noise](Backend_Procedural_Noise.default.md#noise) +- [instance](Backend_Procedural_Noise.default.md#instance) + +### Methods + +- [simplex2](Backend_Procedural_Noise.default.md#simplex2) +- [getInstance](Backend_Procedural_Noise.default.md#getinstance) +- [initialize](Backend_Procedural_Noise.default.md#initialize) + +## Constructors + +### constructor + +• **new default**() + +## Properties + +### noise + +• **noise**: `any` + +--- + +### instance + +▪ `Static` **instance**: [`default`](Backend_Procedural_Noise.default.md) + +## Methods + +### simplex2 + +▸ **simplex2**(`x`, `y`): `number` + +#### Parameters + +| Name | Type | +| :--- | :---- | +| `x` | `any` | +| `y` | `any` | + +#### Returns + +`number` + +--- + +### getInstance + +▸ `Static` **getInstance**(): [`default`](Backend_Procedural_Noise.default.md) + +#### Returns + +[`default`](Backend_Procedural_Noise.default.md) + +--- + +### initialize + +▸ `Static` **initialize**(): [`default`](Backend_Procedural_Noise.default.md) + +#### Returns + +[`default`](Backend_Procedural_Noise.default.md) diff --git a/docs/classes/Backend_Procedural_ProcgenUtils.ProcgenUtils.md b/docs/classes/Backend_Procedural_ProcgenUtils.ProcgenUtils.md new file mode 100644 index 00000000..82d7ee55 --- /dev/null +++ b/docs/classes/Backend_Procedural_ProcgenUtils.ProcgenUtils.md @@ -0,0 +1,605 @@ +# Class: ProcgenUtils + +[Backend/Procedural/ProcgenUtils](../modules/Backend_Procedural_ProcgenUtils.md).ProcgenUtils + +## Table of contents + +### Constructors + +- [constructor](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#constructor) + +### Properties + +- [baseByBiome](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#basebybiome) +- [blurbs2ById](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#blurbs2byid) +- [blurbsById](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#blurbsbyid) +- [cosmeticByLocId](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#cosmeticbylocid) +- [grayColors](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#graycolors) +- [huesByHash](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#huesbyhash) +- [namesById](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#namesbyid) +- [oceanByBiome](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#oceanbybiome) +- [rgbsByHash](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#rgbsbyhash) +- [strByBiome](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#strbybiome) +- [taglinesById](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#taglinesbyid) + +### Methods + +- [artifactRandom](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#artifactrandom) +- [artifactRandomInt](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#artifactrandomint) +- [ellipsStrEnd](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#ellipsstrend) +- [ellipsisStr](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#ellipsisstr) +- [getBiomeRgbStr](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getbiomergbstr) +- [getHatSizeName](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#gethatsizename) +- [getOwnerColor](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getownercolor) +- [getOwnerColorVec](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getownercolorvec) +- [getPlanetBlurb](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getplanetblurb) +- [getPlanetBlurb2](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getplanetblurb2) +- [getPlanetClass](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getplanetclass) +- [getPlanetCosmetic](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getplanetcosmetic) +- [getPlanetName](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getplanetname) +- [getPlanetNameHash](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getplanetnamehash) +- [getPlanetTagline](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getplanettagline) +- [getPlanetTitle](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getplanettitle) +- [getPlayerColor](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getplayercolor) +- [getPlayerColorVec](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getplayercolorvec) +- [getRuinsInfo](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#getruinsinfo) +- [hashToHue](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#hashtohue) +- [hashToInt](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#hashtoint) +- [hslStr](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#hslstr) +- [hslToRgb](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#hsltorgb) +- [planetPerlin](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#planetperlin) +- [planetRandom](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#planetrandom) +- [planetRandomInt](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#planetrandomint) +- [rgbStr](Backend_Procedural_ProcgenUtils.ProcgenUtils.md#rgbstr) + +## Constructors + +### constructor + +• **new ProcgenUtils**() + +## Properties + +### baseByBiome + +▪ `Static` `Private` **baseByBiome**: `Object` + +#### Index signature + +▪ [Biome: `number`]: [`HSLVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#hslvec) + +--- + +### blurbs2ById + +▪ `Static` `Private` **blurbs2ById**: `Map`<`LocationId`, `string`\> + +--- + +### blurbsById + +▪ `Static` `Private` **blurbsById**: `Map`<`LocationId`, `string`\> + +--- + +### cosmeticByLocId + +▪ `Static` `Private` **cosmeticByLocId**: `Map`<`LocationId`, [`PlanetCosmeticInfo`](../interfaces/Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md)\> + +--- + +### grayColors + +▪ `Static` **grayColors**: [`PlanetCosmeticInfo`](../interfaces/Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md) + +--- + +### huesByHash + +▪ `Static` `Private` **huesByHash**: `Map`<`string`, `number`\> + +--- + +### namesById + +▪ `Static` `Private` **namesById**: `Map`<`LocationId`, `string`\> + +--- + +### oceanByBiome + +▪ `Static` `Private` **oceanByBiome**: `Object` + +#### Index signature + +▪ [Biome: `number`]: [`HSLVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#hslvec) + +--- + +### rgbsByHash + +▪ `Static` `Private` **rgbsByHash**: `Map`<`string`, [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec)\> + +--- + +### strByBiome + +▪ `Static` `Private` **strByBiome**: `Map`<`Biome`, `string`\> + +--- + +### taglinesById + +▪ `Static` `Private` **taglinesById**: `Map`<`LocationId`, `string`\> + +## Methods + +### artifactRandom + +▸ `Static` **artifactRandom**(`loc`): () => `number` + +#### Parameters + +| Name | Type | +| :---- | :----------- | +| `loc` | `ArtifactId` | + +#### Returns + +`fn` + +▸ (): `number` + +##### Returns + +`number` + +--- + +### artifactRandomInt + +▸ `Static` **artifactRandomInt**(`loc`): () => `number` + +#### Parameters + +| Name | Type | +| :---- | :----------- | +| `loc` | `ArtifactId` | + +#### Returns + +`fn` + +▸ (): `number` + +##### Returns + +`number` + +--- + +### ellipsStrEnd + +▸ `Static` **ellipsStrEnd**(`str`, `maxLen`): `string` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `str` | `string` | +| `maxLen` | `number` | + +#### Returns + +`string` + +--- + +### ellipsisStr + +▸ `Static` **ellipsisStr**(`str`, `maxLen`): `string` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `str` | `string` | +| `maxLen` | `number` | + +#### Returns + +`string` + +--- + +### getBiomeRgbStr + +▸ `Static` **getBiomeRgbStr**(`biome`): `string` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `biome` | `Biome` | + +#### Returns + +`string` + +--- + +### getHatSizeName + +▸ `Static` **getHatSizeName**(`planet`): `string` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`string` + +--- + +### getOwnerColor + +▸ `Static` **getOwnerColor**(`planet`): `string` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`string` + +--- + +### getOwnerColorVec + +▸ `Static` **getOwnerColorVec**(`planet`): [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +[`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) + +--- + +### getPlanetBlurb + +▸ `Static` **getPlanetBlurb**(`planet`): `string` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`string` + +--- + +### getPlanetBlurb2 + +▸ `Static` **getPlanetBlurb2**(`planet`): `string` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`string` + +--- + +### getPlanetClass + +▸ `Static` **getPlanetClass**(`planet`): `UpgradeBranchName` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`UpgradeBranchName` + +--- + +### getPlanetCosmetic + +▸ `Static` **getPlanetCosmetic**(`planet`): [`PlanetCosmeticInfo`](../interfaces/Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md) + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +[`PlanetCosmeticInfo`](../interfaces/Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md) + +--- + +### getPlanetName + +▸ `Static` **getPlanetName**(`planet`): `string` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`string` + +--- + +### getPlanetNameHash + +▸ `Static` **getPlanetNameHash**(`locId`): `string` + +#### Parameters + +| Name | Type | +| :------ | :----------- | +| `locId` | `LocationId` | + +#### Returns + +`string` + +--- + +### getPlanetTagline + +▸ `Static` **getPlanetTagline**(`planet`): `string` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`string` + +--- + +### getPlanetTitle + +▸ `Static` **getPlanetTitle**(`planet`): `string` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`string` + +--- + +### getPlayerColor + +▸ `Static` **getPlayerColor**(`player`): `string` + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `player` | `EthAddress` | + +#### Returns + +`string` + +--- + +### getPlayerColorVec + +▸ `Static` **getPlayerColorVec**(`player`): [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `player` | `EthAddress` | + +#### Returns + +[`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) + +--- + +### getRuinsInfo + +▸ `Static` **getRuinsInfo**(`loc`): [`RuinsInfo`](../modules/Backend_Utils_UtilsTypes.md#ruinsinfo) + +#### Parameters + +| Name | Type | +| :---- | :----------- | +| `loc` | `LocationId` | + +#### Returns + +[`RuinsInfo`](../modules/Backend_Utils_UtilsTypes.md#ruinsinfo) + +--- + +### hashToHue + +▸ `Static` **hashToHue**(`hash`): `number` + +#### Parameters + +| Name | Type | +| :----- | :------- | +| `hash` | `string` | + +#### Returns + +`number` + +--- + +### hashToInt + +▸ `Static` **hashToInt**(`hash`): `number` + +#### Parameters + +| Name | Type | +| :----- | :------- | +| `hash` | `string` | + +#### Returns + +`number` + +--- + +### hslStr + +▸ `Static` **hslStr**(`h`, `s`, `l`): `string` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `h` | `number` | +| `s` | `number` | +| `l` | `number` | + +#### Returns + +`string` + +--- + +### hslToRgb + +▸ `Static` **hslToRgb**(`__namedParameters`): [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +#### Parameters + +| Name | Type | +| :------------------ | :--------------------------------------------------------------------------- | +| `__namedParameters` | [`HSLVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#hslvec) | + +#### Returns + +[`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### planetPerlin + +▸ `Static` **planetPerlin**(`loc`): (`coords`: [`PixelCoords`](../modules/Backend_Procedural_ProcgenUtils.md#pixelcoords)) => `number` + +#### Parameters + +| Name | Type | +| :---- | :----------- | +| `loc` | `LocationId` | + +#### Returns + +`fn` + +▸ (`coords`): `number` + +##### Parameters + +| Name | Type | +| :------- | :------------------------------------------------------------------------- | +| `coords` | [`PixelCoords`](../modules/Backend_Procedural_ProcgenUtils.md#pixelcoords) | + +##### Returns + +`number` + +--- + +### planetRandom + +▸ `Static` **planetRandom**(`loc`): () => `number` + +#### Parameters + +| Name | Type | +| :---- | :----------- | +| `loc` | `LocationId` | + +#### Returns + +`fn` + +▸ (): `number` + +##### Returns + +`number` + +--- + +### planetRandomInt + +▸ `Static` **planetRandomInt**(`loc`): () => `number` + +#### Parameters + +| Name | Type | +| :---- | :----------- | +| `loc` | `LocationId` | + +#### Returns + +`fn` + +▸ (): `number` + +##### Returns + +`number` + +--- + +### rgbStr + +▸ `Static` **rgbStr**(`rgb`): `string` + +#### Parameters + +| Name | Type | +| :---- | :--------------------------------------------------------------------------- | +| `rgb` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | + +#### Returns + +`string` diff --git a/docs/classes/Backend_Storage_PersistentChunkStore.default.md b/docs/classes/Backend_Storage_PersistentChunkStore.default.md new file mode 100644 index 00000000..c4e0bd4b --- /dev/null +++ b/docs/classes/Backend_Storage_PersistentChunkStore.default.md @@ -0,0 +1,551 @@ +# Class: default + +[Backend/Storage/PersistentChunkStore](../modules/Backend_Storage_PersistentChunkStore.md).default + +## Implements + +- [`ChunkStore`](../interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md) + +## Table of contents + +### Constructors + +- [constructor](Backend_Storage_PersistentChunkStore.default.md#constructor) + +### Properties + +- [account](Backend_Storage_PersistentChunkStore.default.md#account) +- [chunkMap](Backend_Storage_PersistentChunkStore.default.md#chunkmap) +- [confirmedTxHashes](Backend_Storage_PersistentChunkStore.default.md#confirmedtxhashes) +- [db](Backend_Storage_PersistentChunkStore.default.md#db) +- [diagnosticUpdater](Backend_Storage_PersistentChunkStore.default.md#diagnosticupdater) +- [nUpdatesLastTwoMins](Backend_Storage_PersistentChunkStore.default.md#nupdateslasttwomins) +- [queuedChunkWrites](Backend_Storage_PersistentChunkStore.default.md#queuedchunkwrites) +- [throttledSaveChunkCacheToDisk](Backend_Storage_PersistentChunkStore.default.md#throttledsavechunkcachetodisk) + +### Methods + +- [addChunk](Backend_Storage_PersistentChunkStore.default.md#addchunk) +- [addHomeLocation](Backend_Storage_PersistentChunkStore.default.md#addhomelocation) +- [allChunks](Backend_Storage_PersistentChunkStore.default.md#allchunks) +- [bulkSetKeyInCollection](Backend_Storage_PersistentChunkStore.default.md#bulksetkeyincollection) +- [confirmHomeLocation](Backend_Storage_PersistentChunkStore.default.md#confirmhomelocation) +- [destroy](Backend_Storage_PersistentChunkStore.default.md#destroy) +- [getChunkByFootprint](Backend_Storage_PersistentChunkStore.default.md#getchunkbyfootprint) +- [getChunkById](Backend_Storage_PersistentChunkStore.default.md#getchunkbyid) +- [getHomeLocations](Backend_Storage_PersistentChunkStore.default.md#gethomelocations) +- [getKey](Backend_Storage_PersistentChunkStore.default.md#getkey) +- [getMinedSubChunks](Backend_Storage_PersistentChunkStore.default.md#getminedsubchunks) +- [getSavedRevealedCoords](Backend_Storage_PersistentChunkStore.default.md#getsavedrevealedcoords) +- [getSavedTouchedPlanetIds](Backend_Storage_PersistentChunkStore.default.md#getsavedtouchedplanetids) +- [getUnconfirmedSubmittedEthTxs](Backend_Storage_PersistentChunkStore.default.md#getunconfirmedsubmittedethtxs) +- [hasMinedChunk](Backend_Storage_PersistentChunkStore.default.md#hasminedchunk) +- [loadChunks](Backend_Storage_PersistentChunkStore.default.md#loadchunks) +- [loadPlugins](Backend_Storage_PersistentChunkStore.default.md#loadplugins) +- [onEthTxComplete](Backend_Storage_PersistentChunkStore.default.md#onethtxcomplete) +- [onEthTxSubmit](Backend_Storage_PersistentChunkStore.default.md#onethtxsubmit) +- [persistQueuedChunks](Backend_Storage_PersistentChunkStore.default.md#persistqueuedchunks) +- [recomputeSaveThrottleAfterUpdate](Backend_Storage_PersistentChunkStore.default.md#recomputesavethrottleafterupdate) +- [removeKey](Backend_Storage_PersistentChunkStore.default.md#removekey) +- [savePlugins](Backend_Storage_PersistentChunkStore.default.md#saveplugins) +- [saveRevealedCoords](Backend_Storage_PersistentChunkStore.default.md#saverevealedcoords) +- [saveTouchedPlanetIds](Backend_Storage_PersistentChunkStore.default.md#savetouchedplanetids) +- [setDiagnosticUpdater](Backend_Storage_PersistentChunkStore.default.md#setdiagnosticupdater) +- [setKey](Backend_Storage_PersistentChunkStore.default.md#setkey) +- [create](Backend_Storage_PersistentChunkStore.default.md#create) + +## Constructors + +### constructor + +• **new default**(`db`, `account`) + +#### Parameters + +| Name | Type | +| :-------- | :------------------------- | +| `db` | `IDBPDatabase`<`unknown`\> | +| `account` | `EthAddress` | + +## Properties + +### account + +• `Private` **account**: `EthAddress` + +--- + +### chunkMap + +• `Private` **chunkMap**: `Map`<[`ChunkId`](../modules/_types_darkforest_api_ChunkStoreTypes.md#chunkid), [`Chunk`](_types_global_GlobalTypes.Chunk.md)\> + +--- + +### confirmedTxHashes + +• `Private` **confirmedTxHashes**: `Set`<`string`\> + +--- + +### db + +• `Private` **db**: `IDBPDatabase`<`unknown`\> + +--- + +### diagnosticUpdater + +• `Private` `Optional` **diagnosticUpdater**: [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) + +--- + +### nUpdatesLastTwoMins + +• `Private` **nUpdatesLastTwoMins**: `number` = `0` + +--- + +### queuedChunkWrites + +• `Private` **queuedChunkWrites**: `DBTx`[] + +--- + +### throttledSaveChunkCacheToDisk + +• `Private` **throttledSaveChunkCacheToDisk**: `DebouncedFunc`<`fn`\> + +## Methods + +### addChunk + +▸ **addChunk**(`chunk`, `persistChunk?`): `void` + +When a chunk is mined, or a chunk is imported via map import, or a chunk is loaded from +persistent storage for the first time, we need to add this chunk to the game. This function +allows you to add a new chunk to the game, and optionally persist that chunk. The reason you +might not want to persist the chunk is if you are sure that you got it from persistent storage. +i.e. it already exists in persistent storage. + +#### Parameters + +| Name | Type | Default value | +| :------------- | :-------------------------------------------- | :------------ | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | `undefined` | +| `persistChunk` | `boolean` | `true` | + +#### Returns + +`void` + +--- + +### addHomeLocation + +▸ **addHomeLocation**(`location`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :--------- | :-------------- | +| `location` | `WorldLocation` | + +#### Returns + +`Promise`<`void`\> + +--- + +### allChunks + +▸ **allChunks**(): `Iterable`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> + +#### Returns + +`Iterable`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> + +--- + +### bulkSetKeyInCollection + +▸ `Private` **bulkSetKeyInCollection**(`updateChunkTxs`, `collection`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :--------------- | :------------ | +| `updateChunkTxs` | `DBTx`[] | +| `collection` | `ObjectStore` | + +#### Returns + +`Promise`<`void`\> + +--- + +### confirmHomeLocation + +▸ **confirmHomeLocation**(`location`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :--------- | :-------------- | +| `location` | `WorldLocation` | + +#### Returns + +`Promise`<`void`\> + +--- + +### destroy + +▸ **destroy**(): `void` + +#### Returns + +`void` + +--- + +### getChunkByFootprint + +▸ **getChunkByFootprint**(`chunkLoc`): `undefined` \| [`Chunk`](_types_global_GlobalTypes.Chunk.md) + +Returns the explored chunk data for the given rectangle if that chunk has been mined. If this +chunk is entirely contained within another bigger chunk that has been mined, return that chunk. +`chunkLoc` is an aligned square, as defined in ChunkUtils.ts in the `getSiblingLocations` +function. + +#### Parameters + +| Name | Type | +| :--------- | :------------------------------------------------------------------ | +| `chunkLoc` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +`undefined` \| [`Chunk`](_types_global_GlobalTypes.Chunk.md) + +--- + +### getChunkById + +▸ `Private` **getChunkById**(`chunkId`): `undefined` \| [`Chunk`](_types_global_GlobalTypes.Chunk.md) + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------- | +| `chunkId` | [`ChunkId`](../modules/_types_darkforest_api_ChunkStoreTypes.md#chunkid) | + +#### Returns + +`undefined` \| [`Chunk`](_types_global_GlobalTypes.Chunk.md) + +--- + +### getHomeLocations + +▸ **getHomeLocations**(): `Promise`<`WorldLocation`[]\> + +we keep a list rather than a single location, since client/contract can +often go out of sync on initialization - if client thinks that init +failed but is wrong, it will prompt user to initialize with new home coords, +which bricks the user's account. + +#### Returns + +`Promise`<`WorldLocation`[]\> + +--- + +### getKey + +▸ `Private` **getKey**(`key`, `objStore?`): `Promise`<`undefined` \| `string`\> + +Important! This sets the key in indexed db per account and per contract. This means the same +client can connect to multiple different dark forest contracts, with multiple different +accounts, and the persistent storage will not overwrite data that is not relevant for the +current configuration of the client. + +#### Parameters + +| Name | Type | +| :--------- | :------------ | +| `key` | `string` | +| `objStore` | `ObjectStore` | + +#### Returns + +`Promise`<`undefined` \| `string`\> + +--- + +### getMinedSubChunks + +▸ `Private` **getMinedSubChunks**(`chunk`): [`Chunk`](_types_global_GlobalTypes.Chunk.md)[] + +Returns all the mined chunks with smaller sidelength strictly contained in the chunk. + +TODO: move this into ChunkUtils, and also make use of it, the way that it is currently used, in +the function named `addToChunkMap`. + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +[`Chunk`](_types_global_GlobalTypes.Chunk.md)[] + +--- + +### getSavedRevealedCoords + +▸ **getSavedRevealedCoords**(): `Promise`<`RevealedCoords`[]\> + +#### Returns + +`Promise`<`RevealedCoords`[]\> + +--- + +### getSavedTouchedPlanetIds + +▸ **getSavedTouchedPlanetIds**(): `Promise`<`LocationId`[]\> + +#### Returns + +`Promise`<`LocationId`[]\> + +--- + +### getUnconfirmedSubmittedEthTxs + +▸ **getUnconfirmedSubmittedEthTxs**(): `Promise`<`SubmittedTx`[]\> + +#### Returns + +`Promise`<`SubmittedTx`[]\> + +--- + +### hasMinedChunk + +▸ **hasMinedChunk**(`chunkLoc`): `boolean` + +#### Parameters + +| Name | Type | +| :--------- | :------------------------------------------------------------------ | +| `chunkLoc` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +`boolean` + +#### Implementation of + +[ChunkStore](../interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md).[hasMinedChunk](../interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md#hasminedchunk) + +--- + +### loadChunks + +▸ `Private` **loadChunks**(): `Promise`<`void`\> + +This function loads all chunks persisted in the user's storage into the game. + +#### Returns + +`Promise`<`void`\> + +--- + +### loadPlugins + +▸ **loadPlugins**(): `Promise`<[`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[]\> + +#### Returns + +`Promise`<[`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[]\> + +--- + +### onEthTxComplete + +▸ **onEthTxComplete**(`txHash`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `txHash` | `string` | + +#### Returns + +`Promise`<`void`\> + +--- + +### onEthTxSubmit + +▸ **onEthTxSubmit**(`tx`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :--- | :------------ | +| `tx` | `SubmittedTx` | + +#### Returns + +`Promise`<`void`\> + +--- + +### persistQueuedChunks + +▸ `Private` **persistQueuedChunks**(): `Promise`<`void`\> + +Rather than saving a chunk immediately after it's mined, we queue up new chunks, and +periodically save them. This function gets all of the queued new chunks, and persists them to +indexed db. + +#### Returns + +`Promise`<`void`\> + +--- + +### recomputeSaveThrottleAfterUpdate + +▸ `Private` **recomputeSaveThrottleAfterUpdate**(): `void` + +#### Returns + +`void` + +--- + +### removeKey + +▸ `Private` **removeKey**(`key`, `objStore?`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :--------- | :------------ | +| `key` | `string` | +| `objStore` | `ObjectStore` | + +#### Returns + +`Promise`<`void`\> + +--- + +### savePlugins + +▸ **savePlugins**(`plugins`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------------- | +| `plugins` | [`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[] | + +#### Returns + +`Promise`<`void`\> + +--- + +### saveRevealedCoords + +▸ **saveRevealedCoords**(`revealedCoordTups`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :------------------ | :----------------- | +| `revealedCoordTups` | `RevealedCoords`[] | + +#### Returns + +`Promise`<`void`\> + +--- + +### saveTouchedPlanetIds + +▸ **saveTouchedPlanetIds**(`ids`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :---- | :------------- | +| `ids` | `LocationId`[] | + +#### Returns + +`Promise`<`void`\> + +--- + +### setDiagnosticUpdater + +▸ **setDiagnosticUpdater**(`diagnosticUpdater?`): `void` + +#### Parameters + +| Name | Type | +| :------------------- | :--------------------------------------------------------------------------------------------- | +| `diagnosticUpdater?` | [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) | + +#### Returns + +`void` + +--- + +### setKey + +▸ `Private` **setKey**(`key`, `value`, `objStore?`): `Promise`<`void`\> + +Important! This sets the key in indexed db per account and per contract. This means the same +client can connect to multiple different dark forest contracts, with multiple different +accounts, and the persistent storage will not overwrite data that is not relevant for the +current configuration of the client. + +#### Parameters + +| Name | Type | +| :--------- | :------------ | +| `key` | `string` | +| `value` | `string` | +| `objStore` | `ObjectStore` | + +#### Returns + +`Promise`<`void`\> + +--- + +### create + +▸ `Static` **create**(`account`): `Promise`<[`default`](Backend_Storage_PersistentChunkStore.default.md)\> + +#### Parameters + +| Name | Type | +| :-------- | :----------- | +| `account` | `EthAddress` | + +#### Returns + +`Promise`<[`default`](Backend_Storage_PersistentChunkStore.default.md)\> diff --git a/docs/classes/Backend_Storage_ReaderDataStore.default.md b/docs/classes/Backend_Storage_ReaderDataStore.default.md new file mode 100644 index 00000000..950c89bd --- /dev/null +++ b/docs/classes/Backend_Storage_ReaderDataStore.default.md @@ -0,0 +1,213 @@ +# Class: default + +[Backend/Storage/ReaderDataStore](../modules/Backend_Storage_ReaderDataStore.md).default + +A data store that allows you to retrieve data from the contract, +and combine it with data that is stored in this browser about a +particular user. + +## Table of contents + +### Constructors + +- [constructor](Backend_Storage_ReaderDataStore.default.md#constructor) + +### Properties + +- [addressTwitterMap](Backend_Storage_ReaderDataStore.default.md#addresstwittermap) +- [contractConstants](Backend_Storage_ReaderDataStore.default.md#contractconstants) +- [contractsAPI](Backend_Storage_ReaderDataStore.default.md#contractsapi) +- [persistentChunkStore](Backend_Storage_ReaderDataStore.default.md#persistentchunkstore) +- [viewer](Backend_Storage_ReaderDataStore.default.md#viewer) + +### Methods + +- [destroy](Backend_Storage_ReaderDataStore.default.md#destroy) +- [getBiome](Backend_Storage_ReaderDataStore.default.md#getbiome) +- [getTwitter](Backend_Storage_ReaderDataStore.default.md#gettwitter) +- [getViewer](Backend_Storage_ReaderDataStore.default.md#getviewer) +- [loadArtifactFromContract](Backend_Storage_ReaderDataStore.default.md#loadartifactfromcontract) +- [loadPlanetFromContract](Backend_Storage_ReaderDataStore.default.md#loadplanetfromcontract) +- [setPlanetLocationIfKnown](Backend_Storage_ReaderDataStore.default.md#setplanetlocationifknown) +- [spaceTypeFromPerlin](Backend_Storage_ReaderDataStore.default.md#spacetypefromperlin) +- [create](Backend_Storage_ReaderDataStore.default.md#create) + +## Constructors + +### constructor + +• `Private` **new default**(`viewer`, `addressTwitterMap`, `contractConstants`, `contractsAPI`, `persistentChunkStore`) + +#### Parameters + +| Name | Type | +| :--------------------- | :------------------------------------------------------------------------------------------------- | +| `viewer` | `undefined` \| `EthAddress` | +| `addressTwitterMap` | [`AddressTwitterMap`](../modules/_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap) | +| `contractConstants` | [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) | +| `contractsAPI` | [`default`](Backend_GameLogic_ContractsAPI.default.md) | +| `persistentChunkStore` | `undefined` \| [`default`](Backend_Storage_PersistentChunkStore.default.md) | + +## Properties + +### addressTwitterMap + +• `Private` `Readonly` **addressTwitterMap**: [`AddressTwitterMap`](../modules/_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap) + +--- + +### contractConstants + +• `Private` `Readonly` **contractConstants**: [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) + +--- + +### contractsAPI + +• `Private` `Readonly` **contractsAPI**: [`default`](Backend_GameLogic_ContractsAPI.default.md) + +--- + +### persistentChunkStore + +• `Private` `Readonly` **persistentChunkStore**: `undefined` \| [`default`](Backend_Storage_PersistentChunkStore.default.md) + +--- + +### viewer + +• `Private` `Readonly` **viewer**: `undefined` \| `EthAddress` + +## Methods + +### destroy + +▸ **destroy**(): `void` + +#### Returns + +`void` + +--- + +### getBiome + +▸ `Private` **getBiome**(`loc`): `Biome` + +#### Parameters + +| Name | Type | +| :---- | :-------------- | +| `loc` | `WorldLocation` | + +#### Returns + +`Biome` + +--- + +### getTwitter + +▸ **getTwitter**(`owner`): `undefined` \| `string` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------- | +| `owner` | `undefined` \| `EthAddress` | + +#### Returns + +`undefined` \| `string` + +--- + +### getViewer + +▸ **getViewer**(): `undefined` \| `EthAddress` + +#### Returns + +`undefined` \| `EthAddress` + +--- + +### loadArtifactFromContract + +▸ **loadArtifactFromContract**(`artifactId`): `Promise`<`Artifact`\> + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`Promise`<`Artifact`\> + +--- + +### loadPlanetFromContract + +▸ **loadPlanetFromContract**(`planetId`): `Promise`<`Planet` \| `LocatablePlanet`\> + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`Promise`<`Planet` \| `LocatablePlanet`\> + +--- + +### setPlanetLocationIfKnown + +▸ `Private` **setPlanetLocationIfKnown**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### spaceTypeFromPerlin + +▸ `Private` **spaceTypeFromPerlin**(`perlin`): `SpaceType` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `perlin` | `number` | + +#### Returns + +`SpaceType` + +--- + +### create + +▸ `Static` **create**(`terminal`, `ethConnection`, `viewer`): `Promise`<[`default`](Backend_Storage_ReaderDataStore.default.md)\> + +#### Parameters + +| Name | Type | +| :-------------- | :-------------------------------------------------------------------------------------------------------------- | +| `terminal` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | +| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | +| `viewer` | `undefined` \| `EthAddress` | + +#### Returns + +`Promise`<[`default`](Backend_Storage_ReaderDataStore.default.md)\> diff --git a/docs/classes/Backend_Utils_BlockWaiter.BlockWaiter.md b/docs/classes/Backend_Utils_BlockWaiter.BlockWaiter.md new file mode 100644 index 00000000..73527da6 --- /dev/null +++ b/docs/classes/Backend_Utils_BlockWaiter.BlockWaiter.md @@ -0,0 +1,61 @@ +# Class: BlockWaiter + +[Backend/Utils/BlockWaiter](../modules/Backend_Utils_BlockWaiter.md).BlockWaiter + +You can schedule a function to be executed {@code waitThisLong} in the future. If you +schedule again, the previously scheduled function will not be executed. + +## Table of contents + +### Constructors + +- [constructor](Backend_Utils_BlockWaiter.BlockWaiter.md#constructor) + +### Properties + +- [timeout](Backend_Utils_BlockWaiter.BlockWaiter.md#timeout) +- [waitThisLong](Backend_Utils_BlockWaiter.BlockWaiter.md#waitthislong) + +### Methods + +- [schedule](Backend_Utils_BlockWaiter.BlockWaiter.md#schedule) + +## Constructors + +### constructor + +• **new BlockWaiter**(`waitThisLong`) + +#### Parameters + +| Name | Type | +| :------------- | :------- | +| `waitThisLong` | `number` | + +## Properties + +### timeout + +• `Private` `Optional` **timeout**: `Timeout` + +--- + +### waitThisLong + +• `Private` **waitThisLong**: `number` + +## Methods + +### schedule + +▸ **schedule**(`func`): `void` + +#### Parameters + +| Name | Type | +| :----- | :----------- | +| `func` | () => `void` | + +#### Returns + +`void` diff --git a/docs/classes/Backend_Utils_SnarkArgsHelper.default.md b/docs/classes/Backend_Utils_SnarkArgsHelper.default.md new file mode 100644 index 00000000..ca306dd9 --- /dev/null +++ b/docs/classes/Backend_Utils_SnarkArgsHelper.default.md @@ -0,0 +1,298 @@ +# Class: default + +[Backend/Utils/SnarkArgsHelper](../modules/Backend_Utils_SnarkArgsHelper.md).default + +## Table of contents + +### Constructors + +- [constructor](Backend_Utils_SnarkArgsHelper.default.md#constructor) + +### Properties + +- [biomebasePerlinOpts](Backend_Utils_SnarkArgsHelper.default.md#biomebaseperlinopts) +- [hashConfig](Backend_Utils_SnarkArgsHelper.default.md#hashconfig) +- [moveSnarkCache](Backend_Utils_SnarkArgsHelper.default.md#movesnarkcache) +- [planetHashMimc](Backend_Utils_SnarkArgsHelper.default.md#planethashmimc) +- [snarkProverQueue](Backend_Utils_SnarkArgsHelper.default.md#snarkproverqueue) +- [spaceTypePerlinOpts](Backend_Utils_SnarkArgsHelper.default.md#spacetypeperlinopts) +- [terminal](Backend_Utils_SnarkArgsHelper.default.md#terminal) +- [useMockHash](Backend_Utils_SnarkArgsHelper.default.md#usemockhash) +- [DEFAULT_SNARK_CACHE_SIZE](Backend_Utils_SnarkArgsHelper.default.md#default_snark_cache_size) + +### Methods + +- [fakeBiomebaseProof](Backend_Utils_SnarkArgsHelper.default.md#fakebiomebaseproof) +- [fakeInitProof](Backend_Utils_SnarkArgsHelper.default.md#fakeinitproof) +- [fakeMoveProof](Backend_Utils_SnarkArgsHelper.default.md#fakemoveproof) +- [fakeRevealProof](Backend_Utils_SnarkArgsHelper.default.md#fakerevealproof) +- [getFindArtifactArgs](Backend_Utils_SnarkArgsHelper.default.md#getfindartifactargs) +- [getInitArgs](Backend_Utils_SnarkArgsHelper.default.md#getinitargs) +- [getMoveArgs](Backend_Utils_SnarkArgsHelper.default.md#getmoveargs) +- [getRevealArgs](Backend_Utils_SnarkArgsHelper.default.md#getrevealargs) +- [setSnarkCacheSize](Backend_Utils_SnarkArgsHelper.default.md#setsnarkcachesize) +- [create](Backend_Utils_SnarkArgsHelper.default.md#create) + +## Constructors + +### constructor + +• `Private` **new default**(`hashConfig`, `terminal`, `useMockHash`) + +#### Parameters + +| Name | Type | +| :------------ | :-------------------------------------------------------------------------------------------------------------- | +| `hashConfig` | [`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) | +| `terminal` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | +| `useMockHash` | `boolean` | + +## Properties + +### biomebasePerlinOpts + +• `Private` `Readonly` **biomebasePerlinOpts**: `PerlinConfig` + +--- + +### hashConfig + +• `Private` `Readonly` **hashConfig**: [`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) + +--- + +### moveSnarkCache + +• `Private` **moveSnarkCache**: `default`<`string`, `MoveSnarkContractCallArgs`\> + +--- + +### planetHashMimc + +• `Private` `Readonly` **planetHashMimc**: (...`inputs`: `number`[]) => `BigInteger` + +#### Type declaration + +▸ (...`inputs`): `BigInteger` + +##### Parameters + +| Name | Type | +| :---------- | :--------- | +| `...inputs` | `number`[] | + +##### Returns + +`BigInteger` + +--- + +### snarkProverQueue + +• `Private` `Readonly` **snarkProverQueue**: `SnarkProverQueue` + +--- + +### spaceTypePerlinOpts + +• `Private` `Readonly` **spaceTypePerlinOpts**: `PerlinConfig` + +--- + +### terminal + +• `Private` `Readonly` **terminal**: `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> + +--- + +### useMockHash + +• `Private` `Readonly` **useMockHash**: `boolean` + +--- + +### DEFAULT_SNARK_CACHE_SIZE + +▪ `Static` `Private` `Readonly` **DEFAULT_SNARK_CACHE_SIZE**: `20` + +How many snark results to keep in an LRU cache. + +## Methods + +### fakeBiomebaseProof + +▸ `Private` **fakeBiomebaseProof**(`x`, `y`): `SnarkJSProofAndSignals` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | + +#### Returns + +`SnarkJSProofAndSignals` + +--- + +### fakeInitProof + +▸ `Private` **fakeInitProof**(`x`, `y`, `r`): `SnarkJSProofAndSignals` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | +| `r` | `number` | + +#### Returns + +`SnarkJSProofAndSignals` + +--- + +### fakeMoveProof + +▸ `Private` **fakeMoveProof**(`x1`, `y1`, `x2`, `y2`, `r`, `distMax`): `SnarkJSProofAndSignals` + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `x1` | `number` | +| `y1` | `number` | +| `x2` | `number` | +| `y2` | `number` | +| `r` | `number` | +| `distMax` | `number` | + +#### Returns + +`SnarkJSProofAndSignals` + +--- + +### fakeRevealProof + +▸ `Private` **fakeRevealProof**(`x`, `y`): `SnarkJSProofAndSignals` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | + +#### Returns + +`SnarkJSProofAndSignals` + +--- + +### getFindArtifactArgs + +▸ **getFindArtifactArgs**(`x`, `y`): `Promise`<`BiomebaseSnarkContractCallArgs`\> + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | + +#### Returns + +`Promise`<`BiomebaseSnarkContractCallArgs`\> + +--- + +### getInitArgs + +▸ **getInitArgs**(`x`, `y`, `r`): `Promise`<`InitSnarkContractCallArgs`\> + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | +| `r` | `number` | + +#### Returns + +`Promise`<`InitSnarkContractCallArgs`\> + +--- + +### getMoveArgs + +▸ **getMoveArgs**(`x1`, `y1`, `x2`, `y2`, `r`, `distMax`): `Promise`<`MoveSnarkContractCallArgs`\> + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `x1` | `number` | +| `y1` | `number` | +| `x2` | `number` | +| `y2` | `number` | +| `r` | `number` | +| `distMax` | `number` | + +#### Returns + +`Promise`<`MoveSnarkContractCallArgs`\> + +--- + +### getRevealArgs + +▸ **getRevealArgs**(`x`, `y`): `Promise`<`RevealSnarkContractCallArgs`\> + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | + +#### Returns + +`Promise`<`RevealSnarkContractCallArgs`\> + +--- + +### setSnarkCacheSize + +▸ **setSnarkCacheSize**(`size`): `void` + +#### Parameters + +| Name | Type | +| :----- | :------- | +| `size` | `number` | + +#### Returns + +`void` + +--- + +### create + +▸ `Static` **create**(`hashConfig`, `terminal`, `fakeHash?`): [`default`](Backend_Utils_SnarkArgsHelper.default.md) + +#### Parameters + +| Name | Type | Default value | +| :----------- | :-------------------------------------------------------------------------------------------------------------- | :------------ | +| `hashConfig` | [`HashConfig`](../modules/_types_global_GlobalTypes.md#hashconfig) | `undefined` | +| `terminal` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | `undefined` | +| `fakeHash` | `boolean` | `false` | + +#### Returns + +[`default`](Backend_Utils_SnarkArgsHelper.default.md) diff --git a/docs/classes/backend_utils_wrapper.wrapper.md b/docs/classes/Backend_Utils_Wrapper.Wrapper.md similarity index 57% rename from docs/classes/backend_utils_wrapper.wrapper.md rename to docs/classes/Backend_Utils_Wrapper.Wrapper.md index 28ab4983..f0997381 100644 --- a/docs/classes/backend_utils_wrapper.wrapper.md +++ b/docs/classes/Backend_Utils_Wrapper.Wrapper.md @@ -1,6 +1,6 @@ # Class: Wrapper -[Backend/Utils/Wrapper](../modules/backend_utils_wrapper.md).Wrapper +[Backend/Utils/Wrapper](../modules/Backend_Utils_Wrapper.md).Wrapper React uses referential identity to detect changes, and rerender. Rather than copying an object into a new object, to force a rerender, we can @@ -16,17 +16,17 @@ just wrap it in a new {@code Wrapper}, which will force a rerender. ### Constructors -- [constructor](backend_utils_wrapper.wrapper.md#constructor) +- [constructor](Backend_Utils_Wrapper.Wrapper.md#constructor) ### Properties -- [value](backend_utils_wrapper.wrapper.md#value) +- [value](Backend_Utils_Wrapper.Wrapper.md#value) ## Constructors ### constructor -\+ **new Wrapper**(`value`: T): [_Wrapper_](backend_utils_wrapper.wrapper.md) +• **new Wrapper**<`T`\>(`value`) #### Type parameters @@ -38,12 +38,10 @@ just wrap it in a new {@code Wrapper}, which will force a rerender. | Name | Type | | :------ | :--- | -| `value` | T | - -**Returns:** [_Wrapper_](backend_utils_wrapper.wrapper.md) +| `value` | `T` | ## Properties ### value -• `Readonly` **value**: T +• `Readonly` **value**: `T` diff --git a/docs/classes/Frontend_Game_NotificationManager.default.md b/docs/classes/Frontend_Game_NotificationManager.default.md new file mode 100644 index 00000000..8c3c87c7 --- /dev/null +++ b/docs/classes/Frontend_Game_NotificationManager.default.md @@ -0,0 +1,502 @@ +# Class: default + +[Frontend/Game/NotificationManager](../modules/Frontend_Game_NotificationManager.md).default + +## Hierarchy + +- `EventEmitter` + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Game_NotificationManager.default.md#constructor) + +### Properties + +- [instance](Frontend_Game_NotificationManager.default.md#instance) + +### Methods + +- [artifactFound](Frontend_Game_NotificationManager.default.md#artifactfound) +- [artifactProspected](Frontend_Game_NotificationManager.default.md#artifactprospected) +- [balanceEmpty](Frontend_Game_NotificationManager.default.md#balanceempty) +- [foundBiome](Frontend_Game_NotificationManager.default.md#foundbiome) +- [foundComet](Frontend_Game_NotificationManager.default.md#foundcomet) +- [foundDeadSpace](Frontend_Game_NotificationManager.default.md#founddeadspace) +- [foundDeepSpace](Frontend_Game_NotificationManager.default.md#founddeepspace) +- [foundFoundry](Frontend_Game_NotificationManager.default.md#foundfoundry) +- [foundPirates](Frontend_Game_NotificationManager.default.md#foundpirates) +- [foundSilver](Frontend_Game_NotificationManager.default.md#foundsilver) +- [foundSilverBank](Frontend_Game_NotificationManager.default.md#foundsilverbank) +- [foundSpace](Frontend_Game_NotificationManager.default.md#foundspace) +- [foundTradingPost](Frontend_Game_NotificationManager.default.md#foundtradingpost) +- [getIcon](Frontend_Game_NotificationManager.default.md#geticon) +- [notify](Frontend_Game_NotificationManager.default.md#notify) +- [notifyTx](Frontend_Game_NotificationManager.default.md#notifytx) +- [planetAttacked](Frontend_Game_NotificationManager.default.md#planetattacked) +- [planetCanUpgrade](Frontend_Game_NotificationManager.default.md#planetcanupgrade) +- [planetConquered](Frontend_Game_NotificationManager.default.md#planetconquered) +- [planetLost](Frontend_Game_NotificationManager.default.md#planetlost) +- [receivedPlanet](Frontend_Game_NotificationManager.default.md#receivedplanet) +- [txConfirm](Frontend_Game_NotificationManager.default.md#txconfirm) +- [txInit](Frontend_Game_NotificationManager.default.md#txinit) +- [txRevert](Frontend_Game_NotificationManager.default.md#txrevert) +- [txSubmit](Frontend_Game_NotificationManager.default.md#txsubmit) +- [unsubmittedTxFail](Frontend_Game_NotificationManager.default.md#unsubmittedtxfail) +- [welcomePlayer](Frontend_Game_NotificationManager.default.md#welcomeplayer) +- [getInstance](Frontend_Game_NotificationManager.default.md#getinstance) + +## Constructors + +### constructor + +• `Private` **new default**() + +#### Overrides + +EventEmitter.constructor + +## Properties + +### instance + +▪ `Static` **instance**: [`default`](Frontend_Game_NotificationManager.default.md) + +## Methods + +### artifactFound + +▸ **artifactFound**(`planet`, `artifact`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :---------------- | +| `planet` | `LocatablePlanet` | +| `artifact` | `Artifact` | + +#### Returns + +`void` + +--- + +### artifactProspected + +▸ **artifactProspected**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | + +#### Returns + +`void` + +--- + +### balanceEmpty + +▸ **balanceEmpty**(): `void` + +#### Returns + +`void` + +--- + +### foundBiome + +▸ **foundBiome**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | + +#### Returns + +`void` + +--- + +### foundComet + +▸ **foundComet**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### foundDeadSpace + +▸ **foundDeadSpace**(`chunk`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### foundDeepSpace + +▸ **foundDeepSpace**(`chunk`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### foundFoundry + +▸ **foundFoundry**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | + +#### Returns + +`void` + +--- + +### foundPirates + +▸ **foundPirates**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### foundSilver + +▸ **foundSilver**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### foundSilverBank + +▸ **foundSilverBank**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### foundSpace + +▸ **foundSpace**(`chunk`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### foundTradingPost + +▸ **foundTradingPost**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### getIcon + +▸ `Private` **getIcon**(`type`, `txStatus?`): `undefined` \| `Element` + +#### Parameters + +| Name | Type | +| :---------- | :----------------------------------------------------------------------------------- | +| `type` | [`NotificationType`](../enums/Frontend_Game_NotificationManager.NotificationType.md) | +| `txStatus?` | `EthTxStatus` | + +#### Returns + +`undefined` \| `Element` + +--- + +### notify + +▸ **notify**(`type`, `message`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `type` | [`NotificationType`](../enums/Frontend_Game_NotificationManager.NotificationType.md) | +| `message` | `ReactNode` | + +#### Returns + +`void` + +--- + +### notifyTx + +▸ **notifyTx**(`txData`, `message`, `txStatus`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :------------ | +| `txData` | `TxIntent` | +| `message` | `ReactNode` | +| `txStatus` | `EthTxStatus` | + +#### Returns + +`void` + +--- + +### planetAttacked + +▸ **planetAttacked**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | + +#### Returns + +`void` + +--- + +### planetCanUpgrade + +▸ **planetCanUpgrade**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### planetConquered + +▸ **planetConquered**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | + +#### Returns + +`void` + +--- + +### planetLost + +▸ **planetLost**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | + +#### Returns + +`void` + +--- + +### receivedPlanet + +▸ **receivedPlanet**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`void` + +--- + +### txConfirm + +▸ **txConfirm**(`tx`): `void` + +#### Parameters + +| Name | Type | +| :--- | :------------ | +| `tx` | `SubmittedTx` | + +#### Returns + +`void` + +--- + +### txInit + +▸ **txInit**(`txIntent`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +`void` + +--- + +### txRevert + +▸ **txRevert**(`tx`): `void` + +#### Parameters + +| Name | Type | +| :--- | :------------ | +| `tx` | `SubmittedTx` | + +#### Returns + +`void` + +--- + +### txSubmit + +▸ **txSubmit**(`tx`): `void` + +#### Parameters + +| Name | Type | +| :--- | :------------ | +| `tx` | `SubmittedTx` | + +#### Returns + +`void` + +--- + +### unsubmittedTxFail + +▸ **unsubmittedTxFail**(`txIntent`, `_e`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | +| `_e` | `Error` | + +#### Returns + +`void` + +--- + +### welcomePlayer + +▸ **welcomePlayer**(): `void` + +#### Returns + +`void` + +--- + +### getInstance + +▸ `Static` **getInstance**(): [`default`](Frontend_Game_NotificationManager.default.md) + +#### Returns + +[`default`](Frontend_Game_NotificationManager.default.md) diff --git a/docs/classes/Frontend_Game_Viewport.default.md b/docs/classes/Frontend_Game_Viewport.default.md new file mode 100644 index 00000000..e005f8dc --- /dev/null +++ b/docs/classes/Frontend_Game_Viewport.default.md @@ -0,0 +1,867 @@ +# Class: default + +[Frontend/Game/Viewport](../modules/Frontend_Game_Viewport.md).default + +## Table of contents + +### Constructors + +- [constructor](Frontend_Game_Viewport.default.md#constructor) + +### Properties + +- [animationManager](Frontend_Game_Viewport.default.md#animationmanager) +- [canvas](Frontend_Game_Viewport.default.md#canvas) +- [centerWorldCoords](Frontend_Game_Viewport.default.md#centerworldcoords) +- [frameRequestId](Frontend_Game_Viewport.default.md#framerequestid) +- [gameUIManager](Frontend_Game_Viewport.default.md#gameuimanager) +- [heightInWorldUnits](Frontend_Game_Viewport.default.md#heightinworldunits) +- [intervalId](Frontend_Game_Viewport.default.md#intervalid) +- [isFirefox](Frontend_Game_Viewport.default.md#isfirefox) +- [isPanning](Frontend_Game_Viewport.default.md#ispanning) +- [isSending](Frontend_Game_Viewport.default.md#issending) +- [momentum](Frontend_Game_Viewport.default.md#momentum) +- [mouseLastCoords](Frontend_Game_Viewport.default.md#mouselastcoords) +- [mouseSensitivity](Frontend_Game_Viewport.default.md#mousesensitivity) +- [mousedownCoords](Frontend_Game_Viewport.default.md#mousedowncoords) +- [scale](Frontend_Game_Viewport.default.md#scale) +- [velocity](Frontend_Game_Viewport.default.md#velocity) +- [viewportHeight](Frontend_Game_Viewport.default.md#viewportheight) +- [viewportWidth](Frontend_Game_Viewport.default.md#viewportwidth) +- [widthInWorldUnits](Frontend_Game_Viewport.default.md#widthinworldunits) +- [instance](Frontend_Game_Viewport.default.md#instance) + +### Accessors + +- [maxWorldWidth](Frontend_Game_Viewport.default.md#maxworldwidth) +- [minWorldWidth](Frontend_Game_Viewport.default.md#minworldwidth) + +### Methods + +- [canvasToWorldCoords](Frontend_Game_Viewport.default.md#canvastoworldcoords) +- [canvasToWorldDist](Frontend_Game_Viewport.default.md#canvastoworlddist) +- [canvasToWorldX](Frontend_Game_Viewport.default.md#canvastoworldx) +- [canvasToWorldY](Frontend_Game_Viewport.default.md#canvastoworldy) +- [centerChunk](Frontend_Game_Viewport.default.md#centerchunk) +- [centerCoords](Frontend_Game_Viewport.default.md#centercoords) +- [centerPlanet](Frontend_Game_Viewport.default.md#centerplanet) +- [centerPlanetAnimated](Frontend_Game_Viewport.default.md#centerplanetanimated) +- [getBottomBound](Frontend_Game_Viewport.default.md#getbottombound) +- [getDetailLevel](Frontend_Game_Viewport.default.md#getdetaillevel) +- [getLeftBound](Frontend_Game_Viewport.default.md#getleftbound) +- [getRightBound](Frontend_Game_Viewport.default.md#getrightbound) +- [getStorage](Frontend_Game_Viewport.default.md#getstorage) +- [getStorageKey](Frontend_Game_Viewport.default.md#getstoragekey) +- [getTopBound](Frontend_Game_Viewport.default.md#gettopbound) +- [getViewportPosition](Frontend_Game_Viewport.default.md#getviewportposition) +- [getViewportWorldHeight](Frontend_Game_Viewport.default.md#getviewportworldheight) +- [getViewportWorldWidth](Frontend_Game_Viewport.default.md#getviewportworldwidth) +- [intersectsViewport](Frontend_Game_Viewport.default.md#intersectsviewport) +- [isInOrAroundViewport](Frontend_Game_Viewport.default.md#isinoraroundviewport) +- [isInViewport](Frontend_Game_Viewport.default.md#isinviewport) +- [isValidWorldWidth](Frontend_Game_Viewport.default.md#isvalidworldwidth) +- [onMouseDown](Frontend_Game_Viewport.default.md#onmousedown) +- [onMouseMove](Frontend_Game_Viewport.default.md#onmousemove) +- [onMouseOut](Frontend_Game_Viewport.default.md#onmouseout) +- [onMouseUp](Frontend_Game_Viewport.default.md#onmouseup) +- [onResize](Frontend_Game_Viewport.default.md#onresize) +- [onScroll](Frontend_Game_Viewport.default.md#onscroll) +- [onSendComplete](Frontend_Game_Viewport.default.md#onsendcomplete) +- [onSendInit](Frontend_Game_Viewport.default.md#onsendinit) +- [onWindowResize](Frontend_Game_Viewport.default.md#onwindowresize) +- [setData](Frontend_Game_Viewport.default.md#setdata) +- [setMouseSensitivty](Frontend_Game_Viewport.default.md#setmousesensitivty) +- [setStorage](Frontend_Game_Viewport.default.md#setstorage) +- [setWorldHeight](Frontend_Game_Viewport.default.md#setworldheight) +- [setWorldWidth](Frontend_Game_Viewport.default.md#setworldwidth) +- [worldToCanvasCoords](Frontend_Game_Viewport.default.md#worldtocanvascoords) +- [worldToCanvasDist](Frontend_Game_Viewport.default.md#worldtocanvasdist) +- [worldToCanvasX](Frontend_Game_Viewport.default.md#worldtocanvasx) +- [worldToCanvasY](Frontend_Game_Viewport.default.md#worldtocanvasy) +- [zoomIn](Frontend_Game_Viewport.default.md#zoomin) +- [zoomOut](Frontend_Game_Viewport.default.md#zoomout) +- [zoomPlanet](Frontend_Game_Viewport.default.md#zoomplanet) +- [destroyInstance](Frontend_Game_Viewport.default.md#destroyinstance) +- [getInstance](Frontend_Game_Viewport.default.md#getinstance) +- [initialize](Frontend_Game_Viewport.default.md#initialize) + +## Constructors + +### constructor + +• `Private` **new default**(`gameUIManager`, `centerWorldCoords`, `widthInWorldUnits`, `viewportWidth`, `viewportHeight`, `canvas`) + +#### Parameters + +| Name | Type | +| :------------------ | :------------------------------------------------------ | +| `gameUIManager` | [`default`](Backend_GameLogic_GameUIManager.default.md) | +| `centerWorldCoords` | `WorldCoords` | +| `widthInWorldUnits` | `number` | +| `viewportWidth` | `number` | +| `viewportHeight` | `number` | +| `canvas` | `HTMLCanvasElement` | + +## Properties + +### animationManager + +• `Private` **animationManager**: [`AnimationManager`](Frontend_Game_ViewportAnimation.AnimationManager.md) + +--- + +### canvas + +• **canvas**: `HTMLCanvasElement` + +--- + +### centerWorldCoords + +• **centerWorldCoords**: `WorldCoords` + +--- + +### frameRequestId + +• **frameRequestId**: `number` + +--- + +### gameUIManager + +• **gameUIManager**: [`default`](Backend_GameLogic_GameUIManager.default.md) + +--- + +### heightInWorldUnits + +• **heightInWorldUnits**: `number` + +--- + +### intervalId + +• **intervalId**: `Timeout` + +--- + +### isFirefox + +• **isFirefox**: `boolean` + +--- + +### isPanning + +• **isPanning**: `boolean` = `false` + +--- + +### isSending + +• `Private` **isSending**: `boolean` = `false` + +--- + +### momentum + +• **momentum**: `boolean` = `false` + +--- + +### mouseLastCoords + +• **mouseLastCoords**: `undefined` \| [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) + +--- + +### mouseSensitivity + +• **mouseSensitivity**: `number` + +--- + +### mousedownCoords + +• **mousedownCoords**: `undefined` \| [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) + +--- + +### scale + +• **scale**: `number` + +--- + +### velocity + +• **velocity**: `undefined` \| `WorldCoords` + +--- + +### viewportHeight + +• **viewportHeight**: `number` + +--- + +### viewportWidth + +• **viewportWidth**: `number` + +--- + +### widthInWorldUnits + +• **widthInWorldUnits**: `number` + +--- + +### instance + +▪ `Static` **instance**: `undefined` \| [`default`](Frontend_Game_Viewport.default.md) + +## Accessors + +### maxWorldWidth + +• `get` **maxWorldWidth**(): `number` + +#### Returns + +`number` + +--- + +### minWorldWidth + +• `get` **minWorldWidth**(): `number` + +#### Returns + +`number` + +## Methods + +### canvasToWorldCoords + +▸ **canvasToWorldCoords**(`canvasCoords`): `WorldCoords` + +#### Parameters + +| Name | Type | +| :------------- | :------------------------------------------------------------------------ | +| `canvasCoords` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | + +#### Returns + +`WorldCoords` + +--- + +### canvasToWorldDist + +▸ **canvasToWorldDist**(`d`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `d` | `number` | + +#### Returns + +`number` + +--- + +### canvasToWorldX + +▸ `Private` **canvasToWorldX**(`x`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `x` | `number` | + +#### Returns + +`number` + +--- + +### canvasToWorldY + +▸ `Private` **canvasToWorldY**(`y`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `y` | `number` | + +#### Returns + +`number` + +--- + +### centerChunk + +▸ **centerChunk**(`chunk`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### centerCoords + +▸ **centerCoords**(`coords`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`void` + +--- + +### centerPlanet + +▸ **centerPlanet**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`void` + +--- + +### centerPlanetAnimated + +▸ **centerPlanetAnimated**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`void` + +--- + +### getBottomBound + +▸ **getBottomBound**(): `number` + +#### Returns + +`number` + +--- + +### getDetailLevel + +▸ `Private` **getDetailLevel**(): `number` + +#### Returns + +`number` + +--- + +### getLeftBound + +▸ **getLeftBound**(): `number` + +#### Returns + +`number` + +--- + +### getRightBound + +▸ **getRightBound**(): `number` + +#### Returns + +`number` + +--- + +### getStorage + +▸ **getStorage**(): `undefined` \| `ViewportData` + +#### Returns + +`undefined` \| `ViewportData` + +--- + +### getStorageKey + +▸ `Private` **getStorageKey**(): `string` + +#### Returns + +`string` + +--- + +### getTopBound + +▸ **getTopBound**(): `number` + +#### Returns + +`number` + +--- + +### getViewportPosition + +▸ **getViewportPosition**(): `Object` + +#### Returns + +`Object` + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | + +--- + +### getViewportWorldHeight + +▸ **getViewportWorldHeight**(): `number` + +#### Returns + +`number` + +--- + +### getViewportWorldWidth + +▸ **getViewportWorldWidth**(): `number` + +#### Returns + +`number` + +--- + +### intersectsViewport + +▸ **intersectsViewport**(`chunk`): `boolean` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`boolean` + +--- + +### isInOrAroundViewport + +▸ **isInOrAroundViewport**(`coords`): `boolean` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`boolean` + +--- + +### isInViewport + +▸ **isInViewport**(`coords`): `boolean` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | + +#### Returns + +`boolean` + +--- + +### isValidWorldWidth + +▸ `Private` **isValidWorldWidth**(`width`): `boolean` + +#### Parameters + +| Name | Type | +| :------ | :------- | +| `width` | `number` | + +#### Returns + +`boolean` + +--- + +### onMouseDown + +▸ **onMouseDown**(`canvasCoords`): `void` + +#### Parameters + +| Name | Type | +| :------------- | :------------------------------------------------------------------------ | +| `canvasCoords` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | + +#### Returns + +`void` + +--- + +### onMouseMove + +▸ **onMouseMove**(`canvasCoords`): `void` + +#### Parameters + +| Name | Type | +| :------------- | :------------------------------------------------------------------------ | +| `canvasCoords` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | + +#### Returns + +`void` + +--- + +### onMouseOut + +▸ **onMouseOut**(): `void` + +#### Returns + +`void` + +--- + +### onMouseUp + +▸ **onMouseUp**(`canvasCoords`): `void` + +#### Parameters + +| Name | Type | +| :------------- | :------------------------------------------------------------------------ | +| `canvasCoords` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | + +#### Returns + +`void` + +--- + +### onResize + +▸ **onResize**(): `void` + +#### Returns + +`void` + +--- + +### onScroll + +▸ **onScroll**(`deltaY`, `forceZoom?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :---------- | :-------- | :------------ | +| `deltaY` | `number` | `undefined` | +| `forceZoom` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### onSendComplete + +▸ **onSendComplete**(): `void` + +#### Returns + +`void` + +--- + +### onSendInit + +▸ **onSendInit**(): `void` + +#### Returns + +`void` + +--- + +### onWindowResize + +▸ **onWindowResize**(): `void` + +#### Returns + +`void` + +--- + +### setData + +▸ **setData**(`data`): `void` + +#### Parameters + +| Name | Type | +| :----- | :------------- | +| `data` | `ViewportData` | + +#### Returns + +`void` + +--- + +### setMouseSensitivty + +▸ **setMouseSensitivty**(`mouseSensitivity`): `void` + +#### Parameters + +| Name | Type | +| :----------------- | :------- | +| `mouseSensitivity` | `number` | + +#### Returns + +`void` + +--- + +### setStorage + +▸ **setStorage**(): `void` + +#### Returns + +`void` + +--- + +### setWorldHeight + +▸ **setWorldHeight**(`height`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `height` | `number` | + +#### Returns + +`void` + +--- + +### setWorldWidth + +▸ `Private` **setWorldWidth**(`width`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------- | +| `width` | `number` | + +#### Returns + +`void` + +--- + +### worldToCanvasCoords + +▸ **worldToCanvasCoords**(`worldCoords`): [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) + +#### Parameters + +| Name | Type | +| :------------ | :------------ | +| `worldCoords` | `WorldCoords` | + +#### Returns + +[`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) + +--- + +### worldToCanvasDist + +▸ **worldToCanvasDist**(`d`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `d` | `number` | + +#### Returns + +`number` + +--- + +### worldToCanvasX + +▸ `Private` **worldToCanvasX**(`x`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `x` | `number` | + +#### Returns + +`number` + +--- + +### worldToCanvasY + +▸ `Private` **worldToCanvasY**(`y`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `y` | `number` | + +#### Returns + +`number` + +--- + +### zoomIn + +▸ **zoomIn**(): `void` + +#### Returns + +`void` + +--- + +### zoomOut + +▸ **zoomOut**(): `void` + +#### Returns + +`void` + +--- + +### zoomPlanet + +▸ **zoomPlanet**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`void` + +--- + +### destroyInstance + +▸ `Static` **destroyInstance**(): `void` + +#### Returns + +`void` + +--- + +### getInstance + +▸ `Static` **getInstance**(): [`default`](Frontend_Game_Viewport.default.md) + +#### Returns + +[`default`](Frontend_Game_Viewport.default.md) + +--- + +### initialize + +▸ `Static` **initialize**(`gameUIManager`, `widthInWorldUnits`, `canvas`): [`default`](Frontend_Game_Viewport.default.md) + +#### Parameters + +| Name | Type | +| :------------------ | :------------------------------------------------------ | +| `gameUIManager` | [`default`](Backend_GameLogic_GameUIManager.default.md) | +| `widthInWorldUnits` | `number` | +| `canvas` | `HTMLCanvasElement` | + +#### Returns + +[`default`](Frontend_Game_Viewport.default.md) diff --git a/docs/classes/Frontend_Game_ViewportAnimation.AnimationManager.md b/docs/classes/Frontend_Game_ViewportAnimation.AnimationManager.md new file mode 100644 index 00000000..7a55c48f --- /dev/null +++ b/docs/classes/Frontend_Game_ViewportAnimation.AnimationManager.md @@ -0,0 +1,56 @@ +# Class: AnimationManager + +[Frontend/Game/ViewportAnimation](../modules/Frontend_Game_ViewportAnimation.md).AnimationManager + +## Table of contents + +### Constructors + +- [constructor](Frontend_Game_ViewportAnimation.AnimationManager.md#constructor) + +### Properties + +- [currentAnimation](Frontend_Game_ViewportAnimation.AnimationManager.md#currentanimation) + +### Methods + +- [replaceAnimation](Frontend_Game_ViewportAnimation.AnimationManager.md#replaceanimation) +- [stopCurrentAnimation](Frontend_Game_ViewportAnimation.AnimationManager.md#stopcurrentanimation) + +## Constructors + +### constructor + +• **new AnimationManager**() + +## Properties + +### currentAnimation + +• `Private` `Optional` **currentAnimation**: `AnimeInstance` + +## Methods + +### replaceAnimation + +▸ **replaceAnimation**(`animation`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :-------------------------------------------------------------------------- | +| `animation` | [`ViewportAnimation`](Frontend_Game_ViewportAnimation.ViewportAnimation.md) | + +#### Returns + +`void` + +--- + +### stopCurrentAnimation + +▸ **stopCurrentAnimation**(): `void` + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Game_ViewportAnimation.ViewportAnimation.md b/docs/classes/Frontend_Game_ViewportAnimation.ViewportAnimation.md new file mode 100644 index 00000000..a519f8d7 --- /dev/null +++ b/docs/classes/Frontend_Game_ViewportAnimation.ViewportAnimation.md @@ -0,0 +1,113 @@ +# Class: ViewportAnimation + +[Frontend/Game/ViewportAnimation](../modules/Frontend_Game_ViewportAnimation.md).ViewportAnimation + +## Table of contents + +### Constructors + +- [constructor](Frontend_Game_ViewportAnimation.ViewportAnimation.md#constructor) + +### Properties + +- [coordsEnd](Frontend_Game_ViewportAnimation.ViewportAnimation.md#coordsend) +- [coordsStart](Frontend_Game_ViewportAnimation.ViewportAnimation.md#coordsstart) +- [durationMs](Frontend_Game_ViewportAnimation.ViewportAnimation.md#durationms) +- [heightEnd](Frontend_Game_ViewportAnimation.ViewportAnimation.md#heightend) +- [heightStart](Frontend_Game_ViewportAnimation.ViewportAnimation.md#heightstart) +- [timeStarted](Frontend_Game_ViewportAnimation.ViewportAnimation.md#timestarted) + +### Methods + +- [apply](Frontend_Game_ViewportAnimation.ViewportAnimation.md#apply) +- [between](Frontend_Game_ViewportAnimation.ViewportAnimation.md#between) + +## Constructors + +### constructor + +• **new ViewportAnimation**(`timeStarted`, `coordsStart`, `coordsEnd`, `heightStart`, `heightEnd`, `durationMs`) + +#### Parameters + +| Name | Type | +| :------------ | :------------ | +| `timeStarted` | `number` | +| `coordsStart` | `WorldCoords` | +| `coordsEnd` | `WorldCoords` | +| `heightStart` | `number` | +| `heightEnd` | `number` | +| `durationMs` | `number` | + +## Properties + +### coordsEnd + +• `Readonly` **coordsEnd**: `WorldCoords` + +--- + +### coordsStart + +• `Readonly` **coordsStart**: `WorldCoords` + +--- + +### durationMs + +• `Readonly` **durationMs**: `number` + +--- + +### heightEnd + +• `Readonly` **heightEnd**: `number` + +--- + +### heightStart + +• `Readonly` **heightStart**: `number` + +--- + +### timeStarted + +• `Readonly` **timeStarted**: `number` + +## Methods + +### apply + +▸ **apply**(`percent`, `viewport`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------- | +| `percent` | `number` | +| `viewport` | [`default`](Frontend_Game_Viewport.default.md) | + +#### Returns + +`void` + +--- + +### between + +▸ `Static` **between**(`timeStarted`, `from`, `to`, `heightStart`, `heightEnd`): [`ViewportAnimation`](Frontend_Game_ViewportAnimation.ViewportAnimation.md) + +#### Parameters + +| Name | Type | +| :------------ | :------------ | +| `timeStarted` | `number` | +| `from` | `WorldCoords` | +| `to` | `WorldCoords` | +| `heightStart` | `number` | +| `heightEnd` | `number` | + +#### Returns + +[`ViewportAnimation`](Frontend_Game_ViewportAnimation.ViewportAnimation.md) diff --git a/docs/classes/Frontend_Game_WindowManager.default.md b/docs/classes/Frontend_Game_WindowManager.default.md new file mode 100644 index 00000000..7d1859e0 --- /dev/null +++ b/docs/classes/Frontend_Game_WindowManager.default.md @@ -0,0 +1,179 @@ +# Class: default + +[Frontend/Game/WindowManager](../modules/Frontend_Game_WindowManager.md).default + +## Hierarchy + +- `EventEmitter` + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Game_WindowManager.default.md#constructor) + +### Properties + +- [currentTooltip](Frontend_Game_WindowManager.default.md#currenttooltip) +- [cursorState](Frontend_Game_WindowManager.default.md#cursorstate) +- [lastZIndex](Frontend_Game_WindowManager.default.md#lastzindex) +- [mousePos](Frontend_Game_WindowManager.default.md#mousepos) +- [mousedownPos](Frontend_Game_WindowManager.default.md#mousedownpos) +- [instance](Frontend_Game_WindowManager.default.md#instance) + +### Methods + +- [acceptInputForTarget](Frontend_Game_WindowManager.default.md#acceptinputfortarget) +- [getClickDelta](Frontend_Game_WindowManager.default.md#getclickdelta) +- [getCursorState](Frontend_Game_WindowManager.default.md#getcursorstate) +- [getIndex](Frontend_Game_WindowManager.default.md#getindex) +- [getTooltip](Frontend_Game_WindowManager.default.md#gettooltip) +- [setCursorState](Frontend_Game_WindowManager.default.md#setcursorstate) +- [setTooltip](Frontend_Game_WindowManager.default.md#settooltip) +- [getInstance](Frontend_Game_WindowManager.default.md#getinstance) + +## Constructors + +### constructor + +• `Private` **new default**() + +#### Overrides + +EventEmitter.constructor + +## Properties + +### currentTooltip + +• `Private` **currentTooltip**: [`TooltipName`](../enums/Frontend_Game_WindowManager.TooltipName.md) + +--- + +### cursorState + +• `Private` **cursorState**: [`CursorState`](../enums/Frontend_Game_WindowManager.CursorState.md) + +--- + +### lastZIndex + +• `Private` **lastZIndex**: `number` + +--- + +### mousePos + +• `Private` **mousePos**: [`MousePos`](../modules/Frontend_Game_WindowManager.md#mousepos) + +--- + +### mousedownPos + +• `Private` **mousedownPos**: `null` \| [`MousePos`](../modules/Frontend_Game_WindowManager.md#mousepos) + +--- + +### instance + +▪ `Static` **instance**: [`default`](Frontend_Game_WindowManager.default.md) + +## Methods + +### acceptInputForTarget + +▸ **acceptInputForTarget**(`input`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------------ | +| `input` | `WorldCoords` | + +#### Returns + +`void` + +--- + +### getClickDelta + +▸ **getClickDelta**(): [`MousePos`](../modules/Frontend_Game_WindowManager.md#mousepos) + +#### Returns + +[`MousePos`](../modules/Frontend_Game_WindowManager.md#mousepos) + +--- + +### getCursorState + +▸ **getCursorState**(): [`CursorState`](../enums/Frontend_Game_WindowManager.CursorState.md) + +#### Returns + +[`CursorState`](../enums/Frontend_Game_WindowManager.CursorState.md) + +--- + +### getIndex + +▸ **getIndex**(): `number` + +#### Returns + +`number` + +--- + +### getTooltip + +▸ **getTooltip**(): [`TooltipName`](../enums/Frontend_Game_WindowManager.TooltipName.md) + +#### Returns + +[`TooltipName`](../enums/Frontend_Game_WindowManager.TooltipName.md) + +--- + +### setCursorState + +▸ **setCursorState**(`newstate`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :------------------------------------------------------------------- | +| `newstate` | [`CursorState`](../enums/Frontend_Game_WindowManager.CursorState.md) | + +#### Returns + +`void` + +--- + +### setTooltip + +▸ **setTooltip**(`tooltip`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------------- | +| `tooltip` | [`TooltipName`](../enums/Frontend_Game_WindowManager.TooltipName.md) | + +#### Returns + +`void` + +--- + +### getInstance + +▸ `Static` **getInstance**(): [`default`](Frontend_Game_WindowManager.default.md) + +#### Returns + +[`default`](Frontend_Game_WindowManager.default.md) diff --git a/docs/classes/Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md b/docs/classes/Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md new file mode 100644 index 00000000..c79b49f0 --- /dev/null +++ b/docs/classes/Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md @@ -0,0 +1,344 @@ +# Class: ArtifactRenderer + +[Frontend/Renderers/Artifacts/ArtifactRenderer](../modules/Frontend_Renderers_Artifacts_ArtifactRenderer.md).ArtifactRenderer + +## Hierarchy + +- [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + + ↳ **`ArtifactRenderer`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#constructor) + +### Properties + +- [artifacts](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#artifacts) +- [canvas](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#canvas) +- [frameRequestId](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#framerequestid) +- [gl](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#gl) +- [isDex](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#isdex) +- [projectionMatrix](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#projectionmatrix) +- [scroll](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#scroll) +- [spriteRenderer](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#spriterenderer) +- [visible](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#visible) + +### Methods + +- [clear](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#clear) +- [containsArtifact](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#containsartifact) +- [destroy](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#destroy) +- [draw](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#draw) +- [drawDex](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#drawdex) +- [drawList](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#drawlist) +- [getTexIdx](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#gettexidx) +- [loop](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#loop) +- [queueArtifactColumn](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#queueartifactcolumn) +- [queueRarityColumn](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#queueraritycolumn) +- [setArtifacts](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#setartifacts) +- [setIsDex](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#setisdex) +- [setProjectionMatrix](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#setprojectionmatrix) +- [setScroll](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#setscroll) +- [setVisible](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md#setvisible) + +## Constructors + +### constructor + +• **new ArtifactRenderer**(`canvas`, `isDex?`) + +#### Parameters + +| Name | Type | Default value | +| :------- | :------------------ | :------------ | +| `canvas` | `HTMLCanvasElement` | `undefined` | +| `isDex` | `boolean` | `true` | + +#### Overrides + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#constructor) + +## Properties + +### artifacts + +• `Private` **artifacts**: `Artifact`[] + +--- + +### canvas + +• **canvas**: `HTMLCanvasElement` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[canvas](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#canvas) + +--- + +### frameRequestId + +• `Private` **frameRequestId**: `number` + +--- + +### gl + +• **gl**: `WebGL2RenderingContext` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[gl](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#gl) + +--- + +### isDex + +• `Private` **isDex**: `boolean` + +--- + +### projectionMatrix + +• **projectionMatrix**: `mat4` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[projectionMatrix](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#projectionmatrix) + +--- + +### scroll + +• `Private` **scroll**: `number` = `0` + +--- + +### spriteRenderer + +• `Private` **spriteRenderer**: [`SpriteRenderer`](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md) + +--- + +### visible + +• `Private` **visible**: `boolean` = `false` + +## Methods + +### clear + +▸ **clear**(`bits?`, `color?`): `void` + +#### Parameters + +| Name | Type | +| :------- | :----------------------------------------------------------------------------- | +| `bits?` | `number` | +| `color?` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | + +#### Returns + +`void` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[clear](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#clear) + +--- + +### containsArtifact + +▸ `Private` **containsArtifact**(`biome`, `rarity`, `type`): `boolean` + +#### Parameters + +| Name | Type | +| :------- | :--------------- | +| `biome` | `Biome` | +| `rarity` | `ArtifactRarity` | +| `type` | `ArtifactType` | + +#### Returns + +`boolean` + +--- + +### destroy + +▸ **destroy**(): `void` + +#### Returns + +`void` + +--- + +### draw + +▸ `Private` **draw**(): `void` + +#### Returns + +`void` + +--- + +### drawDex + +▸ `Private` **drawDex**(): `void` + +#### Returns + +`void` + +--- + +### drawList + +▸ `Private` **drawList**(): `void` + +#### Returns + +`void` + +--- + +### getTexIdx + +▸ **getTexIdx**(): `number` + +#### Returns + +`number` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[getTexIdx](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#gettexidx) + +--- + +### loop + +▸ `Private` **loop**(): `void` + +#### Returns + +`void` + +--- + +### queueArtifactColumn + +▸ `Private` **queueArtifactColumn**(`type`, `rarity`, `startX`): `void` + +#### Parameters + +| Name | Type | +| :------- | :--------------- | +| `type` | `ArtifactType` | +| `rarity` | `ArtifactRarity` | +| `startX` | `number` | + +#### Returns + +`void` + +--- + +### queueRarityColumn + +▸ `Private` **queueRarityColumn**(`rarity`, `startX`): `void` + +#### Parameters + +| Name | Type | +| :------- | :--------------- | +| `rarity` | `ArtifactRarity` | +| `startX` | `number` | + +#### Returns + +`void` + +--- + +### setArtifacts + +▸ **setArtifacts**(`artifacts`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :----------- | +| `artifacts` | `Artifact`[] | + +#### Returns + +`void` + +--- + +### setIsDex + +▸ **setIsDex**(`isDex`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------- | +| `isDex` | `boolean` | + +#### Returns + +`void` + +--- + +### setProjectionMatrix + +▸ **setProjectionMatrix**(): `void` + +#### Returns + +`void` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[setProjectionMatrix](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#setprojectionmatrix) + +--- + +### setScroll + +▸ **setScroll**(`scroll`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `scroll` | `number` | + +#### Returns + +`void` + +--- + +### setVisible + +▸ **setVisible**(`visible`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :-------- | +| `visible` | `boolean` | + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_EngineUtils.default.md b/docs/classes/Frontend_Renderers_GameRenderer_EngineUtils.default.md new file mode 100644 index 00000000..ba52ed15 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_EngineUtils.default.md @@ -0,0 +1,334 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/EngineUtils](../modules/Frontend_Renderers_GameRenderer_EngineUtils.md).default + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_EngineUtils.default.md#constructor) + +### Methods + +- [fillTexture](Frontend_Renderers_GameRenderer_EngineUtils.default.md#filltexture) +- [getNow](Frontend_Renderers_GameRenderer_EngineUtils.default.md#getnow) +- [getPlanetZIndex](Frontend_Renderers_GameRenderer_EngineUtils.default.md#getplanetzindex) +- [makeDoubleQuadBuffered](Frontend_Renderers_GameRenderer_EngineUtils.default.md#makedoublequadbuffered) +- [makeEmptyDoubleQuad](Frontend_Renderers_GameRenderer_EngineUtils.default.md#makeemptydoublequad) +- [makeEmptyQuad](Frontend_Renderers_GameRenderer_EngineUtils.default.md#makeemptyquad) +- [makeEmptyQuadVec2](Frontend_Renderers_GameRenderer_EngineUtils.default.md#makeemptyquadvec2) +- [makeQuad](Frontend_Renderers_GameRenderer_EngineUtils.default.md#makequad) +- [makeQuadBuffered](Frontend_Renderers_GameRenderer_EngineUtils.default.md#makequadbuffered) +- [makeQuadVec2](Frontend_Renderers_GameRenderer_EngineUtils.default.md#makequadvec2) +- [makeQuadVec2Buffered](Frontend_Renderers_GameRenderer_EngineUtils.default.md#makequadvec2buffered) +- [rgbVecToHex](Frontend_Renderers_GameRenderer_EngineUtils.default.md#rgbvectohex) +- [rotateIndices](Frontend_Renderers_GameRenderer_EngineUtils.default.md#rotateindices) +- [rotateQuad](Frontend_Renderers_GameRenderer_EngineUtils.default.md#rotatequad) +- [rotateQuadVec2](Frontend_Renderers_GameRenderer_EngineUtils.default.md#rotatequadvec2) +- [translateIndices](Frontend_Renderers_GameRenderer_EngineUtils.default.md#translateindices) +- [translateQuad](Frontend_Renderers_GameRenderer_EngineUtils.default.md#translatequad) +- [translateQuadVec2](Frontend_Renderers_GameRenderer_EngineUtils.default.md#translatequadvec2) + +## Constructors + +### constructor + +• **new default**() + +## Methods + +### fillTexture + +▸ `Static` **fillTexture**(`gl`): `void` + +#### Parameters + +| Name | Type | +| :--- | :----------------------- | +| `gl` | `WebGL2RenderingContext` | + +#### Returns + +`void` + +--- + +### getNow + +▸ `Static` **getNow**(): `number` + +#### Returns + +`number` + +--- + +### getPlanetZIndex + +▸ `Static` **getPlanetZIndex**(`planet`): `number` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`number` + +--- + +### makeDoubleQuadBuffered + +▸ `Static` **makeDoubleQuadBuffered**(`b`, `ax1`, `ay1`, `ax2`, `ay2`, `bx1`, `by1`, `bx2`, `by2`): `void` + +#### Parameters + +| Name | Type | +| :---- | :--------- | +| `b` | `number`[] | +| `ax1` | `number` | +| `ay1` | `number` | +| `ax2` | `number` | +| `ay2` | `number` | +| `bx1` | `number` | +| `by1` | `number` | +| `bx2` | `number` | +| `by2` | `number` | + +#### Returns + +`void` + +--- + +### makeEmptyDoubleQuad + +▸ `Static` **makeEmptyDoubleQuad**(): `number`[] + +#### Returns + +`number`[] + +--- + +### makeEmptyQuad + +▸ `Static` **makeEmptyQuad**(): `number`[] + +#### Returns + +`number`[] + +--- + +### makeEmptyQuadVec2 + +▸ `Static` **makeEmptyQuadVec2**(): `number`[] + +#### Returns + +`number`[] + +--- + +### makeQuad + +▸ `Static` **makeQuad**(`x1`, `y1`, `x2`, `y2`, `z`): `number`[] + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `x1` | `number` | +| `y1` | `number` | +| `x2` | `number` | +| `y2` | `number` | +| `z` | `number` | + +#### Returns + +`number`[] + +--- + +### makeQuadBuffered + +▸ `Static` **makeQuadBuffered**(`b`, `x1`, `y1`, `x2`, `y2`, `z`): `void` + +#### Parameters + +| Name | Type | +| :--- | :--------- | +| `b` | `number`[] | +| `x1` | `number` | +| `y1` | `number` | +| `x2` | `number` | +| `y2` | `number` | +| `z` | `number` | + +#### Returns + +`void` + +--- + +### makeQuadVec2 + +▸ `Static` **makeQuadVec2**(`x1`, `y1`, `x2`, `y2`): `number`[] + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `x1` | `number` | +| `y1` | `number` | +| `x2` | `number` | +| `y2` | `number` | + +#### Returns + +`number`[] + +--- + +### makeQuadVec2Buffered + +▸ `Static` **makeQuadVec2Buffered**(`b`, `x1`, `y1`, `x2`, `y2`): `void` + +#### Parameters + +| Name | Type | +| :--- | :--------- | +| `b` | `number`[] | +| `x1` | `number` | +| `y1` | `number` | +| `x2` | `number` | +| `y2` | `number` | + +#### Returns + +`void` + +--- + +### rgbVecToHex + +▸ `Static` **rgbVecToHex**(`rgb`): `string` + +#### Parameters + +| Name | Type | +| :---- | :--------------------------------------------------------------------------- | +| `rgb` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | + +#### Returns + +`string` + +--- + +### rotateIndices + +▸ `Static` `Private` **rotateIndices**(`b`, `i`, `j`, `angle`): `void` + +#### Parameters + +| Name | Type | +| :------ | :--------- | +| `b` | `number`[] | +| `i` | `number` | +| `j` | `number` | +| `angle` | `number` | + +#### Returns + +`void` + +--- + +### rotateQuad + +▸ `Static` **rotateQuad**(`b`, `angle`): `void` + +#### Parameters + +| Name | Type | +| :------ | :--------- | +| `b` | `number`[] | +| `angle` | `number` | + +#### Returns + +`void` + +--- + +### rotateQuadVec2 + +▸ `Static` **rotateQuadVec2**(`b`, `angle`): `void` + +#### Parameters + +| Name | Type | +| :------ | :--------- | +| `b` | `number`[] | +| `angle` | `number` | + +#### Returns + +`void` + +--- + +### translateIndices + +▸ `Static` `Private` **translateIndices**(`b`, `i`, `j`, `__namedParameters`): `void` + +#### Parameters + +| Name | Type | +| :------------------ | :------------------- | +| `b` | `number`[] | +| `i` | `number` | +| `j` | `number` | +| `__namedParameters` | [`number`, `number`] | + +#### Returns + +`void` + +--- + +### translateQuad + +▸ `Static` **translateQuad**(`b`, `t`): `void` + +#### Parameters + +| Name | Type | +| :--- | :------------------- | +| `b` | `number`[] | +| `t` | [`number`, `number`] | + +#### Returns + +`void` + +--- + +### translateQuadVec2 + +▸ `Static` **translateQuadVec2**(`b`, `t`): `void` + +#### Parameters + +| Name | Type | +| :--- | :------------------- | +| `b` | `number`[] | +| `t` | [`number`, `number`] | + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md new file mode 100644 index 00000000..50bc5e0a --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md @@ -0,0 +1,208 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/AsteroidRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.md).default + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#program) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#verts) +- [viewport](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#viewport) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#flush) +- [queueAsteroid](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#queueasteroid) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md#setuniforms) + +## Constructors + +### constructor + +• **new default**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------------------------------------------------------------------- | +| `manager` | [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +--- + +### viewport + +• **viewport**: [`default`](Frontend_Game_Viewport.default.md) + +## Methods + +### flush + +▸ **flush**(): `void` + +Draw all buffered vertices to the screen. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueAsteroid + +▸ **queueAsteroid**(`planet`, `centerW`, `radiusW`, `color`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :--------------------------------------------------------------------------- | +| `planet` | `Planet` | +| `centerW` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `radiusW` | `number` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md new file mode 100644 index 00000000..5e1598e6 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md @@ -0,0 +1,98 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/BackgroundRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.md).default + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md#constructor) + +### Properties + +- [borderRenderer](Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md#borderrenderer) +- [manager](Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md#manager) +- [perlinRenderer](Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md#perlinrenderer) +- [renderer](Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md#renderer) + +### Methods + +- [drawChunks](Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md#drawchunks) +- [fillPerlin](Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md#fillperlin) +- [flush](Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md#flush) + +## Constructors + +### constructor + +• **new default**(`manager`, `config`, `thresholds`) + +#### Parameters + +| Name | Type | +| :----------- | :-------------------------------------------------------------------------------------- | +| `manager` | [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) | +| `config` | `PerlinConfig` | +| `thresholds` | [`number`, `number`, `number`] | + +## Properties + +### borderRenderer + +• **borderRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md) + +--- + +### manager + +• **manager**: [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) + +--- + +### perlinRenderer + +• **perlinRenderer**: [`PerlinRenderer`](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md) + +--- + +### renderer + +• **renderer**: [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) + +## Methods + +### drawChunks + +▸ **drawChunks**(`exploredChunks`, `highPerfMode`, `drawChunkBorders`): `void` + +#### Parameters + +| Name | Type | +| :----------------- | :--------------------------------------------------------- | +| `exploredChunks` | `Iterable`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> | +| `highPerfMode` | `boolean` | +| `drawChunkBorders` | `boolean` | + +#### Returns + +`void` + +--- + +### fillPerlin + +▸ **fillPerlin**(): `void` + +#### Returns + +`void` + +--- + +### flush + +▸ **flush**(): `void` + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md new file mode 100644 index 00000000..2406f67c --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md @@ -0,0 +1,279 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/BeltRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_BeltRenderer.md).default + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#attribmanagers) +- [botRectPosBuffer](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#botrectposbuffer) +- [manager](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#manager) +- [posBuffer](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#posbuffer) +- [program](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#program) +- [topRectPosBuffer](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#toprectposbuffer) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#flush) +- [queueBelt](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#queuebelt) +- [queueBeltAtIdx](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#queuebeltatidx) +- [queueBeltWorld](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#queuebeltworld) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md#setuniforms) + +## Constructors + +### constructor + +• **new default**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### botRectPosBuffer + +• **botRectPosBuffer**: `number`[] + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### posBuffer + +• **posBuffer**: `number`[] + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### topRectPosBuffer + +• **topRectPosBuffer**: `number`[] + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueBelt + +▸ **queueBelt**(`center`, `radius`, `color`, `l?`, `z?`, `delZ?`, `props?`, `angle?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :------------------------------------------------------------------------------------------ | :------------ | +| `center` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `radius` | `number` | `undefined` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `l` | `number` | `1` | +| `z` | `number` | `0` | +| `delZ` | `number` | `0` | +| `props` | [`BeltProps`](../modules/Frontend_Renderers_GameRenderer_Programs_BeltProgram.md#beltprops) | `undefined` | +| `angle` | `number` | `0` | + +#### Returns + +`void` + +--- + +### queueBeltAtIdx + +▸ **queueBeltAtIdx**(`planet`, `center`, `radius`, `color`, `beltIdx`, `angle?`, `screen?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :-------- | :----------------------------------------------------------------------------------------- | :------------ | +| `planet` | `Planet` | `undefined` | +| `center` | `WorldCoords` \| [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `radius` | `number` | `undefined` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `beltIdx` | `number` | `undefined` | +| `angle` | `number` | `0` | +| `screen` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### queueBeltWorld + +▸ **queueBeltWorld**(`centerW`, `radiusW`, `color`, `l?`, `z?`, `delZ?`, `props?`, `angle?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :-------- | :------------------------------------------------------------------------------------------ | :------------ | +| `centerW` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `radiusW` | `number` | `undefined` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `l` | `number` | `1` | +| `z` | `number` | `0` | +| `delZ` | `number` | `0` | +| `props` | [`BeltProps`](../modules/Frontend_Renderers_GameRenderer_Programs_BeltProgram.md#beltprops) | `undefined` | +| `angle` | `number` | `0` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md new file mode 100644 index 00000000..fc9840bb --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md @@ -0,0 +1,242 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/BlackDomainRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.md).default + +Renders a shadow-type thing over destroyed planets + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#program) +- [quad2Buffer](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#quad2buffer) +- [quad3Buffer](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#quad3buffer) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#flush) +- [queueBlackDomain](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#queueblackdomain) +- [queueBlackDomainScreen](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#queueblackdomainscreen) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md#setuniforms) + +## Constructors + +### constructor + +• **new default**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------------------------------------------------------------------- | +| `manager` | [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### quad2Buffer + +• **quad2Buffer**: `number`[] + +--- + +### quad3Buffer + +• **quad3Buffer**: `number`[] + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueBlackDomain + +▸ **queueBlackDomain**(`planet`, `centerW`, `radiusW`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------ | +| `planet` | `Planet` | +| `centerW` | `WorldCoords` | +| `radiusW` | `number` | + +#### Returns + +`void` + +--- + +### queueBlackDomainScreen + +▸ **queueBlackDomainScreen**(`_planet`, `center`, `radius`, `z`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------------------ | +| `_planet` | `Planet` | +| `center` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `radius` | `number` | +| `z` | `number` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md new file mode 100644 index 00000000..8c432702 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md @@ -0,0 +1,264 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/CircleRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_CircleRenderer.md).default + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#program) +- [quadBuffer](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#quadbuffer) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#verts) +- [viewport](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#viewport) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#flush) +- [queueCircle](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#queuecircle) +- [queueCircleWorld](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#queuecircleworld) +- [queueCircleWorldCenterOnly](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#queuecircleworldcenteronly) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md#setuniforms) + +## Constructors + +### constructor + +• **new default**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------------------------------------------------------------------- | +| `manager` | [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### quadBuffer + +• **quadBuffer**: `number`[] + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +--- + +### viewport + +• **viewport**: [`default`](Frontend_Game_Viewport.default.md) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueCircle + +▸ **queueCircle**(`center`, `radius`, `color?`, `stroke?`, `angle?`, `dashed?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :----------------------------------------------------------------------------- | :------------ | +| `center` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `radius` | `number` | `undefined` | +| `color` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | `undefined` | +| `stroke` | `number` | `-1` | +| `angle` | `number` | `1` | +| `dashed` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### queueCircleWorld + +▸ **queueCircleWorld**(`center`, `radius`, `color?`, `stroke?`, `angle?`, `dashed?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :----------------------------------------------------------------------------- | :------------ | +| `center` | `WorldCoords` | `undefined` | +| `radius` | `number` | `undefined` | +| `color` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | `undefined` | +| `stroke` | `number` | `-1` | +| `angle` | `number` | `1` | +| `dashed` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### queueCircleWorldCenterOnly + +▸ **queueCircleWorldCenterOnly**(`center`, `radius`, `color?`): `void` + +#### Parameters + +| Name | Type | +| :------- | :----------------------------------------------------------------------------- | +| `center` | `WorldCoords` | +| `radius` | `number` | +| `color` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md new file mode 100644 index 00000000..7b68e269 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md @@ -0,0 +1,243 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/LineRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_LineRenderer.md).default + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#program) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#flush) +- [getOffset](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#getoffset) +- [queueLine](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#queueline) +- [queueLineWorld](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#queuelineworld) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md#setuniforms) + +## Constructors + +### constructor + +• **new default**(`glManager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :---------- | :-------------------------------------------------------------------------------------- | +| `glManager` | [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(): `void` + +Draw all buffered vertices to the screen. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### getOffset + +▸ `Private` **getOffset**(`start`, `end`): [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) + +#### Parameters + +| Name | Type | +| :------ | :------------------------------------------------------------------------ | +| `start` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `end` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | + +#### Returns + +[`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) + +--- + +### queueLine + +▸ **queueLine**(`start`, `end`, `color?`, `width?`, `zIdx?`, `dashed?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :----------------------------------------------------------------------------- | :------------ | +| `start` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `end` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `color` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | `undefined` | +| `width` | `number` | `1` | +| `zIdx` | `number` | `undefined` | +| `dashed` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### queueLineWorld + +▸ **queueLineWorld**(`start`, `end`, `color?`, `width?`, `zIdx?`, `dashed?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :----------------------------------------------------------------------------- | :------------ | +| `start` | `WorldCoords` | `undefined` | +| `end` | `WorldCoords` | `undefined` | +| `color` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | `undefined` | +| `width` | `number` | `1` | +| `zIdx` | `number` | `undefined` | +| `dashed` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md new file mode 100644 index 00000000..1e509aa0 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md @@ -0,0 +1,225 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/MaskRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_MaskRenderer.md).default + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#attribmanagers) +- [bgCanvas](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#bgcanvas) +- [manager](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#manager) +- [perlinThresholds](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#perlinthresholds) +- [program](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#program) +- [quadBuffer](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#quadbuffer) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#flush) +- [queueChunk](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#queuechunk) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md#setuniforms) + +## Constructors + +### constructor + +• **new default**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------------------------------------------------------------------- | +| `manager` | [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### bgCanvas + +• **bgCanvas**: `HTMLCanvasElement` + +--- + +### manager + +• **manager**: [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) + +WebGLManager corresponding to this program. + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### perlinThresholds + +• **perlinThresholds**: `number`[] + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### quadBuffer + +• **quadBuffer**: `number`[] + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueChunk + +▸ **queueChunk**(`chunk`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md new file mode 100644 index 00000000..0aefbbe5 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md @@ -0,0 +1,244 @@ +# Class: MineBodyRenderer + +[Frontend/Renderers/GameRenderer/Entities/MineBodyRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.md).MineBodyRenderer + +Renderers asteroids at the center of silver mines + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`MineBodyRenderer`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#program) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#flush) +- [queueMine](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#queuemine) +- [queueMineScreen](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#queueminescreen) +- [queuePoint](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#queuepoint) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md#setuniforms) + +## Constructors + +### constructor + +• **new MineBodyRenderer**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(): `void` + +Draw all buffered vertices to the screen. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueMine + +▸ **queueMine**(`planet`, `centerW`, `radiusW`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------ | +| `planet` | `Planet` | +| `centerW` | `WorldCoords` | +| `radiusW` | `number` | + +#### Returns + +`void` + +--- + +### queueMineScreen + +▸ **queueMineScreen**(`planet`, `center`, `radius`, `z`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `planet` | `Planet` | +| `center` | `WorldCoords` | +| `radius` | `number` | +| `z` | `number` | + +#### Returns + +`void` + +--- + +### queuePoint + +▸ `Private` **queuePoint**(`__namedParameters`, `z`, `radius`, `color`, `seed`, `offset`): `void` + +#### Parameters + +| Name | Type | +| :------------------ | :--------------------------------------------------------------------------- | +| `__namedParameters` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `z` | `number` | +| `radius` | `number` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `seed` | `number` | +| `offset` | `number` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md new file mode 100644 index 00000000..d500b276 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md @@ -0,0 +1,102 @@ +# Class: MineRenderer + +[Frontend/Renderers/GameRenderer/Entities/MineRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_MineRenderer.md).MineRenderer + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md#constructor) + +### Properties + +- [beltRenderer](Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md#beltrenderer) +- [mineBodyRenderer](Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md#minebodyrenderer) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md#flush) +- [queueMine](Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md#queuemine) +- [queueMineScreen](Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md#queueminescreen) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md#setuniforms) + +## Constructors + +### constructor + +• **new MineRenderer**(`manager`) + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | + +## Properties + +### beltRenderer + +• **beltRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md) + +--- + +### mineBodyRenderer + +• **mineBodyRenderer**: [`MineBodyRenderer`](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md) + +## Methods + +### flush + +▸ **flush**(): `void` + +#### Returns + +`void` + +--- + +### queueMine + +▸ **queueMine**(`planet`, `centerW`, `radiusW`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------ | +| `planet` | `Planet` | +| `centerW` | `WorldCoords` | +| `radiusW` | `number` | + +#### Returns + +`void` + +--- + +### queueMineScreen + +▸ **queueMineScreen**(`planet`, `centerW`, `radiusW`, `z`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------ | +| `planet` | `Planet` | +| `centerW` | `WorldCoords` | +| `radiusW` | `number` | +| `z` | `number` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md new file mode 100644 index 00000000..9be48d51 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md @@ -0,0 +1,279 @@ +# Class: PerlinRenderer + +[Frontend/Renderers/GameRenderer/Entities/PerlinRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.md).PerlinRenderer + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`PerlinRenderer`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#attribmanagers) +- [config](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#config) +- [coordsBuffer](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#coordsbuffer) +- [manager](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#manager) +- [posBuffer](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#posbuffer) +- [program](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#program) +- [rectRenderer](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#rectrenderer) +- [thresholds](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#thresholds) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#verts) + +### Methods + +- [bufferGradients](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#buffergradients) +- [flush](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#flush) +- [queueChunk](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#queuechunk) +- [queueRect](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#queuerect) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md#setuniforms) + +## Constructors + +### constructor + +• **new PerlinRenderer**(`manager`, `config`, `thresholds`, `rectRenderer?`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :------------- | :------------------------------------------------------------------------------------------- | +| `manager` | [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) | +| `config` | `PerlinConfig` | +| `thresholds` | [`number`, `number`, `number`] | +| `rectRenderer` | `undefined` \| [`default`](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### config + +• **config**: `PerlinConfig` + +--- + +### coordsBuffer + +• **coordsBuffer**: `number`[] + +--- + +### manager + +• **manager**: [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) + +WebGLManager corresponding to this program. + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### posBuffer + +• **posBuffer**: `number`[] + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### rectRenderer + +• **rectRenderer**: `undefined` \| [`default`](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md) + +--- + +### thresholds + +• **thresholds**: [`Vec3`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#vec3) + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### bufferGradients + +▸ `Private` **bufferGradients**(`rect`, `octave`, `topGrad`, `botGrad`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :---------------------------------------------------------------------------------------------- | +| `rect` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | +| `octave` | [`PerlinOctave`](../enums/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.PerlinOctave.md) | +| `topGrad` | [`default`](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md) | +| `botGrad` | [`default`](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md) | + +#### Returns + +`void` + +--- + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueChunk + +▸ **queueChunk**(`chunk`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### queueRect + +▸ `Private` **queueRect**(`rect`): `void` + +#### Parameters + +| Name | Type | +| :----- | :------------------------------------------------------------------ | +| `rect` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md new file mode 100644 index 00000000..b99b3a67 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md @@ -0,0 +1,310 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager](../modules/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.md).default + +this guy is always going to call things in worldcoords, we'll convert them +to CanvasCoords. responsible for rendering planets by calling primitive renderers + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#constructor) + +### Properties + +- [renderer](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#renderer) + +### Methods + +- [drawPlanetMessages](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#drawplanetmessages) +- [flush](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#flush) +- [getLockedEnergy](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#getlockedenergy) +- [getMouseAtk](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#getmouseatk) +- [queueArtifactIcon](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueartifacticon) +- [queueArtifactsAroundPlanet](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueartifactsaroundplanet) +- [queueAsteroids](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueasteroids) +- [queueBlackDomain](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueblackdomain) +- [queueHat](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queuehat) +- [queueLocation](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queuelocation) +- [queuePlanetBody](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueplanetbody) +- [queuePlanetEnergyText](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueplanetenergytext) +- [queuePlanetSilverText](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueplanetsilvertext) +- [queuePlanets](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueplanets) +- [queueRings](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queuerings) + +## Constructors + +### constructor + +• **new default**(`renderer`) + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------------------------- | +| `renderer` | [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) | + +## Properties + +### renderer + +• **renderer**: [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) + +## Methods + +### drawPlanetMessages + +▸ `Private` **drawPlanetMessages**(`renderInfo`, `coords`, `radiusW`, `textAlpha`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------------------------------------------------------------------------------------- | +| `renderInfo` | [`PlanetRenderInfo`](../interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md) | +| `coords` | `WorldCoords` | +| `radiusW` | `number` | +| `textAlpha` | `number` | + +#### Returns + +`void` + +--- + +### flush + +▸ **flush**(): `void` + +#### Returns + +`void` + +--- + +### getLockedEnergy + +▸ `Private` **getLockedEnergy**(`planet`): `number` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`number` + +--- + +### getMouseAtk + +▸ `Private` **getMouseAtk**(): `undefined` \| `number` + +#### Returns + +`undefined` \| `number` + +--- + +### queueArtifactIcon + +▸ `Private` **queueArtifactIcon**(`planet`, `__namedParameters`, `radius`): `void` + +#### Parameters + +| Name | Type | +| :------------------ | :------------ | +| `planet` | `Planet` | +| `__namedParameters` | `WorldCoords` | +| `radius` | `number` | + +#### Returns + +`void` + +--- + +### queueArtifactsAroundPlanet + +▸ `Private` **queueArtifactsAroundPlanet**(`planet`, `artifacts`, `centerW`, `radiusW`, `now`, `alpha`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :------------ | +| `planet` | `Planet` | +| `artifacts` | `Artifact`[] | +| `centerW` | `WorldCoords` | +| `radiusW` | `number` | +| `now` | `number` | +| `alpha` | `number` | + +#### Returns + +`void` + +--- + +### queueAsteroids + +▸ `Private` **queueAsteroids**(`planet`, `center`, `radius`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `planet` | `Planet` | +| `center` | `WorldCoords` | +| `radius` | `number` | + +#### Returns + +`void` + +--- + +### queueBlackDomain + +▸ `Private` **queueBlackDomain**(`planet`, `center`, `radius`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `planet` | `Planet` | +| `center` | `WorldCoords` | +| `radius` | `number` | + +#### Returns + +`void` + +--- + +### queueHat + +▸ `Private` **queueHat**(`planet`, `center`, `radius`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `planet` | `Planet` | +| `center` | `WorldCoords` | +| `radius` | `number` | + +#### Returns + +`void` + +--- + +### queueLocation + +▸ **queueLocation**(`renderInfo`, `now`, `highPerfMode`): `void` + +#### Parameters + +| Name | Type | +| :------------- | :----------------------------------------------------------------------------------------- | +| `renderInfo` | [`PlanetRenderInfo`](../interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md) | +| `now` | `number` | +| `highPerfMode` | `boolean` | + +#### Returns + +`void` + +--- + +### queuePlanetBody + +▸ `Private` **queuePlanetBody**(`planet`, `centerW`, `radiusW`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------ | +| `planet` | `Planet` | +| `centerW` | `WorldCoords` | +| `radiusW` | `number` | + +#### Returns + +`void` + +--- + +### queuePlanetEnergyText + +▸ `Private` **queuePlanetEnergyText**(`planet`, `center`, `radius`, `alpha`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `planet` | `Planet` | +| `center` | `WorldCoords` | +| `radius` | `number` | +| `alpha` | `number` | + +#### Returns + +`void` + +--- + +### queuePlanetSilverText + +▸ `Private` **queuePlanetSilverText**(`planet`, `center`, `radius`, `alpha`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `planet` | `Planet` | +| `center` | `WorldCoords` | +| `radius` | `number` | +| `alpha` | `number` | + +#### Returns + +`void` + +--- + +### queuePlanets + +▸ **queuePlanets**(`cachedPlanets`, `now`, `highPerfMode`): `void` + +#### Parameters + +| Name | Type | +| :-------------- | :--------------------------------------------------------------------------------------------------------------- | +| `cachedPlanets` | `Map`<`LocationId`, [`PlanetRenderInfo`](../interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md)\> | +| `now` | `number` | +| `highPerfMode` | `boolean` | + +#### Returns + +`void` + +--- + +### queueRings + +▸ `Private` **queueRings**(`planet`, `center`, `radius`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `planet` | `Planet` | +| `center` | `WorldCoords` | +| `radius` | `number` | + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md new file mode 100644 index 00000000..0db8b5df --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md @@ -0,0 +1,249 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/PlanetRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.md).default + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#program) +- [quad2Buffer](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#quad2buffer) +- [quad3Buffer](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#quad3buffer) +- [timeMatrix](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#timematrix) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#flush) +- [queuePlanetBody](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#queueplanetbody) +- [queuePlanetBodyScreen](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#queueplanetbodyscreen) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md#setuniforms) + +## Constructors + +### constructor + +• **new default**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### quad2Buffer + +• **quad2Buffer**: `number`[] + +--- + +### quad3Buffer + +• **quad3Buffer**: `number`[] + +--- + +### timeMatrix + +• **timeMatrix**: `mat4` + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queuePlanetBody + +▸ **queuePlanetBody**(`planet`, `centerW`, `radiusW`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------ | +| `planet` | `Planet` | +| `centerW` | `WorldCoords` | +| `radiusW` | `number` | + +#### Returns + +`void` + +--- + +### queuePlanetBodyScreen + +▸ **queuePlanetBodyScreen**(`planet`, `radius`, `x1`, `y1`, `x2`, `y2`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | +| `radius` | `number` | +| `x1` | `number` | +| `y1` | `number` | +| `x2` | `number` | +| `y2` | `number` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md new file mode 100644 index 00000000..1a4a4d84 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md @@ -0,0 +1,243 @@ +# Class: QuasarBodyRenderer + +[Frontend/Renderers/GameRenderer/Entities/QuasarBodyRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.md).QuasarBodyRenderer + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`QuasarBodyRenderer`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#program) +- [quad2Buffer](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#quad2buffer) +- [quad3Buffer](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#quad3buffer) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#flush) +- [queueQuasarBody](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#queuequasarbody) +- [queueQuasarBodyScreen](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#queuequasarbodyscreen) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md#setuniforms) + +## Constructors + +### constructor + +• **new QuasarBodyRenderer**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### quad2Buffer + +• **quad2Buffer**: `number`[] + +--- + +### quad3Buffer + +• **quad3Buffer**: `number`[] + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueQuasarBody + +▸ **queueQuasarBody**(`planet`, `centerW`, `radiusW`, `z`, `angle?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :-------- | :------------ | :------------ | +| `planet` | `Planet` | `undefined` | +| `centerW` | `WorldCoords` | `undefined` | +| `radiusW` | `number` | `undefined` | +| `z` | `number` | `undefined` | +| `angle` | `number` | `0` | + +#### Returns + +`void` + +--- + +### queueQuasarBodyScreen + +▸ **queueQuasarBodyScreen**(`planet`, `center`, `radius`, `z`, `angle?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :------------------------------------------------------------------------ | :------------ | +| `planet` | `Planet` | `undefined` | +| `center` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `radius` | `number` | `undefined` | +| `z` | `number` | `undefined` | +| `angle` | `number` | `0` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md new file mode 100644 index 00000000..3e6f7b4e --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md @@ -0,0 +1,252 @@ +# Class: QuasarRayRenderer + +[Frontend/Renderers/GameRenderer/Entities/QuasarRayRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.md).QuasarRayRenderer + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`QuasarRayRenderer`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#program) +- [quad2BufferBot](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#quad2bufferbot) +- [quad2BufferTop](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#quad2buffertop) +- [quad3Buffer](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#quad3buffer) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#flush) +- [queueQuasarRay](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#queuequasarray) +- [queueQuasarRayScreen](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#queuequasarrayscreen) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md#setuniforms) + +## Constructors + +### constructor + +• **new QuasarRayRenderer**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### quad2BufferBot + +• **quad2BufferBot**: `number`[] + +--- + +### quad2BufferTop + +• **quad2BufferTop**: `number`[] + +--- + +### quad3Buffer + +• **quad3Buffer**: `number`[] + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueQuasarRay + +▸ **queueQuasarRay**(`top?`, `planet`, `centerW`, `radiusW`, `z`, `angle?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :-------- | :------------ | :------------ | +| `top` | `boolean` | `true` | +| `planet` | `Planet` | `undefined` | +| `centerW` | `WorldCoords` | `undefined` | +| `radiusW` | `number` | `undefined` | +| `z` | `number` | `undefined` | +| `angle` | `number` | `0` | + +#### Returns + +`void` + +--- + +### queueQuasarRayScreen + +▸ **queueQuasarRayScreen**(`top?`, `planet`, `center`, `radius`, `z`, `angle?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :------------------------------------------------------------------------ | :------------ | +| `top` | `boolean` | `true` | +| `planet` | `Planet` | `undefined` | +| `center` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `radius` | `number` | `undefined` | +| `z` | `number` | `undefined` | +| `angle` | `number` | `0` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md new file mode 100644 index 00000000..db6a4ddf --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md @@ -0,0 +1,134 @@ +# Class: QuasarRenderer + +[Frontend/Renderers/GameRenderer/Entities/QuasarRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.md).QuasarRenderer + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#constructor) + +### Properties + +- [manager](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#manager) +- [quasarBodyRenderer](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#quasarbodyrenderer) +- [quasarRayRendererBot](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#quasarrayrendererbot) +- [quasarRayRendererTop](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#quasarrayrenderertop) +- [renderer](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#renderer) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#flush) +- [getAngle](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#getangle) +- [queueQuasar](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#queuequasar) +- [queueQuasarScreen](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#queuequasarscreen) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md#setuniforms) + +## Constructors + +### constructor + +• **new QuasarRenderer**(`manager`) + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | + +## Properties + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +--- + +### quasarBodyRenderer + +• **quasarBodyRenderer**: [`QuasarBodyRenderer`](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md) + +--- + +### quasarRayRendererBot + +• **quasarRayRendererBot**: [`QuasarRayRenderer`](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md) + +--- + +### quasarRayRendererTop + +• **quasarRayRendererTop**: [`QuasarRayRenderer`](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md) + +--- + +### renderer + +• **renderer**: [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) + +## Methods + +### flush + +▸ **flush**(): `void` + +#### Returns + +`void` + +--- + +### getAngle + +▸ `Private` **getAngle**(): `number` + +#### Returns + +`number` + +--- + +### queueQuasar + +▸ **queueQuasar**(`planet`, `centerW`, `radiusW`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------ | +| `planet` | `Planet` | +| `centerW` | `WorldCoords` | +| `radiusW` | `number` | + +#### Returns + +`void` + +--- + +### queueQuasarScreen + +▸ **queueQuasarScreen**(`planet`, `center`, `radius`, `z`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------------------------------------------------------------------ | +| `planet` | `Planet` | +| `center` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `radius` | `number` | +| `z` | `number` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md new file mode 100644 index 00000000..a9558cbd --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md @@ -0,0 +1,284 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/RectRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_RectRenderer.md).default + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#program) +- [quad2Buffer](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#quad2buffer) +- [quad3Buffer](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#quad3buffer) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#flush) +- [queueChunkBorder](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#queuechunkborder) +- [queueRect](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#queuerect) +- [queueRectCenterWorld](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#queuerectcenterworld) +- [queueRectWorld](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#queuerectworld) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md#setuniforms) + +## Constructors + +### constructor + +• **new default**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------------------------------------------------------------------- | +| `manager` | [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### quad2Buffer + +• **quad2Buffer**: `number`[] + +--- + +### quad3Buffer + +• **quad3Buffer**: `number`[] + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueChunkBorder + +▸ **queueChunkBorder**(`chunk`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### queueRect + +▸ **queueRect**(`__namedParameters`, `width`, `height`, `color?`, `stroke?`, `zIdx?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------------------ | :--------------------------------------------------------------------------- | :------------ | +| `__namedParameters` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `width` | `number` | `undefined` | +| `height` | `number` | `undefined` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `stroke` | `number` | `-1` | +| `zIdx` | `number` | `undefined` | + +#### Returns + +`void` + +--- + +### queueRectCenterWorld + +▸ **queueRectCenterWorld**(`center`, `width`, `height`, `color?`, `stroke?`, `zIdx?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :--------------------------------------------------------------------------- | :------------ | +| `center` | `WorldCoords` | `undefined` | +| `width` | `number` | `undefined` | +| `height` | `number` | `undefined` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `stroke` | `number` | `-1` | +| `zIdx` | `number` | `undefined` | + +#### Returns + +`void` + +--- + +### queueRectWorld + +▸ **queueRectWorld**(`coords`, `width`, `height`, `color?`, `stroke?`, `zIdx?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :--------------------------------------------------------------------------- | :------------ | +| `coords` | `WorldCoords` | `undefined` | +| `width` | `number` | `undefined` | +| `height` | `number` | `undefined` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `stroke` | `number` | `-1` | +| `zIdx` | `number` | `undefined` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md new file mode 100644 index 00000000..065fb70d --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md @@ -0,0 +1,285 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/RingRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_RingRenderer.md).default + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#attribmanagers) +- [botRectPosBuffer](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#botrectposbuffer) +- [manager](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#manager) +- [posBuffer](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#posbuffer) +- [program](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#program) +- [topRectPosBuffer](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#toprectposbuffer) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#verts) +- [viewport](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#viewport) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#flush) +- [queueBelt](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#queuebelt) +- [queueBeltAtIdx](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#queuebeltatidx) +- [queueBeltWorld](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#queuebeltworld) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md#setuniforms) + +## Constructors + +### constructor + +• **new default**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------------------------------------------------------------------- | +| `manager` | [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### botRectPosBuffer + +• **botRectPosBuffer**: `number`[] + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### posBuffer + +• **posBuffer**: `number`[] + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### topRectPosBuffer + +• **topRectPosBuffer**: `number`[] + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +--- + +### viewport + +• **viewport**: [`default`](Frontend_Game_Viewport.default.md) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueBelt + +▸ **queueBelt**(`center`, `radius`, `color`, `l?`, `z?`, `delZ?`, `props?`, `angle?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :------------------------------------------------------------------------------------------ | :------------ | +| `center` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `radius` | `number` | `undefined` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `l` | `number` | `1` | +| `z` | `number` | `0` | +| `delZ` | `number` | `0` | +| `props` | [`RingProps`](../modules/Frontend_Renderers_GameRenderer_Programs_RingProgram.md#ringprops) | `undefined` | +| `angle` | `number` | `0` | + +#### Returns + +`void` + +--- + +### queueBeltAtIdx + +▸ **queueBeltAtIdx**(`planet`, `centerW`, `radiusW`, `color`, `beltIdx`, `angle?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :-------- | :--------------------------------------------------------------------------- | :------------ | +| `planet` | `Planet` | `undefined` | +| `centerW` | `WorldCoords` | `undefined` | +| `radiusW` | `number` | `undefined` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `beltIdx` | `number` | `undefined` | +| `angle` | `number` | `0` | + +#### Returns + +`void` + +--- + +### queueBeltWorld + +▸ **queueBeltWorld**(`centerW`, `radiusW`, `color`, `l?`, `z?`, `delZ?`, `props?`, `angle?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :-------- | :------------------------------------------------------------------------------------------ | :------------ | +| `centerW` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `radiusW` | `number` | `undefined` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `l` | `number` | `1` | +| `z` | `number` | `0` | +| `delZ` | `number` | `0` | +| `props` | [`RingProps`](../modules/Frontend_Renderers_GameRenderer_Programs_RingProgram.md#ringprops) | `undefined` | +| `angle` | `number` | `0` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md new file mode 100644 index 00000000..7d7f3562 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md @@ -0,0 +1,262 @@ +# Class: RuinsRenderer + +[Frontend/Renderers/GameRenderer/Entities/RuinsRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.md).RuinsRenderer + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`RuinsRenderer`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#program) +- [quad2Buffer](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#quad2buffer) +- [quad3Buffer](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#quad3buffer) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#flush) +- [queueBloom](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#queuebloom) +- [queueRuins](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#queueruins) +- [queueRuinsScreen](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#queueruinsscreen) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md#setuniforms) + +## Constructors + +### constructor + +• **new RuinsRenderer**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### quad2Buffer + +• **quad2Buffer**: `number`[] + +--- + +### quad3Buffer + +• **quad3Buffer**: `number`[] + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueBloom + +▸ `Private` **queueBloom**(`center`, `radius`, `z`, `color`, `weights`, `props`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :--------------------------------------------------------------------------- | +| `center` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `radius` | `number` | +| `z` | `number` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `weights` | [`number`, `number`, `number`, `number`] | +| `props` | [`number`, `number`, `number`, `number`] | + +#### Returns + +`void` + +--- + +### queueRuins + +▸ **queueRuins**(`planet`, `centerW`, `radiusW`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------ | +| `planet` | `Planet` | +| `centerW` | `WorldCoords` | +| `radiusW` | `number` | + +#### Returns + +`void` + +--- + +### queueRuinsScreen + +▸ **queueRuinsScreen**(`planet`, `center`, `radius`, `z`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------------------------------------------------------------------ | +| `planet` | `Planet` | +| `center` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `radius` | `number` | +| `z` | `number` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md new file mode 100644 index 00000000..4426724e --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md @@ -0,0 +1,240 @@ +# Class: SpacetimeRipRenderer + +[Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.md).SpacetimeRipRenderer + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`SpacetimeRipRenderer`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#program) +- [quad2Buffer](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#quad2buffer) +- [quad3Buffer](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#quad3buffer) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#flush) +- [queueRip](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#queuerip) +- [queueRipScreen](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#queueripscreen) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md#setuniforms) + +## Constructors + +### constructor + +• **new SpacetimeRipRenderer**(`manager`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### quad2Buffer + +• **quad2Buffer**: `number`[] + +--- + +### quad3Buffer + +• **quad3Buffer**: `number`[] + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueRip + +▸ **queueRip**(`planet`, `centerW`, `radiusW`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------ | +| `planet` | `Planet` | +| `centerW` | `WorldCoords` | +| `radiusW` | `number` | + +#### Returns + +`void` + +--- + +### queueRipScreen + +▸ **queueRipScreen**(`planet`, `center`, `radius`, `z`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------------------------------------------------------------------------ | +| `planet` | `Planet` | +| `center` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `radius` | `number` | +| `z` | `number` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md new file mode 100644 index 00000000..3cc9b488 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md @@ -0,0 +1,380 @@ +# Class: SpriteRenderer + +[Frontend/Renderers/GameRenderer/Entities/SpriteRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.md).SpriteRenderer + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`SpriteRenderer`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#attribmanagers) +- [flip](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#flip) +- [loaded](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#loaded) +- [manager](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#manager) +- [posBuffer](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#posbuffer) +- [program](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#program) +- [rectposBuffer](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#rectposbuffer) +- [texBuffer](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#texbuffer) +- [texIdx](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#texidx) +- [thumb](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#thumb) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#flush) +- [loadAtlas](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#loadatlas) +- [loadTexture](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#loadtexture) +- [queueArtifact](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#queueartifact) +- [queueArtifactWorld](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#queueartifactworld) +- [queueIconWorld](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#queueiconworld) +- [queueOutline](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#queueoutline) +- [queueSprite](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#queuesprite) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md#setuniforms) + +## Constructors + +### constructor + +• **new SpriteRenderer**(`manager`, `thumb?`, `flip?`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | Default value | +| :-------- | :----------------------------------------------------------------------------------- | :------------ | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | `undefined` | +| `thumb` | `boolean` | `false` | +| `flip` | `boolean` | `false` | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### flip + +• `Private` **flip**: `boolean` + +--- + +### loaded + +• `Private` **loaded**: `boolean` + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### posBuffer + +• `Private` **posBuffer**: `number`[] + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### rectposBuffer + +• `Private` **rectposBuffer**: `number`[] + +--- + +### texBuffer + +• `Private` **texBuffer**: `number`[] + +--- + +### texIdx + +• `Private` **texIdx**: `number` + +--- + +### thumb + +• `Private` **thumb**: `boolean` + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### flush + +▸ **flush**(): `void` + +Draw all buffered vertices to the screen. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### loadAtlas + +▸ `Private` **loadAtlas**(`thumb`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :------ | :-------- | +| `thumb` | `boolean` | + +#### Returns + +`Promise`<`void`\> + +--- + +### loadTexture + +▸ `Private` **loadTexture**(`img`, `texIdx`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :------- | :----------------- | +| `img` | `HTMLImageElement` | +| `texIdx` | `number` | + +#### Returns + +`Promise`<`void`\> + +--- + +### queueArtifact + +▸ **queueArtifact**(`artifact`, `pos`, `width?`, `alpha?`, `atFrame?`, `color?`, `theta?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :--------- | :------------------------------------------------------------------------------------------ | :------------ | +| `artifact` | [`RenderedArtifact`](../interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md) | `undefined` | +| `pos` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `width` | `number` | `128` | +| `alpha` | `number` | `255` | +| `atFrame` | `undefined` \| `number` | `undefined` | +| `color` | `undefined` \| [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `theta` | `undefined` \| `number` | `undefined` | + +#### Returns + +`void` + +--- + +### queueArtifactWorld + +▸ **queueArtifactWorld**(`artifact`, `posW`, `widthW`, `alpha?`, `atFrame?`, `color?`, `theta?`): `void` + +Queue artifact to worldcoords, centered + +#### Parameters + +| Name | Type | Default value | +| :--------- | :------------------------------------------------------------------------------------------ | :------------ | +| `artifact` | [`RenderedArtifact`](../interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md) | `undefined` | +| `posW` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | `undefined` | +| `widthW` | `number` | `undefined` | +| `alpha` | `number` | `255` | +| `atFrame` | `undefined` \| `number` | `undefined` | +| `color` | `undefined` \| [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | `undefined` | +| `theta` | `undefined` \| `number` | `undefined` | + +#### Returns + +`void` + +--- + +### queueIconWorld + +▸ **queueIconWorld**(`artifact`, `topLeft`, `widthW`, `maxWidth?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :--------- | :------------ | :------------ | +| `artifact` | `Artifact` | `undefined` | +| `topLeft` | `WorldCoords` | `undefined` | +| `widthW` | `number` | `undefined` | +| `maxWidth` | `number` | `32` | + +#### Returns + +`void` + +--- + +### queueOutline + +▸ **queueOutline**(`artifact`, `__namedParameters`, `width`, `alpha`, `theta`, `color?`): `void` + +#### Parameters + +| Name | Type | +| :------------------ | :-------------------------------------------------------------------------------------- | +| `artifact` | [`RenderedArtifact`](../interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md) | +| `__namedParameters` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `width` | `number` | +| `alpha` | `number` | +| `theta` | `undefined` \| `number` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | + +#### Returns + +`void` + +--- + +### queueSprite + +▸ **queueSprite**(`artifact`, `topLeft`, `width`, `alpha`, `color?`, `atFrame?`, `theta?`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :------------------------------------------------------------------------------------------ | +| `artifact` | [`RenderedArtifact`](../interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md) | +| `topLeft` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `width` | `number` | +| `alpha` | `number` | +| `color` | `undefined` \| [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `atFrame` | `undefined` \| `number` | +| `theta` | `undefined` \| `number` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md new file mode 100644 index 00000000..e7912b0c --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md @@ -0,0 +1,317 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/TextRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_TextRenderer.md).default + +## Hierarchy + +- [`GenericRenderer`](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#attribmanagers) +- [bufferCanvas](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#buffercanvas) +- [glyphData](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#glyphdata) +- [manager](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#manager) +- [program](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#program) +- [quad2Buffer](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#quad2buffer) +- [quad3Buffer](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#quad3buffer) +- [texIdx](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#texidx) +- [uniformData](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#verts) + +### Methods + +- [createGlyphs](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#createglyphs) +- [flush](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#flush) +- [queueGlyph](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#queueglyph) +- [queueText](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#queuetext) +- [queueTextWorld](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#queuetextworld) +- [setTexture](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#settexture) +- [setUniforms](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md#setuniforms) + +## Constructors + +### constructor + +• **new default**(`manager`, `bufferCanvas`) + +Create a renderer from a WebGLManager and program data. + +#### Parameters + +| Name | Type | +| :------------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | +| `bufferCanvas` | `HTMLCanvasElement` | + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`Object`\> + +A dictionary of attrib managers, keyed by attrib name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) + +--- + +### bufferCanvas + +• **bufferCanvas**: `HTMLCanvasElement` + +--- + +### glyphData + +• **glyphData**: `Map`<`string`, `GlyphInfo`\> + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) + +--- + +### quad2Buffer + +• **quad2Buffer**: `number`[] + +--- + +### quad3Buffer + +• **quad3Buffer**: `number`[] + +--- + +### texIdx + +• **texIdx**: `number` + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`Object`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`Object`\> + +A dictionary of uniform setters, keyed by uniform name. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +#### Inherited from + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +## Methods + +### createGlyphs + +▸ `Private` **createGlyphs**(`debug?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------ | :-------- | :------------ | +| `debug` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### flush + +▸ **flush**(): `void` + +Draw all buffered vertices to the screen. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) + +--- + +### queueGlyph + +▸ `Private` **queueGlyph**(`glyph`, `x`, `y`, `color`, `zIdx`): `void` + +#### Parameters + +| Name | Type | +| :------ | :----------------------------------------------------------------------------- | +| `glyph` | `string` | +| `x` | `number` | +| `y` | `number` | +| `color` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | +| `zIdx` | `number` | + +#### Returns + +`void` + +--- + +### queueText + +▸ **queueText**(`text`, `__namedParameters`, `color`, `align?`, `anchor?`, `zIdx?`): `void` + +#### Parameters + +| Name | Type | +| :------------------ | :--------------------------------------------------------------------------------- | +| `text` | `string` | +| `__namedParameters` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `color` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | +| `align` | [`TextAlign`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md) | +| `anchor` | [`TextAnchor`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAnchor.md) | +| `zIdx` | `number` | + +#### Returns + +`void` + +--- + +### queueTextWorld + +▸ **queueTextWorld**(`text`, `coords`, `color?`, `offY?`, `align?`, `anchor?`, `zIdx?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :--------------------------------------------------------------------------------- | :------------ | +| `text` | `string` | `undefined` | +| `coords` | `WorldCoords` | `undefined` | +| `color` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | `undefined` | +| `offY` | `number` | `0` | +| `align` | [`TextAlign`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md) | `undefined` | +| `anchor` | [`TextAnchor`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAnchor.md) | `undefined` | +| `zIdx` | `number` | `undefined` | + +#### Returns + +`void` + +--- + +### setTexture + +▸ `Private` **setTexture**(`texIdx`): `void` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `texIdx` | `number` | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` + +#### Overrides + +[GenericRenderer](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md).[setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md new file mode 100644 index 00000000..670324dd --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md @@ -0,0 +1,82 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Entities/VoyageRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.md).default + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md#constructor) + +### Properties + +- [renderer](Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md#renderer) + +### Methods + +- [drawFleet](Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md#drawfleet) +- [drawVoyagePath](Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md#drawvoyagepath) +- [queueVoyages](Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md#queuevoyages) + +## Constructors + +### constructor + +• **new default**(`renderer`) + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------------------------- | +| `renderer` | [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) | + +## Properties + +### renderer + +• **renderer**: [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) + +## Methods + +### drawFleet + +▸ **drawFleet**(`voyage`): `void` + +#### Parameters + +| Name | Type | +| :------- | :-------------- | +| `voyage` | `QueuedArrival` | + +#### Returns + +`void` + +--- + +### drawVoyagePath + +▸ `Private` **drawVoyagePath**(`from`, `to`, `confirmed`, `isMyVoyage`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `from` | `LocationId` | +| `to` | `LocationId` | +| `confirmed` | `boolean` | +| `isMyVoyage` | `boolean` | + +#### Returns + +`void` + +--- + +### queueVoyages + +▸ **queueVoyages**(): `void` + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.WormholeRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.WormholeRenderer.md new file mode 100644 index 00000000..e167b987 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.WormholeRenderer.md @@ -0,0 +1,64 @@ +# Class: WormholeRenderer + +[Frontend/Renderers/GameRenderer/Entities/WormholeRenderer](../modules/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.md).WormholeRenderer + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.WormholeRenderer.md#constructor) + +### Properties + +- [renderer](Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.WormholeRenderer.md#renderer) + +### Methods + +- [drawVoyagePath](Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.WormholeRenderer.md#drawvoyagepath) +- [queueWormholes](Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.WormholeRenderer.md#queuewormholes) + +## Constructors + +### constructor + +• **new WormholeRenderer**(`renderer`) + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------------------------- | +| `renderer` | [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) | + +## Properties + +### renderer + +• **renderer**: [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) + +## Methods + +### drawVoyagePath + +▸ `Private` **drawVoyagePath**(`from`, `to`, `confirmed`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :----------- | +| `from` | `LocationId` | +| `to` | `LocationId` | +| `confirmed` | `boolean` | + +#### Returns + +`void` + +--- + +### queueWormholes + +▸ **queueWormholes**(): `void` + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md new file mode 100644 index 00000000..29889e44 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md @@ -0,0 +1,300 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Overlay2DRenderer](../modules/Frontend_Renderers_GameRenderer_Overlay2DRenderer.md).default + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#constructor) + +### Properties + +- [canvas](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#canvas) +- [ctx](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#ctx) +- [renderer](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#renderer) + +### Methods + +- [clear](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#clear) +- [drawArcWorld](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawarcworld) +- [drawArtifactAroundPlanet](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawartifactaroundplanet) +- [drawArtifactIcon](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawartifacticon) +- [drawChunk](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawchunk) +- [drawEmojiMessage](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawemojimessage) +- [drawHat](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawhat) +- [drawLine](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawline) +- [drawLoopWorld](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawloopworld) +- [drawMiner](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawminer) +- [drawPlanetMessages](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawplanetmessages) +- [drawRectStrokeAtCenterWorld](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawrectstrokeatcenterworld) +- [drawText](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md#drawtext) + +## Constructors + +### constructor + +• **new default**(`engine`, `canvas`) + +#### Parameters + +| Name | Type | +| :------- | :--------------------------------------------------------------- | +| `engine` | [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) | +| `canvas` | `HTMLCanvasElement` | + +## Properties + +### canvas + +• **canvas**: `HTMLCanvasElement` + +--- + +### ctx + +• **ctx**: `CanvasRenderingContext2D` + +--- + +### renderer + +• **renderer**: [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) + +## Methods + +### clear + +▸ **clear**(): `void` + +#### Returns + +`void` + +--- + +### drawArcWorld + +▸ **drawArcWorld**(`center`, `radius`, `width`, `percent`, `color?`, `dotted?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :-------- | :------------ | :------------ | +| `center` | `WorldCoords` | `undefined` | +| `radius` | `number` | `undefined` | +| `width` | `number` | `undefined` | +| `percent` | `number` | `undefined` | +| `color` | `string` | `'white'` | +| `dotted` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### drawArtifactAroundPlanet + +▸ **drawArtifactAroundPlanet**(`artifact`, `coords`, `size`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :------------------------------------------------------------------------ | +| `artifact` | `Artifact` | +| `coords` | [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `size` | `number` | + +#### Returns + +`void` + +--- + +### drawArtifactIcon + +▸ **drawArtifactIcon**(`glassLoc`, `scale`, `color?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :--------- | :------------ | :------------ | +| `glassLoc` | `WorldCoords` | `undefined` | +| `scale` | `number` | `undefined` | +| `color` | `string` | `'white'` | + +#### Returns + +`void` + +--- + +### drawChunk + +▸ **drawChunk**(`chunk`): `void` + +#### Parameters + +| Name | Type | +| :------ | :-------------------------------------------- | +| `chunk` | [`Chunk`](_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`void` + +--- + +### drawEmojiMessage + +▸ **drawEmojiMessage**(`centerWorld`, `radiusWorld`, `renderInfo`, `message`, `textAlpha`): `void` + +#### Parameters + +| Name | Type | +| :------------ | :----------------------------------------------------------------------------------------- | +| `centerWorld` | `WorldCoords` | +| `radiusWorld` | `number` | +| `renderInfo` | [`PlanetRenderInfo`](../interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md) | +| `message` | `PlanetMessage`<`EmojiFlagBody`\> | +| `textAlpha` | `number` | + +#### Returns + +`void` + +--- + +### drawHat + +▸ **drawHat**(`hatType`, `pathHeight`, `pathWidth`, `center`, `width`, `height`, `radius`, `rotation`, `fill1?`, `fill2?`, `hoverCoords?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------------ | :--------------------------------------------------- | :------------ | +| `hatType` | [`HatType`](../enums/Frontend_Utils_Hats.HatType.md) | `undefined` | +| `pathHeight` | `number` | `undefined` | +| `pathWidth` | `number` | `undefined` | +| `center` | `WorldCoords` | `undefined` | +| `width` | `number` | `undefined` | +| `height` | `number` | `undefined` | +| `radius` | `number` | `undefined` | +| `rotation` | `number` | `undefined` | +| `fill1` | `string` \| `CanvasPattern` | `'white'` | +| `fill2` | `string` \| `CanvasPattern` | `'red'` | +| `hoverCoords` | `null` \| `WorldCoords` | `null` | + +#### Returns + +`void` + +--- + +### drawLine + +▸ **drawLine**(`startCoords`, `endCoords`, `lineWidth`, `color?`, `dotted?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------------ | :------------ | :------------ | +| `startCoords` | `WorldCoords` | `undefined` | +| `endCoords` | `WorldCoords` | `undefined` | +| `lineWidth` | `number` | `undefined` | +| `color` | `string` | `'white'` | +| `dotted` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### drawLoopWorld + +▸ **drawLoopWorld**(`center`, `radius`, `width`, `color?`, `dotted?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------- | :------------ | :------------ | +| `center` | `WorldCoords` | `undefined` | +| `radius` | `number` | `undefined` | +| `width` | `number` | `undefined` | +| `color` | `string` | `'white'` | +| `dotted` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### drawMiner + +▸ **drawMiner**(): `void` + +#### Returns + +`void` + +--- + +### drawPlanetMessages + +▸ **drawPlanetMessages**(`centerWorld`, `radiusWorld`, `renderInfo`, `textAlpha`): `void` + +#### Parameters + +| Name | Type | +| :------------ | :----------------------------------------------------------------------------------------- | +| `centerWorld` | `WorldCoords` | +| `radiusWorld` | `number` | +| `renderInfo` | [`PlanetRenderInfo`](../interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md) | +| `textAlpha` | `number` | + +#### Returns + +`void` + +--- + +### drawRectStrokeAtCenterWorld + +▸ **drawRectStrokeAtCenterWorld**(`center`, `width`, `height`, `strokeWidth`, `color?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------------ | :------------ | :------------ | +| `center` | `WorldCoords` | `undefined` | +| `width` | `number` | `undefined` | +| `height` | `number` | `undefined` | +| `strokeWidth` | `number` | `undefined` | +| `color` | `string` | `'white'` | + +#### Returns + +`void` + +--- + +### drawText + +▸ **drawText**(`text`, `x`, `y`, `color?`, `align?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------ | :------------------------------------------------------------------------------- | :------------ | +| `text` | `string` | `undefined` | +| `x` | `number` | `undefined` | +| `y` | `number` | `undefined` | +| `color` | `string` | `'white'` | +| `align` | [`TextAlign`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md) | `undefined` | + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Renderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Renderer.default.md new file mode 100644 index 00000000..82660be9 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_Renderer.default.md @@ -0,0 +1,321 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/Renderer](../modules/Frontend_Renderers_GameRenderer_Renderer.md).default + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_Renderer.default.md#constructor) + +### Properties + +- [asteroidRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#asteroidrenderer) +- [beltRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#beltrenderer) +- [bgRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#bgrenderer) +- [blackDomainRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#blackdomainrenderer) +- [bufferCanvas](Frontend_Renderers_GameRenderer_Renderer.default.md#buffercanvas) +- [canvas](Frontend_Renderers_GameRenderer_Renderer.default.md#canvas) +- [circleRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#circlerenderer) +- [frameCount](Frontend_Renderers_GameRenderer_Renderer.default.md#framecount) +- [frameRequestId](Frontend_Renderers_GameRenderer_Renderer.default.md#framerequestid) +- [gameUIManager](Frontend_Renderers_GameRenderer_Renderer.default.md#gameuimanager) +- [glCanvas](Frontend_Renderers_GameRenderer_Renderer.default.md#glcanvas) +- [glManager](Frontend_Renderers_GameRenderer_Renderer.default.md#glmanager) +- [lineRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#linerenderer) +- [mineRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#minerenderer) +- [now](Frontend_Renderers_GameRenderer_Renderer.default.md#now) +- [overlay2dRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#overlay2drenderer) +- [planetRenderManager](Frontend_Renderers_GameRenderer_Renderer.default.md#planetrendermanager) +- [planetRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#planetrenderer) +- [previousRenderTimestamp](Frontend_Renderers_GameRenderer_Renderer.default.md#previousrendertimestamp) +- [quasarRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#quasarrenderer) +- [rectRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#rectrenderer) +- [ringRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#ringrenderer) +- [ruinsRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#ruinsrenderer) +- [spacetimeRipRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#spacetimeriprenderer) +- [spriteRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#spriterenderer) +- [textRenderer](Frontend_Renderers_GameRenderer_Renderer.default.md#textrenderer) +- [uiRenderManager](Frontend_Renderers_GameRenderer_Renderer.default.md#uirendermanager) +- [voyageRenderManager](Frontend_Renderers_GameRenderer_Renderer.default.md#voyagerendermanager) +- [wormholeRenderManager](Frontend_Renderers_GameRenderer_Renderer.default.md#wormholerendermanager) +- [instance](Frontend_Renderers_GameRenderer_Renderer.default.md#instance) + +### Methods + +- [draw](Frontend_Renderers_GameRenderer_Renderer.default.md#draw) +- [loop](Frontend_Renderers_GameRenderer_Renderer.default.md#loop) +- [recordRender](Frontend_Renderers_GameRenderer_Renderer.default.md#recordrender) +- [setup](Frontend_Renderers_GameRenderer_Renderer.default.md#setup) +- [destroy](Frontend_Renderers_GameRenderer_Renderer.default.md#destroy) +- [initialize](Frontend_Renderers_GameRenderer_Renderer.default.md#initialize) + +## Constructors + +### constructor + +• `Private` **new default**(`canvas`, `glCanvas`, `bufferCanvas`, `gameUIManager`) + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------ | +| `canvas` | `HTMLCanvasElement` | +| `glCanvas` | `HTMLCanvasElement` | +| `bufferCanvas` | `HTMLCanvasElement` | +| `gameUIManager` | [`default`](Backend_GameLogic_GameUIManager.default.md) | + +## Properties + +### asteroidRenderer + +• **asteroidRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md) + +--- + +### beltRenderer + +• **beltRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md) + +--- + +### bgRenderer + +• **bgRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md) + +--- + +### blackDomainRenderer + +• **blackDomainRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md) + +--- + +### bufferCanvas + +• **bufferCanvas**: `HTMLCanvasElement` + +--- + +### canvas + +• **canvas**: `HTMLCanvasElement` + +--- + +### circleRenderer + +• **circleRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md) + +--- + +### frameCount + +• **frameCount**: `number` + +--- + +### frameRequestId + +• **frameRequestId**: `number` + +--- + +### gameUIManager + +• **gameUIManager**: [`default`](Backend_GameLogic_GameUIManager.default.md) + +--- + +### glCanvas + +• **glCanvas**: `HTMLCanvasElement` + +--- + +### glManager + +• **glManager**: [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) + +--- + +### lineRenderer + +• **lineRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md) + +--- + +### mineRenderer + +• **mineRenderer**: [`MineRenderer`](Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md) + +--- + +### now + +• **now**: `number` + +--- + +### overlay2dRenderer + +• **overlay2dRenderer**: [`default`](Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md) + +--- + +### planetRenderManager + +• **planetRenderManager**: [`default`](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md) + +--- + +### planetRenderer + +• **planetRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md) + +--- + +### previousRenderTimestamp + +• `Private` **previousRenderTimestamp**: `number` + +--- + +### quasarRenderer + +• **quasarRenderer**: [`QuasarRenderer`](Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md) + +--- + +### rectRenderer + +• **rectRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md) + +--- + +### ringRenderer + +• **ringRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md) + +--- + +### ruinsRenderer + +• **ruinsRenderer**: [`RuinsRenderer`](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md) + +--- + +### spacetimeRipRenderer + +• **spacetimeRipRenderer**: [`SpacetimeRipRenderer`](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md) + +--- + +### spriteRenderer + +• **spriteRenderer**: [`SpriteRenderer`](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md) + +--- + +### textRenderer + +• **textRenderer**: [`default`](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md) + +--- + +### uiRenderManager + +• **uiRenderManager**: [`UIRenderer`](Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md) + +--- + +### voyageRenderManager + +• **voyageRenderManager**: [`default`](Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md) + +--- + +### wormholeRenderManager + +• **wormholeRenderManager**: [`WormholeRenderer`](Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.WormholeRenderer.md) + +--- + +### instance + +▪ `Static` **instance**: `null` \| [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) + +## Methods + +### draw + +▸ `Private` **draw**(): `void` + +#### Returns + +`void` + +--- + +### loop + +▸ `Private` **loop**(): `void` + +#### Returns + +`void` + +--- + +### recordRender + +▸ `Private` **recordRender**(`now`): `void` + +#### Parameters + +| Name | Type | +| :---- | :------- | +| `now` | `number` | + +#### Returns + +`void` + +--- + +### setup + +▸ `Private` **setup**(): `void` + +#### Returns + +`void` + +--- + +### destroy + +▸ `Static` **destroy**(): `void` + +#### Returns + +`void` + +--- + +### initialize + +▸ `Static` **initialize**(`canvas`, `glCanvas`, `bufferCanvas`, `gameUIManager`): [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------ | +| `canvas` | `HTMLCanvasElement` | +| `glCanvas` | `HTMLCanvasElement` | +| `bufferCanvas` | `HTMLCanvasElement` | +| `gameUIManager` | [`default`](Backend_GameLogic_GameUIManager.default.md) | + +#### Returns + +[`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md new file mode 100644 index 00000000..0a0c3253 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md @@ -0,0 +1,119 @@ +# Class: UIRenderer + +[Frontend/Renderers/GameRenderer/UIRenderer](../modules/Frontend_Renderers_GameRenderer_UIRenderer.md).UIRenderer + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md#constructor) + +### Properties + +- [renderer](Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md#renderer) + +### Methods + +- [drawMiner](Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md#drawminer) +- [queueBorders](Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md#queueborders) +- [queueHoveringRect](Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md#queuehoveringrect) +- [queueMousePath](Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md#queuemousepath) +- [queueRectAtPlanet](Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md#queuerectatplanet) +- [queueSelectedRangeRing](Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md#queueselectedrangering) +- [queueSelectedRect](Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md#queueselectedrect) + +## Constructors + +### constructor + +• **new UIRenderer**(`renderer`) + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------------------------- | +| `renderer` | [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) | + +## Properties + +### renderer + +• **renderer**: [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) + +## Methods + +### drawMiner + +▸ **drawMiner**(): `void` + +#### Returns + +`void` + +--- + +### queueBorders + +▸ **queueBorders**(): `void` + +#### Returns + +`void` + +--- + +### queueHoveringRect + +▸ **queueHoveringRect**(): `void` + +#### Returns + +`void` + +--- + +### queueMousePath + +▸ **queueMousePath**(): `void` + +#### Returns + +`void` + +--- + +### queueRectAtPlanet + +▸ `Private` **queueRectAtPlanet**(`planet`, `coords`, `color`): `void` + +#### Parameters + +| Name | Type | +| :------- | :--------------------------------------------------------------------------- | +| `planet` | `Planet` | +| `coords` | `WorldCoords` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | + +#### Returns + +`void` + +--- + +### queueSelectedRangeRing + +▸ **queueSelectedRangeRing**(): `void` + +#### Returns + +`void` + +--- + +### queueSelectedRect + +▸ **queueSelectedRect**(): `void` + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md new file mode 100644 index 00000000..fc5fbd1f --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md @@ -0,0 +1,105 @@ +# Class: AttribArray + +[Frontend/Renderers/GameRenderer/WebGL/AttribArray](../modules/Frontend_Renderers_GameRenderer_WebGL_AttribArray.md).AttribArray + +Helper class - essentially an implementation of ArrayList from Java, but using +typed JS Arrays so that we can efficiently write our WebGL data without converting. + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md#constructor) + +### Properties + +- [array](Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md#array) +- [size](Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md#size) +- [type](Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md#type) + +### Methods + +- [createArray](Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md#createarray) +- [doubleLen](Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md#doublelen) +- [set](Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md#set) + +## Constructors + +### constructor + +• **new AttribArray**(`type`, `startSize?`) + +#### Parameters + +| Name | Type | Default value | +| :---------- | :--------------------------------------------------------------------------------- | :------------ | +| `type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | `undefined` | +| `startSize` | `number` | `4` | + +## Properties + +### array + +• **array**: [`GLArray`](../modules/Frontend_Renderers_GameRenderer_WebGL_AttribArray.md#glarray) + +A typed array, representing the data in this array. + +--- + +### size + +• `Private` **size**: `number` + +The number of bytes per data entry in this array. + +--- + +### type + +• `Private` **type**: [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) + +The WebGL data type that this array represents. + +## Methods + +### createArray + +▸ `Private` **createArray**(): `void` + +Initialize a new blank array of size this.size. + +#### Returns + +`void` + +--- + +### doubleLen + +▸ `Private` **doubleLen**(): `void` + +Initialize a new array of 2x the length, and copy in the old data. + +#### Returns + +`void` + +--- + +### set + +▸ **set**(`els`, `idx`): `void` + +Copy in an array of data starting at an index. Writing past the maximum +array length will trigger doubleLen(). + +#### Parameters + +| Name | Type | Description | +| :---- | :--------------------- | :--------------------------- | +| `els` | `ArrayLike`<`number`\> | The array of data to copy. | +| `idx` | `number` | The array index to start at. | + +#### Returns + +`void` diff --git a/docs/classes/frontend_renderers_gamerenderer_webgl_attribmanager.default.md b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md similarity index 53% rename from docs/classes/frontend_renderers_gamerenderer_webgl_attribmanager.default.md rename to docs/classes/Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md index 754863a0..797408b5 100644 --- a/docs/classes/frontend_renderers_gamerenderer_webgl_attribmanager.default.md +++ b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md @@ -1,6 +1,6 @@ # Class: default -[Frontend/Renderers/GameRenderer/WebGL/AttribManager](../modules/frontend_renderers_gamerenderer_webgl_attribmanager.md).default +[Frontend/Renderers/GameRenderer/WebGL/AttribManager](../modules/Frontend_Renderers_GameRenderer_WebGL_AttribManager.md).default Responsible for queuing data about a webgl attribute and then writing to it. Does this by maintaining a persistent AttribArray and WebGLBuffer reference, @@ -11,26 +11,26 @@ whole arrays of objects at once, providing speed boost. ### Constructors -- [constructor](frontend_renderers_gamerenderer_webgl_attribmanager.default.md#constructor) +- [constructor](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md#constructor) ### Properties -- [attribArray](frontend_renderers_gamerenderer_webgl_attribmanager.default.md#attribarray) -- [buffer](frontend_renderers_gamerenderer_webgl_attribmanager.default.md#buffer) -- [gl](frontend_renderers_gamerenderer_webgl_attribmanager.default.md#gl) -- [loc](frontend_renderers_gamerenderer_webgl_attribmanager.default.md#loc) -- [props](frontend_renderers_gamerenderer_webgl_attribmanager.default.md#props) +- [attribArray](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md#attribarray) +- [buffer](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md#buffer) +- [gl](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md#gl) +- [loc](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md#loc) +- [props](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md#props) ### Methods -- [bufferData](frontend_renderers_gamerenderer_webgl_attribmanager.default.md#bufferdata) -- [setVertex](frontend_renderers_gamerenderer_webgl_attribmanager.default.md#setvertex) +- [bufferData](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md#bufferdata) +- [setVertex](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md#setvertex) ## Constructors ### constructor -\+ **new default**(`gl`: WebGL2RenderingContext, `program`: WebGLProgram, `props`: [_AttribProps_](../modules/frontend_renderers_gamerenderer_enginetypes.md#attribprops), `enable?`: _boolean_): [_default_](frontend_renderers_gamerenderer_webgl_attribmanager.default.md) +• **new default**(`gl`, `program`, `props`, `enable?`) For a given attribute on a program on a context, create an AttribManager. @@ -38,18 +38,16 @@ For a given attribute on a program on a context, create an AttribManager. | Name | Type | Default value | Description | | :-------- | :------------------------------------------------------------------------------------- | :------------ | :---------------------------------------------------------------- | -| `gl` | WebGL2RenderingContext | - | The WebGL context to generate this attrib on. | -| `program` | WebGLProgram | - | The program corresponding to this attrib. | -| `props` | [_AttribProps_](../modules/frontend_renderers_gamerenderer_enginetypes.md#attribprops) | - | An AttribProps object, containing the attrib name and other info. | -| `enable` | _boolean_ | true | Should we call gl.enableVertexAttribArray? (default true) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_webgl_attribmanager.default.md) +| `gl` | `WebGL2RenderingContext` | `undefined` | The WebGL context to generate this attrib on. | +| `program` | `WebGLProgram` | `undefined` | The program corresponding to this attrib. | +| `props` | [`AttribProps`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#attribprops) | `undefined` | An AttribProps object, containing the attrib name and other info. | +| `enable` | `boolean` | `true` | Should we call gl.enableVertexAttribArray? (default true) | ## Properties ### attribArray -• `Private` **attribArray**: [_AttribArray_](frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md) +• `Private` **attribArray**: [`AttribArray`](Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md) An internally managed AttribArray, which is a typed mutable array. @@ -57,7 +55,7 @@ An internally managed AttribArray, which is a typed mutable array. ### buffer -• `Private` **buffer**: WebGLBuffer +• `Private` **buffer**: `WebGLBuffer` The WebGLBuffer associated with this attribute. @@ -65,7 +63,7 @@ The WebGLBuffer associated with this attribute. ### gl -• `Private` **gl**: WebGL2RenderingContext +• `Private` **gl**: `WebGL2RenderingContext` The WebGL rendering context. @@ -73,7 +71,7 @@ The WebGL rendering context. ### loc -• `Private` **loc**: _number_ +• `Private` **loc**: `number` Attrib loc, returned by gl.getAttribLocation(). @@ -81,7 +79,7 @@ Attrib loc, returned by gl.getAttribLocation(). ### props -• `Private` **props**: [_AttribProps_](../modules/frontend_renderers_gamerenderer_enginetypes.md#attribprops) +• `Private` **props**: [`AttribProps`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#attribprops) AttribProps object for this attribute, containing name, dimension, and more. @@ -89,7 +87,7 @@ AttribProps object for this attribute, containing name, dimension, and more. ### bufferData -▸ **bufferData**(`n`: _number_): _void_ +▸ **bufferData**(`n`): `void` Send vertices [0, n - 1] through the buffer - bufferData(1) will send one vertex (only vertex #0) @@ -97,15 +95,17 @@ Send vertices [0, n - 1] through the buffer - bufferData(1) will send one vertex | Name | Type | Description | | :--- | :------- | :------------------------------------------------- | -| `n` | _number_ | The number of vertices to send through the buffer. | +| `n` | `number` | The number of vertices to send through the buffer. | + +#### Returns -**Returns:** _void_ +`void` --- ### setVertex -▸ **setVertex**(`els`: _number_[], `idx`: _number_): _void_ +▸ **setVertex**(`els`, `idx`): `void` Set vertices starting from vertex #idx - writing to vertex #0 will write to the first vertex. @@ -116,7 +116,9 @@ attribute at vertex 0, you will write 3 vertices at once. | Name | Type | Description | | :---- | :--------- | :----------------------------------- | -| `els` | _number_[] | The data to write into the vertices. | -| `idx` | _number_ | The starting vertex # to write to. | +| `els` | `number`[] | The data to write into the vertices. | +| `idx` | `number` | The starting vertex # to write to. | + +#### Returns -**Returns:** _void_ +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md new file mode 100644 index 00000000..27293165 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md @@ -0,0 +1,137 @@ +# Class: GameGLManager + +[Frontend/Renderers/GameRenderer/WebGL/GameGLManager](../modules/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.md).GameGLManager + +## Hierarchy + +- [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + + ↳ **`GameGLManager`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md#constructor) + +### Properties + +- [canvas](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md#canvas) +- [gl](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md#gl) +- [isHighPerf](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md#ishighperf) +- [projectionMatrix](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md#projectionmatrix) +- [renderer](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md#renderer) +- [stencil](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md#stencil) + +### Methods + +- [clear](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md#clear) +- [getTexIdx](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md#gettexidx) +- [setProjectionMatrix](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md#setprojectionmatrix) + +## Constructors + +### constructor + +• **new GameGLManager**(`engine`, `glCanvas`) + +#### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------------------------- | +| `engine` | [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) | +| `glCanvas` | `HTMLCanvasElement` | + +#### Overrides + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#constructor) + +## Properties + +### canvas + +• **canvas**: `HTMLCanvasElement` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[canvas](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#canvas) + +--- + +### gl + +• **gl**: `WebGL2RenderingContext` + +#### Overrides + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[gl](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#gl) + +--- + +### isHighPerf + +• **isHighPerf**: `boolean` + +--- + +### projectionMatrix + +• **projectionMatrix**: `mat4` + +#### Overrides + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[projectionMatrix](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#projectionmatrix) + +--- + +### renderer + +• **renderer**: [`default`](Frontend_Renderers_GameRenderer_Renderer.default.md) + +--- + +### stencil + +• **stencil**: `boolean` + +## Methods + +### clear + +▸ **clear**(): `void` + +#### Returns + +`void` + +#### Overrides + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[clear](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#clear) + +--- + +### getTexIdx + +▸ **getTexIdx**(): `number` + +#### Returns + +`number` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[getTexIdx](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#gettexidx) + +--- + +### setProjectionMatrix + +▸ **setProjectionMatrix**(): `void` + +#### Returns + +`void` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[setProjectionMatrix](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#setprojectionmatrix) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md new file mode 100644 index 00000000..5b2b2145 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md @@ -0,0 +1,195 @@ +# Class: GenericRenderer + +[Frontend/Renderers/GameRenderer/WebGL/GenericRenderer](../modules/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.md).GenericRenderer + +Takes in a gl context, program sources (frag and vert shader), +and data about attribs / uniforms and provides: + +- attrib managers +- uniform setters +- skeleton code for rendering in our engine via `flush()` + +## Type parameters + +| Name | Type | +| :--- | :-------------------------------- | +| `T` | extends `EngineProgramDefinition` | + +## Hierarchy + +- **`GenericRenderer`** + + ↳ [`default`](Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md) + + ↳ [`default`](Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md) + + ↳ [`default`](Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md) + + ↳ [`default`](Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md) + + ↳ [`default`](Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md) + + ↳ [`default`](Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md) + + ↳ [`MineBodyRenderer`](Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md) + + ↳ [`PerlinRenderer`](Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md) + + ↳ [`default`](Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md) + + ↳ [`QuasarBodyRenderer`](Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md) + + ↳ [`QuasarRayRenderer`](Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md) + + ↳ [`default`](Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md) + + ↳ [`default`](Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md) + + ↳ [`RuinsRenderer`](Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md) + + ↳ [`SpacetimeRipRenderer`](Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md) + + ↳ [`SpriteRenderer`](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md) + + ↳ [`default`](Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md) + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#constructor) + +### Properties + +- [attribData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribdata) +- [attribManagers](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#attribmanagers) +- [manager](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#manager) +- [program](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#program) +- [uniformData](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformdata) +- [uniformLocs](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformlocs) +- [uniformSetters](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#uniformsetters) +- [verts](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#verts) + +### Methods + +- [flush](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#flush) +- [setUniforms](Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md#setuniforms) + +## Constructors + +### constructor + +• **new GenericRenderer**<`T`\>(`glManager`, `programData`) + +Create a renderer from a WebGLManager and program data. + +#### Type parameters + +| Name | Type | +| :--- | :-------------------------------- | +| `T` | extends `EngineProgramDefinition` | + +#### Parameters + +| Name | Type | Description | +| :------------ | :----------------------------------------------------------------------------------- | :----------------------------------------------------------- | +| `glManager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | WebGLManager which holds context for rendering this program. | +| `programData` | `T` | ProgramData describing this program. | + +## Properties + +### attribData + +• **attribData**: `AttribData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +--- + +### attribManagers + +• **attribManagers**: `AttribManagers`<`T`\> + +A dictionary of attrib managers, keyed by attrib name. + +--- + +### manager + +• **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +WebGLManager corresponding to this program. + +--- + +### program + +• **program**: `WebGLProgram` + +The program corresponding to this renderer. + +--- + +### uniformData + +• **uniformData**: `UniformData` + +Uniform data for this program. Typically not used after construction. +Kept for use in inherited classes. + +--- + +### uniformLocs + +• **uniformLocs**: `UniformLocs`<`T`\> + +Uniform locs for this program. Typically not referenced directly, +but rather through generated uniformSetters. Kept for use in inherited classes. + +--- + +### uniformSetters + +• **uniformSetters**: `UniformSetters`<`T`\> + +A dictionary of uniform setters, keyed by uniform name. + +--- + +### verts + +• **verts**: `number` + +The number of queued vertices so far. Used for batch rendering. + +## Methods + +### flush + +▸ **flush**(`drawMode?`): `void` + +Draw all buffered vertices to the screen. + +#### Parameters + +| Name | Type | Description | +| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| `drawMode` | [`DrawMode`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) | The drawing mode for the buffered vertices. Default: Triangles. | + +#### Returns + +`void` + +--- + +### setUniforms + +▸ **setUniforms**(): `void` + +Run by flush(). Override this in child classes. Programs with uniformss +should always override this. + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.default.md b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.default.md new file mode 100644 index 00000000..3dcb52eb --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.default.md @@ -0,0 +1,75 @@ +# Class: default + +[Frontend/Renderers/GameRenderer/WebGL/ProgramUtils](../modules/Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.md).default + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.default.md#constructor) + +### Methods + +- [createProgram](Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.default.md#createprogram) +- [createShader](Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.default.md#createshader) +- [programFromSources](Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.default.md#programfromsources) + +## Constructors + +### constructor + +• **new default**() + +## Methods + +### createProgram + +▸ `Static` **createProgram**(`gl`, `vertexShader`, `fragShader`): `null` \| `WebGLProgram` + +#### Parameters + +| Name | Type | +| :------------- | :----------------------- | +| `gl` | `WebGL2RenderingContext` | +| `vertexShader` | `WebGLShader` | +| `fragShader` | `WebGLShader` | + +#### Returns + +`null` \| `WebGLProgram` + +--- + +### createShader + +▸ `Static` **createShader**(`gl`, `type`, `source`): `null` \| `WebGLShader` + +#### Parameters + +| Name | Type | +| :------- | :----------------------- | +| `gl` | `WebGL2RenderingContext` | +| `type` | `number` | +| `source` | `string` | + +#### Returns + +`null` \| `WebGLShader` + +--- + +### programFromSources + +▸ `Static` **programFromSources**(`gl`, `vertexShaderSource`, `fragShaderSource`): `null` \| `WebGLProgram` + +#### Parameters + +| Name | Type | +| :------------------- | :----------------------- | +| `gl` | `WebGL2RenderingContext` | +| `vertexShaderSource` | `string` | +| `fragShaderSource` | `string` | + +#### Returns + +`null` \| `WebGLProgram` diff --git a/docs/classes/Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md new file mode 100644 index 00000000..e00c67e4 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md @@ -0,0 +1,134 @@ +# Class: ShaderMixins + +[Frontend/Renderers/GameRenderer/WebGL/ShaderMixins](../modules/Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.md).ShaderMixins + +these are 'includes' that you can add into shader template strings as in `${include}` + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#constructor) + +### Properties + +- [PI](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#pi) +- [arcTan](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#arctan) +- [blend](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#blend) +- [desaturate](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#desaturate) +- [fade](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#fade) +- [hueShift](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#hueshift) +- [invertBrightness](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#invertbrightness) +- [invertColors](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#invertcolors) +- [mod2pi](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#mod2pi) +- [modFloat](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#modfloat) +- [noiseVec3](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#noisevec3) +- [radAtAngle](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#radatangle) +- [seededRandom](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#seededrandom) +- [seededRandomVec2](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#seededrandomvec2) +- [simplex4](Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md#simplex4) + +## Constructors + +### constructor + +• **new ShaderMixins**() + +## Properties + +### PI + +▪ `Static` **PI**: `string` + +--- + +### arcTan + +▪ `Static` **arcTan**: `string` + +Good atan that returns [0, 2Pi) + +--- + +### blend + +▪ `Static` **blend**: `string` + +1 minus source alpha blend mode + +--- + +### desaturate + +▪ `Static` **desaturate**: `string` + +--- + +### fade + +▪ `Static` **fade**: `string` + +Fade out the last `tail * 100` percent of `value` to 0 - a plateau with a steep dropoff + +--- + +### hueShift + +▪ `Static` **hueShift**: `string` + +--- + +### invertBrightness + +▪ `Static` **invertBrightness**: `string` + +--- + +### invertColors + +▪ `Static` **invertColors**: `string` + +--- + +### mod2pi + +▪ `Static` **mod2pi**: `string` + +--- + +### modFloat + +▪ `Static` **modFloat**: `string` + +--- + +### noiseVec3 + +▪ `Static` **noiseVec3**: `string` + +--- + +### radAtAngle + +▪ `Static` **radAtAngle**: `string` + +--- + +### seededRandom + +▪ `Static` **seededRandom**: `string` + +--- + +### seededRandomVec2 + +▪ `Static` **seededRandomVec2**: `string` + +--- + +### simplex4 + +▪ `Static` **simplex4**: `string` + +4d simplex noise - `snoise(vec4)`, seems to return `[-1, 1]` +https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83 diff --git a/docs/classes/Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md new file mode 100644 index 00000000..1a5cc913 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md @@ -0,0 +1,108 @@ +# Class: WebGLManager + +[Frontend/Renderers/GameRenderer/WebGL/WebGLManager](../modules/Frontend_Renderers_GameRenderer_WebGL_WebGLManager.md).WebGLManager + +## Hierarchy + +- **`WebGLManager`** + + ↳ [`ArtifactRenderer`](Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md) + + ↳ [`GameGLManager`](Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) + + ↳ [`GifRenderer`](Frontend_Renderers_GifRenderer.GifRenderer.md) + + ↳ [`PlanetscapeRenderer`](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md) + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#constructor) + +### Properties + +- [canvas](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#canvas) +- [gl](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#gl) +- [projectionMatrix](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#projectionmatrix) +- [texIdx](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#texidx) + +### Methods + +- [clear](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#clear) +- [getTexIdx](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#gettexidx) +- [setProjectionMatrix](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#setprojectionmatrix) + +## Constructors + +### constructor + +• **new WebGLManager**(`canvas`, `attr?`) + +#### Parameters + +| Name | Type | +| :------- | :----------------------- | +| `canvas` | `HTMLCanvasElement` | +| `attr?` | `WebGLContextAttributes` | + +## Properties + +### canvas + +• **canvas**: `HTMLCanvasElement` + +--- + +### gl + +• **gl**: `WebGL2RenderingContext` + +--- + +### projectionMatrix + +• **projectionMatrix**: `mat4` + +--- + +### texIdx + +• `Private` **texIdx**: `number` = `0` + +## Methods + +### clear + +▸ **clear**(`bits?`, `color?`): `void` + +#### Parameters + +| Name | Type | +| :------- | :----------------------------------------------------------------------------- | +| `bits?` | `number` | +| `color?` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | + +#### Returns + +`void` + +--- + +### getTexIdx + +▸ **getTexIdx**(): `number` + +#### Returns + +`number` + +--- + +### setProjectionMatrix + +▸ **setProjectionMatrix**(): `void` + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_GifRenderer.GifRenderer.md b/docs/classes/Frontend_Renderers_GifRenderer.GifRenderer.md new file mode 100644 index 00000000..461f9484 --- /dev/null +++ b/docs/classes/Frontend_Renderers_GifRenderer.GifRenderer.md @@ -0,0 +1,343 @@ +# Class: GifRenderer + +[Frontend/Renderers/GifRenderer](../modules/Frontend_Renderers_GifRenderer.md).GifRenderer + +## Hierarchy + +- [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + + ↳ **`GifRenderer`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_GifRenderer.GifRenderer.md#constructor) + +### Properties + +- [artifactDim](Frontend_Renderers_GifRenderer.GifRenderer.md#artifactdim) +- [canvas](Frontend_Renderers_GifRenderer.GifRenderer.md#canvas) +- [canvasDim](Frontend_Renderers_GifRenderer.GifRenderer.md#canvasdim) +- [gl](Frontend_Renderers_GifRenderer.GifRenderer.md#gl) +- [margin](Frontend_Renderers_GifRenderer.GifRenderer.md#margin) +- [projectionMatrix](Frontend_Renderers_GifRenderer.GifRenderer.md#projectionmatrix) +- [resolution](Frontend_Renderers_GifRenderer.GifRenderer.md#resolution) +- [spriteRenderer](Frontend_Renderers_GifRenderer.GifRenderer.md#spriterenderer) +- [thumb](Frontend_Renderers_GifRenderer.GifRenderer.md#thumb) + +### Methods + +- [addAncient](Frontend_Renderers_GifRenderer.GifRenderer.md#addancient) +- [addBiomes](Frontend_Renderers_GifRenderer.GifRenderer.md#addbiomes) +- [addSprite](Frontend_Renderers_GifRenderer.GifRenderer.md#addsprite) +- [addVideo](Frontend_Renderers_GifRenderer.GifRenderer.md#addvideo) +- [clear](Frontend_Renderers_GifRenderer.GifRenderer.md#clear) +- [drawSprite](Frontend_Renderers_GifRenderer.GifRenderer.md#drawsprite) +- [getAll](Frontend_Renderers_GifRenderer.GifRenderer.md#getall) +- [getAllSprites](Frontend_Renderers_GifRenderer.GifRenderer.md#getallsprites) +- [getAllVideos](Frontend_Renderers_GifRenderer.GifRenderer.md#getallvideos) +- [getBase64](Frontend_Renderers_GifRenderer.GifRenderer.md#getbase64) +- [getFileName](Frontend_Renderers_GifRenderer.GifRenderer.md#getfilename) +- [getTexIdx](Frontend_Renderers_GifRenderer.GifRenderer.md#gettexidx) +- [setDim](Frontend_Renderers_GifRenderer.GifRenderer.md#setdim) +- [setProjectionMatrix](Frontend_Renderers_GifRenderer.GifRenderer.md#setprojectionmatrix) + +## Constructors + +### constructor + +• **new GifRenderer**(`canvas`, `dim`, `isThumb`) + +#### Parameters + +| Name | Type | +| :-------- | :------------------ | +| `canvas` | `HTMLCanvasElement` | +| `dim` | `number` | +| `isThumb` | `boolean` | + +#### Overrides + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#constructor) + +## Properties + +### artifactDim + +• `Private` **artifactDim**: `number` + +--- + +### canvas + +• **canvas**: `HTMLCanvasElement` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[canvas](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#canvas) + +--- + +### canvasDim + +• `Private` **canvasDim**: `number` + +--- + +### gl + +• **gl**: `WebGL2RenderingContext` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[gl](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#gl) + +--- + +### margin + +• `Private` **margin**: `number` + +--- + +### projectionMatrix + +• **projectionMatrix**: `mat4` + +#### Overrides + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[projectionMatrix](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#projectionmatrix) + +--- + +### resolution + +• `Private` **resolution**: `number` + +--- + +### spriteRenderer + +• `Private` **spriteRenderer**: [`SpriteRenderer`](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md) + +--- + +### thumb + +• `Private` **thumb**: `boolean` + +## Methods + +### addAncient + +▸ `Private` **addAncient**(`videoMode`, `dir`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :---------- | :-------- | +| `videoMode` | `boolean` | +| `dir` | `JSZip` | + +#### Returns + +`Promise`<`void`\> + +--- + +### addBiomes + +▸ `Private` **addBiomes**(`videoMode`, `dir`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :---------- | :-------- | +| `videoMode` | `boolean` | +| `dir` | `JSZip` | + +#### Returns + +`Promise`<`void`\> + +--- + +### addSprite + +▸ `Private` **addSprite**(`dir`, `type`, `biome`, `rarity`, `ancient?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :-------- | :--------------- | :------------ | +| `dir` | `JSZip` | `undefined` | +| `type` | `ArtifactType` | `undefined` | +| `biome` | `Biome` | `undefined` | +| `rarity` | `ArtifactRarity` | `undefined` | +| `ancient` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### addVideo + +▸ `Private` **addVideo**(`dir`, `type`, `biome`, `rarity`, `ancient?`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | Default value | +| :-------- | :--------------- | :------------ | +| `dir` | `JSZip` | `undefined` | +| `type` | `ArtifactType` | `undefined` | +| `biome` | `Biome` | `undefined` | +| `rarity` | `ArtifactRarity` | `undefined` | +| `ancient` | `boolean` | `false` | + +#### Returns + +`Promise`<`void`\> + +--- + +### clear + +▸ **clear**(): `void` + +#### Returns + +`void` + +#### Overrides + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[clear](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#clear) + +--- + +### drawSprite + +▸ `Private` **drawSprite**(`artifact`, `atFrame?`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :---------------------- | +| `artifact` | `Artifact` | +| `atFrame` | `undefined` \| `number` | + +#### Returns + +`void` + +--- + +### getAll + +▸ `Private` **getAll**(`videoMode?`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | Default value | +| :---------- | :-------- | :------------ | +| `videoMode` | `boolean` | `false` | + +#### Returns + +`Promise`<`void`\> + +--- + +### getAllSprites + +▸ **getAllSprites**(): `void` + +#### Returns + +`void` + +--- + +### getAllVideos + +▸ **getAllVideos**(): `void` + +#### Returns + +`void` + +--- + +### getBase64 + +▸ `Private` **getBase64**(): `string` + +#### Returns + +`string` + +--- + +### getFileName + +▸ `Private` **getFileName**(`video`, `type`, `biome`, `rarity`, `ancient`): `string` + +#### Parameters + +| Name | Type | +| :-------- | :--------------- | +| `video` | `boolean` | +| `type` | `ArtifactType` | +| `biome` | `Biome` | +| `rarity` | `ArtifactRarity` | +| `ancient` | `boolean` | + +#### Returns + +`string` + +--- + +### getTexIdx + +▸ **getTexIdx**(): `number` + +#### Returns + +`number` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[getTexIdx](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#gettexidx) + +--- + +### setDim + +▸ `Private` **setDim**(`dim`): `void` + +#### Parameters + +| Name | Type | +| :---- | :------- | +| `dim` | `number` | + +#### Returns + +`void` + +--- + +### setProjectionMatrix + +▸ **setProjectionMatrix**(): `void` + +#### Returns + +`void` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[setProjectionMatrix](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#setprojectionmatrix) diff --git a/docs/classes/Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md b/docs/classes/Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md new file mode 100644 index 00000000..0dff6c13 --- /dev/null +++ b/docs/classes/Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md @@ -0,0 +1,80 @@ +# Class: PathRenderer + +[Frontend/Renderers/PlanetscapeRenderer/PathRenderer](../modules/Frontend_Renderers_PlanetscapeRenderer_PathRenderer.md).PathRenderer + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md#constructor) + +### Properties + +- [colorA](Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md#colora) +- [manager](Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md#manager) +- [matrixULoc](Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md#matrixuloc) +- [posA](Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md#posa) +- [program](Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md#program) + +### Methods + +- [drawPath](Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md#drawpath) + +## Constructors + +### constructor + +• **new PathRenderer**(`manager`) + +#### Parameters + +| Name | Type | +| :-------- | :----------------------------------------------------------------------------------- | +| `manager` | [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) | + +## Properties + +### colorA + +• `Private` **colorA**: [`default`](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md) + +--- + +### manager + +• `Private` **manager**: [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + +--- + +### matrixULoc + +• `Private` **matrixULoc**: `null` \| `WebGLUniformLocation` + +--- + +### posA + +• `Private` **posA**: [`default`](Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md) + +--- + +### program + +• `Private` **program**: `WebGLProgram` + +## Methods + +### drawPath + +▸ **drawPath**(`arr`, `color`): `void` + +#### Parameters + +| Name | Type | +| :------ | :--------------------------------------------------------------------------- | +| `arr` | [`PixelCoords`](../modules/Backend_Procedural_ProcgenUtils.md#pixelcoords)[] | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | + +#### Returns + +`void` diff --git a/docs/classes/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md b/docs/classes/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md new file mode 100644 index 00000000..0753fe73 --- /dev/null +++ b/docs/classes/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md @@ -0,0 +1,323 @@ +# Class: PlanetscapeRenderer + +[Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer](../modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.md).PlanetscapeRenderer + +## Hierarchy + +- [`WebGLManager`](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) + + ↳ **`PlanetscapeRenderer`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#constructor) + +### Properties + +- [TICK_SIZE](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#tick_size) +- [artifacts](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#artifacts) +- [canvas](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#canvas) +- [frameRequestId](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#framerequestid) +- [gl](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#gl) +- [isPaused](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#ispaused) +- [moonCanvas](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#mooncanvas) +- [moonCtx](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#moonctx) +- [pathRenderer](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#pathrenderer) +- [planet](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#planet) +- [projectionMatrix](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#projectionmatrix) +- [spriteRenderer](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#spriterenderer) +- [uiManager](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#uimanager) + +### Methods + +- [clear](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#clear) +- [destroy](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#destroy) +- [draw](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#draw) +- [drawHill](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#drawhill) +- [drawMoon](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#drawmoon) +- [drawScape](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#drawscape) +- [flushArtifactOnce](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#flushartifactonce) +- [getTexIdx](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#gettexidx) +- [loop](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#loop) +- [queueArtifacts](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#queueartifacts) +- [setPaused](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#setpaused) +- [setPlanet](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#setplanet) +- [setProjectionMatrix](Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md#setprojectionmatrix) + +## Constructors + +### constructor + +• **new PlanetscapeRenderer**(`canvas`, `moonCanvas`, `uiManager`) + +#### Parameters + +| Name | Type | +| :----------- | :------------------------------------------------------ | +| `canvas` | `HTMLCanvasElement` | +| `moonCanvas` | `HTMLCanvasElement` | +| `uiManager` | [`default`](Backend_GameLogic_GameUIManager.default.md) | + +#### Overrides + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[constructor](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#constructor) + +## Properties + +### TICK_SIZE + +• `Private` **TICK_SIZE**: `number` = `3` + +--- + +### artifacts + +• `Private` **artifacts**: `Artifact`[] + +--- + +### canvas + +• **canvas**: `HTMLCanvasElement` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[canvas](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#canvas) + +--- + +### frameRequestId + +• `Private` **frameRequestId**: `number` + +--- + +### gl + +• **gl**: `WebGL2RenderingContext` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[gl](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#gl) + +--- + +### isPaused + +• `Private` **isPaused**: `boolean` + +--- + +### moonCanvas + +• `Private` **moonCanvas**: `HTMLCanvasElement` + +--- + +### moonCtx + +• `Private` **moonCtx**: `CanvasRenderingContext2D` + +--- + +### pathRenderer + +• `Private` **pathRenderer**: [`PathRenderer`](Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md) + +--- + +### planet + +• **planet**: `undefined` \| `Planet` + +--- + +### projectionMatrix + +• **projectionMatrix**: `mat4` + +#### Overrides + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[projectionMatrix](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#projectionmatrix) + +--- + +### spriteRenderer + +• `Private` **spriteRenderer**: [`SpriteRenderer`](Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md) + +--- + +### uiManager + +• `Private` **uiManager**: [`default`](Backend_GameLogic_GameUIManager.default.md) + +## Methods + +### clear + +▸ **clear**(`bits?`, `color?`): `void` + +#### Parameters + +| Name | Type | +| :------- | :----------------------------------------------------------------------------- | +| `bits?` | `number` | +| `color?` | [`RGBAVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | + +#### Returns + +`void` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[clear](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#clear) + +--- + +### destroy + +▸ **destroy**(): `void` + +#### Returns + +`void` + +--- + +### draw + +▸ `Private` **draw**(): `void` + +#### Returns + +`void` + +--- + +### drawHill + +▸ `Private` **drawHill**(`fn`, `color`): `void` + +#### Parameters + +| Name | Type | +| :------ | :--------------------------------------------------------------------------- | +| `fn` | (`x`: `number`) => `number` | +| `color` | [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | + +#### Returns + +`void` + +--- + +### drawMoon + +▸ `Private` **drawMoon**(): `void` + +#### Returns + +`void` + +--- + +### drawScape + +▸ `Private` **drawScape**(): `void` + +#### Returns + +`void` + +--- + +### flushArtifactOnce + +▸ `Private` **flushArtifactOnce**(): `void` + +#### Returns + +`void` + +--- + +### getTexIdx + +▸ **getTexIdx**(): `number` + +#### Returns + +`number` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[getTexIdx](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#gettexidx) + +--- + +### loop + +▸ `Private` **loop**(): `void` + +#### Returns + +`void` + +--- + +### queueArtifacts + +▸ `Private` **queueArtifacts**(): `void` + +#### Returns + +`void` + +--- + +### setPaused + +▸ **setPaused**(`isPaused?`): `void` + +#### Parameters + +| Name | Type | +| :---------- | :-------- | +| `isPaused?` | `boolean` | + +#### Returns + +`void` + +--- + +### setPlanet + +▸ **setPlanet**(`planet`): `void` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`void` + +--- + +### setProjectionMatrix + +▸ **setProjectionMatrix**(): `void` + +#### Returns + +`void` + +#### Inherited from + +[WebGLManager](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md).[setProjectionMatrix](Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md#setprojectionmatrix) diff --git a/docs/classes/Frontend_Utils_UIEmitter.default.md b/docs/classes/Frontend_Utils_UIEmitter.default.md new file mode 100644 index 00000000..6e45498d --- /dev/null +++ b/docs/classes/Frontend_Utils_UIEmitter.default.md @@ -0,0 +1,60 @@ +# Class: default + +[Frontend/Utils/UIEmitter](../modules/Frontend_Utils_UIEmitter.md).default + +## Hierarchy + +- `EventEmitter` + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Utils_UIEmitter.default.md#constructor) + +### Properties + +- [instance](Frontend_Utils_UIEmitter.default.md#instance) + +### Methods + +- [getInstance](Frontend_Utils_UIEmitter.default.md#getinstance) +- [initialize](Frontend_Utils_UIEmitter.default.md#initialize) + +## Constructors + +### constructor + +• `Private` **new default**() + +#### Overrides + +EventEmitter.constructor + +## Properties + +### instance + +▪ `Static` **instance**: [`default`](Frontend_Utils_UIEmitter.default.md) + +## Methods + +### getInstance + +▸ `Static` **getInstance**(): [`default`](Frontend_Utils_UIEmitter.default.md) + +#### Returns + +[`default`](Frontend_Utils_UIEmitter.default.md) + +--- + +### initialize + +▸ `Static` **initialize**(): [`default`](Frontend_Utils_UIEmitter.default.md) + +#### Returns + +[`default`](Frontend_Utils_UIEmitter.default.md) diff --git a/docs/classes/Frontend_Views_DFErrorBoundary.DFErrorBoundary.md b/docs/classes/Frontend_Views_DFErrorBoundary.DFErrorBoundary.md new file mode 100644 index 00000000..90d00949 --- /dev/null +++ b/docs/classes/Frontend_Views_DFErrorBoundary.DFErrorBoundary.md @@ -0,0 +1,92 @@ +# Class: DFErrorBoundary + +[Frontend/Views/DFErrorBoundary](../modules/Frontend_Views_DFErrorBoundary.md).DFErrorBoundary + +## Hierarchy + +- `Component`<`unknown`, `Object`\> + + ↳ **`DFErrorBoundary`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Views_DFErrorBoundary.DFErrorBoundary.md#constructor) + +### Methods + +- [componentDidCatch](Frontend_Views_DFErrorBoundary.DFErrorBoundary.md#componentdidcatch) +- [render](Frontend_Views_DFErrorBoundary.DFErrorBoundary.md#render) +- [getDerivedStateFromError](Frontend_Views_DFErrorBoundary.DFErrorBoundary.md#getderivedstatefromerror) + +## Constructors + +### constructor + +• **new DFErrorBoundary**(`props`) + +#### Parameters + +| Name | Type | +| :------ | :-------- | +| `props` | `unknown` | + +#### Overrides + +React.Component<unknown, { hasError: boolean }\>.constructor + +## Methods + +### componentDidCatch + +▸ **componentDidCatch**(`error`, `_errorInfo`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :---------- | +| `error` | `Error` | +| `_errorInfo` | `ErrorInfo` | + +#### Returns + +`void` + +#### Overrides + +React.Component.componentDidCatch + +--- + +### render + +▸ **render**(): `ReactNode` + +#### Returns + +`ReactNode` + +#### Overrides + +React.Component.render + +--- + +### getDerivedStateFromError + +▸ `Static` **getDerivedStateFromError**(`_error`): `Object` + +#### Parameters + +| Name | Type | +| :------- | :------ | +| `_error` | `Error` | + +#### Returns + +`Object` + +| Name | Type | +| :--------- | :-------- | +| `hasError` | `boolean` | diff --git a/docs/classes/Frontend_Views_GenericErrorBoundary.GenericErrorBoundary.md b/docs/classes/Frontend_Views_GenericErrorBoundary.GenericErrorBoundary.md new file mode 100644 index 00000000..892ca0b1 --- /dev/null +++ b/docs/classes/Frontend_Views_GenericErrorBoundary.GenericErrorBoundary.md @@ -0,0 +1,95 @@ +# Class: GenericErrorBoundary + +[Frontend/Views/GenericErrorBoundary](../modules/Frontend_Views_GenericErrorBoundary.md).GenericErrorBoundary + +## Hierarchy + +- `Component`<`GenericErrorBoundaryProps`, `Object`\> + + ↳ **`GenericErrorBoundary`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Views_GenericErrorBoundary.GenericErrorBoundary.md#constructor) + +### Methods + +- [componentDidCatch](Frontend_Views_GenericErrorBoundary.GenericErrorBoundary.md#componentdidcatch) +- [render](Frontend_Views_GenericErrorBoundary.GenericErrorBoundary.md#render) +- [getDerivedStateFromError](Frontend_Views_GenericErrorBoundary.GenericErrorBoundary.md#getderivedstatefromerror) + +## Constructors + +### constructor + +• **new GenericErrorBoundary**(`props`) + +#### Parameters + +| Name | Type | +| :------ | :-------------------------- | +| `props` | `GenericErrorBoundaryProps` | + +#### Overrides + +React.Component< +GenericErrorBoundaryProps, +{ hasError: boolean } +\>.constructor + +## Methods + +### componentDidCatch + +▸ **componentDidCatch**(`error`, `_errorInfo`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :---------- | +| `error` | `Error` | +| `_errorInfo` | `ErrorInfo` | + +#### Returns + +`void` + +#### Overrides + +React.Component.componentDidCatch + +--- + +### render + +▸ **render**(): `ReactNode` + +#### Returns + +`ReactNode` + +#### Overrides + +React.Component.render + +--- + +### getDerivedStateFromError + +▸ `Static` **getDerivedStateFromError**(`_error`): `Object` + +#### Parameters + +| Name | Type | +| :------- | :------ | +| `_error` | `Error` | + +#### Returns + +`Object` + +| Name | Type | +| :--------- | :-------- | +| `hasError` | `boolean` | diff --git a/docs/classes/Frontend_Views_OwnedPluginView.OwnedPluginView.md b/docs/classes/Frontend_Views_OwnedPluginView.OwnedPluginView.md new file mode 100644 index 00000000..7a925f00 --- /dev/null +++ b/docs/classes/Frontend_Views_OwnedPluginView.OwnedPluginView.md @@ -0,0 +1,177 @@ +# Class: OwnedPluginView + +[Frontend/Views/OwnedPluginView](../modules/Frontend_Views_OwnedPluginView.md).OwnedPluginView + +One row in {@link PluginLibraryView}. Represents a single plugin. Allows +the user to edit, delete, or open the plugin. This class is responsible for +evaluating a plugin's source code (as safely as we can), and calling its +appropriate lifecycle methods. Loads and evaluates the plugin on mount, +and destroys and unloads the plugin on dismount. I'm not sure I like how tightly +coupled rendering is to evaluating here, so I'll probably move the evaluation +code into {@link PluginHost} at some point. + +## Hierarchy + +- `Component`<`Props`, `State`\> + + ↳ **`OwnedPluginView`** + +## Table of contents + +### Constructors + +- [constructor](Frontend_Views_OwnedPluginView.OwnedPluginView.md#constructor) + +### Properties + +- [closeEditor](Frontend_Views_OwnedPluginView.OwnedPluginView.md#closeeditor) +- [renderedPluginRef](Frontend_Views_OwnedPluginView.OwnedPluginView.md#renderedpluginref) +- [state](Frontend_Views_OwnedPluginView.OwnedPluginView.md#state) + +### Methods + +- [deletePluginClicked](Frontend_Views_OwnedPluginView.OwnedPluginView.md#deletepluginclicked) +- [editClicked](Frontend_Views_OwnedPluginView.OwnedPluginView.md#editclicked) +- [render](Frontend_Views_OwnedPluginView.OwnedPluginView.md#render) +- [runClicked](Frontend_Views_OwnedPluginView.OwnedPluginView.md#runclicked) +- [saveRef](Frontend_Views_OwnedPluginView.OwnedPluginView.md#saveref) +- [setModalIsOpen](Frontend_Views_OwnedPluginView.OwnedPluginView.md#setmodalisopen) + +## Constructors + +### constructor + +• **new OwnedPluginView**(`props`) + +#### Parameters + +| Name | Type | +| :------ | :------------------------------ | +| `props` | `Props` \| `Readonly`<`Props`\> | + +#### Inherited from + +React.Component.constructor + +• **new OwnedPluginView**(`props`, `context`) + +**`deprecated`** + +**`see`** https://reactjs.org/docs/legacy-context.html + +#### Parameters + +| Name | Type | +| :-------- | :------ | +| `props` | `Props` | +| `context` | `any` | + +#### Inherited from + +React.Component.constructor + +## Properties + +### closeEditor + +• `Private` **closeEditor**: `undefined` \| () => `void` + +--- + +### renderedPluginRef + +• `Private` **renderedPluginRef**: `null` \| `HTMLDivElement` + +--- + +### state + +• **state**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :---------- | +| `error` | `undefined` | +| `modalOpen` | `boolean` | +| `rendered` | `boolean` | + +#### Overrides + +React.Component.state + +## Methods + +### deletePluginClicked + +▸ `Private` **deletePluginClicked**(): `void` + +#### Returns + +`void` + +--- + +### editClicked + +▸ `Private` **editClicked**(): `void` + +#### Returns + +`void` + +--- + +### render + +▸ **render**(): `Element` + +#### Returns + +`Element` + +#### Overrides + +React.Component.render + +--- + +### runClicked + +▸ `Private` **runClicked**(): `void` + +#### Returns + +`void` + +--- + +### saveRef + +▸ `Private` **saveRef**(`el`): `void` + +#### Parameters + +| Name | Type | +| :--- | :------------------------- | +| `el` | `null` \| `HTMLDivElement` | + +#### Returns + +`void` + +--- + +### setModalIsOpen + +▸ `Private` **setModalIsOpen**(`isOpen`): `void` + +#### Parameters + +| Name | Type | +| :------- | :-------- | +| `isOpen` | `boolean` | + +#### Returns + +`void` diff --git a/docs/classes/_types_global_GlobalTypes.Chunk.md b/docs/classes/_types_global_GlobalTypes.Chunk.md new file mode 100644 index 00000000..46d1c643 --- /dev/null +++ b/docs/classes/_types_global_GlobalTypes.Chunk.md @@ -0,0 +1,41 @@ +# Class: Chunk + +[\_types/global/GlobalTypes](../modules/_types_global_GlobalTypes.md).Chunk + +Represents a fully mined aligned square. + +## Table of contents + +### Constructors + +- [constructor](_types_global_GlobalTypes.Chunk.md#constructor) + +### Properties + +- [chunkFootprint](_types_global_GlobalTypes.Chunk.md#chunkfootprint) +- [perlin](_types_global_GlobalTypes.Chunk.md#perlin) +- [planetLocations](_types_global_GlobalTypes.Chunk.md#planetlocations) + +## Constructors + +### constructor + +• **new Chunk**() + +## Properties + +### chunkFootprint + +• **chunkFootprint**: [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) + +--- + +### perlin + +• **perlin**: `number` + +--- + +### planetLocations + +• **planetLocations**: `WorldLocation`[] diff --git a/docs/classes/_types_global_globaltypes.chunk.md b/docs/classes/_types_global_globaltypes.chunk.md deleted file mode 100644 index 4dd5a6cd..00000000 --- a/docs/classes/_types_global_globaltypes.chunk.md +++ /dev/null @@ -1,43 +0,0 @@ -# Class: Chunk - -[\_types/global/GlobalTypes](../modules/_types_global_globaltypes.md).Chunk - -Represents a fully mined aligned square. - -## Table of contents - -### Constructors - -- [constructor](_types_global_globaltypes.chunk.md#constructor) - -### Properties - -- [chunkFootprint](_types_global_globaltypes.chunk.md#chunkfootprint) -- [perlin](_types_global_globaltypes.chunk.md#perlin) -- [planetLocations](_types_global_globaltypes.chunk.md#planetlocations) - -## Constructors - -### constructor - -\+ **new Chunk**(): [_Chunk_](_types_global_globaltypes.chunk.md) - -**Returns:** [_Chunk_](_types_global_globaltypes.chunk.md) - -## Properties - -### chunkFootprint - -• **chunkFootprint**: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - ---- - -### perlin - -• **perlin**: _number_ - ---- - -### planetLocations - -• **planetLocations**: WorldLocation[] diff --git a/docs/classes/_types_worker_loader_WorkerTypes.default.md b/docs/classes/_types_worker_loader_WorkerTypes.default.md new file mode 100644 index 00000000..c29707b9 --- /dev/null +++ b/docs/classes/_types_worker_loader_WorkerTypes.default.md @@ -0,0 +1,25 @@ +# Class: default + +[\_types/worker-loader/WorkerTypes](../modules/_types_worker_loader_WorkerTypes.md).default + +## Hierarchy + +- `Worker` + + ↳ **`default`** + +## Table of contents + +### Constructors + +- [constructor](_types_worker_loader_WorkerTypes.default.md#constructor) + +## Constructors + +### constructor + +• **new default**() + +#### Overrides + +Worker.constructor diff --git a/docs/classes/_types_worker_loader_workertypes.default.md b/docs/classes/_types_worker_loader_workertypes.default.md deleted file mode 100644 index f63956aa..00000000 --- a/docs/classes/_types_worker_loader_workertypes.default.md +++ /dev/null @@ -1,25 +0,0 @@ -# Class: default - -[\_types/worker-loader/WorkerTypes](../modules/_types_worker_loader_workertypes.md).default - -## Hierarchy - -- _Worker_ - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](_types_worker_loader_workertypes.default.md#constructor) - -## Constructors - -### constructor - -\+ **new default**(): [_default_](_types_worker_loader_workertypes.default.md) - -**Returns:** [_default_](_types_worker_loader_workertypes.default.md) - -Overrides: Worker.constructor diff --git a/docs/classes/backend_gamelogic_contractcaller.contractcaller.md b/docs/classes/backend_gamelogic_contractcaller.contractcaller.md deleted file mode 100644 index a76e7abc..00000000 --- a/docs/classes/backend_gamelogic_contractcaller.contractcaller.md +++ /dev/null @@ -1,81 +0,0 @@ -# Class: ContractCaller - -[Backend/GameLogic/ContractCaller](../modules/backend_gamelogic_contractcaller.md).ContractCaller - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_contractcaller.contractcaller.md#constructor) - -### Properties - -- [callQueue](backend_gamelogic_contractcaller.contractcaller.md#callqueue) -- [diagnosticsUpdater](backend_gamelogic_contractcaller.contractcaller.md#diagnosticsupdater) -- [MAX_RETRIES](backend_gamelogic_contractcaller.contractcaller.md#max_retries) - -### Methods - -- [makeCall](backend_gamelogic_contractcaller.contractcaller.md#makecall) -- [setDiagnosticUpdater](backend_gamelogic_contractcaller.contractcaller.md#setdiagnosticupdater) - -## Constructors - -### constructor - -\+ **new ContractCaller**(): [_ContractCaller_](backend_gamelogic_contractcaller.contractcaller.md) - -**Returns:** [_ContractCaller_](backend_gamelogic_contractcaller.contractcaller.md) - -## Properties - -### callQueue - -• `Private` `Readonly` **callQueue**: [_ThrottledConcurrentQueue_](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md) - ---- - -### diagnosticsUpdater - -• `Private` `Optional` **diagnosticsUpdater**: [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) - ---- - -### MAX_RETRIES - -▪ `Static` `Private` `Readonly` **MAX_RETRIES**: `12`= 12 - -## Methods - -### makeCall - -▸ **makeCall**(`contractViewFunction`: _ContractFunction_, `args?`: _unknown_[]): _Promise_ - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Default value | -| :--------------------- | :--------------------- | :------------ | -| `contractViewFunction` | _ContractFunction_ | - | -| `args` | _unknown_[] | [] | - -**Returns:** _Promise_ - ---- - -### setDiagnosticUpdater - -▸ **setDiagnosticUpdater**(`diagnosticUpdater?`: [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md)): _void_ - -#### Parameters - -| Name | Type | -| :------------------- | :--------------------------------------------------------------------------------------------- | -| `diagnosticUpdater?` | [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) | - -**Returns:** _void_ diff --git a/docs/classes/backend_gamelogic_contractsapi.default.md b/docs/classes/backend_gamelogic_contractsapi.default.md deleted file mode 100644 index 33adfe6a..00000000 --- a/docs/classes/backend_gamelogic_contractsapi.default.md +++ /dev/null @@ -1,722 +0,0 @@ -# Class: default - -[Backend/GameLogic/ContractsAPI](../modules/backend_gamelogic_contractsapi.md).default - -Roughly contains methods that map 1:1 with functions that live -in the contract. - -## Hierarchy - -- _EventEmitter_ - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_contractsapi.default.md#constructor) - -### Properties - -- [contractCaller](backend_gamelogic_contractsapi.default.md#contractcaller) -- [coreContract](backend_gamelogic_contractsapi.default.md#corecontract) -- [diagnosticsUpdater](backend_gamelogic_contractsapi.default.md#diagnosticsupdater) -- [ethConnection](backend_gamelogic_contractsapi.default.md#ethconnection) -- [gettersContract](backend_gamelogic_contractsapi.default.md#getterscontract) -- [gptCreditContract](backend_gamelogic_contractsapi.default.md#gptcreditcontract) -- [txRequestExecutor](backend_gamelogic_contractsapi.default.md#txrequestexecutor) - -### Methods - -- [activateArtifact](backend_gamelogic_contractsapi.default.md#activateartifact) -- [bulkGetArtifacts](backend_gamelogic_contractsapi.default.md#bulkgetartifacts) -- [bulkGetArtifactsOnPlanets](backend_gamelogic_contractsapi.default.md#bulkgetartifactsonplanets) -- [bulkGetPlanets](backend_gamelogic_contractsapi.default.md#bulkgetplanets) -- [buyGPTCredits](backend_gamelogic_contractsapi.default.md#buygptcredits) -- [buyHat](backend_gamelogic_contractsapi.default.md#buyhat) -- [deactivateArtifact](backend_gamelogic_contractsapi.default.md#deactivateartifact) -- [depositArtifact](backend_gamelogic_contractsapi.default.md#depositartifact) -- [destroy](backend_gamelogic_contractsapi.default.md#destroy) -- [findArtifact](backend_gamelogic_contractsapi.default.md#findartifact) -- [getAccount](backend_gamelogic_contractsapi.default.md#getaccount) -- [getAllArrivals](backend_gamelogic_contractsapi.default.md#getallarrivals) -- [getArrival](backend_gamelogic_contractsapi.default.md#getarrival) -- [getArrivalsForPlanet](backend_gamelogic_contractsapi.default.md#getarrivalsforplanet) -- [getArtifactById](backend_gamelogic_contractsapi.default.md#getartifactbyid) -- [getBalance](backend_gamelogic_contractsapi.default.md#getbalance) -- [getConstants](backend_gamelogic_contractsapi.default.md#getconstants) -- [getContractAddress](backend_gamelogic_contractsapi.default.md#getcontractaddress) -- [getContractBalance](backend_gamelogic_contractsapi.default.md#getcontractbalance) -- [getGPTCreditBalance](backend_gamelogic_contractsapi.default.md#getgptcreditbalance) -- [getGPTCreditPriceEther](backend_gamelogic_contractsapi.default.md#getgptcreditpriceether) -- [getPlanetById](backend_gamelogic_contractsapi.default.md#getplanetbyid) -- [getPlayerArtifacts](backend_gamelogic_contractsapi.default.md#getplayerartifacts) -- [getPlayerById](backend_gamelogic_contractsapi.default.md#getplayerbyid) -- [getPlayers](backend_gamelogic_contractsapi.default.md#getplayers) -- [getRevealedCoordsByIdIfExists](backend_gamelogic_contractsapi.default.md#getrevealedcoordsbyidifexists) -- [getRevealedPlanetsCoords](backend_gamelogic_contractsapi.default.md#getrevealedplanetscoords) -- [getTokenMintEndTimestamp](backend_gamelogic_contractsapi.default.md#gettokenmintendtimestamp) -- [getTouchedPlanetIds](backend_gamelogic_contractsapi.default.md#gettouchedplanetids) -- [getWorldRadius](backend_gamelogic_contractsapi.default.md#getworldradius) -- [initializePlayer](backend_gamelogic_contractsapi.default.md#initializeplayer) -- [makeCall](backend_gamelogic_contractsapi.default.md#makecall) -- [move](backend_gamelogic_contractsapi.default.md#move) -- [prospectPlanet](backend_gamelogic_contractsapi.default.md#prospectplanet) -- [removeEventListeners](backend_gamelogic_contractsapi.default.md#removeeventlisteners) -- [reveal](backend_gamelogic_contractsapi.default.md#reveal) -- [setDiagnosticUpdater](backend_gamelogic_contractsapi.default.md#setdiagnosticupdater) -- [setupEventListeners](backend_gamelogic_contractsapi.default.md#setupeventlisteners) -- [transferOwnership](backend_gamelogic_contractsapi.default.md#transferownership) -- [upgradePlanet](backend_gamelogic_contractsapi.default.md#upgradeplanet) -- [waitFor](backend_gamelogic_contractsapi.default.md#waitfor) -- [withdrawArtifact](backend_gamelogic_contractsapi.default.md#withdrawartifact) -- [withdrawSilver](backend_gamelogic_contractsapi.default.md#withdrawsilver) -- [create](backend_gamelogic_contractsapi.default.md#create) - -## Constructors - -### constructor - -\+ `Private` **new default**(`ethConnection`: [_default_](backend_network_ethconnection.default.md), `coreContract`: _DarkForestCore_, `gettersContract`: _DarkForestGetters_, `gptCreditContract`: _DarkForestGPTCredit_, `nonce`: _number_): [_default_](backend_gamelogic_contractsapi.default.md) - -#### Parameters - -| Name | Type | -| :------------------ | :---------------------------------------------------- | -| `ethConnection` | [_default_](backend_network_ethconnection.default.md) | -| `coreContract` | _DarkForestCore_ | -| `gettersContract` | _DarkForestGetters_ | -| `gptCreditContract` | _DarkForestGPTCredit_ | -| `nonce` | _number_ | - -**Returns:** [_default_](backend_gamelogic_contractsapi.default.md) - -Overrides: EventEmitter.constructor - -## Properties - -### contractCaller - -• `Private` `Readonly` **contractCaller**: [_ContractCaller_](backend_gamelogic_contractcaller.contractcaller.md) - ---- - -### coreContract - -• `Private` **coreContract**: _DarkForestCore_ - ---- - -### diagnosticsUpdater - -• `Private` `Optional` **diagnosticsUpdater**: [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) - ---- - -### ethConnection - -• `Private` **ethConnection**: [_default_](backend_network_ethconnection.default.md) - ---- - -### gettersContract - -• `Private` **gettersContract**: _DarkForestGetters_ - ---- - -### gptCreditContract - -• `Private` **gptCreditContract**: _DarkForestGPTCredit_ - ---- - -### txRequestExecutor - -• `Private` `Readonly` **txRequestExecutor**: _undefined_ \| [_TxExecutor_](backend_network_txexecutor.txexecutor.md) - -## Methods - -### activateArtifact - -▸ **activateArtifact**(`action`: UnconfirmedActivateArtifact): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------------- | -| `action` | UnconfirmedActivateArtifact | - -**Returns:** _Promise_ - ---- - -### bulkGetArtifacts - -▸ **bulkGetArtifacts**(`artifactIds`: ArtifactId[], `onProgress?`: (`fractionCompleted`: _number_) => _void_): _Promise_ - -#### Parameters - -| Name | Type | -| :------------ | :---------------------------------------- | -| `artifactIds` | ArtifactId[] | -| `onProgress?` | (`fractionCompleted`: _number_) => _void_ | - -**Returns:** _Promise_ - ---- - -### bulkGetArtifactsOnPlanets - -▸ **bulkGetArtifactsOnPlanets**(`locationIds`: LocationId[], `onProgress?`: (`fractionCompleted`: _number_) => _void_): _Promise_ - -#### Parameters - -| Name | Type | -| :------------ | :---------------------------------------- | -| `locationIds` | LocationId[] | -| `onProgress?` | (`fractionCompleted`: _number_) => _void_ | - -**Returns:** _Promise_ - ---- - -### bulkGetPlanets - -▸ **bulkGetPlanets**(`toLoadPlanets`: LocationId[], `onProgressPlanet?`: (`fractionCompleted`: _number_) => _void_, `onProgressMetadata?`: (`fractionCompleted`: _number_) => _void_): _Promise_\> - -#### Parameters - -| Name | Type | -| :-------------------- | :---------------------------------------- | -| `toLoadPlanets` | LocationId[] | -| `onProgressPlanet?` | (`fractionCompleted`: _number_) => _void_ | -| `onProgressMetadata?` | (`fractionCompleted`: _number_) => _void_ | - -**Returns:** _Promise_\> - ---- - -### buyGPTCredits - -▸ **buyGPTCredits**(`amount`: _number_, `actionId`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `amount` | _number_ | -| `actionId` | _string_ | - -**Returns:** _Promise_ - ---- - -### buyHat - -▸ **buyHat**(`planetIdDecStr`: _string_, `currentHatLevel`: _number_, `actionId`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :---------------- | :------- | -| `planetIdDecStr` | _string_ | -| `currentHatLevel` | _number_ | -| `actionId` | _string_ | - -**Returns:** _Promise_ - ---- - -### deactivateArtifact - -▸ **deactivateArtifact**(`action`: UnconfirmedDeactivateArtifact): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :---------------------------- | -| `action` | UnconfirmedDeactivateArtifact | - -**Returns:** _Promise_ - ---- - -### depositArtifact - -▸ **depositArtifact**(`action`: UnconfirmedDepositArtifact): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :------------------------- | -| `action` | UnconfirmedDepositArtifact | - -**Returns:** _Promise_ - ---- - -### destroy - -▸ **destroy**(): _void_ - -**Returns:** _void_ - ---- - -### findArtifact - -▸ **findArtifact**(`location`: WorldLocation, `biomeSnarkArgs`: BiomebaseSnarkContractCallArgs, `actionId`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :--------------- | :----------------------------- | -| `location` | WorldLocation | -| `biomeSnarkArgs` | BiomebaseSnarkContractCallArgs | -| `actionId` | _string_ | - -**Returns:** _Promise_ - ---- - -### getAccount - -▸ **getAccount**(): EthAddress - -**Returns:** EthAddress - ---- - -### getAllArrivals - -▸ **getAllArrivals**(`planetsToLoad`: LocationId[], `onProgress?`: (`fractionCompleted`: _number_) => _void_): _Promise_ - -#### Parameters - -| Name | Type | -| :-------------- | :---------------------------------------- | -| `planetsToLoad` | LocationId[] | -| `onProgress?` | (`fractionCompleted`: _number_) => _void_ | - -**Returns:** _Promise_ - ---- - -### getArrival - -▸ **getArrival**(`arrivalId`: _number_): _Promise_ - -#### Parameters - -| Name | Type | -| :---------- | :------- | -| `arrivalId` | _number_ | - -**Returns:** _Promise_ - ---- - -### getArrivalsForPlanet - -▸ **getArrivalsForPlanet**(`planetId`: LocationId): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _Promise_ - ---- - -### getArtifactById - -▸ **getArtifactById**(`artifactId`: ArtifactId): _Promise_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _Promise_ - ---- - -### getBalance - -▸ **getBalance**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### getConstants - -▸ **getConstants**(): _Promise_<[_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md)\> - -**Returns:** _Promise_<[_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md)\> - ---- - -### getContractAddress - -▸ **getContractAddress**(): EthAddress - -**Returns:** EthAddress - ---- - -### getContractBalance - -▸ **getContractBalance**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### getGPTCreditBalance - -▸ **getGPTCreditBalance**(`address`: EthAddress): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :--------- | -| `address` | EthAddress | - -**Returns:** _Promise_ - ---- - -### getGPTCreditPriceEther - -▸ **getGPTCreditPriceEther**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### getPlanetById - -▸ **getPlanetById**(`planetId`: LocationId): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _Promise_ - ---- - -### getPlayerArtifacts - -▸ **getPlayerArtifacts**(`playerId`: EthAddress, `onProgress?`: (`percent`: _number_) => _void_): _Promise_ - -#### Parameters - -| Name | Type | -| :------------ | :------------------------------ | -| `playerId` | EthAddress | -| `onProgress?` | (`percent`: _number_) => _void_ | - -**Returns:** _Promise_ - ---- - -### getPlayerById - -▸ **getPlayerById**(`playerId`: EthAddress): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `playerId` | EthAddress | - -**Returns:** _Promise_ - ---- - -### getPlayers - -▸ **getPlayers**(`onProgress?`: (`fractionCompleted`: _number_) => _void_): _Promise_\> - -#### Parameters - -| Name | Type | -| :------------ | :---------------------------------------- | -| `onProgress?` | (`fractionCompleted`: _number_) => _void_ | - -**Returns:** _Promise_\> - ---- - -### getRevealedCoordsByIdIfExists - -▸ **getRevealedCoordsByIdIfExists**(`planetId`: LocationId): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _Promise_ - ---- - -### getRevealedPlanetsCoords - -▸ **getRevealedPlanetsCoords**(`startingAt`: _number_, `onProgressIds?`: (`fractionCompleted`: _number_) => _void_, `onProgressCoords?`: (`fractionCompleted`: _number_) => _void_): _Promise_ - -#### Parameters - -| Name | Type | -| :------------------ | :---------------------------------------- | -| `startingAt` | _number_ | -| `onProgressIds?` | (`fractionCompleted`: _number_) => _void_ | -| `onProgressCoords?` | (`fractionCompleted`: _number_) => _void_ | - -**Returns:** _Promise_ - ---- - -### getTokenMintEndTimestamp - -▸ **getTokenMintEndTimestamp**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### getTouchedPlanetIds - -▸ **getTouchedPlanetIds**(`startingAt`: _number_, `onProgress?`: (`fractionCompleted`: _number_) => _void_): _Promise_ - -#### Parameters - -| Name | Type | -| :------------ | :---------------------------------------- | -| `startingAt` | _number_ | -| `onProgress?` | (`fractionCompleted`: _number_) => _void_ | - -**Returns:** _Promise_ - ---- - -### getWorldRadius - -▸ **getWorldRadius**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### initializePlayer - -▸ **initializePlayer**(`args`: InitSnarkContractCallArgs, `action`: UnconfirmedInit): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :------------------------ | -| `args` | InitSnarkContractCallArgs | -| `action` | UnconfirmedInit | - -**Returns:** _Promise_ - ---- - -### makeCall - -▸ `Private` **makeCall**(`contractViewFunction`: _ContractFunction_, `args?`: _unknown_[]): _Promise_ - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Default value | -| :--------------------- | :--------------------- | :------------ | -| `contractViewFunction` | _ContractFunction_ | - | -| `args` | _unknown_[] | [] | - -**Returns:** _Promise_ - ---- - -### move - -▸ **move**(`actionId`: _string_, `snarkArgs`: MoveSnarkContractCallArgs, `shipsMoved`: _number_, `silverMoved`: _number_, `artifactMoved?`: ArtifactId): _Promise_ - -#### Parameters - -| Name | Type | -| :--------------- | :------------------------ | -| `actionId` | _string_ | -| `snarkArgs` | MoveSnarkContractCallArgs | -| `shipsMoved` | _number_ | -| `silverMoved` | _number_ | -| `artifactMoved?` | ArtifactId | - -**Returns:** _Promise_ - ---- - -### prospectPlanet - -▸ **prospectPlanet**(`planetId`: LocationId, `actionId`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | -| `actionId` | _string_ | - -**Returns:** _Promise_ - ---- - -### removeEventListeners - -▸ **removeEventListeners**(): _void_ - -**Returns:** _void_ - ---- - -### reveal - -▸ **reveal**(`args`: RevealSnarkContractCallArgs, `action`: UnconfirmedReveal): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------------- | -| `args` | RevealSnarkContractCallArgs | -| `action` | UnconfirmedReveal | - -**Returns:** _Promise_ - ---- - -### setDiagnosticUpdater - -▸ **setDiagnosticUpdater**(`diagnosticUpdater?`: [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md)): _void_ - -#### Parameters - -| Name | Type | -| :------------------- | :--------------------------------------------------------------------------------------------- | -| `diagnosticUpdater?` | [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) | - -**Returns:** _void_ - ---- - -### setupEventListeners - -▸ **setupEventListeners**(): _void_ - -**Returns:** _void_ - ---- - -### transferOwnership - -▸ **transferOwnership**(`planetId`: LocationId, `newOwner`: EthAddress, `actionId`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | -| `newOwner` | EthAddress | -| `actionId` | _string_ | - -**Returns:** _Promise_ - ---- - -### upgradePlanet - -▸ **upgradePlanet**(`args`: [_UpgradeArgs_](../modules/_types_darkforest_api_contractsapitypes.md#upgradeargs), `actionId`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------------------------------------------- | -| `args` | [_UpgradeArgs_](../modules/_types_darkforest_api_contractsapitypes.md#upgradeargs) | -| `actionId` | _string_ | - -**Returns:** _Promise_ - ---- - -### waitFor - -▸ **waitFor**(`submitted`: SubmittedTx, `receiptPromise`: _Promise_): _Promise_ - -Given an unconfirmed (but submitted) transaction, emits the appropriate -[ContractsAPIEvent](../enums/_types_darkforest_api_contractsapitypes.contractsapievent.md). - -#### Parameters - -| Name | Type | -| :--------------- | :----------------------------- | -| `submitted` | SubmittedTx | -| `receiptPromise` | _Promise_ | - -**Returns:** _Promise_ - ---- - -### withdrawArtifact - -▸ **withdrawArtifact**(`action`: UnconfirmedWithdrawArtifact): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------------- | -| `action` | UnconfirmedWithdrawArtifact | - -**Returns:** _Promise_ - ---- - -### withdrawSilver - -▸ **withdrawSilver**(`action`: UnconfirmedWithdrawSilver): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :------------------------ | -| `action` | UnconfirmedWithdrawSilver | - -**Returns:** _Promise_ - ---- - -### create - -▸ `Static` **create**(`ethConnection`: [_default_](backend_network_ethconnection.default.md)): _Promise_<[_default_](backend_gamelogic_contractsapi.default.md)\> - -#### Parameters - -| Name | Type | -| :-------------- | :---------------------------------------------------- | -| `ethConnection` | [_default_](backend_network_ethconnection.default.md) | - -**Returns:** _Promise_<[_default_](backend_gamelogic_contractsapi.default.md)\> diff --git a/docs/classes/backend_gamelogic_conversationmanager.conversationmanager.md b/docs/classes/backend_gamelogic_conversationmanager.conversationmanager.md deleted file mode 100644 index 12209330..00000000 --- a/docs/classes/backend_gamelogic_conversationmanager.conversationmanager.md +++ /dev/null @@ -1,147 +0,0 @@ -# Class: ConversationManager - -[Backend/GameLogic/ConversationManager](../modules/backend_gamelogic_conversationmanager.md).ConversationManager - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_conversationmanager.conversationmanager.md#constructor) - -### Properties - -- [artifact](backend_gamelogic_conversationmanager.conversationmanager.md#artifact) -- [artifactId](backend_gamelogic_conversationmanager.conversationmanager.md#artifactid) -- [conversation](backend_gamelogic_conversationmanager.conversationmanager.md#conversation) -- [setConversation](backend_gamelogic_conversationmanager.conversationmanager.md#setconversation) -- [setLoading](backend_gamelogic_conversationmanager.conversationmanager.md#setloading) -- [terminal](backend_gamelogic_conversationmanager.conversationmanager.md#terminal) -- [username](backend_gamelogic_conversationmanager.conversationmanager.md#username) - -### Methods - -- [printClean](backend_gamelogic_conversationmanager.conversationmanager.md#printclean) -- [printLastMessage](backend_gamelogic_conversationmanager.conversationmanager.md#printlastmessage) -- [start](backend_gamelogic_conversationmanager.conversationmanager.md#start) - -## Constructors - -### constructor - -\+ **new ConversationManager**(`terminal`: _MutableRefObject_, `setConversation`: (`conversation`: Conversation) => _void_, `setLoading`: (`loading`: _boolean_) => _void_, `artifactType`: ArtifactType, `artifactRarity`: ArtifactRarity): [_ConversationManager_](backend_gamelogic_conversationmanager.conversationmanager.md) - -#### Parameters - -| Name | Type | -| :---------------- | :------------------------------------------------------------------------------------------------------------ | -| `terminal` | _MutableRefObject_ | -| `setConversation` | (`conversation`: Conversation) => _void_ | -| `setLoading` | (`loading`: _boolean_) => _void_ | -| `artifactType` | ArtifactType | -| `artifactRarity` | ArtifactRarity | - -**Returns:** [_ConversationManager_](backend_gamelogic_conversationmanager.conversationmanager.md) - -## Properties - -### artifact - -• `Private` **artifact**: ConversationArtifact - ---- - -### artifactId - -• `Private` **artifactId**: _string_ - ---- - -### conversation - -• `Private` **conversation**: Conversation - ---- - -### setConversation - -• `Private` **setConversation**: (`conversation`: Conversation) => _void_ - -#### Type declaration - -▸ (`conversation`: Conversation): _void_ - -#### Parameters - -| Name | Type | -| :------------- | :----------- | -| `conversation` | Conversation | - -**Returns:** _void_ - ---- - -### setLoading - -• `Private` **setLoading**: (`loading`: _boolean_) => _void_ - -#### Type declaration - -▸ (`loading`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :-------- | -| `loading` | _boolean_ | - -**Returns:** _void_ - ---- - -### terminal - -• `Private` **terminal**: _MutableRefObject_ - ---- - -### username - -• `Private` **username**: _string_ - -## Methods - -### printClean - -▸ `Private` **printClean**(`message`: _string_, `style?`: [_Green_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#green) \| [_Sub_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#sub) \| [_White_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#white) \| [_Red_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#red) \| [_Blue_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#blue) \| [_Invisible_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#invisible) \| [_Default_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#default) \| [_Underline_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#underline) \| [_Hoverable_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#hoverable), `hoverContents?`: () => _Element_): _void_ - -#### Parameters - -| Name | Type | -| :--------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `message` | _string_ | -| `style?` | [_Green_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#green) \| [_Sub_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#sub) \| [_White_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#white) \| [_Red_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#red) \| [_Blue_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#blue) \| [_Invisible_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#invisible) \| [_Default_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#default) \| [_Underline_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#underline) \| [_Hoverable_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#hoverable) | -| `hoverContents?` | () => _Element_ | - -**Returns:** _void_ - ---- - -### printLastMessage - -▸ `Private` **printLastMessage**(`message`: Message): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :------ | -| `message` | Message | - -**Returns:** _void_ - ---- - -### start - -▸ **start**(): _Promise_ - -**Returns:** _Promise_ diff --git a/docs/classes/backend_gamelogic_gamemanager.default.md b/docs/classes/backend_gamelogic_gamemanager.default.md deleted file mode 100644 index f0ab6cf2..00000000 --- a/docs/classes/backend_gamelogic_gamemanager.default.md +++ /dev/null @@ -1,2508 +0,0 @@ -# Class: default - -[Backend/GameLogic/GameManager](../modules/backend_gamelogic_gamemanager.md).default - -## Hierarchy - -- _EventEmitter_ - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_gamemanager.default.md#constructor) - -### Properties - -- [account](backend_gamelogic_gamemanager.default.md#account) -- [balance](backend_gamelogic_gamemanager.default.md#balance) -- [balanceInterval](backend_gamelogic_gamemanager.default.md#balanceinterval) -- [contractConstants](backend_gamelogic_gamemanager.default.md#contractconstants) -- [contractsAPI](backend_gamelogic_gamemanager.default.md#contractsapi) -- [diagnostics](backend_gamelogic_gamemanager.default.md#diagnostics) -- [endTimeSeconds](backend_gamelogic_gamemanager.default.md#endtimeseconds) -- [entityStore](backend_gamelogic_gamemanager.default.md#entitystore) -- [ethConnection](backend_gamelogic_gamemanager.default.md#ethconnection) -- [gptCreditPriceEther](backend_gamelogic_gamemanager.default.md#gptcreditpriceether) -- [gptCreditPriceEtherEmitter$](backend_gamelogic_gamemanager.default.md#gptcreditpriceetheremitter$) -- [hashConfig](backend_gamelogic_gamemanager.default.md#hashconfig) -- [hashRate](backend_gamelogic_gamemanager.default.md#hashrate) -- [homeLocation](backend_gamelogic_gamemanager.default.md#homelocation) -- [minerManager](backend_gamelogic_gamemanager.default.md#minermanager) -- [myBalance$](backend_gamelogic_gamemanager.default.md#mybalance$) -- [myGPTCredits](backend_gamelogic_gamemanager.default.md#mygptcredits) -- [myGPTCredits$](backend_gamelogic_gamemanager.default.md#mygptcredits$) -- [persistentChunkStore](backend_gamelogic_gamemanager.default.md#persistentchunkstore) -- [planetHashMimc](backend_gamelogic_gamemanager.default.md#planethashmimc) -- [playerInterval](backend_gamelogic_gamemanager.default.md#playerinterval) -- [players](backend_gamelogic_gamemanager.default.md#players) -- [settingsSubscription](backend_gamelogic_gamemanager.default.md#settingssubscription) -- [snarkHelper](backend_gamelogic_gamemanager.default.md#snarkhelper) -- [terminal](backend_gamelogic_gamemanager.default.md#terminal) -- [useMockHash](backend_gamelogic_gamemanager.default.md#usemockhash) -- [worldRadius](backend_gamelogic_gamemanager.default.md#worldradius) - -### Accessors - -- [planetRarity](backend_gamelogic_gamemanager.default.md#planetrarity) - -### Methods - -- [activateArtifact](backend_gamelogic_gamemanager.default.md#activateartifact) -- [addAccount](backend_gamelogic_gamemanager.default.md#addaccount) -- [addNewChunk](backend_gamelogic_gamemanager.default.md#addnewchunk) -- [biomebasePerlin](backend_gamelogic_gamemanager.default.md#biomebaseperlin) -- [bulkAddNewChunks](backend_gamelogic_gamemanager.default.md#bulkaddnewchunks) -- [bulkHardRefreshPlanets](backend_gamelogic_gamemanager.default.md#bulkhardrefreshplanets) -- [buyGPTCredits](backend_gamelogic_gamemanager.default.md#buygptcredits) -- [buyHat](backend_gamelogic_gamemanager.default.md#buyhat) -- [checkGameHasEnded](backend_gamelogic_gamemanager.default.md#checkgamehasended) -- [clearEmoji](backend_gamelogic_gamemanager.default.md#clearemoji) -- [deactivateArtifact](backend_gamelogic_gamemanager.default.md#deactivateartifact) -- [depositArtifact](backend_gamelogic_gamemanager.default.md#depositartifact) -- [destroy](backend_gamelogic_gamemanager.default.md#destroy) -- [findArtifact](backend_gamelogic_gamemanager.default.md#findartifact) -- [getAccount](backend_gamelogic_gamemanager.default.md#getaccount) -- [getActiveArtifact](backend_gamelogic_gamemanager.default.md#getactiveartifact) -- [getAllOwnedPlanets](backend_gamelogic_gamemanager.default.md#getallownedplanets) -- [getAllPlanets](backend_gamelogic_gamemanager.default.md#getallplanets) -- [getAllPlayers](backend_gamelogic_gamemanager.default.md#getallplayers) -- [getAllVoyages](backend_gamelogic_gamemanager.default.md#getallvoyages) -- [getArtifactMap](backend_gamelogic_gamemanager.default.md#getartifactmap) -- [getArtifactUpdated$](backend_gamelogic_gamemanager.default.md#getartifactupdated$) -- [getArtifactWithId](backend_gamelogic_gamemanager.default.md#getartifactwithid) -- [getArtifactsWithIds](backend_gamelogic_gamemanager.default.md#getartifactswithids) -- [getChunk](backend_gamelogic_gamemanager.default.md#getchunk) -- [getChunkStore](backend_gamelogic_gamemanager.default.md#getchunkstore) -- [getConstructors](backend_gamelogic_gamemanager.default.md#getconstructors) -- [getContractAddress](backend_gamelogic_gamemanager.default.md#getcontractaddress) -- [getContractConstants](backend_gamelogic_gamemanager.default.md#getcontractconstants) -- [getConversation](backend_gamelogic_gamemanager.default.md#getconversation) -- [getCurrentlyExploringChunk](backend_gamelogic_gamemanager.default.md#getcurrentlyexploringchunk) -- [getDiagnostics](backend_gamelogic_gamemanager.default.md#getdiagnostics) -- [getDist](backend_gamelogic_gamemanager.default.md#getdist) -- [getDistCoords](backend_gamelogic_gamemanager.default.md#getdistcoords) -- [getEndTimeSeconds](backend_gamelogic_gamemanager.default.md#getendtimeseconds) -- [getEnergyArrivingForMove](backend_gamelogic_gamemanager.default.md#getenergyarrivingformove) -- [getEnergyCurveAtPercent](backend_gamelogic_gamemanager.default.md#getenergycurveatpercent) -- [getEnergyNeededForMove](backend_gamelogic_gamemanager.default.md#getenergyneededformove) -- [getEnergyOfPlayer](backend_gamelogic_gamemanager.default.md#getenergyofplayer) -- [getEthConnection](backend_gamelogic_gamemanager.default.md#getethconnection) -- [getExploredChunks](backend_gamelogic_gamemanager.default.md#getexploredchunks) -- [getGameObjects](backend_gamelogic_gamemanager.default.md#getgameobjects) -- [getGptCreditBalanceEmitter](backend_gamelogic_gamemanager.default.md#getgptcreditbalanceemitter) -- [getGptCreditPriceEmitter](backend_gamelogic_gamemanager.default.md#getgptcreditpriceemitter) -- [getHashConfig](backend_gamelogic_gamemanager.default.md#gethashconfig) -- [getHashesPerSec](backend_gamelogic_gamemanager.default.md#gethashespersec) -- [getHomeCoords](backend_gamelogic_gamemanager.default.md#gethomecoords) -- [getHomeHash](backend_gamelogic_gamemanager.default.md#gethomehash) -- [getIsBuyingCreditsEmitter](backend_gamelogic_gamemanager.default.md#getisbuyingcreditsemitter) -- [getLocationOfPlanet](backend_gamelogic_gamemanager.default.md#getlocationofplanet) -- [getMaxMoveDist](backend_gamelogic_gamemanager.default.md#getmaxmovedist) -- [getMiningPattern](backend_gamelogic_gamemanager.default.md#getminingpattern) -- [getMyArtifactMap](backend_gamelogic_gamemanager.default.md#getmyartifactmap) -- [getMyArtifacts](backend_gamelogic_gamemanager.default.md#getmyartifacts) -- [getMyArtifactsUpdated$](backend_gamelogic_gamemanager.default.md#getmyartifactsupdated$) -- [getMyBalance](backend_gamelogic_gamemanager.default.md#getmybalance) -- [getMyBalanceEmitter](backend_gamelogic_gamemanager.default.md#getmybalanceemitter) -- [getMyPlanetMap](backend_gamelogic_gamemanager.default.md#getmyplanetmap) -- [getMyPlanets](backend_gamelogic_gamemanager.default.md#getmyplanets) -- [getMyPlanetsUpdated$](backend_gamelogic_gamemanager.default.md#getmyplanetsupdated$) -- [getMyScore](backend_gamelogic_gamemanager.default.md#getmyscore) -- [getNextBroadcastAvailableTimestamp](backend_gamelogic_gamemanager.default.md#getnextbroadcastavailabletimestamp) -- [getNextRevealCountdownInfo](backend_gamelogic_gamemanager.default.md#getnextrevealcountdowninfo) -- [getNotificationsManager](backend_gamelogic_gamemanager.default.md#getnotificationsmanager) -- [getPerlinThresholds](backend_gamelogic_gamemanager.default.md#getperlinthresholds) -- [getPlanetLevel](backend_gamelogic_gamemanager.default.md#getplanetlevel) -- [getPlanetMap](backend_gamelogic_gamemanager.default.md#getplanetmap) -- [getPlanetRarity](backend_gamelogic_gamemanager.default.md#getplanetrarity) -- [getPlanetUpdated$](backend_gamelogic_gamemanager.default.md#getplanetupdated$) -- [getPlanetWithCoords](backend_gamelogic_gamemanager.default.md#getplanetwithcoords) -- [getPlanetWithId](backend_gamelogic_gamemanager.default.md#getplanetwithid) -- [getPlanetsInRange](backend_gamelogic_gamemanager.default.md#getplanetsinrange) -- [getPlanetsInWorldRectangle](backend_gamelogic_gamemanager.default.md#getplanetsinworldrectangle) -- [getPlanetsWithIds](backend_gamelogic_gamemanager.default.md#getplanetswithids) -- [getPrivateKey](backend_gamelogic_gamemanager.default.md#getprivatekey) -- [getProcgenUtils](backend_gamelogic_gamemanager.default.md#getprocgenutils) -- [getRandomHomePlanetCoords](backend_gamelogic_gamemanager.default.md#getrandomhomeplanetcoords) -- [getRevealedLocations](backend_gamelogic_gamemanager.default.md#getrevealedlocations) -- [getSignedTwitter](backend_gamelogic_gamemanager.default.md#getsignedtwitter) -- [getSilverCurveAtPercent](backend_gamelogic_gamemanager.default.md#getsilvercurveatpercent) -- [getSilverOfPlayer](backend_gamelogic_gamemanager.default.md#getsilverofplayer) -- [getStalePlanetWithId](backend_gamelogic_gamemanager.default.md#getstaleplanetwithid) -- [getTemperature](backend_gamelogic_gamemanager.default.md#gettemperature) -- [getTimeForMove](backend_gamelogic_gamemanager.default.md#gettimeformove) -- [getTokenMintEndTimeSeconds](backend_gamelogic_gamemanager.default.md#gettokenmintendtimeseconds) -- [getTwitter](backend_gamelogic_gamemanager.default.md#gettwitter) -- [getUIEventEmitter](backend_gamelogic_gamemanager.default.md#getuieventemitter) -- [getUnconfirmedMoves](backend_gamelogic_gamemanager.default.md#getunconfirmedmoves) -- [getUnconfirmedUpgrades](backend_gamelogic_gamemanager.default.md#getunconfirmedupgrades) -- [getUnconfirmedWormholeActivations](backend_gamelogic_gamemanager.default.md#getunconfirmedwormholeactivations) -- [getUniverseTotalEnergy](backend_gamelogic_gamemanager.default.md#getuniversetotalenergy) -- [getUpgrade](backend_gamelogic_gamemanager.default.md#getupgrade) -- [getWithdrawnSilverOfPlayer](backend_gamelogic_gamemanager.default.md#getwithdrawnsilverofplayer) -- [getWorldRadius](backend_gamelogic_gamemanager.default.md#getworldradius) -- [getWorldSilver](backend_gamelogic_gamemanager.default.md#getworldsilver) -- [getWormholeFactors](backend_gamelogic_gamemanager.default.md#getwormholefactors) -- [getWormholes](backend_gamelogic_gamemanager.default.md#getwormholes) -- [handleTxIntent](backend_gamelogic_gamemanager.default.md#handletxintent) -- [hardRefreshArtifact](backend_gamelogic_gamemanager.default.md#hardrefreshartifact) -- [hardRefreshPlanet](backend_gamelogic_gamemanager.default.md#hardrefreshplanet) -- [hardRefreshPlayer](backend_gamelogic_gamemanager.default.md#hardrefreshplayer) -- [hasJoinedGame](backend_gamelogic_gamemanager.default.md#hasjoinedgame) -- [hasMinedChunk](backend_gamelogic_gamemanager.default.md#hasminedchunk) -- [initMiningManager](backend_gamelogic_gamemanager.default.md#initminingmanager) -- [isMining](backend_gamelogic_gamemanager.default.md#ismining) -- [isPlanetMineable](backend_gamelogic_gamemanager.default.md#isplanetmineable) -- [isRoundOver](backend_gamelogic_gamemanager.default.md#isroundover) -- [joinGame](backend_gamelogic_gamemanager.default.md#joingame) -- [loadContract](backend_gamelogic_gamemanager.default.md#loadcontract) -- [loadPlugins](backend_gamelogic_gamemanager.default.md#loadplugins) -- [locationFromCoords](backend_gamelogic_gamemanager.default.md#locationfromcoords) -- [move](backend_gamelogic_gamemanager.default.md#move) -- [onTxConfirmed](backend_gamelogic_gamemanager.default.md#ontxconfirmed) -- [onTxIntentFail](backend_gamelogic_gamemanager.default.md#ontxintentfail) -- [onTxReverted](backend_gamelogic_gamemanager.default.md#ontxreverted) -- [onTxSubmit](backend_gamelogic_gamemanager.default.md#ontxsubmit) -- [prospectPlanet](backend_gamelogic_gamemanager.default.md#prospectplanet) -- [refreshMyGPTCredits](backend_gamelogic_gamemanager.default.md#refreshmygptcredits) -- [refreshServerPlanetStates](backend_gamelogic_gamemanager.default.md#refreshserverplanetstates) -- [refreshTwitters](backend_gamelogic_gamemanager.default.md#refreshtwitters) -- [revealLocation](backend_gamelogic_gamemanager.default.md#reveallocation) -- [savePlugins](backend_gamelogic_gamemanager.default.md#saveplugins) -- [setMinerCores](backend_gamelogic_gamemanager.default.md#setminercores) -- [setMiningPattern](backend_gamelogic_gamemanager.default.md#setminingpattern) -- [setPlanetEmoji](backend_gamelogic_gamemanager.default.md#setplanetemoji) -- [setRadius](backend_gamelogic_gamemanager.default.md#setradius) -- [setSnarkCacheSize](backend_gamelogic_gamemanager.default.md#setsnarkcachesize) -- [signMessage](backend_gamelogic_gamemanager.default.md#signmessage) -- [softRefreshPlanet](backend_gamelogic_gamemanager.default.md#softrefreshplanet) -- [spaceTypeFromPerlin](backend_gamelogic_gamemanager.default.md#spacetypefromperlin) -- [spaceTypePerlin](backend_gamelogic_gamemanager.default.md#spacetypeperlin) -- [startConversation](backend_gamelogic_gamemanager.default.md#startconversation) -- [startExplore](backend_gamelogic_gamemanager.default.md#startexplore) -- [stepConversation](backend_gamelogic_gamemanager.default.md#stepconversation) -- [stopExplore](backend_gamelogic_gamemanager.default.md#stopexplore) -- [submitPlanetMessage](backend_gamelogic_gamemanager.default.md#submitplanetmessage) -- [transferOwnership](backend_gamelogic_gamemanager.default.md#transferownership) -- [updateDiagnostics](backend_gamelogic_gamemanager.default.md#updatediagnostics) -- [upgrade](backend_gamelogic_gamemanager.default.md#upgrade) -- [verifyMessage](backend_gamelogic_gamemanager.default.md#verifymessage) -- [verifyTwitter](backend_gamelogic_gamemanager.default.md#verifytwitter) -- [withdrawArtifact](backend_gamelogic_gamemanager.default.md#withdrawartifact) -- [withdrawSilver](backend_gamelogic_gamemanager.default.md#withdrawsilver) -- [create](backend_gamelogic_gamemanager.default.md#create) - -## Constructors - -### constructor - -\+ `Private` **new default**(`terminal`: _MutableRefObject_, `account`: _undefined_ \| EthAddress, `balance`: _number_, `players`: _Map_, `touchedPlanets`: _Map_, `allTouchedPlanetIds`: _Set_, `revealedCoords`: _Map_, `worldRadius`: _number_, `unprocessedArrivals`: _Map_, `unprocessedPlanetArrivalIds`: _Map_, `contractsAPI`: [_default_](backend_gamelogic_contractsapi.default.md), `contractConstants`: [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md), `persistentChunkStore`: [_default_](backend_storage_persistentchunkstore.default.md), `snarkHelper`: [_default_](backend_utils_snarkargshelper.default.md), `homeLocation`: _undefined_ \| WorldLocation, `useMockHash`: _boolean_, `artifacts`: _Map_, `ethConnection`: [_default_](backend_network_ethconnection.default.md), `gptCreditPriceEther`: _number_, `myGPTCredits`: _number_): [_default_](backend_gamelogic_gamemanager.default.md) - -#### Parameters - -| Name | Type | -| :---------------------------- | :------------------------------------------------------------------------------------------------------------ | -| `terminal` | _MutableRefObject_ | -| `account` | _undefined_ \| EthAddress | -| `balance` | _number_ | -| `players` | _Map_ | -| `touchedPlanets` | _Map_ | -| `allTouchedPlanetIds` | _Set_ | -| `revealedCoords` | _Map_ | -| `worldRadius` | _number_ | -| `unprocessedArrivals` | _Map_ | -| `unprocessedPlanetArrivalIds` | _Map_ | -| `contractsAPI` | [_default_](backend_gamelogic_contractsapi.default.md) | -| `contractConstants` | [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) | -| `persistentChunkStore` | [_default_](backend_storage_persistentchunkstore.default.md) | -| `snarkHelper` | [_default_](backend_utils_snarkargshelper.default.md) | -| `homeLocation` | _undefined_ \| WorldLocation | -| `useMockHash` | _boolean_ | -| `artifacts` | _Map_ | -| `ethConnection` | [_default_](backend_network_ethconnection.default.md) | -| `gptCreditPriceEther` | _number_ | -| `myGPTCredits` | _number_ | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - -Overrides: EventEmitter.constructor - -## Properties - -### account - -• `Private` `Readonly` **account**: _undefined_ \| EthAddress - -The ethereum address of the player who is currently logged in. We support 'no account', -represented by `undefined` in the case when you want to simply load the game state from the -contract and view it without be able to make any moves. - ---- - -### balance - -• `Private` **balance**: _number_ - -This is kept relatively up-to-date with the balance of the player's wallet on the latest block -of whatever blockchain we're connected to. - -**`todo`** move this into a new `PlayerState` class. - ---- - -### balanceInterval - -• `Private` **balanceInterval**: _Timeout_ - -Handle to an interval that periodically refreshes the player's balance. - -**`todo`** move this into a new `PlayerState` class. - ---- - -### contractConstants - -• `Private` `Readonly` **contractConstants**: [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) - -Game parameters set by the contract. Stuff like perlin keys, which are important for mining the -correct universe, or the time multiplier, which allows us to tune how quickly voyages go. - -**`todo`** move this into a separate `GameConfiguration` class. - ---- - -### contractsAPI - -• `Private` `Readonly` **contractsAPI**: [_default_](backend_gamelogic_contractsapi.default.md) - -Allows us to make contract calls, and execute transactions. Be careful about how you use this -guy. You don't want to cause your client to send an excessive amount of traffic to whatever -node you're connected to. - -Interacting with the blockchain isn't free, and we need to be mindful about about the way our -application interacts with the blockchain. The current rate limiting strategy consists of three -points: - -- data that needs to be fetched often should be fetched in bulk. -- rate limit smart contract calls (reads from the blockchain), implemented by - [ContractCaller](backend_gamelogic_contractcaller.contractcaller.md) and transactions (writes to the blockchain on behalf of the player), - implemented by [TxExecutor](backend_network_txexecutor.txexecutor.md) via two separately tuned [ThrottledConcurrentQueue](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md)s. - ---- - -### diagnostics - -• `Private` **diagnostics**: [_Diagnostics_](../interfaces/frontend_panes_diagnosticspane.diagnostics.md) - -Diagnostic information about the game. - ---- - -### endTimeSeconds - -• `Private` `Readonly` **endTimeSeconds**: _number_= 1643587533 - -**`todo`** change this to the correct timestamp each round. - ---- - -### entityStore - -• `Private` `Readonly` **entityStore**: [_GameObjects_](backend_gamelogic_gameobjects.gameobjects.md) - -This variable contains the internal state of objects that live in the game world. - ---- - -### ethConnection - -• `Private` `Readonly` **ethConnection**: [_default_](backend_network_ethconnection.default.md) - -An interface to the blockchain that is a little bit lower-level than {@link ContractsAPI}. It -allows us to do basic operations such as wait for a transaction to complete, check the player's -address and balance, etc. - ---- - -### gptCreditPriceEther - -• `Private` **gptCreditPriceEther**: _number_ - -Price of a single gpt credit, which buys you a single interaction with the GPT-powered AI -Artifact Chat Bots. - -**`todo`** move this into a new `GameConfiguration` class. - ---- - -### gptCreditPriceEtherEmitter$ - -• `Private` **gptCreditPriceEtherEmitter$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -Whenever the price of single GPT credit changes, we emit that event here. - ---- - -### hashConfig - -• `Private` `Readonly` **hashConfig**: [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) - -Each round we change the hash configuration of the game. The hash configuration is download -from the blockchain, and essentially acts as a salt, permuting the universe into a unique -configuration for each new round. - -**`todo`** deduplicate this and `useMockHash` somehow. - ---- - -### hashRate - -• `Private` **hashRate**: _number_ - -Continuously updated value representing the total hashes per second that the game is currently -mining the universe at. - -**`todo`** keep this in {@link MinerManager} - ---- - -### homeLocation - -• `Private` **homeLocation**: _undefined_ \| WorldLocation - -The spawn location of the current player. - -**`todo,`** make this smarter somehow. It's really annoying to have to import world coordinates, and -get them wrong or something. Maybe we need to mark a planet, once it's been initialized -contract-side, as the homeworld of the user who initialized on it. That way, when you import a -new account into the game, and you import map data that contains your home planet, the client -would be able to automatically detect which planet is the player's home planet. - -**`todo`** move this into a new `PlayerState` class. - ---- - -### minerManager - -• `Private` `Optional` **minerManager**: [_default_](backend_miner_minermanager.default.md) - -Manages the process of mining new space territory. - ---- - -### myBalance$ - -• `Private` **myBalance$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -Any time the balance of the player's address changes, we publish an event here. - -**`todo`** move this into a new `PlayerState` class. - ---- - -### myGPTCredits - -• `Private` **myGPTCredits**: _number_ - -The total amount of GPT credits that belong to the current player. - -**`todo`** move this into a new `PlayerState` class. - ---- - -### myGPTCredits$ - -• `Private` **myGPTCredits$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -Whenever the amount of the GPT credits that this player owns changes, we publish an event here. - -**`todo`** move this into a new `PlayerState` class. - ---- - -### persistentChunkStore - -• `Private` `Readonly` **persistentChunkStore**: [_default_](backend_storage_persistentchunkstore.default.md) - -An object that syncs any newly added or deleted chunks to the player's IndexedDB. - -**`todo`** it also persists other game data to IndexedDB. This class needs to be renamed `GameSaver` -or something like that. - ---- - -### planetHashMimc - -• `Private` `Readonly` **planetHashMimc**: (...`inputs`: _number_[]) => BigInteger - -The aforementioned hash function. In debug mode where `DISABLE_ZK_CHECKS` is on, we use a -faster hash function. Othewise, in production mode, use MiMC hash (https://byt3bit.github.io/primesym/). - -#### Type declaration - -▸ (...`inputs`: _number_[]): BigInteger - -#### Parameters - -| Name | Type | -| :---------- | :--------- | -| `...inputs` | _number_[] | - -**Returns:** BigInteger - ---- - -### playerInterval - -• `Private` **playerInterval**: _Timeout_ - -Handle to an interval that periodically refreshes some information about the player from the -blockchain. - -**`todo`** move this into a new `PlayerState` class. - ---- - -### players - -• `Private` `Readonly` **players**: _Map_ - -Map from ethereum addresses to player objects. This isn't stored in [GameObjects](backend_gamelogic_gameobjects.gameobjects.md), -because it's not techincally an entity that exists in the world. A player just controls planets -and artifacts that do exist in the world. - -**`todo`** move this into a new `Players` class. - ---- - -### settingsSubscription - -• `Private` **settingsSubscription**: _undefined_ \| [_Subscription_](../modules/frontend_utils_monomitter.md#subscription) - -Subscription to act on setting changes - ---- - -### snarkHelper - -• `Private` `Readonly` **snarkHelper**: [_default_](backend_utils_snarkargshelper.default.md) - -Responsible for generating snark proofs. - ---- - -### terminal - -• `Private` `Readonly` **terminal**: _MutableRefObject_ - -Kind of hacky, but we store a reference to the terminal that the player sees when the initially -load into the game. This is the same exact terminal that appears inside the collapsable right -bar of the game. - ---- - -### useMockHash - -• `Private` `Readonly` **useMockHash**: _boolean_ - -In debug builds of the game, we can connect to a set of contracts deployed to a local -blockchain, which are tweaked to not verify planet hashes, meaning we can use a faster hash -function with similar properties to mimc. This allows us to mine the map faster in debug mode. - -**`todo`** move this into a separate `GameConfiguration` class. - ---- - -### worldRadius - -• `Private` **worldRadius**: _number_ - -Sometimes the universe gets bigger... Sometimes it doesn't. - -**`todo`** move this into a new `GameConfiguration` class. - -## Accessors - -### planetRarity - -• get **planetRarity**(): _number_ - -**Returns:** _number_ - -## Methods - -### activateArtifact - -▸ **activateArtifact**(`locationId`: LocationId, `artifactId`: ArtifactId, `wormholeTo`: _undefined_ \| LocationId, `bypassChecks?`: _boolean_): [_default_](backend_gamelogic_gamemanager.default.md) - -#### Parameters - -| Name | Type | Default value | -| :------------- | :------------------------ | :------------ | -| `locationId` | LocationId | - | -| `artifactId` | ArtifactId | - | -| `wormholeTo` | _undefined_ \| LocationId | - | -| `bypassChecks` | _boolean_ | false | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### addAccount - -▸ **addAccount**(`coords`: WorldCoords): _Promise_ - -Initializes a new player's game to start at the given home planet. Must have already -initialized the player on the contract. - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _Promise_ - ---- - -### addNewChunk - -▸ **addNewChunk**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): [_default_](backend_gamelogic_gamemanager.default.md) - -Makes this game manager aware of a new chunk - which includes its location, size, -as well as all of the planets contained in that chunk. Causes the client to load -all of the information about those planets from the blockchain. - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### biomebasePerlin - -▸ **biomebasePerlin**(`coords`: WorldCoords, `floor`: _boolean_): _number_ - -Gets the biome perlin valie at the given location in the world. - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | -| `floor` | _boolean_ | - -**Returns:** _number_ - ---- - -### bulkAddNewChunks - -▸ **bulkAddNewChunks**(`chunks`: [_Chunk_](_types_global_globaltypes.chunk.md)[]): _Promise_ - -To add multiple chunks at once, use this function rather than `addNewChunk`, in order -to load all of the associated planet data in an efficient manner. - -#### Parameters - -| Name | Type | -| :------- | :---------------------------------------------- | -| `chunks` | [_Chunk_](_types_global_globaltypes.chunk.md)[] | - -**Returns:** _Promise_ - ---- - -### bulkHardRefreshPlanets - -▸ `Private` **bulkHardRefreshPlanets**(`planetIds`: LocationId[]): _Promise_ - -#### Parameters - -| Name | Type | -| :---------- | :----------- | -| `planetIds` | LocationId[] | - -**Returns:** _Promise_ - ---- - -### buyGPTCredits - -▸ **buyGPTCredits**(`amount`: _number_): [_default_](backend_gamelogic_gamemanager.default.md) - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `amount` | _number_ | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### buyHat - -▸ **buyHat**(`planetId`: LocationId, `_bypassChecks?`: _boolean_): [_default_](backend_gamelogic_gamemanager.default.md) - -Submits a transaction to the blockchain to buy a hat for the given planet. You -must own the planet. Warning costs real xdai. Hats are permanently locked to a -planet. They are purely cosmetic and a great way to BM your opponents or just -look your best. Just like in the real world, more money means more hat. - -#### Parameters - -| Name | Type | Default value | -| :-------------- | :--------- | :------------ | -| `planetId` | LocationId | - | -| `_bypassChecks` | _boolean_ | false | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### checkGameHasEnded - -▸ `Private` **checkGameHasEnded**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### clearEmoji - -▸ **clearEmoji**(`locationId`: LocationId): _Promise_ - -If you are the owner of this planet, you can delete the emoji that is hovering above the -planet. - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `locationId` | LocationId | - -**Returns:** _Promise_ - ---- - -### deactivateArtifact - -▸ **deactivateArtifact**(`locationId`: LocationId, `artifactId`: ArtifactId, `bypassChecks?`: _boolean_): _undefined_ \| [_default_](backend_gamelogic_gamemanager.default.md) - -#### Parameters - -| Name | Type | Default value | -| :------------- | :--------- | :------------ | -| `locationId` | LocationId | - | -| `artifactId` | ArtifactId | - | -| `bypassChecks` | _boolean_ | false | - -**Returns:** _undefined_ \| [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### depositArtifact - -▸ **depositArtifact**(`locationId`: LocationId, `artifactId`: ArtifactId, `bypassChecks?`: _boolean_): [_default_](backend_gamelogic_gamemanager.default.md) - -Submits a transaction to the blockchain to deposit an artifact on a given planet. -You must own the planet and you must own the artifact directly (can't be locked in contract) - -#### Parameters - -| Name | Type | Default value | -| :------------- | :--------- | :------------ | -| `locationId` | LocationId | - | -| `artifactId` | ArtifactId | - | -| `bypassChecks` | _boolean_ | true | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### destroy - -▸ **destroy**(): _void_ - -**Returns:** _void_ - ---- - -### findArtifact - -▸ **findArtifact**(`planetId`: LocationId, `bypassChecks?`: _boolean_): [_default_](backend_gamelogic_gamemanager.default.md) - -Calls the contract to find an artifact on the given planet. - -#### Parameters - -| Name | Type | Default value | -| :------------- | :--------- | :------------ | -| `planetId` | LocationId | - | -| `bypassChecks` | _boolean_ | false | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### getAccount - -▸ **getAccount**(): _undefined_ \| EthAddress - -Gets the address of the player logged into this game manager. - -**Returns:** _undefined_ \| EthAddress - ---- - -### getActiveArtifact - -▸ **getActiveArtifact**(`planet`: Planet): _undefined_ \| Artifact - -Gets the active artifact on this planet, if one exists. - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _undefined_ \| Artifact - ---- - -### getAllOwnedPlanets - -▸ **getAllOwnedPlanets**(): Planet[] - -Gets a list of planets that have an owner. - -**Returns:** Planet[] - ---- - -### getAllPlanets - -▸ **getAllPlanets**(): _Iterable_ - -Gets all planets. This means all planets that are in the contract, and also all -planets that have been mined locally. Does not update planets if they are stale. -NOT PERFORMANT - for scripting only. - -**Returns:** _Iterable_ - ---- - -### getAllPlayers - -▸ **getAllPlayers**(): Player[] - -Gets a list of all the players in the game (not just the ones you've -encounterd) - -**Returns:** Player[] - ---- - -### getAllVoyages - -▸ **getAllVoyages**(): QueuedArrival[] - -Gets all voyages that have not completed. - -**Returns:** QueuedArrival[] - ---- - -### getArtifactMap - -▸ **getArtifactMap**(): _Map_ - -Return a reference to the artifact map - -**Returns:** _Map_ - ---- - -### getArtifactUpdated$ - -▸ **getArtifactUpdated$**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getArtifactWithId - -▸ **getArtifactWithId**(`artifactId`: ArtifactId): _undefined_ \| Artifact - -Gets the artifact with the given id. Null if no artifact with id exists. - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _undefined_ \| Artifact - ---- - -### getArtifactsWithIds - -▸ **getArtifactsWithIds**(`artifactIds`: ArtifactId[]): (_undefined_ \| Artifact)[] - -Gets the artifacts with the given ids, including ones we know exist but haven't been loaded, -represented by `undefined`. - -#### Parameters - -| Name | Type | -| :------------ | :----------- | -| `artifactIds` | ArtifactId[] | - -**Returns:** (_undefined_ \| Artifact)[] - ---- - -### getChunk - -▸ **getChunk**(`chunkFootprint`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): _undefined_ \| [_Chunk_](_types_global_globaltypes.chunk.md) - -#### Parameters - -| Name | Type | -| :--------------- | :------------------------------------------------------------------ | -| `chunkFootprint` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** _undefined_ \| [_Chunk_](_types_global_globaltypes.chunk.md) - ---- - -### getChunkStore - -▸ **getChunkStore**(): [_default_](backend_storage_persistentchunkstore.default.md) - -**Returns:** [_default_](backend_storage_persistentchunkstore.default.md) - ---- - -### getConstructors - -▸ **getConstructors**(): _object_ - -Returns constructors of classes that may be useful for developing plugins. - -**Returns:** _object_ - -| Name | Type | -| :------------------- | :---------------------------------------------------------------------------------- | -| `MinerManager` | _typeof_ [_default_](backend_miner_minermanager.default.md) | -| `SpiralPattern` | _typeof_ [_SpiralPattern_](backend_miner_miningpatterns.spiralpattern.md) | -| `SwissCheesePattern` | _typeof_ [_SwissCheesePattern_](backend_miner_miningpatterns.swisscheesepattern.md) | - ---- - -### getContractAddress - -▸ **getContractAddress**(): EthAddress - -Gets the address of the `DarkForestCore` contract, which is essentially -the 'backend' of the game. - -**Returns:** EthAddress - ---- - -### getContractConstants - -▸ **getContractConstants**(): [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) - -**Returns:** [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) - ---- - -### getConversation - -▸ **getConversation**(`artifactId`: ArtifactId): _Promise_ - -Gets the GPT conversation with an artifact; undefined if there is none so far - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _Promise_ - ---- - -### getCurrentlyExploringChunk - -▸ **getCurrentlyExploringChunk**(): _undefined_ \| [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - -Gets the rectangle bounding the chunk that the miner is currently in the process -of hashing. - -**Returns:** _undefined_ \| [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - ---- - -### getDiagnostics - -▸ **getDiagnostics**(): [_Diagnostics_](../interfaces/frontend_panes_diagnosticspane.diagnostics.md) - -Gets some diagnostic information about the game. Returns a copy, you can't modify it. - -**Returns:** [_Diagnostics_](../interfaces/frontend_panes_diagnosticspane.diagnostics.md) - ---- - -### getDist - -▸ **getDist**(`fromId`: LocationId, `toId`: LocationId): _number_ - -Gets the distance between two planets. Throws an exception if you don't -know the location of either planet. - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `fromId` | LocationId | -| `toId` | LocationId | - -**Returns:** _number_ - ---- - -### getDistCoords - -▸ **getDistCoords**(`fromCoords`: WorldCoords, `toCoords`: WorldCoords): _number_ - -Gets the distance between two coordinates in space. - -#### Parameters - -| Name | Type | -| :----------- | :---------- | -| `fromCoords` | WorldCoords | -| `toCoords` | WorldCoords | - -**Returns:** _number_ - ---- - -### getEndTimeSeconds - -▸ **getEndTimeSeconds**(): _number_ - -The game ends at a particular time in the future - get this time measured -in seconds from the epoch. - -**Returns:** _number_ - ---- - -### getEnergyArrivingForMove - -▸ **getEnergyArrivingForMove**(`fromId`: LocationId, `toId`: _undefined_ \| LocationId, `distance`: _undefined_ \| _number_, `sentEnergy`: _number_): _number_ - -Gets the amount of energy that would arrive if a voyage with the given parameters -was to occur. The toPlanet is optional, in case you want an estimate that doesn't include -wormhole speedups. - -#### Parameters - -| Name | Type | -| :----------- | :------------------------ | -| `fromId` | LocationId | -| `toId` | _undefined_ \| LocationId | -| `distance` | _undefined_ \| _number_ | -| `sentEnergy` | _number_ | - -**Returns:** _number_ - ---- - -### getEnergyCurveAtPercent - -▸ **getEnergyCurveAtPercent**(`planet`: Planet, `percent`: _number_): _number_ - -returns timestamp (seconds) that planet will reach percent% of energycap -time may be in the past - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `planet` | Planet | -| `percent` | _number_ | - -**Returns:** _number_ - ---- - -### getEnergyNeededForMove - -▸ **getEnergyNeededForMove**(`fromId`: LocationId, `toId`: LocationId, `arrivingEnergy`: _number_): _number_ - -Gets the amount of energy needed in order for a voyage from the given to the given -planet to arrive with your desired amount of energy. - -#### Parameters - -| Name | Type | -| :--------------- | :--------- | -| `fromId` | LocationId | -| `toId` | LocationId | -| `arrivingEnergy` | _number_ | - -**Returns:** _number_ - ---- - -### getEnergyOfPlayer - -▸ **getEnergyOfPlayer**(`player`: EthAddress): _number_ - -Gets the total amount of energy that lives on planets that the given player owns. - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `player` | EthAddress | - -**Returns:** _number_ - ---- - -### getEthConnection - -▸ **getEthConnection**(): [_default_](backend_network_ethconnection.default.md) - -**Returns:** [_default_](backend_network_ethconnection.default.md) - ---- - -### getExploredChunks - -▸ **getExploredChunks**(): _Iterable_<[_Chunk_](_types_global_globaltypes.chunk.md)\> - -Gets all the map chunks that this client is aware of. Chunks may have come from -mining, or from importing map data. - -**Returns:** _Iterable_<[_Chunk_](_types_global_globaltypes.chunk.md)\> - ---- - -### getGameObjects - -▸ **getGameObjects**(): [_GameObjects_](backend_gamelogic_gameobjects.gameobjects.md) - -Gets a reference to the game's internal representation of the world state. This includes -voyages, planets, artifacts, and active wormholes, - -**Returns:** [_GameObjects_](backend_gamelogic_gameobjects.gameobjects.md) - ---- - -### getGptCreditBalanceEmitter - -▸ **getGptCreditBalanceEmitter**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getGptCreditPriceEmitter - -▸ **getGptCreditPriceEmitter**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getHashConfig - -▸ **getHashConfig**(): [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) - -Gets the HASH CONFIG - -**Returns:** [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) - ---- - -### getHashesPerSec - -▸ **getHashesPerSec**(): _number_ - -Gets the amount of hashes per second that the miner manager is calculating. - -**Returns:** _number_ - ---- - -### getHomeCoords - -▸ **getHomeCoords**(): _undefined_ \| WorldCoords - -Gets the location of your home planet. - -**Returns:** _undefined_ \| WorldCoords - ---- - -### getHomeHash - -▸ **getHomeHash**(): _undefined_ \| LocationId - -Gets the hash of the location of your home planet. - -**Returns:** _undefined_ \| LocationId - ---- - -### getIsBuyingCreditsEmitter - -▸ **getIsBuyingCreditsEmitter**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getLocationOfPlanet - -▸ **getLocationOfPlanet**(`planetId`: LocationId): _undefined_ \| WorldLocation - -Gets the location of the given planet. Returns undefined if the planet does not exist, or if -we do not know the location of this planet NOT update the planet if the planet is stale, -which means this function is fast. - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _undefined_ \| WorldLocation - ---- - -### getMaxMoveDist - -▸ **getMaxMoveDist**(`planetId`: LocationId, `sendingPercent`: _number_): _number_ - -Gets the maximuim distance that you can send your energy from the given planet, -using the given percentage of that planet's current silver. - -#### Parameters - -| Name | Type | -| :--------------- | :--------- | -| `planetId` | LocationId | -| `sendingPercent` | _number_ | - -**Returns:** _number_ - ---- - -### getMiningPattern - -▸ **getMiningPattern**(): _undefined_ \| [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) - -Gets the mining pattern that the miner is currently using. - -**Returns:** _undefined_ \| [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) - ---- - -### getMyArtifactMap - -▸ **getMyArtifactMap**(): _Map_ - -Return a reference to the map of my artifacts - -**Returns:** _Map_ - ---- - -### getMyArtifacts - -▸ **getMyArtifacts**(): Artifact[] - -gets both deposited artifacts that are on planets i own as well as artifacts i own - -**Returns:** Artifact[] - ---- - -### getMyArtifactsUpdated$ - -▸ **getMyArtifactsUpdated$**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter)\> - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter)\> - ---- - -### getMyBalance - -▸ **getMyBalance**(): _number_ - -Gets the balance of the account - -**Returns:** _number_ - ---- - -### getMyBalanceEmitter - -▸ **getMyBalanceEmitter**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getMyPlanetMap - -▸ **getMyPlanetMap**(): _Map_ - -Return a reference to the map of my planets - -**Returns:** _Map_ - ---- - -### getMyPlanets - -▸ **getMyPlanets**(): Planet[] - -Gets a list of the planets that the player logged into this `GameManager` owns. - -**Returns:** Planet[] - ---- - -### getMyPlanetsUpdated$ - -▸ **getMyPlanetsUpdated$**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter)\> - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter)\> - ---- - -### getMyScore - -▸ **getMyScore**(): _number_ - -Get the score of the currently logged-in account. - -**Returns:** _number_ - ---- - -### getNextBroadcastAvailableTimestamp - -▸ **getNextBroadcastAvailableTimestamp**(): _number_ - -Gets the timestamp (ms) of the next time that we can broadcast the coordinates of a planet. - -**Returns:** _number_ - ---- - -### getNextRevealCountdownInfo - -▸ **getNextRevealCountdownInfo**(): [_RevealCountdownInfo_](../interfaces/_types_global_globaltypes.revealcountdowninfo.md) - -Returns info about the next time you can broadcast coordinates - -**Returns:** [_RevealCountdownInfo_](../interfaces/_types_global_globaltypes.revealcountdowninfo.md) - ---- - -### getNotificationsManager - -▸ **getNotificationsManager**(): [_default_](frontend_game_notificationmanager.default.md) - -**Returns:** [_default_](frontend_game_notificationmanager.default.md) - ---- - -### getPerlinThresholds - -▸ **getPerlinThresholds**(): [*number*, *number*, *number*] - -The perlin value at each coordinate determines the space type. There are four space -types, which means there are four ranges on the number line that correspond to -each space type. This function returns the boundary values between each of these -four ranges: `PERLIN_THRESHOLD_1`, `PERLIN_THRESHOLD_2`, `PERLIN_THRESHOLD_3`. - -**Returns:** [*number*, *number*, *number*] - ---- - -### getPlanetLevel - -▸ **getPlanetLevel**(`planetId`: LocationId): _undefined_ \| ZERO \| ONE \| TWO \| THREE \| FOUR \| FIVE \| SIX \| SEVEN \| EIGHT \| NINE - -Gets the level of the given planet. Returns undefined if the planet does not exist. Does -NOT update the planet if the planet is stale, which means this function is fast. - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _undefined_ \| ZERO \| ONE \| TWO \| THREE \| FOUR \| FIVE \| SIX \| SEVEN \| EIGHT \| NINE - ---- - -### getPlanetMap - -▸ **getPlanetMap**(): _Map_ - -Return a reference to the planet map - -**Returns:** _Map_ - ---- - -### getPlanetRarity - -▸ **getPlanetRarity**(): _number_ - -Gets the rarity of planets in the universe - -**Returns:** _number_ - ---- - -### getPlanetUpdated$ - -▸ **getPlanetUpdated$**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getPlanetWithCoords - -▸ **getPlanetWithCoords**(`coords`: WorldCoords): _undefined_ \| Planet - -Gets the planet that is located at the given coordinates. Returns undefined if not a valid -location or if no planet exists at location. If the planet needs to be updated (because -some time has passed since we last updated the planet), then updates that planet first. - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _undefined_ \| Planet - ---- - -### getPlanetWithId - -▸ **getPlanetWithId**(`planetId`: _undefined_ \| LocationId): _undefined_ \| Planet - -Gets the planet with the given hash. Returns undefined if the planet is neither in the contract -nor has been discovered locally. If the planet needs to be updated (because some time has -passed since we last updated the planet), then updates that planet first. - -#### Parameters - -| Name | Type | -| :--------- | :------------------------ | -| `planetId` | _undefined_ \| LocationId | - -**Returns:** _undefined_ \| Planet - ---- - -### getPlanetsInRange - -▸ **getPlanetsInRange**(`planetId`: LocationId, `sendingPercent`: _number_): Planet[] - -Gets all the planets that you can reach with at least 1 energy from -the given planet. - -#### Parameters - -| Name | Type | -| :--------------- | :--------- | -| `planetId` | LocationId | -| `sendingPercent` | _number_ | - -**Returns:** Planet[] - ---- - -### getPlanetsInWorldRectangle - -▸ **getPlanetsInWorldRectangle**(`worldX`: _number_, `worldY`: _number_, `worldWidth`: _number_, `worldHeight`: _number_, `levels`: _number_[], `planetLevelToRadii`: _Map_, `updateIfStale?`: _boolean_): LocatablePlanet[] - -Gets the ids of all the planets that are both within the given bounding box (defined by its bottom -left coordinate, width, and height) in the world and of a level that was passed in via the -`planetLevels` parameter. - -#### Parameters - -| Name | Type | Default value | -| :------------------- | :----------------------------------------------------------------------------------- | :------------ | -| `worldX` | _number_ | - | -| `worldY` | _number_ | - | -| `worldWidth` | _number_ | - | -| `worldHeight` | _number_ | - | -| `levels` | _number_[] | - | -| `planetLevelToRadii` | _Map_ | - | -| `updateIfStale` | _boolean_ | true | - -**Returns:** LocatablePlanet[] - ---- - -### getPlanetsWithIds - -▸ **getPlanetsWithIds**(`planetId`: LocationId[]): Planet[] - -Gets a list of planets in the client's memory with the given ids. If a planet with the given id -doesn't exist, no entry for that planet will be returned in the result. - -#### Parameters - -| Name | Type | -| :--------- | :----------- | -| `planetId` | LocationId[] | - -**Returns:** Planet[] - ---- - -### getPrivateKey - -▸ **getPrivateKey**(): _string_ - -Gets the private key of the burner wallet used by this account. - -**Returns:** _string_ - ---- - -### getProcgenUtils - -▸ **getProcgenUtils**(): _typeof_ [_ProcgenUtils_](backend_procedural_procgenutils.procgenutils.md) - -Helpful functions for getting the names, descriptions, and colors of in-game entities. - -**Returns:** _typeof_ [_ProcgenUtils_](backend_procedural_procgenutils.procgenutils.md) - ---- - -### getRandomHomePlanetCoords - -▸ `Private` **getRandomHomePlanetCoords**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### getRevealedLocations - -▸ **getRevealedLocations**(): _Map_ - -Gets a map of all location IDs whose coords have been publicly revealed - -**Returns:** _Map_ - ---- - -### getSignedTwitter - -▸ **getSignedTwitter**(`twitter`: _string_): _Promise_ - -Signs the given twitter handle with the private key of the current user. Used to -verify that the person who owns the Dark Forest account was the one that attempted -to link a twitter to their account. - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `twitter` | _string_ | - -**Returns:** _Promise_ - ---- - -### getSilverCurveAtPercent - -▸ **getSilverCurveAtPercent**(`planet`: Planet, `percent`: _number_): _undefined_ \| _number_ - -returns timestamp (seconds) that planet will reach percent% of silcap if -doesn't produce silver, returns undefined if already over percent% of silcap, - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `planet` | Planet | -| `percent` | _number_ | - -**Returns:** _undefined_ \| _number_ - ---- - -### getSilverOfPlayer - -▸ **getSilverOfPlayer**(`player`: EthAddress): _number_ - -Gets the total amount of silver that lives on planets that the given player owns. - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `player` | EthAddress | - -**Returns:** _number_ - ---- - -### getStalePlanetWithId - -▸ **getStalePlanetWithId**(`planetId`: LocationId): _undefined_ \| Planet - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _undefined_ \| Planet - ---- - -### getTemperature - -▸ **getTemperature**(`coords`: WorldCoords): _number_ - -Gets the temperature of a given location. - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _number_ - ---- - -### getTimeForMove - -▸ **getTimeForMove**(`fromId`: LocationId, `toId`: LocationId): _number_ - -Gets the amount of time, in seconds that a voyage between from the first to the -second planet would take. - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `fromId` | LocationId | -| `toId` | LocationId | - -**Returns:** _number_ - ---- - -### getTokenMintEndTimeSeconds - -▸ **getTokenMintEndTimeSeconds**(): _number_ - -Dark Forest tokens can only be minted up to a certain time - get this time measured in seconds from epoch. - -**Returns:** _number_ - ---- - -### getTwitter - -▸ **getTwitter**(`address`: _undefined_ \| EthAddress): _undefined_ \| _string_ - -Gets the twitter handle of the given ethereum account which is associated -with Dark Forest. - -#### Parameters - -| Name | Type | -| :-------- | :------------------------ | -| `address` | _undefined_ \| EthAddress | - -**Returns:** _undefined_ \| _string_ - ---- - -### getUIEventEmitter - -▸ **getUIEventEmitter**(): [_default_](frontend_utils_uiemitter.default.md) - -Helpful for listening to user input events. - -**Returns:** [_default_](frontend_utils_uiemitter.default.md) - ---- - -### getUnconfirmedMoves - -▸ **getUnconfirmedMoves**(): UnconfirmedMove[] - -Gets all moves that this client has queued to be uploaded to the contract, but -have not been successfully confirmed yet. - -**Returns:** UnconfirmedMove[] - ---- - -### getUnconfirmedUpgrades - -▸ **getUnconfirmedUpgrades**(): UnconfirmedUpgrade[] - -Gets all upgrades that this client has queued to be uploaded to the contract, but -have not been successfully confirmed yet. - -**Returns:** UnconfirmedUpgrade[] - ---- - -### getUnconfirmedWormholeActivations - -▸ **getUnconfirmedWormholeActivations**(): UnconfirmedActivateArtifact[] - -**Returns:** UnconfirmedActivateArtifact[] - ---- - -### getUniverseTotalEnergy - -▸ **getUniverseTotalEnergy**(): _number_ - -Gets the total amount of energy that lives on a planet that somebody owns. - -**Returns:** _number_ - ---- - -### getUpgrade - -▸ **getUpgrade**(`branch`: _number_, `level`: _number_): Upgrade - -Returns the upgrade that would be applied to a planet given a particular -upgrade branch (defense, range, speed) and level of upgrade. - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `branch` | _number_ | -| `level` | _number_ | - -**Returns:** Upgrade - ---- - -### getWithdrawnSilverOfPlayer - -▸ **getWithdrawnSilverOfPlayer**(`addr`: EthAddress): _number_ - -#### Parameters - -| Name | Type | -| :----- | :--------- | -| `addr` | EthAddress | - -**Returns:** _number_ - ---- - -### getWorldRadius - -▸ **getWorldRadius**(): _number_ - -Gets the radius of the playable area of the universe. - -**Returns:** _number_ - ---- - -### getWorldSilver - -▸ **getWorldSilver**(): _number_ - -Gets the total amount of silver that lives on a planet that somebody owns. - -**Returns:** _number_ - ---- - -### getWormholeFactors - -▸ **getWormholeFactors**(`fromPlanet`: Planet, `toPlanet`: Planet): _undefined_ \| { `distanceFactor`: _number_ ; `speedFactor`: _number_ } - -If there's an active artifact on either of these planets which happens to be a wormhole which -is active and targetting the other planet, return the wormhole boost which is greater. Values -represent a multiplier. - -#### Parameters - -| Name | Type | -| :----------- | :----- | -| `fromPlanet` | Planet | -| `toPlanet` | Planet | - -**Returns:** _undefined_ \| { `distanceFactor`: _number_ ; `speedFactor`: _number_ } - ---- - -### getWormholes - -▸ **getWormholes**(): _Iterable_<[_Wormhole_](../modules/_types_global_globaltypes.md#wormhole)\> - -**Returns:** _Iterable_<[_Wormhole_](../modules/_types_global_globaltypes.md#wormhole)\> - ---- - -### handleTxIntent - -▸ `Private` **handleTxIntent**(`txIntent`: TxIntent): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** _void_ - ---- - -### hardRefreshArtifact - -▸ `Private` **hardRefreshArtifact**(`artifactId`: ArtifactId): _Promise_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _Promise_ - ---- - -### hardRefreshPlanet - -▸ `Private` **hardRefreshPlanet**(`planetId`: LocationId): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _Promise_ - ---- - -### hardRefreshPlayer - -▸ `Private` **hardRefreshPlayer**(`address`: EthAddress): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :--------- | -| `address` | EthAddress | - -**Returns:** _Promise_ - ---- - -### hasJoinedGame - -▸ **hasJoinedGame**(): _boolean_ - -Whether or not this client has successfully found and landed on a home planet. - -**Returns:** _boolean_ - ---- - -### hasMinedChunk - -▸ **hasMinedChunk**(`chunkLocation`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): _boolean_ - -Whether or not the given rectangle has been mined. - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------------------ | -| `chunkLocation` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** _boolean_ - ---- - -### initMiningManager - -▸ `Private` **initMiningManager**(`homeCoords`: WorldCoords): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :---------- | -| `homeCoords` | WorldCoords | - -**Returns:** _void_ - ---- - -### isMining - -▸ **isMining**(): _boolean_ - -Whether or not the miner is currently exploring space. - -**Returns:** _boolean_ - ---- - -### isPlanetMineable - -▸ **isPlanetMineable**(`p`: Planet): _boolean_ - -Whether or not the given planet is capable of minting an artifact. - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `p` | Planet | - -**Returns:** _boolean_ - ---- - -### isRoundOver - -▸ **isRoundOver**(): _boolean_ - -Returns whether or not the current round has ended. - -**Returns:** _boolean_ - ---- - -### joinGame - -▸ **joinGame**(`beforeRetry`: (`e`: Error) => _Promise_): [_default_](backend_gamelogic_gamemanager.default.md) - -Attempts to join the game. Should not be called once you've already joined. - -#### Parameters - -| Name | Type | -| :------------ | :---------------------------------- | -| `beforeRetry` | (`e`: Error) => _Promise_ | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### loadContract - -▸ **loadContract**(`contractAddress`: _string_, `contractABI`: ContractInterface): _Promise_ - -Returns an instance of a `Contract` from the ethersjs library. This is the library we use to -connect to the blockchain. For documentation about how `Contract` works, see: -https://docs.ethers.io/v5/api/contract/contract/ - -#### Parameters - -| Name | Type | -| :---------------- | :---------------- | -| `contractAddress` | _string_ | -| `contractABI` | ContractInterface | - -**Returns:** _Promise_ - ---- - -### loadPlugins - -▸ **loadPlugins**(): _Promise_<[_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[]\> - -Load the serialized versions of all the plugins that this player has. - -**Returns:** _Promise_<[_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[]\> - ---- - -### locationFromCoords - -▸ `Private` **locationFromCoords**(`coords`: WorldCoords): WorldLocation - -computes the WorldLocation object corresponding to a set of coordinates -very slow since it actually calculates the hash; do not use in render loop - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** WorldLocation - ---- - -### move - -▸ **move**(`from`: LocationId, `to`: LocationId, `forces`: _number_, `silver`: _number_, `artifactMoved?`: ArtifactId, `bypassChecks?`: _boolean_): [_default_](backend_gamelogic_gamemanager.default.md) - -Submits a transaction to the blockchain to move the given amount of resources from -the given planet to the given planet. - -#### Parameters - -| Name | Type | Default value | -| :--------------- | :--------- | :------------ | -| `from` | LocationId | - | -| `to` | LocationId | - | -| `forces` | _number_ | - | -| `silver` | _number_ | - | -| `artifactMoved?` | ArtifactId | - | -| `bypassChecks` | _boolean_ | false | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### onTxConfirmed - -▸ `Private` **onTxConfirmed**(`unminedTx`: SubmittedTx): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :---------- | -| `unminedTx` | SubmittedTx | - -**Returns:** _void_ - ---- - -### onTxIntentFail - -▸ `Private` **onTxIntentFail**(`txIntent`: TxIntent, `e`: Error): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | -| `e` | Error | - -**Returns:** _void_ - ---- - -### onTxReverted - -▸ `Private` **onTxReverted**(`unminedTx`: SubmittedTx): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :---------- | -| `unminedTx` | SubmittedTx | - -**Returns:** _void_ - ---- - -### onTxSubmit - -▸ `Private` **onTxSubmit**(`unminedTx`: SubmittedTx): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :---------- | -| `unminedTx` | SubmittedTx | - -**Returns:** _void_ - ---- - -### prospectPlanet - -▸ **prospectPlanet**(`planetId`: LocationId, `bypassChecks?`: _boolean_): _Promise_ - -#### Parameters - -| Name | Type | Default value | -| :------------- | :--------- | :------------ | -| `planetId` | LocationId | - | -| `bypassChecks` | _boolean_ | false | - -**Returns:** _Promise_ - ---- - -### refreshMyGPTCredits - -▸ `Private` **refreshMyGPTCredits**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### refreshServerPlanetStates - -▸ **refreshServerPlanetStates**(`planetIds`: LocationId[]): _Promise_ - -We have two locations which planet state can live: on the server, and on the blockchain. We use -the blockchain for the 'physics' of the universe, and the webserver for optional 'add-on' -features, which are cryptographically secure, but live off-chain. - -This function loads the planet states which live on the server. Plays nicely with our -notifications system and sets the appropriate loading state values on the planet. - -#### Parameters - -| Name | Type | -| :---------- | :----------- | -| `planetIds` | LocationId[] | - -**Returns:** _Promise_ - ---- - -### refreshTwitters - -▸ `Private` **refreshTwitters**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### revealLocation - -▸ **revealLocation**(`planetId`: LocationId): [_default_](backend_gamelogic_gamemanager.default.md) - -Reveals a planet's location on-chain. - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### savePlugins - -▸ **savePlugins**(`savedPlugins`: [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[]): _Promise_ - -Overwrites all the saved plugins to equal the given array of plugins. - -#### Parameters - -| Name | Type | -| :------------- | :----------------------------------------------------------------------------------------- | -| `savedPlugins` | [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[] | - -**Returns:** _Promise_ - ---- - -### setMinerCores - -▸ **setMinerCores**(`nCores`: _number_): _void_ - -Set the amount of cores to mine the universe with. More cores equals faster! - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `nCores` | _number_ | - -**Returns:** _void_ - ---- - -### setMiningPattern - -▸ **setMiningPattern**(`pattern`: [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md)): _void_ - -Sets the mining pattern of the miner. This kills the old miner and starts this one. - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------- | -| `pattern` | [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) | - -**Returns:** _void_ - ---- - -### setPlanetEmoji - -▸ **setPlanetEmoji**(`locationId`: LocationId, `emojiStr`: _string_): _Promise_ - -If you are the owner of this planet, you can set an 'emoji' to hover above the planet. -`emojiStr` must be a string that contains a single emoji, otherwise this function will throw an -error. - -The emoji is stored off-chain in a postgres database. We verify planet ownership via a contract -call from the webserver, and by verifying that the request to add (or remove) an emoji from a -planet was signed by the owner. - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `locationId` | LocationId | -| `emojiStr` | _string_ | - -**Returns:** _Promise_ - ---- - -### setRadius - -▸ `Private` **setRadius**(`worldRadius`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------------ | :------- | -| `worldRadius` | _number_ | - -**Returns:** _void_ - ---- - -### setSnarkCacheSize - -▸ **setSnarkCacheSize**(`size`: _number_): _void_ - -Changes the amount of move snark proofs that are cached. - -#### Parameters - -| Name | Type | -| :----- | :------- | -| `size` | _number_ | - -**Returns:** _void_ - ---- - -### signMessage - -▸ `Private` **signMessage**(`obj`: T): _Promise_\> - -Returns a signed version of this message. - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :---- | :--- | -| `obj` | T | - -**Returns:** _Promise_\> - ---- - -### softRefreshPlanet - -▸ `Private` **softRefreshPlanet**(`planetId`: LocationId): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _Promise_ - ---- - -### spaceTypeFromPerlin - -▸ **spaceTypeFromPerlin**(`perlin`: _number_): SpaceType - -Each coordinate lives in a particular type of space, determined by a smooth random -function called 'perlin noise. - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `perlin` | _number_ | - -**Returns:** SpaceType - ---- - -### spaceTypePerlin - -▸ **spaceTypePerlin**(`coords`: WorldCoords, `floor`: _boolean_): _number_ - -Gets the perlin value at the given location in the world. SpaceType is based -on this value. - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | -| `floor` | _boolean_ | - -**Returns:** _number_ - ---- - -### startConversation - -▸ **startConversation**(`artifactId`: ArtifactId): _Promise_ - -Starts a GPT conversation with an artifact - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _Promise_ - ---- - -### startExplore - -▸ **startExplore**(): _void_ - -Starts the miner. - -**Returns:** _void_ - ---- - -### stepConversation - -▸ **stepConversation**(`artifactId`: ArtifactId, `message`: _string_): _Promise_ - -Sends a message to an artifact you are having a GPT conversation with - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | -| `message` | _string_ | - -**Returns:** _Promise_ - ---- - -### stopExplore - -▸ **stopExplore**(): _void_ - -Stops the miner. - -**Returns:** _void_ - ---- - -### submitPlanetMessage - -▸ `Private` **submitPlanetMessage**(`locationId`: LocationId, `type`: EmojiFlag, `body`: _unknown_): _Promise_ - -The planet emoji feature is built on top of a more general 'Planet Message' system, which -allows players to upload pieces of data called 'Message's to planets that they own. Emojis are -just one type of message. Their implementation leaves the door open to more off-chain data. - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `locationId` | LocationId | -| `type` | EmojiFlag | -| `body` | _unknown_ | - -**Returns:** _Promise_ - ---- - -### transferOwnership - -▸ **transferOwnership**(`planetId`: LocationId, `newOwner`: EthAddress, `bypassChecks?`: _boolean_): [_default_](backend_gamelogic_gamemanager.default.md) - -#### Parameters - -| Name | Type | Default value | -| :------------- | :--------- | :------------ | -| `planetId` | LocationId | - | -| `newOwner` | EthAddress | - | -| `bypassChecks` | _boolean_ | false | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### updateDiagnostics - -▸ **updateDiagnostics**(`updateFn`: (`d`: [_Diagnostics_](../interfaces/frontend_panes_diagnosticspane.diagnostics.md)) => _void_): _void_ - -Updates the diagnostic info of the game using the supplied function. Ideally, each spot in the -codebase that would like to record a metric is able to update its specific metric in a -convenient manner. - -#### Parameters - -| Name | Type | -| :--------- | :-------------------------------------------------------------------------------------------- | -| `updateFn` | (`d`: [_Diagnostics_](../interfaces/frontend_panes_diagnosticspane.diagnostics.md)) => _void_ | - -**Returns:** _void_ - ---- - -### upgrade - -▸ **upgrade**(`planetId`: LocationId, `branch`: _number_, `_bypassChecks?`: _boolean_): [_default_](backend_gamelogic_gamemanager.default.md) - -Submits a transaction to the blockchain to upgrade the given planet with the given -upgrade branch. You must own the planet, and have enough silver on it to complete -the upgrade. - -#### Parameters - -| Name | Type | Default value | -| :-------------- | :--------- | :------------ | -| `planetId` | LocationId | - | -| `branch` | _number_ | - | -| `_bypassChecks` | _boolean_ | false | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### verifyMessage - -▸ `Private` **verifyMessage**(`message`: _SignedMessage_): _Promise_ - -Checks that a message signed by {@link GameManager#signMessage} was signed by the address that -it claims it was signed by. - -#### Parameters - -| Name | Type | -| :-------- | :------------------------ | -| `message` | _SignedMessage_ | - -**Returns:** _Promise_ - ---- - -### verifyTwitter - -▸ **verifyTwitter**(`twitter`: _string_): _Promise_ - -Once you have posted the verificatoin tweet - complete the twitter-account-linking -process by telling the Dark Forest webserver to look at that tweet. - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `twitter` | _string_ | - -**Returns:** _Promise_ - ---- - -### withdrawArtifact - -▸ **withdrawArtifact**(`locationId`: LocationId, `artifactId`: ArtifactId, `bypassChecks?`: _boolean_): [_default_](backend_gamelogic_gamemanager.default.md) - -Withdraws the artifact that is locked up on the given planet. - -#### Parameters - -| Name | Type | Default value | -| :------------- | :--------- | :------------ | -| `locationId` | LocationId | - | -| `artifactId` | ArtifactId | - | -| `bypassChecks` | _boolean_ | true | - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### withdrawSilver - -▸ **withdrawSilver**(`locationId`: LocationId, `amount`: _number_, `bypassChecks?`: _boolean_): _undefined_ \| [_default_](backend_gamelogic_gamemanager.default.md) - -#### Parameters - -| Name | Type | Default value | -| :------------- | :--------- | :------------ | -| `locationId` | LocationId | - | -| `amount` | _number_ | - | -| `bypassChecks` | _boolean_ | false | - -**Returns:** _undefined_ \| [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### create - -▸ `Static` **create**(`ethConnection`: [_default_](backend_network_ethconnection.default.md), `terminal`: _MutableRefObject_): _Promise_<[_default_](backend_gamelogic_gamemanager.default.md)\> - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------------------------------------------------------------ | -| `ethConnection` | [_default_](backend_network_ethconnection.default.md) | -| `terminal` | _MutableRefObject_ | - -**Returns:** _Promise_<[_default_](backend_gamelogic_gamemanager.default.md)\> diff --git a/docs/classes/backend_gamelogic_gameobjects.gameobjects.md b/docs/classes/backend_gamelogic_gameobjects.gameobjects.md deleted file mode 100644 index 4b072267..00000000 --- a/docs/classes/backend_gamelogic_gameobjects.gameobjects.md +++ /dev/null @@ -1,1123 +0,0 @@ -# Class: GameObjects - -[Backend/GameLogic/GameObjects](../modules/backend_gamelogic_gameobjects.md).GameObjects - -Representation of the objects which exist in the world. - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_gameobjects.gameobjects.md#constructor) - -### Properties - -- [address](backend_gamelogic_gameobjects.gameobjects.md#address) -- [arrivals](backend_gamelogic_gameobjects.gameobjects.md#arrivals) -- [artifactUpdated$](backend_gamelogic_gameobjects.gameobjects.md#artifactupdated$) -- [artifacts](backend_gamelogic_gameobjects.gameobjects.md#artifacts) -- [contractConstants](backend_gamelogic_gameobjects.gameobjects.md#contractconstants) -- [coordsToLocation](backend_gamelogic_gameobjects.gameobjects.md#coordstolocation) -- [isBuyingCredits$](backend_gamelogic_gameobjects.gameobjects.md#isbuyingcredits$) -- [layeredMap](backend_gamelogic_gameobjects.gameobjects.md#layeredmap) -- [myArtifacts](backend_gamelogic_gameobjects.gameobjects.md#myartifacts) -- [myArtifactsUpdated$](backend_gamelogic_gameobjects.gameobjects.md#myartifactsupdated$) -- [myPlanets](backend_gamelogic_gameobjects.gameobjects.md#myplanets) -- [myPlanetsUpdated$](backend_gamelogic_gameobjects.gameobjects.md#myplanetsupdated$) -- [planetArrivalIds](backend_gamelogic_gameobjects.gameobjects.md#planetarrivalids) -- [planetLocationMap](backend_gamelogic_gameobjects.gameobjects.md#planetlocationmap) -- [planetUpdated$](backend_gamelogic_gameobjects.gameobjects.md#planetupdated$) -- [planets](backend_gamelogic_gameobjects.gameobjects.md#planets) -- [revealedLocations](backend_gamelogic_gameobjects.gameobjects.md#revealedlocations) -- [touchedPlanetIds](backend_gamelogic_gameobjects.gameobjects.md#touchedplanetids) -- [unconfirmedBuyGPTCredits](backend_gamelogic_gameobjects.gameobjects.md#unconfirmedbuygptcredits) -- [unconfirmedBuyHats](backend_gamelogic_gameobjects.gameobjects.md#unconfirmedbuyhats) -- [unconfirmedMoves](backend_gamelogic_gameobjects.gameobjects.md#unconfirmedmoves) -- [unconfirmedPlanetTransfers](backend_gamelogic_gameobjects.gameobjects.md#unconfirmedplanettransfers) -- [unconfirmedReveal](backend_gamelogic_gameobjects.gameobjects.md#unconfirmedreveal) -- [unconfirmedUpgrades](backend_gamelogic_gameobjects.gameobjects.md#unconfirmedupgrades) -- [unconfirmedWormholeActivations](backend_gamelogic_gameobjects.gameobjects.md#unconfirmedwormholeactivations) -- [wormholes](backend_gamelogic_gameobjects.gameobjects.md#wormholes) - -### Methods - -- [addPlanetLocation](backend_gamelogic_gameobjects.gameobjects.md#addplanetlocation) -- [calculateSilverSpent](backend_gamelogic_gameobjects.gameobjects.md#calculatesilverspent) -- [clearOldArrivals](backend_gamelogic_gameobjects.gameobjects.md#clearoldarrivals) -- [clearUnconfirmedTxIntent](backend_gamelogic_gameobjects.gameobjects.md#clearunconfirmedtxintent) -- [defaultPlanetFromLocation](backend_gamelogic_gameobjects.gameobjects.md#defaultplanetfromlocation) -- [getAllOwnedPlanets](backend_gamelogic_gameobjects.gameobjects.md#getallownedplanets) -- [getAllPlanets](backend_gamelogic_gameobjects.gameobjects.md#getallplanets) -- [getAllPlanetsMap](backend_gamelogic_gameobjects.gameobjects.md#getallplanetsmap) -- [getAllVoyages](backend_gamelogic_gameobjects.gameobjects.md#getallvoyages) -- [getArtifactById](backend_gamelogic_gameobjects.gameobjects.md#getartifactbyid) -- [getArtifactController](backend_gamelogic_gameobjects.gameobjects.md#getartifactcontroller) -- [getArtifactMap](backend_gamelogic_gameobjects.gameobjects.md#getartifactmap) -- [getArtifactsOnPlanetsOwnedBy](backend_gamelogic_gameobjects.gameobjects.md#getartifactsonplanetsownedby) -- [getArtifactsOwnedBy](backend_gamelogic_gameobjects.gameobjects.md#getartifactsownedby) -- [getBiome](backend_gamelogic_gameobjects.gameobjects.md#getbiome) -- [getEnergyCurveAtPercent](backend_gamelogic_gameobjects.gameobjects.md#getenergycurveatpercent) -- [getIsBuyingCreditsEmitter](backend_gamelogic_gameobjects.gameobjects.md#getisbuyingcreditsemitter) -- [getLocationOfPlanet](backend_gamelogic_gameobjects.gameobjects.md#getlocationofplanet) -- [getMyArtifactMap](backend_gamelogic_gameobjects.gameobjects.md#getmyartifactmap) -- [getMyPlanetMap](backend_gamelogic_gameobjects.gameobjects.md#getmyplanetmap) -- [getPlanetArtifacts](backend_gamelogic_gameobjects.gameobjects.md#getplanetartifacts) -- [getPlanetDetailLevel](backend_gamelogic_gameobjects.gameobjects.md#getplanetdetaillevel) -- [getPlanetLevel](backend_gamelogic_gameobjects.gameobjects.md#getplanetlevel) -- [getPlanetMap](backend_gamelogic_gameobjects.gameobjects.md#getplanetmap) -- [getPlanetWithCoords](backend_gamelogic_gameobjects.gameobjects.md#getplanetwithcoords) -- [getPlanetWithId](backend_gamelogic_gameobjects.gameobjects.md#getplanetwithid) -- [getPlanetWithLocation](backend_gamelogic_gameobjects.gameobjects.md#getplanetwithlocation) -- [getPlanetsInWorldRectangle](backend_gamelogic_gameobjects.gameobjects.md#getplanetsinworldrectangle) -- [getRevealedLocations](backend_gamelogic_gameobjects.gameobjects.md#getrevealedlocations) -- [getSilverCurveAtPercent](backend_gamelogic_gameobjects.gameobjects.md#getsilvercurveatpercent) -- [getUnconfirmedBuyGPTCredits](backend_gamelogic_gameobjects.gameobjects.md#getunconfirmedbuygptcredits) -- [getUnconfirmedMoves](backend_gamelogic_gameobjects.gameobjects.md#getunconfirmedmoves) -- [getUnconfirmedReveal](backend_gamelogic_gameobjects.gameobjects.md#getunconfirmedreveal) -- [getUnconfirmedUpgrades](backend_gamelogic_gameobjects.gameobjects.md#getunconfirmedupgrades) -- [getUnconfirmedWormholeActivations](backend_gamelogic_gameobjects.gameobjects.md#getunconfirmedwormholeactivations) -- [getWormholes](backend_gamelogic_gameobjects.gameobjects.md#getwormholes) -- [isPlanetInContract](backend_gamelogic_gameobjects.gameobjects.md#isplanetincontract) -- [markLocationRevealed](backend_gamelogic_gameobjects.gameobjects.md#marklocationrevealed) -- [onTxIntent](backend_gamelogic_gameobjects.gameobjects.md#ontxintent) -- [planetLevelFromHexPerlin](backend_gamelogic_gameobjects.gameobjects.md#planetlevelfromhexperlin) -- [planetTypeFromHexPerlin](backend_gamelogic_gameobjects.gameobjects.md#planettypefromhexperlin) -- [processArrivalsForPlanet](backend_gamelogic_gameobjects.gameobjects.md#processarrivalsforplanet) -- [replaceArtifactFromContractData](backend_gamelogic_gameobjects.gameobjects.md#replaceartifactfromcontractdata) -- [replaceArtifactsFromContractData](backend_gamelogic_gameobjects.gameobjects.md#replaceartifactsfromcontractdata) -- [replacePlanetFromContractData](backend_gamelogic_gameobjects.gameobjects.md#replaceplanetfromcontractdata) -- [setArtifact](backend_gamelogic_gameobjects.gameobjects.md#setartifact) -- [setPlanet](backend_gamelogic_gameobjects.gameobjects.md#setplanet) -- [spaceTypeFromPerlin](backend_gamelogic_gameobjects.gameobjects.md#spacetypefromperlin) -- [updatePlanet](backend_gamelogic_gameobjects.gameobjects.md#updateplanet) -- [updatePlanetIfStale](backend_gamelogic_gameobjects.gameobjects.md#updateplanetifstale) -- [updateScore](backend_gamelogic_gameobjects.gameobjects.md#updatescore) -- [getSilverNeeded](backend_gamelogic_gameobjects.gameobjects.md#getsilverneeded) -- [planetCanUpgrade](backend_gamelogic_gameobjects.gameobjects.md#planetcanupgrade) - -## Constructors - -### constructor - -\+ **new GameObjects**(`address`: _undefined_ \| EthAddress, `touchedPlanets`: _Map_, `allTouchedPlanetIds`: _Set_, `revealedLocations`: _Map_, `artifacts`: _Map_, `allChunks`: _Iterable_<[_Chunk_](_types_global_globaltypes.chunk.md)\>, `unprocessedArrivals`: _Map_, `unprocessedPlanetArrivalIds`: _Map_, `contractConstants`: [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md), `worldRadius`: _number_): [_GameObjects_](backend_gamelogic_gameobjects.gameobjects.md) - -#### Parameters - -| Name | Type | -| :---------------------------- | :------------------------------------------------------------------------------------------------ | -| `address` | _undefined_ \| EthAddress | -| `touchedPlanets` | _Map_ | -| `allTouchedPlanetIds` | _Set_ | -| `revealedLocations` | _Map_ | -| `artifacts` | _Map_ | -| `allChunks` | _Iterable_<[_Chunk_](_types_global_globaltypes.chunk.md)\> | -| `unprocessedArrivals` | _Map_ | -| `unprocessedPlanetArrivalIds` | _Map_ | -| `contractConstants` | [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) | -| `worldRadius` | _number_ | - -**Returns:** [_GameObjects_](backend_gamelogic_gameobjects.gameobjects.md) - -## Properties - -### address - -• `Private` `Readonly` **address**: _undefined_ \| EthAddress - -This address of the player that is currently logged in. - -**`todo`** move this, along with all other objects relating to the currently logged-on player into a -new field: {@code player: PlayerInfo} - ---- - -### arrivals - -• `Private` `Readonly` **arrivals**: _Map_ - -Map of arrivals to timers that fire when an arrival arrives, in case that handler needs to be -cancelled for whatever reason. - ---- - -### artifactUpdated$ - -• `Readonly` **artifactUpdated$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -Event emitter which publishes whenever an artifact has been updated. - ---- - -### artifacts - -• `Private` `Readonly` **artifacts**: _Map_ - -Cached index of all known artifact data. - -**`see`** The same warning applys as the one on [GameObjects.planets](backend_gamelogic_gameobjects.gameobjects.md#planets) - ---- - -### contractConstants - -• `Private` `Readonly` **contractConstants**: [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) - -Some of the game's parameters are downloaded from the blockchain. This allows the client to be -flexible, and connect to any compatible set of Dark Forest contracts, download the parameters, -and join the game, taking into account the unique configuration of those specific Dark Forest -contracts. - ---- - -### coordsToLocation - -• `Private` `Readonly` **coordsToLocation**: _Map_ - -Map from a stringified representation of an x-y coordinate to an object that contains some more -information about the world at that location. - ---- - -### isBuyingCredits$ - -• `Readonly` **isBuyingCredits$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -Event emitter which publishes whenever the player begins and finishes (whether with a success -or an error) buying gpt credits. - -**`todo`** move into `PlayerInfo` - ---- - -### layeredMap - -• `Private` `Readonly` **layeredMap**: [_LayeredMap_](backend_gamelogic_layeredmap.layeredmap.md) - -This is a data structure that allows us to efficiently calculate which planets are visible on -the player's screen given the viewport's position and size. - ---- - -### myArtifacts - -• `Private` `Readonly` **myArtifacts**: _Map_ - -Cached index of artifacts owned by the player. - -**`see`** The same warning applys as the one on [GameObjects.planets](backend_gamelogic_gameobjects.gameobjects.md#planets) - ---- - -### myArtifactsUpdated$ - -• `Readonly` **myArtifactsUpdated$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter)\> - -Whenever one of the player's artifacts are updated, this event emitter publishes. See -[GameObjects.myPlanetsUpdated$](backend_gamelogic_gameobjects.gameobjects.md#myplanetsupdated$) for more info. - ---- - -### myPlanets - -• `Private` `Readonly` **myPlanets**: _Map_ - -Cached index of planets owned by the player. - -**`see`** The same warning applys as the one on [GameObjects.planets](backend_gamelogic_gameobjects.gameobjects.md#planets) - ---- - -### myPlanetsUpdated$ - -• `Readonly` **myPlanetsUpdated$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter)\> - -Whenever a planet is updated, we publish to this event with a reference to a map from location -id to planet. We need to rethink this event emitter because it currently publishes every time -that any planet is updated, and if a lot of them are updated at once (which i think is the case -once every two minutes) then this event emitter will publish a shitton of events. -TODO: rethink this - ---- - -### planetArrivalIds - -• `Private` `Readonly` **planetArrivalIds**: _Map_ - -Map from a location id (think of it as the unique id of each planet) to all the ids of the -voyages that are arriving on that planet. These include both the player's own voyages, and also -any potential invader's voyages. - ---- - -### planetLocationMap - -• `Private` `Readonly` **planetLocationMap**: _Map_ - -Map from location id (unique id of each planet) to some information about the location at which -this planet is located, if this client happens to know the coordinates of this planet. - ---- - -### planetUpdated$ - -• `Readonly` **planetUpdated$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -Event emitter which publishes whenever a planet is updated. - ---- - -### planets - -• `Private` `Readonly` **planets**: _Map_ - -Cached index of all known planet data. - -Warning! - -This should NEVER be set to directly! Any time you want to update a planet, you must call the -{@link GameObjects#setPlanet()} function. Following this rule enables us to reliably notify -other parts of the client when a particular object has been updated. TODO: what is the best way -to do this? - -**`todo`** extract the pattern we're using for the field tuples - -- {planets, myPlanets, myPlanetsUpdated, planetUpdated$} -- {artifacts, myArtifacts, myArtifactsUpdated, artifactUpdated$} - -into some sort of class. - ---- - -### revealedLocations - -• `Private` `Readonly` **revealedLocations**: _Map_ - -Map from location ids to, if that location id has been revealed on-chain, the world coordinates -of that location id, as well as some extra information regarding the circumstances of the -revealing of this planet. - ---- - -### touchedPlanetIds - -• `Private` `Readonly` **touchedPlanetIds**: _Set_ - -Set of all planet ids that we know have been interacted-with on-chain. - ---- - -### unconfirmedBuyGPTCredits - -• `Private` `Optional` **unconfirmedBuyGPTCredits**: UnconfirmedBuyGPTCredits - ---- - -### unconfirmedBuyHats - -• `Private` `Readonly` **unconfirmedBuyHats**: _Record_ - ---- - -### unconfirmedMoves - -• `Private` `Readonly` **unconfirmedMoves**: _Record_ - ---- - -### unconfirmedPlanetTransfers - -• `Private` `Readonly` **unconfirmedPlanetTransfers**: _Record_ - ---- - -### unconfirmedReveal - -• `Private` `Optional` **unconfirmedReveal**: UnconfirmedReveal - -The following set of fields represent actions which the user has initiated on the blockchain, -and have not yet completed. The nature of the blockchain is that transactions could take up to -several minutes to confirm (depending on network congestion). This means that we need to make -it clear to players that the action that they have initiated is indeed in progress, and that -something is actually happening. See `Prospect.tsx` for example. - -The storage and retrieval of unconfirmed transactions could, and -probablu should be abstracted into some sort of class which keeps in sync both _these_ fields -and each of these fields counterparts in their corresponding entity objects (Planet, Artifact, -etc.) - -**`todo`** these are good candidates for being in the `PlayerInfo` class. - ---- - -### unconfirmedUpgrades - -• `Private` `Readonly` **unconfirmedUpgrades**: _Record_ - ---- - -### unconfirmedWormholeActivations - -• `Private` `Readonly` **unconfirmedWormholeActivations**: UnconfirmedActivateArtifact[] - ---- - -### wormholes - -• `Private` `Readonly` **wormholes**: _Map_ - -Map from artifact ids to wormholes. - -## Methods - -### addPlanetLocation - -▸ **addPlanetLocation**(`planetLocation`: WorldLocation): _void_ - -Called when we load chunk data into memory (on startup), when we're loading all revealed locations (on startup), -when miner has mined a new chunk while exploring, and when a planet's location is revealed onchain during the course of play -Adds a WorldLocation to the planetLocationMap, making it known to the player locally -Sets an unsynced default planet in the PlanetMap this.planets -IMPORTANT: This is the only way a LocatablePlanet gets constructed -IMPORTANT: Idempotent - -#### Parameters - -| Name | Type | -| :--------------- | :------------ | -| `planetLocation` | WorldLocation | - -**Returns:** _void_ - ---- - -### calculateSilverSpent - -▸ `Private` **calculateSilverSpent**(`planet`: Planet): _number_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _number_ - ---- - -### clearOldArrivals - -▸ `Private` **clearOldArrivals**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### clearUnconfirmedTxIntent - -▸ **clearUnconfirmedTxIntent**(`txIntent`: TxIntent): _void_ - -Whenever a transaction that the user initiated either succeeds or fails, we need to clear the -fact that it was in progress from the event's corresponding entities. For example, whenever a -transaction that sends a voyage from one planet to another either succeeds or fails, we need to -remove the dashed line that connected them. - -Making sure that we never miss something here is very tedious. - -**`todo`** Make this less tedious. - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** _void_ - ---- - -### defaultPlanetFromLocation - -▸ `Private` **defaultPlanetFromLocation**(`location`: WorldLocation): LocatablePlanet - -returns the data for an unowned, untouched planet at location -most planets in the game are untouched and not stored in the contract, -so we need to generate their data optimistically in the client - -#### Parameters - -| Name | Type | -| :--------- | :------------ | -| `location` | WorldLocation | - -**Returns:** LocatablePlanet - ---- - -### getAllOwnedPlanets - -▸ **getAllOwnedPlanets**(): Planet[] - -Returns all the planets in the game which this client is aware of that have an owner, as a map -from their id to the planet - -**`tutorial`** For plugin developers! - -**`see`** Warning in {@link GameObjects.getAllPlanets()} - -**Returns:** Planet[] - ---- - -### getAllPlanets - -▸ **getAllPlanets**(): _Iterable_ - -Returns all planets in the game. - -Warning! Simply iterating over this is not performant, and is meant for scripting. - -**`tutorial`** For plugin developers! - -**Returns:** _Iterable_ - ---- - -### getAllPlanetsMap - -▸ **getAllPlanetsMap**(): _Map_ - -Returns all planets in the game, as a map from their location id to the planet. - -**`tutorial`** For plugin developers! - -**`see`** Warning in {@link GameObjects.getAllPlanets()} - -**Returns:** _Map_ - ---- - -### getAllVoyages - -▸ **getAllVoyages**(): QueuedArrival[] - -Returns all voyages that are scheduled to arrive at some point in the future. - -**`tutorial`** For plugin developers! - -**`see`** Warning in {@link GameObjects.getAllPlanets()} - -**Returns:** QueuedArrival[] - ---- - -### getArtifactById - -▸ **getArtifactById**(`artifactId`: ArtifactId): _undefined_ \| Artifact - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _undefined_ \| Artifact - ---- - -### getArtifactController - -▸ **getArtifactController**(`artifactId`: ArtifactId): _undefined_ \| EthAddress - -Returns the EthAddress of the player who can control the owner: -if the artifact is on a planet, this is the owner of the planet -if the artifact is on a voyage, this is the initiator of the voyage -if the artifact is not on either, then it is the owner of the artifact NFT - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _undefined_ \| EthAddress - ---- - -### getArtifactMap - -▸ **getArtifactMap**(): _Map_ - -**Returns:** _Map_ - ---- - -### getArtifactsOnPlanetsOwnedBy - -▸ **getArtifactsOnPlanetsOwnedBy**(`addr`: EthAddress): Artifact[] - -#### Parameters - -| Name | Type | -| :----- | :--------- | -| `addr` | EthAddress | - -**Returns:** Artifact[] - ---- - -### getArtifactsOwnedBy - -▸ **getArtifactsOwnedBy**(`addr`: EthAddress): Artifact[] - -#### Parameters - -| Name | Type | -| :----- | :--------- | -| `addr` | EthAddress | - -**Returns:** Artifact[] - ---- - -### getBiome - -▸ `Private` **getBiome**(`loc`: WorldLocation): Biome - -#### Parameters - -| Name | Type | -| :---- | :------------ | -| `loc` | WorldLocation | - -**Returns:** Biome - ---- - -### getEnergyCurveAtPercent - -▸ **getEnergyCurveAtPercent**(`planet`: Planet, `percent`: _number_): _number_ - -returns timestamp (seconds) that planet will reach percent% of energycap -time may be in the past - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `planet` | Planet | -| `percent` | _number_ | - -**Returns:** _number_ - ---- - -### getIsBuyingCreditsEmitter - -▸ **getIsBuyingCreditsEmitter**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getLocationOfPlanet - -▸ **getLocationOfPlanet**(`planetId`: LocationId): _undefined_ \| WorldLocation - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _undefined_ \| WorldLocation - ---- - -### getMyArtifactMap - -▸ **getMyArtifactMap**(): _Map_ - -**Returns:** _Map_ - ---- - -### getMyPlanetMap - -▸ **getMyPlanetMap**(): _Map_ - -**Returns:** _Map_ - ---- - -### getPlanetArtifacts - -▸ **getPlanetArtifacts**(`planetId`: LocationId): Artifact[] - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** Artifact[] - ---- - -### getPlanetDetailLevel - -▸ **getPlanetDetailLevel**(`planetId`: LocationId): _undefined_ \| _number_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _undefined_ \| _number_ - ---- - -### getPlanetLevel - -▸ **getPlanetLevel**(`planetId`: LocationId): _undefined_ \| ZERO \| ONE \| TWO \| THREE \| FOUR \| FIVE \| SIX \| SEVEN \| EIGHT \| NINE - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _undefined_ \| ZERO \| ONE \| TWO \| THREE \| FOUR \| FIVE \| SIX \| SEVEN \| EIGHT \| NINE - ---- - -### getPlanetMap - -▸ **getPlanetMap**(): _Map_ - -**Returns:** _Map_ - ---- - -### getPlanetWithCoords - -▸ **getPlanetWithCoords**(`coords`: WorldCoords): _undefined_ \| Planet - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _undefined_ \| Planet - ---- - -### getPlanetWithId - -▸ **getPlanetWithId**(`planetId`: LocationId, `updateIfStale?`: _boolean_): _undefined_ \| Planet - -#### Parameters - -| Name | Type | Default value | -| :-------------- | :--------- | :------------ | -| `planetId` | LocationId | - | -| `updateIfStale` | _boolean_ | true | - -**Returns:** _undefined_ \| Planet - ---- - -### getPlanetWithLocation - -▸ **getPlanetWithLocation**(`location`: WorldLocation): _undefined_ \| Planet - -#### Parameters - -| Name | Type | -| :--------- | :------------ | -| `location` | WorldLocation | - -**Returns:** _undefined_ \| Planet - ---- - -### getPlanetsInWorldRectangle - -▸ **getPlanetsInWorldRectangle**(`worldX`: _number_, `worldY`: _number_, `worldWidth`: _number_, `worldHeight`: _number_, `levels`: _number_[], `planetLevelToRadii`: _Map_, `updateIfStale?`: _boolean_): LocatablePlanet[] - -Gets the ids of all the planets that are both within the given bounding box (defined by its bottom -left coordinate, width, and height) in the world and of a level that was passed in via the -`planetLevels` parameter. - -#### Parameters - -| Name | Type | Default value | -| :------------------- | :----------------------------------------------------------------------------------- | :------------ | -| `worldX` | _number_ | - | -| `worldY` | _number_ | - | -| `worldWidth` | _number_ | - | -| `worldHeight` | _number_ | - | -| `levels` | _number_[] | - | -| `planetLevelToRadii` | _Map_ | - | -| `updateIfStale` | _boolean_ | true | - -**Returns:** LocatablePlanet[] - ---- - -### getRevealedLocations - -▸ **getRevealedLocations**(): _Map_ - -**Returns:** _Map_ - ---- - -### getSilverCurveAtPercent - -▸ **getSilverCurveAtPercent**(`planet`: Planet, `percent`: _number_): _undefined_ \| _number_ - -returns timestamp (seconds) that planet will reach percent% of silcap if -doesn't produce silver, returns undefined if already over percent% of silcap, -returns undefined - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `planet` | Planet | -| `percent` | _number_ | - -**Returns:** _undefined_ \| _number_ - ---- - -### getUnconfirmedBuyGPTCredits - -▸ **getUnconfirmedBuyGPTCredits**(): _undefined_ \| UnconfirmedBuyGPTCredits - -**Returns:** _undefined_ \| UnconfirmedBuyGPTCredits - ---- - -### getUnconfirmedMoves - -▸ **getUnconfirmedMoves**(): UnconfirmedMove[] - -**Returns:** UnconfirmedMove[] - ---- - -### getUnconfirmedReveal - -▸ **getUnconfirmedReveal**(): _undefined_ \| UnconfirmedReveal - -**Returns:** _undefined_ \| UnconfirmedReveal - ---- - -### getUnconfirmedUpgrades - -▸ **getUnconfirmedUpgrades**(): UnconfirmedUpgrade[] - -**Returns:** UnconfirmedUpgrade[] - ---- - -### getUnconfirmedWormholeActivations - -▸ **getUnconfirmedWormholeActivations**(): UnconfirmedActivateArtifact[] - -**Returns:** UnconfirmedActivateArtifact[] - ---- - -### getWormholes - -▸ **getWormholes**(): _Iterable_<[_Wormhole_](../modules/_types_global_globaltypes.md#wormhole)\> - -**Returns:** _Iterable_<[_Wormhole_](../modules/_types_global_globaltypes.md#wormhole)\> - ---- - -### isPlanetInContract - -▸ **isPlanetInContract**(`planetId`: LocationId): _boolean_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _boolean_ - ---- - -### markLocationRevealed - -▸ **markLocationRevealed**(`revealedLocation`: RevealedLocation): _void_ - -#### Parameters - -| Name | Type | -| :----------------- | :--------------- | -| `revealedLocation` | RevealedLocation | - -**Returns:** _void_ - ---- - -### onTxIntent - -▸ **onTxIntent**(`txIntent`: TxIntent): _void_ - -We call this function whenever the user requests that we send a transaction to the blockchain -with their localstorage wallet. You can think of it as one of the hubs which connects -`GameObjects` to the rest of the world. - -Inside this function, we update the relevant internal game objects to reflect that the user has -requested a particular action. Additionally, we publish the appropriate events to the relevant -[Monomitter](../modules/frontend_utils_monomitter.md#monomitter) instances that are stored in this class. - -In the case of something like prospecting for an artifact, this allows us to display a spinner -text which says "Prospecting..." - -In the case of the user sending energy from one planet to another planet, this allows us to -display a dashed line between the two planets in their new voyage. - -Whenever we update an entity, we must do it via that entity's type's corresponding -`set` function, in order for us to publish these events. - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** _void_ - ---- - -### planetLevelFromHexPerlin - -▸ **planetLevelFromHexPerlin**(`hex`: LocationId, `perlin`: _number_): PlanetLevel - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `hex` | LocationId | -| `perlin` | _number_ | - -**Returns:** PlanetLevel - ---- - -### planetTypeFromHexPerlin - -▸ **planetTypeFromHexPerlin**(`hex`: LocationId, `perlin`: _number_): PlanetType - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `hex` | LocationId | -| `perlin` | _number_ | - -**Returns:** PlanetType - ---- - -### processArrivalsForPlanet - -▸ `Private` **processArrivalsForPlanet**(`planetId`: LocationId, `arrivals`: QueuedArrival[]): ArrivalWithTimer[] - -#### Parameters - -| Name | Type | -| :--------- | :-------------- | -| `planetId` | LocationId | -| `arrivals` | QueuedArrival[] | - -**Returns:** ArrivalWithTimer[] - ---- - -### replaceArtifactFromContractData - -▸ **replaceArtifactFromContractData**(`artifact`: Artifact): _void_ - -received some artifact data from the contract. update our stores - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `artifact` | Artifact | - -**Returns:** _void_ - ---- - -### replaceArtifactsFromContractData - -▸ **replaceArtifactsFromContractData**(`artifacts`: _Iterable_): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :-------------------- | -| `artifacts` | _Iterable_ | - -**Returns:** _void_ - ---- - -### replacePlanetFromContractData - -▸ **replacePlanetFromContractData**(`planet`: Planet, `updatedArrivals?`: QueuedArrival[], `updatedArtifactsOnPlanet?`: ArtifactId[], `revealedLocation?`: RevealedLocation): _void_ - -received some planet data from the contract. update our stores - -#### Parameters - -| Name | Type | -| :-------------------------- | :--------------- | -| `planet` | Planet | -| `updatedArrivals?` | QueuedArrival[] | -| `updatedArtifactsOnPlanet?` | ArtifactId[] | -| `revealedLocation?` | RevealedLocation | - -**Returns:** _void_ - ---- - -### setArtifact - -▸ `Private` **setArtifact**(`artifact`: Artifact): _void_ - -Set an artifact into our cached store. Should ALWAYS call this when setting an artifact. -`this.artifacts` and `this.myArtifacts` should NEVER be accessed directly! -This function also handles managing artifact update messages and indexing the map of owned artifacts. - -#### Parameters - -| Name | Type | Description | -| :--------- | :------- | :------------------ | -| `artifact` | Artifact | the artifact to set | - -**Returns:** _void_ - ---- - -### setPlanet - -▸ `Private` **setPlanet**(`planet`: Planet): _void_ - -Set a planet into our cached store. Should ALWAYS call this when setting a planet. -`this.planets` and `this.myPlanets` should NEVER be accessed directly! -This function also handles managing planet update messages and indexing the map of owned planets. - -#### Parameters - -| Name | Type | Description | -| :------- | :----- | :---------------- | -| `planet` | Planet | the planet to set | - -**Returns:** _void_ - ---- - -### spaceTypeFromPerlin - -▸ **spaceTypeFromPerlin**(`perlin`: _number_): SpaceType - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `perlin` | _number_ | - -**Returns:** SpaceType - ---- - -### updatePlanet - -▸ **updatePlanet**(`id`: LocationId, `updateFn`: (`p`: Planet) => _void_): _void_ - -Given a planet id, update the state of the given planet by calling the given update function. -If the planet was updated, then also publish the appropriate event. - -#### Parameters - -| Name | Type | -| :--------- | :---------------------- | -| `id` | LocationId | -| `updateFn` | (`p`: Planet) => _void_ | - -**Returns:** _void_ - ---- - -### updatePlanetIfStale - -▸ `Private` **updatePlanetIfStale**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### updateScore - -▸ `Private` **updateScore**(`planetId`: LocationId): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _void_ - ---- - -### getSilverNeeded - -▸ `Static` **getSilverNeeded**(`planet`: Planet): _number_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _number_ - ---- - -### planetCanUpgrade - -▸ `Static` **planetCanUpgrade**(`planet`: Planet): _boolean_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _boolean_ diff --git a/docs/classes/backend_gamelogic_gameuimanager.default.md b/docs/classes/backend_gamelogic_gameuimanager.default.md deleted file mode 100644 index 6b5d3723..00000000 --- a/docs/classes/backend_gamelogic_gameuimanager.default.md +++ /dev/null @@ -1,2034 +0,0 @@ -# Class: default - -[Backend/GameLogic/GameUIManager](../modules/backend_gamelogic_gameuimanager.md).default - -## Hierarchy - -- _EventEmitter_ - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_gameuimanager.default.md#constructor) - -### Properties - -- [artifactSending](backend_gamelogic_gameuimanager.default.md#artifactsending) -- [extraMinerLocations](backend_gamelogic_gameuimanager.default.md#extraminerlocations) -- [forcesSending](backend_gamelogic_gameuimanager.default.md#forcessending) -- [gameManager](backend_gamelogic_gameuimanager.default.md#gamemanager) -- [hoverPlanet$](backend_gamelogic_gameuimanager.default.md#hoverplanet$) -- [hoverPlanetId$](backend_gamelogic_gameuimanager.default.md#hoverplanetid$) -- [isChoosingTargetPlanet](backend_gamelogic_gameuimanager.default.md#ischoosingtargetplanet) -- [isSending](backend_gamelogic_gameuimanager.default.md#issending) -- [minerLocation](backend_gamelogic_gameuimanager.default.md#minerlocation) -- [mouseDownOverCoords](backend_gamelogic_gameuimanager.default.md#mousedownovercoords) -- [mouseDownOverPlanet](backend_gamelogic_gameuimanager.default.md#mousedownoverplanet) -- [mouseHoveringOverCoords](backend_gamelogic_gameuimanager.default.md#mousehoveringovercoords) -- [mouseHoveringOverPlanet](backend_gamelogic_gameuimanager.default.md#mousehoveringoverplanet) -- [myArtifacts$](backend_gamelogic_gameuimanager.default.md#myartifacts$) -- [onChooseTargetPlanet](backend_gamelogic_gameuimanager.default.md#onchoosetargetplanet) -- [plugins](backend_gamelogic_gameuimanager.default.md#plugins) -- [previousSelectedPlanet](backend_gamelogic_gameuimanager.default.md#previousselectedplanet) -- [radiusMap](backend_gamelogic_gameuimanager.default.md#radiusmap) -- [selectedArtifact$](backend_gamelogic_gameuimanager.default.md#selectedartifact$) -- [selectedArtifactId$](backend_gamelogic_gameuimanager.default.md#selectedartifactid$) -- [selectedCoords](backend_gamelogic_gameuimanager.default.md#selectedcoords) -- [selectedPlanet](backend_gamelogic_gameuimanager.default.md#selectedplanet) -- [selectedPlanet$](backend_gamelogic_gameuimanager.default.md#selectedplanet$) -- [selectedPlanetId$](backend_gamelogic_gameuimanager.default.md#selectedplanetid$) -- [sendingCoords](backend_gamelogic_gameuimanager.default.md#sendingcoords) -- [sendingPlanet](backend_gamelogic_gameuimanager.default.md#sendingplanet) -- [silverSending](backend_gamelogic_gameuimanager.default.md#silversending) -- [terminal](backend_gamelogic_gameuimanager.default.md#terminal) -- [viewportEntities](backend_gamelogic_gameuimanager.default.md#viewportentities) - -### Methods - -- [activateArtifact](backend_gamelogic_gameuimanager.default.md#activateartifact) -- [addAccount](backend_gamelogic_gameuimanager.default.md#addaccount) -- [addNewChunk](backend_gamelogic_gameuimanager.default.md#addnewchunk) -- [bulkAddNewChunks](backend_gamelogic_gameuimanager.default.md#bulkaddnewchunks) -- [buyGPTCredits](backend_gamelogic_gameuimanager.default.md#buygptcredits) -- [buyHat](backend_gamelogic_gameuimanager.default.md#buyhat) -- [centerCoords](backend_gamelogic_gameuimanager.default.md#centercoords) -- [centerLocationId](backend_gamelogic_gameuimanager.default.md#centerlocationid) -- [centerPlanet](backend_gamelogic_gameuimanager.default.md#centerplanet) -- [deactivateArtifact](backend_gamelogic_gameuimanager.default.md#deactivateartifact) -- [depositArtifact](backend_gamelogic_gameuimanager.default.md#depositartifact) -- [destroy](backend_gamelogic_gameuimanager.default.md#destroy) -- [discoverBiome](backend_gamelogic_gameuimanager.default.md#discoverbiome) -- [findArtifact](backend_gamelogic_gameuimanager.default.md#findartifact) -- [generateVerificationTweet](backend_gamelogic_gameuimanager.default.md#generateverificationtweet) -- [getAccount](backend_gamelogic_gameuimanager.default.md#getaccount) -- [getAllMinerLocations](backend_gamelogic_gameuimanager.default.md#getallminerlocations) -- [getAllOwnedPlanets](backend_gamelogic_gameuimanager.default.md#getallownedplanets) -- [getAllPlayers](backend_gamelogic_gameuimanager.default.md#getallplayers) -- [getAllVoyages](backend_gamelogic_gameuimanager.default.md#getallvoyages) -- [getArtifactMap](backend_gamelogic_gameuimanager.default.md#getartifactmap) -- [getArtifactPlanet](backend_gamelogic_gameuimanager.default.md#getartifactplanet) -- [getArtifactSending](backend_gamelogic_gameuimanager.default.md#getartifactsending) -- [getArtifactWithId](backend_gamelogic_gameuimanager.default.md#getartifactwithid) -- [getArtifactsWithIds](backend_gamelogic_gameuimanager.default.md#getartifactswithids) -- [getBiomeKey](backend_gamelogic_gameuimanager.default.md#getbiomekey) -- [getBiomePerlin](backend_gamelogic_gameuimanager.default.md#getbiomeperlin) -- [getBooleanSetting](backend_gamelogic_gameuimanager.default.md#getbooleansetting) -- [getChunk](backend_gamelogic_gameuimanager.default.md#getchunk) -- [getContractAddress](backend_gamelogic_gameuimanager.default.md#getcontractaddress) -- [getContractConstants](backend_gamelogic_gameuimanager.default.md#getcontractconstants) -- [getConversation](backend_gamelogic_gameuimanager.default.md#getconversation) -- [getDiagnostics](backend_gamelogic_gameuimanager.default.md#getdiagnostics) -- [getDiscoverBiomeName](backend_gamelogic_gameuimanager.default.md#getdiscoverbiomename) -- [getDistCoords](backend_gamelogic_gameuimanager.default.md#getdistcoords) -- [getEndTimeSeconds](backend_gamelogic_gameuimanager.default.md#getendtimeseconds) -- [getEnergyArrivingForMove](backend_gamelogic_gameuimanager.default.md#getenergyarrivingformove) -- [getEnergyCurveAtPercent](backend_gamelogic_gameuimanager.default.md#getenergycurveatpercent) -- [getEnergyOfPlayer](backend_gamelogic_gameuimanager.default.md#getenergyofplayer) -- [getEthConnection](backend_gamelogic_gameuimanager.default.md#getethconnection) -- [getExploredChunks](backend_gamelogic_gameuimanager.default.md#getexploredchunks) -- [getForcesSending](backend_gamelogic_gameuimanager.default.md#getforcessending) -- [getGameManager](backend_gamelogic_gameuimanager.default.md#getgamemanager) -- [getGameObjects](backend_gamelogic_gameuimanager.default.md#getgameobjects) -- [getGptCreditBalanceEmitter](backend_gamelogic_gameuimanager.default.md#getgptcreditbalanceemitter) -- [getGptCreditPriceEmitter](backend_gamelogic_gameuimanager.default.md#getgptcreditpriceemitter) -- [getHashConfig](backend_gamelogic_gameuimanager.default.md#gethashconfig) -- [getHashesPerSec](backend_gamelogic_gameuimanager.default.md#gethashespersec) -- [getHomeCoords](backend_gamelogic_gameuimanager.default.md#gethomecoords) -- [getHomeHash](backend_gamelogic_gameuimanager.default.md#gethomehash) -- [getHomePlanet](backend_gamelogic_gameuimanager.default.md#gethomeplanet) -- [getHoveringOverCoords](backend_gamelogic_gameuimanager.default.md#gethoveringovercoords) -- [getHoveringOverPlanet](backend_gamelogic_gameuimanager.default.md#gethoveringoverplanet) -- [getIsBuyingCreditsEmitter](backend_gamelogic_gameuimanager.default.md#getisbuyingcreditsemitter) -- [getIsChoosingTargetPlanet](backend_gamelogic_gameuimanager.default.md#getischoosingtargetplanet) -- [getIsHighPerfMode](backend_gamelogic_gameuimanager.default.md#getishighperfmode) -- [getLocationOfPlanet](backend_gamelogic_gameuimanager.default.md#getlocationofplanet) -- [getLocationsAndChunks](backend_gamelogic_gameuimanager.default.md#getlocationsandchunks) -- [getMinerLocation](backend_gamelogic_gameuimanager.default.md#getminerlocation) -- [getMiningPattern](backend_gamelogic_gameuimanager.default.md#getminingpattern) -- [getMouseDownCoords](backend_gamelogic_gameuimanager.default.md#getmousedowncoords) -- [getMouseDownPlanet](backend_gamelogic_gameuimanager.default.md#getmousedownplanet) -- [getMyArtifactMap](backend_gamelogic_gameuimanager.default.md#getmyartifactmap) -- [getMyArtifacts](backend_gamelogic_gameuimanager.default.md#getmyartifacts) -- [getMyArtifactsNotOnPlanet](backend_gamelogic_gameuimanager.default.md#getmyartifactsnotonplanet) -- [getMyBalance](backend_gamelogic_gameuimanager.default.md#getmybalance) -- [getMyBalanceEmitter](backend_gamelogic_gameuimanager.default.md#getmybalanceemitter) -- [getMyPlanetMap](backend_gamelogic_gameuimanager.default.md#getmyplanetmap) -- [getMyScore](backend_gamelogic_gameuimanager.default.md#getmyscore) -- [getNextBroadcastAvailableTimestamp](backend_gamelogic_gameuimanager.default.md#getnextbroadcastavailabletimestamp) -- [getPerlinConfig](backend_gamelogic_gameuimanager.default.md#getperlinconfig) -- [getPerlinThresholds](backend_gamelogic_gameuimanager.default.md#getperlinthresholds) -- [getPlanetLevel](backend_gamelogic_gameuimanager.default.md#getplanetlevel) -- [getPlanetMap](backend_gamelogic_gameuimanager.default.md#getplanetmap) -- [getPlanetWithCoords](backend_gamelogic_gameuimanager.default.md#getplanetwithcoords) -- [getPlanetWithId](backend_gamelogic_gameuimanager.default.md#getplanetwithid) -- [getPlanetsInViewport](backend_gamelogic_gameuimanager.default.md#getplanetsinviewport) -- [getPluginManager](backend_gamelogic_gameuimanager.default.md#getpluginmanager) -- [getPreviousSelectedPlanet](backend_gamelogic_gameuimanager.default.md#getpreviousselectedplanet) -- [getPrivateKey](backend_gamelogic_gameuimanager.default.md#getprivatekey) -- [getRadiusOfPlanetLevel](backend_gamelogic_gameuimanager.default.md#getradiusofplanetlevel) -- [getSelectedCoords](backend_gamelogic_gameuimanager.default.md#getselectedcoords) -- [getSelectedPlanet](backend_gamelogic_gameuimanager.default.md#getselectedplanet) -- [getSilverCurveAtPercent](backend_gamelogic_gameuimanager.default.md#getsilvercurveatpercent) -- [getSilverOfPlayer](backend_gamelogic_gameuimanager.default.md#getsilverofplayer) -- [getSilverSending](backend_gamelogic_gameuimanager.default.md#getsilversending) -- [getSpaceTypePerlin](backend_gamelogic_gameuimanager.default.md#getspacetypeperlin) -- [getStringSetting](backend_gamelogic_gameuimanager.default.md#getstringsetting) -- [getTerminal](backend_gamelogic_gameuimanager.default.md#getterminal) -- [getTwitter](backend_gamelogic_gameuimanager.default.md#gettwitter) -- [getUnconfirmedMoves](backend_gamelogic_gameuimanager.default.md#getunconfirmedmoves) -- [getUnconfirmedUpgrades](backend_gamelogic_gameuimanager.default.md#getunconfirmedupgrades) -- [getUnconfirmedWormholeActivations](backend_gamelogic_gameuimanager.default.md#getunconfirmedwormholeactivations) -- [getUniverseTotalEnergy](backend_gamelogic_gameuimanager.default.md#getuniversetotalenergy) -- [getUpgrade](backend_gamelogic_gameuimanager.default.md#getupgrade) -- [getViewport](backend_gamelogic_gameuimanager.default.md#getviewport) -- [getWithdrawnSilverOfPlayer](backend_gamelogic_gameuimanager.default.md#getwithdrawnsilverofplayer) -- [getWorldRadius](backend_gamelogic_gameuimanager.default.md#getworldradius) -- [getWorldSilver](backend_gamelogic_gameuimanager.default.md#getworldsilver) -- [getWormholes](backend_gamelogic_gameuimanager.default.md#getwormholes) -- [hasMinedChunk](backend_gamelogic_gameuimanager.default.md#hasminedchunk) -- [isCurrentlyRevealing](backend_gamelogic_gameuimanager.default.md#iscurrentlyrevealing) -- [isMining](backend_gamelogic_gameuimanager.default.md#ismining) -- [isOverOwnPlanet](backend_gamelogic_gameuimanager.default.md#isoverownplanet) -- [isOwnedByMe](backend_gamelogic_gameuimanager.default.md#isownedbyme) -- [isRoundOver](backend_gamelogic_gameuimanager.default.md#isroundover) -- [joinGame](backend_gamelogic_gameuimanager.default.md#joingame) -- [onDiscoveredChunk](backend_gamelogic_gameuimanager.default.md#ondiscoveredchunk) -- [onEmitInitializedPlayer](backend_gamelogic_gameuimanager.default.md#onemitinitializedplayer) -- [onEmitInitializedPlayerError](backend_gamelogic_gameuimanager.default.md#onemitinitializedplayererror) -- [onMouseClick](backend_gamelogic_gameuimanager.default.md#onmouseclick) -- [onMouseDown](backend_gamelogic_gameuimanager.default.md#onmousedown) -- [onMouseMove](backend_gamelogic_gameuimanager.default.md#onmousemove) -- [onMouseOut](backend_gamelogic_gameuimanager.default.md#onmouseout) -- [onMouseUp](backend_gamelogic_gameuimanager.default.md#onmouseup) -- [onSendCancel](backend_gamelogic_gameuimanager.default.md#onsendcancel) -- [onSendInit](backend_gamelogic_gameuimanager.default.md#onsendinit) -- [prospectPlanet](backend_gamelogic_gameuimanager.default.md#prospectplanet) -- [removeExtraMinerLocation](backend_gamelogic_gameuimanager.default.md#removeextraminerlocation) -- [revealLocation](backend_gamelogic_gameuimanager.default.md#reveallocation) -- [setArtifactSending](backend_gamelogic_gameuimanager.default.md#setartifactsending) -- [setExtraMinerLocation](backend_gamelogic_gameuimanager.default.md#setextraminerlocation) -- [setForcesSending](backend_gamelogic_gameuimanager.default.md#setforcessending) -- [setHoveringOverPlanet](backend_gamelogic_gameuimanager.default.md#sethoveringoverplanet) -- [setMiningPattern](backend_gamelogic_gameuimanager.default.md#setminingpattern) -- [setSelectedId](backend_gamelogic_gameuimanager.default.md#setselectedid) -- [setSelectedPlanet](backend_gamelogic_gameuimanager.default.md#setselectedplanet) -- [setSilverSending](backend_gamelogic_gameuimanager.default.md#setsilversending) -- [spaceTypeFromPerlin](backend_gamelogic_gameuimanager.default.md#spacetypefromperlin) -- [startConversation](backend_gamelogic_gameuimanager.default.md#startconversation) -- [startExplore](backend_gamelogic_gameuimanager.default.md#startexplore) -- [startWormholeFrom](backend_gamelogic_gameuimanager.default.md#startwormholefrom) -- [stepConversation](backend_gamelogic_gameuimanager.default.md#stepconversation) -- [stopExplore](backend_gamelogic_gameuimanager.default.md#stopexplore) -- [updateDiagnostics](backend_gamelogic_gameuimanager.default.md#updatediagnostics) -- [updateMouseHoveringOverCoords](backend_gamelogic_gameuimanager.default.md#updatemousehoveringovercoords) -- [updatePlanets](backend_gamelogic_gameuimanager.default.md#updateplanets) -- [upgrade](backend_gamelogic_gameuimanager.default.md#upgrade) -- [verifyTwitter](backend_gamelogic_gameuimanager.default.md#verifytwitter) -- [withdrawArtifact](backend_gamelogic_gameuimanager.default.md#withdrawartifact) -- [withdrawSilver](backend_gamelogic_gameuimanager.default.md#withdrawsilver) -- [create](backend_gamelogic_gameuimanager.default.md#create) - -## Constructors - -### constructor - -\+ `Private` **new default**(`gameManager`: [_default_](backend_gamelogic_gamemanager.default.md), `terminalHandle`: _MutableRefObject_): [_default_](backend_gamelogic_gameuimanager.default.md) - -#### Parameters - -| Name | Type | -| :--------------- | :------------------------------------------------------------------------------------------------------------ | -| `gameManager` | [_default_](backend_gamelogic_gamemanager.default.md) | -| `terminalHandle` | _MutableRefObject_ | - -**Returns:** [_default_](backend_gamelogic_gameuimanager.default.md) - -Overrides: EventEmitter.constructor - -## Properties - -### artifactSending - -• `Private` **artifactSending**: _object_= {} - -#### Type declaration - ---- - -### extraMinerLocations - -• `Private` **extraMinerLocations**: WorldCoords[]= [] - ---- - -### forcesSending - -• `Private` **forcesSending**: _object_= {} - -#### Type declaration - ---- - -### gameManager - -• `Private` `Readonly` **gameManager**: [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### hoverPlanet$ - -• `Readonly` **hoverPlanet$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### hoverPlanetId$ - -• `Readonly` **hoverPlanetId$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### isChoosingTargetPlanet - -• `Private` **isChoosingTargetPlanet**: _boolean_= false - -The Wormhole artifact requires you to choose a target planet. This value -indicates whether or not the player is currently selecting a target planet. - ---- - -### isSending - -• `Private` **isSending**: _boolean_= false - ---- - -### minerLocation - -• `Private` **minerLocation**: _undefined_ \| WorldCoords - ---- - -### mouseDownOverCoords - -• `Private` **mouseDownOverCoords**: _undefined_ \| WorldCoords - ---- - -### mouseDownOverPlanet - -• `Private` **mouseDownOverPlanet**: _undefined_ \| Planet - ---- - -### mouseHoveringOverCoords - -• `Private` **mouseHoveringOverCoords**: _undefined_ \| WorldCoords - ---- - -### mouseHoveringOverPlanet - -• `Private` **mouseHoveringOverPlanet**: _undefined_ \| Planet - ---- - -### myArtifacts$ - -• `Readonly` **myArtifacts$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter)\> - ---- - -### onChooseTargetPlanet - -• `Private` `Optional` **onChooseTargetPlanet**: (`planet`: _undefined_ \| LocatablePlanet) => _void_ - -#### Type declaration - -▸ (`planet`: _undefined_ \| LocatablePlanet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----------------------------- | -| `planet` | _undefined_ \| LocatablePlanet | - -**Returns:** _void_ - ---- - -### plugins - -• `Private` **plugins**: [_PluginManager_](backend_gamelogic_pluginmanager.pluginmanager.md) - ---- - -### previousSelectedPlanet - -• `Private` **previousSelectedPlanet**: _undefined_ \| Planet - ---- - -### radiusMap - -• `Private` `Readonly` **radiusMap**: _Record_ - ---- - -### selectedArtifact$ - -• `Readonly` **selectedArtifact$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### selectedArtifactId$ - -• `Readonly` **selectedArtifactId$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### selectedCoords - -• `Private` **selectedCoords**: _undefined_ \| WorldCoords - ---- - -### selectedPlanet - -• `Private` **selectedPlanet**: _undefined_ \| Planet - ---- - -### selectedPlanet$ - -• `Readonly` **selectedPlanet$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### selectedPlanetId$ - -• `Readonly` **selectedPlanetId$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### sendingCoords - -• `Private` **sendingCoords**: _undefined_ \| WorldCoords - ---- - -### sendingPlanet - -• `Private` **sendingPlanet**: _undefined_ \| Planet - ---- - -### silverSending - -• `Private` **silverSending**: _object_= {} - -#### Type declaration - ---- - -### terminal - -• `Private` **terminal**: _MutableRefObject_ - ---- - -### viewportEntities - -• `Private` **viewportEntities**: [_ViewportEntities_](backend_gamelogic_viewportentities.viewportentities.md) - -## Methods - -### activateArtifact - -▸ **activateArtifact**(`locationId`: LocationId, `id`: ArtifactId, `wormholeTo?`: LocationId): _void_ - -#### Parameters - -| Name | Type | -| :------------ | :--------- | -| `locationId` | LocationId | -| `id` | ArtifactId | -| `wormholeTo?` | LocationId | - -**Returns:** _void_ - ---- - -### addAccount - -▸ **addAccount**(`coords`: WorldCoords): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _Promise_ - ---- - -### addNewChunk - -▸ **addNewChunk**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### bulkAddNewChunks - -▸ **bulkAddNewChunks**(`chunks`: [_Chunk_](_types_global_globaltypes.chunk.md)[]): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :---------------------------------------------- | -| `chunks` | [_Chunk_](_types_global_globaltypes.chunk.md)[] | - -**Returns:** _Promise_ - ---- - -### buyGPTCredits - -▸ **buyGPTCredits**(`amount`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `amount` | _number_ | - -**Returns:** _void_ - ---- - -### buyHat - -▸ **buyHat**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### centerCoords - -▸ **centerCoords**(`coords`: WorldCoords): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _void_ - ---- - -### centerLocationId - -▸ **centerLocationId**(`planetId`: LocationId): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _void_ - ---- - -### centerPlanet - -▸ **centerPlanet**(`planet`: _undefined_ \| Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _void_ - ---- - -### deactivateArtifact - -▸ **deactivateArtifact**(`locationId`: LocationId, `artifactId`: ArtifactId): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `locationId` | LocationId | -| `artifactId` | ArtifactId | - -**Returns:** _void_ - ---- - -### depositArtifact - -▸ **depositArtifact**(`locationId`: LocationId, `artifactId`: ArtifactId): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `locationId` | LocationId | -| `artifactId` | ArtifactId | - -**Returns:** _void_ - ---- - -### destroy - -▸ **destroy**(): _void_ - -**Returns:** _void_ - ---- - -### discoverBiome - -▸ **discoverBiome**(`planet`: LocatablePlanet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------- | -| `planet` | LocatablePlanet | - -**Returns:** _void_ - ---- - -### findArtifact - -▸ **findArtifact**(`planetId`: LocationId): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _void_ - ---- - -### generateVerificationTweet - -▸ **generateVerificationTweet**(`twitter`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `twitter` | _string_ | - -**Returns:** _Promise_ - ---- - -### getAccount - -▸ **getAccount**(): _undefined_ \| EthAddress - -**Returns:** _undefined_ \| EthAddress - ---- - -### getAllMinerLocations - -▸ **getAllMinerLocations**(): WorldCoords[] - -**Returns:** WorldCoords[] - ---- - -### getAllOwnedPlanets - -▸ **getAllOwnedPlanets**(): Planet[] - -**Returns:** Planet[] - ---- - -### getAllPlayers - -▸ **getAllPlayers**(): Player[] - -**Returns:** Player[] - ---- - -### getAllVoyages - -▸ **getAllVoyages**(): QueuedArrival[] - -**Returns:** QueuedArrival[] - ---- - -### getArtifactMap - -▸ **getArtifactMap**(): _Map_ - -**Returns:** _Map_ - ---- - -### getArtifactPlanet - -▸ **getArtifactPlanet**(`artifact`: Artifact): _undefined_ \| Planet - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `artifact` | Artifact | - -**Returns:** _undefined_ \| Planet - ---- - -### getArtifactSending - -▸ **getArtifactSending**(`planetId`: LocationId): _undefined_ \| Artifact - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _undefined_ \| Artifact - ---- - -### getArtifactWithId - -▸ **getArtifactWithId**(`artifactId`: ArtifactId): _undefined_ \| Artifact - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _undefined_ \| Artifact - ---- - -### getArtifactsWithIds - -▸ **getArtifactsWithIds**(`artifactIds`: ArtifactId[]): (_undefined_ \| Artifact)[] - -#### Parameters - -| Name | Type | -| :------------ | :----------- | -| `artifactIds` | ArtifactId[] | - -**Returns:** (_undefined_ \| Artifact)[] - ---- - -### getBiomeKey - -▸ `Private` **getBiomeKey**(`biome`: Biome): _string_ - -#### Parameters - -| Name | Type | -| :------ | :---- | -| `biome` | Biome | - -**Returns:** _string_ - ---- - -### getBiomePerlin - -▸ **getBiomePerlin**(`coords`: WorldCoords, `floor`: _boolean_): _number_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | -| `floor` | _boolean_ | - -**Returns:** _number_ - ---- - -### getBooleanSetting - -▸ **getBooleanSetting**(`setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md)): _boolean_ - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | - -**Returns:** _boolean_ - ---- - -### getChunk - -▸ **getChunk**(`chunkFootprint`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): _undefined_ \| [_Chunk_](_types_global_globaltypes.chunk.md) - -#### Parameters - -| Name | Type | -| :--------------- | :------------------------------------------------------------------ | -| `chunkFootprint` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** _undefined_ \| [_Chunk_](_types_global_globaltypes.chunk.md) - ---- - -### getContractAddress - -▸ **getContractAddress**(): EthAddress - -**Returns:** EthAddress - ---- - -### getContractConstants - -▸ **getContractConstants**(): [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) - -**Returns:** [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) - ---- - -### getConversation - -▸ **getConversation**(`artifactId`: ArtifactId): _Promise_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _Promise_ - ---- - -### getDiagnostics - -▸ **getDiagnostics**(): [_Diagnostics_](../interfaces/frontend_panes_diagnosticspane.diagnostics.md) - -**Returns:** [_Diagnostics_](../interfaces/frontend_panes_diagnosticspane.diagnostics.md) - ---- - -### getDiscoverBiomeName - -▸ **getDiscoverBiomeName**(`biome`: Biome): _string_ - -#### Parameters - -| Name | Type | -| :------ | :---- | -| `biome` | Biome | - -**Returns:** _string_ - ---- - -### getDistCoords - -▸ **getDistCoords**(`from`: WorldCoords, `to`: WorldCoords): _number_ - -#### Parameters - -| Name | Type | -| :----- | :---------- | -| `from` | WorldCoords | -| `to` | WorldCoords | - -**Returns:** _number_ - ---- - -### getEndTimeSeconds - -▸ **getEndTimeSeconds**(): _number_ - -**Returns:** _number_ - ---- - -### getEnergyArrivingForMove - -▸ **getEnergyArrivingForMove**(`from`: LocationId, `to`: _undefined_ \| LocationId, `dist`: _undefined_ \| _number_, `energy`: _number_): _number_ - -#### Parameters - -| Name | Type | -| :------- | :------------------------ | -| `from` | LocationId | -| `to` | _undefined_ \| LocationId | -| `dist` | _undefined_ \| _number_ | -| `energy` | _number_ | - -**Returns:** _number_ - ---- - -### getEnergyCurveAtPercent - -▸ **getEnergyCurveAtPercent**(`planet`: Planet, `percent`: _number_): _number_ - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `planet` | Planet | -| `percent` | _number_ | - -**Returns:** _number_ - ---- - -### getEnergyOfPlayer - -▸ **getEnergyOfPlayer**(`player`: EthAddress): _number_ - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `player` | EthAddress | - -**Returns:** _number_ - ---- - -### getEthConnection - -▸ **getEthConnection**(): [_default_](backend_network_ethconnection.default.md) - -**Returns:** [_default_](backend_network_ethconnection.default.md) - ---- - -### getExploredChunks - -▸ **getExploredChunks**(): _Iterable_<[_Chunk_](_types_global_globaltypes.chunk.md)\> - -**Returns:** _Iterable_<[_Chunk_](_types_global_globaltypes.chunk.md)\> - ---- - -### getForcesSending - -▸ **getForcesSending**(`planetId`: LocationId): _number_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _number_ - ---- - -### getGameManager - -▸ **getGameManager**(): [_default_](backend_gamelogic_gamemanager.default.md) - -**Returns:** [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### getGameObjects - -▸ **getGameObjects**(): [_GameObjects_](backend_gamelogic_gameobjects.gameobjects.md) - -Gets a reference to the game's internal representation of the world state. Beware! Use this for -reading only, otherwise you might mess up the state of the game. You can try modifying the game -state in some way - -**Returns:** [_GameObjects_](backend_gamelogic_gameobjects.gameobjects.md) - ---- - -### getGptCreditBalanceEmitter - -▸ **getGptCreditBalanceEmitter**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getGptCreditPriceEmitter - -▸ **getGptCreditPriceEmitter**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getHashConfig - -▸ **getHashConfig**(): [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) - -**Returns:** [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) - ---- - -### getHashesPerSec - -▸ **getHashesPerSec**(): _number_ - -**Returns:** _number_ - ---- - -### getHomeCoords - -▸ **getHomeCoords**(): WorldCoords - -**Returns:** WorldCoords - ---- - -### getHomeHash - -▸ **getHomeHash**(): _undefined_ \| LocationId - -**Returns:** _undefined_ \| LocationId - ---- - -### getHomePlanet - -▸ **getHomePlanet**(): _undefined_ \| Planet - -**Returns:** _undefined_ \| Planet - ---- - -### getHoveringOverCoords - -▸ **getHoveringOverCoords**(): _undefined_ \| WorldCoords - -**Returns:** _undefined_ \| WorldCoords - ---- - -### getHoveringOverPlanet - -▸ **getHoveringOverPlanet**(): _undefined_ \| Planet - -**Returns:** _undefined_ \| Planet - ---- - -### getIsBuyingCreditsEmitter - -▸ **getIsBuyingCreditsEmitter**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getIsChoosingTargetPlanet - -▸ **getIsChoosingTargetPlanet**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### getIsHighPerfMode - -▸ **getIsHighPerfMode**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### getLocationOfPlanet - -▸ **getLocationOfPlanet**(`planetId`: LocationId): _undefined_ \| WorldLocation - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _undefined_ \| WorldLocation - ---- - -### getLocationsAndChunks - -▸ **getLocationsAndChunks**(): _object_ - -**Returns:** _object_ - -| Name | Type | -| :-------------- | :------------------------------------------------------------------------------------------------------------- | -| `cachedPlanets` | _Map_ | -| `chunks` | _Set_<[_Chunk_](_types_global_globaltypes.chunk.md)\> | - ---- - -### getMinerLocation - -▸ **getMinerLocation**(): _undefined_ \| WorldCoords - -**Returns:** _undefined_ \| WorldCoords - ---- - -### getMiningPattern - -▸ **getMiningPattern**(): _undefined_ \| [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) - -**Returns:** _undefined_ \| [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) - ---- - -### getMouseDownCoords - -▸ **getMouseDownCoords**(): _undefined_ \| WorldCoords - -**Returns:** _undefined_ \| WorldCoords - ---- - -### getMouseDownPlanet - -▸ **getMouseDownPlanet**(): _undefined_ \| Planet - -**Returns:** _undefined_ \| Planet - ---- - -### getMyArtifactMap - -▸ **getMyArtifactMap**(): _Map_ - -**Returns:** _Map_ - ---- - -### getMyArtifacts - -▸ **getMyArtifacts**(): Artifact[] - -**Returns:** Artifact[] - ---- - -### getMyArtifactsNotOnPlanet - -▸ **getMyArtifactsNotOnPlanet**(): Artifact[] - -**Returns:** Artifact[] - ---- - -### getMyBalance - -▸ **getMyBalance**(): _number_ - -**Returns:** _number_ - ---- - -### getMyBalanceEmitter - -▸ **getMyBalanceEmitter**(): [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - -**Returns:** [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### getMyPlanetMap - -▸ **getMyPlanetMap**(): _Map_ - -**Returns:** _Map_ - ---- - -### getMyScore - -▸ **getMyScore**(): _number_ - -**Returns:** _number_ - ---- - -### getNextBroadcastAvailableTimestamp - -▸ **getNextBroadcastAvailableTimestamp**(): _number_ - -**Returns:** _number_ - ---- - -### getPerlinConfig - -▸ **getPerlinConfig**(`isBiome?`: _boolean_): PerlinConfig - -#### Parameters - -| Name | Type | Default value | -| :-------- | :-------- | :------------ | -| `isBiome` | _boolean_ | false | - -**Returns:** PerlinConfig - ---- - -### getPerlinThresholds - -▸ **getPerlinThresholds**(): [*number*, *number*, *number*] - -**Returns:** [*number*, *number*, *number*] - ---- - -### getPlanetLevel - -▸ **getPlanetLevel**(`planetId`: LocationId): _undefined_ \| ZERO \| ONE \| TWO \| THREE \| FOUR \| FIVE \| SIX \| SEVEN \| EIGHT \| NINE - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _undefined_ \| ZERO \| ONE \| TWO \| THREE \| FOUR \| FIVE \| SIX \| SEVEN \| EIGHT \| NINE - ---- - -### getPlanetMap - -▸ **getPlanetMap**(): _Map_ - -**Returns:** _Map_ - ---- - -### getPlanetWithCoords - -▸ **getPlanetWithCoords**(`coords`: _undefined_ \| WorldCoords): _undefined_ \| Planet - -#### Parameters - -| Name | Type | -| :------- | :------------------------- | -| `coords` | _undefined_ \| WorldCoords | - -**Returns:** _undefined_ \| Planet - ---- - -### getPlanetWithId - -▸ **getPlanetWithId**(`planetId`: LocationId): _undefined_ \| Planet - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _undefined_ \| Planet - ---- - -### getPlanetsInViewport - -▸ **getPlanetsInViewport**(): Planet[] - -**Returns:** Planet[] - ---- - -### getPluginManager - -▸ **getPluginManager**(): [_PluginManager_](backend_gamelogic_pluginmanager.pluginmanager.md) - -**Returns:** [_PluginManager_](backend_gamelogic_pluginmanager.pluginmanager.md) - ---- - -### getPreviousSelectedPlanet - -▸ **getPreviousSelectedPlanet**(): _undefined_ \| Planet - -**Returns:** _undefined_ \| Planet - ---- - -### getPrivateKey - -▸ **getPrivateKey**(): _string_ - -**Returns:** _string_ - ---- - -### getRadiusOfPlanetLevel - -▸ **getRadiusOfPlanetLevel**(`planetRarity`: PlanetLevel): _number_ - -#### Parameters - -| Name | Type | -| :------------- | :---------- | -| `planetRarity` | PlanetLevel | - -**Returns:** _number_ - ---- - -### getSelectedCoords - -▸ **getSelectedCoords**(): _undefined_ \| WorldCoords - -**Returns:** _undefined_ \| WorldCoords - ---- - -### getSelectedPlanet - -▸ **getSelectedPlanet**(): _undefined_ \| Planet - -**Returns:** _undefined_ \| Planet - ---- - -### getSilverCurveAtPercent - -▸ **getSilverCurveAtPercent**(`planet`: Planet, `percent`: _number_): _undefined_ \| _number_ - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `planet` | Planet | -| `percent` | _number_ | - -**Returns:** _undefined_ \| _number_ - ---- - -### getSilverOfPlayer - -▸ **getSilverOfPlayer**(`player`: EthAddress): _number_ - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `player` | EthAddress | - -**Returns:** _number_ - ---- - -### getSilverSending - -▸ **getSilverSending**(`planetId`: LocationId): _number_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _number_ - ---- - -### getSpaceTypePerlin - -▸ **getSpaceTypePerlin**(`coords`: WorldCoords, `floor`: _boolean_): _number_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | -| `floor` | _boolean_ | - -**Returns:** _number_ - ---- - -### getStringSetting - -▸ **getStringSetting**(`setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md)): _undefined_ \| _string_ - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | - -**Returns:** _undefined_ \| _string_ - ---- - -### getTerminal - -▸ **getTerminal**(): _undefined_ \| [_TerminalHandle_](../interfaces/frontend_views_terminal.terminalhandle.md) - -**Returns:** _undefined_ \| [_TerminalHandle_](../interfaces/frontend_views_terminal.terminalhandle.md) - ---- - -### getTwitter - -▸ **getTwitter**(`address`: _undefined_ \| EthAddress): _undefined_ \| _string_ - -#### Parameters - -| Name | Type | -| :-------- | :------------------------ | -| `address` | _undefined_ \| EthAddress | - -**Returns:** _undefined_ \| _string_ - ---- - -### getUnconfirmedMoves - -▸ **getUnconfirmedMoves**(): UnconfirmedMove[] - -**`todo`** delete this. now that [GameObjects](backend_gamelogic_gameobjects.gameobjects.md) is publically accessible, we shouldn't need to -drill fields like this anymore. - -**`tutorial`** Plugin developers, please access fields like this with something like {@code df.getGameObjects().} - -**`deprecated`** - -**Returns:** UnconfirmedMove[] - ---- - -### getUnconfirmedUpgrades - -▸ **getUnconfirmedUpgrades**(): UnconfirmedUpgrade[] - -**Returns:** UnconfirmedUpgrade[] - ---- - -### getUnconfirmedWormholeActivations - -▸ **getUnconfirmedWormholeActivations**(): UnconfirmedActivateArtifact[] - -**Returns:** UnconfirmedActivateArtifact[] - ---- - -### getUniverseTotalEnergy - -▸ **getUniverseTotalEnergy**(): _number_ - -**Returns:** _number_ - ---- - -### getUpgrade - -▸ **getUpgrade**(`branch`: UpgradeBranchName, `level`: _number_): Upgrade - -#### Parameters - -| Name | Type | -| :------- | :---------------- | -| `branch` | UpgradeBranchName | -| `level` | _number_ | - -**Returns:** Upgrade - ---- - -### getViewport - -▸ **getViewport**(): [_default_](frontend_game_viewport.default.md) - -**Returns:** [_default_](frontend_game_viewport.default.md) - ---- - -### getWithdrawnSilverOfPlayer - -▸ **getWithdrawnSilverOfPlayer**(`player`: EthAddress): _number_ - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `player` | EthAddress | - -**Returns:** _number_ - ---- - -### getWorldRadius - -▸ **getWorldRadius**(): _number_ - -**Returns:** _number_ - ---- - -### getWorldSilver - -▸ **getWorldSilver**(): _number_ - -**Returns:** _number_ - ---- - -### getWormholes - -▸ **getWormholes**(): _Iterable_<[_Wormhole_](../modules/_types_global_globaltypes.md#wormhole)\> - -**Returns:** _Iterable_<[_Wormhole_](../modules/_types_global_globaltypes.md#wormhole)\> - ---- - -### hasMinedChunk - -▸ **hasMinedChunk**(`chunkLocation`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): _boolean_ - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------------------ | -| `chunkLocation` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** _boolean_ - ---- - -### isCurrentlyRevealing - -▸ **isCurrentlyRevealing**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### isMining - -▸ **isMining**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### isOverOwnPlanet - -▸ **isOverOwnPlanet**(`coords`: WorldCoords): _undefined_ \| Planet - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _undefined_ \| Planet - ---- - -### isOwnedByMe - -▸ **isOwnedByMe**(`planet`: Planet): _boolean_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _boolean_ - ---- - -### isRoundOver - -▸ **isRoundOver**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### joinGame - -▸ **joinGame**(`beforeRetry`: (`e`: Error) => _Promise_): [_default_](backend_gamelogic_gameuimanager.default.md) - -#### Parameters - -| Name | Type | -| :------------ | :---------------------------------- | -| `beforeRetry` | (`e`: Error) => _Promise_ | - -**Returns:** [_default_](backend_gamelogic_gameuimanager.default.md) - ---- - -### onDiscoveredChunk - -▸ **onDiscoveredChunk**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### onEmitInitializedPlayer - -▸ `Private` **onEmitInitializedPlayer**(): _void_ - -**Returns:** _void_ - ---- - -### onEmitInitializedPlayerError - -▸ `Private` **onEmitInitializedPlayerError**(`err`: ReactNode): _void_ - -#### Parameters - -| Name | Type | -| :---- | :-------- | -| `err` | ReactNode | - -**Returns:** _void_ - ---- - -### onMouseClick - -▸ **onMouseClick**(`_coords`: WorldCoords): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------- | -| `_coords` | WorldCoords | - -**Returns:** _void_ - ---- - -### onMouseDown - -▸ **onMouseDown**(`coords`: WorldCoords): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _void_ - ---- - -### onMouseMove - -▸ **onMouseMove**(`coords`: WorldCoords): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _void_ - ---- - -### onMouseOut - -▸ **onMouseOut**(): _void_ - -**Returns:** _void_ - ---- - -### onMouseUp - -▸ **onMouseUp**(`coords`: WorldCoords): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _void_ - ---- - -### onSendCancel - -▸ **onSendCancel**(): _void_ - -**Returns:** _void_ - ---- - -### onSendInit - -▸ **onSendInit**(`planet`: _undefined_ \| Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _void_ - ---- - -### prospectPlanet - -▸ **prospectPlanet**(`planetId`: LocationId): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _void_ - ---- - -### removeExtraMinerLocation - -▸ **removeExtraMinerLocation**(`idx`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `idx` | _number_ | - -**Returns:** _void_ - ---- - -### revealLocation - -▸ **revealLocation**(`locationId`: LocationId): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `locationId` | LocationId | - -**Returns:** _void_ - ---- - -### setArtifactSending - -▸ **setArtifactSending**(`planetId`: LocationId, `artifact?`: Artifact): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :--------- | -| `planetId` | LocationId | -| `artifact?` | Artifact | - -**Returns:** _void_ - ---- - -### setExtraMinerLocation - -▸ **setExtraMinerLocation**(`idx`: _number_, `coords`: WorldCoords): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `idx` | _number_ | -| `coords` | WorldCoords | - -**Returns:** _void_ - ---- - -### setForcesSending - -▸ **setForcesSending**(`planetId`: LocationId, `percentage`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `planetId` | LocationId | -| `percentage` | _number_ | - -**Returns:** _void_ - ---- - -### setHoveringOverPlanet - -▸ `Private` **setHoveringOverPlanet**(`planet`: _undefined_ \| Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _void_ - ---- - -### setMiningPattern - -▸ **setMiningPattern**(`pattern`: [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md)): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------- | -| `pattern` | [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) | - -**Returns:** _void_ - ---- - -### setSelectedId - -▸ **setSelectedId**(`id`: LocationId): _void_ - -#### Parameters - -| Name | Type | -| :--- | :--------- | -| `id` | LocationId | - -**Returns:** _void_ - ---- - -### setSelectedPlanet - -▸ **setSelectedPlanet**(`planet`: _undefined_ \| Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _void_ - ---- - -### setSilverSending - -▸ **setSilverSending**(`planetId`: LocationId, `percentage`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `planetId` | LocationId | -| `percentage` | _number_ | - -**Returns:** _void_ - ---- - -### spaceTypeFromPerlin - -▸ **spaceTypeFromPerlin**(`perlin`: _number_): SpaceType - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `perlin` | _number_ | - -**Returns:** SpaceType - ---- - -### startConversation - -▸ **startConversation**(`artifactId`: ArtifactId): _Promise_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _Promise_ - ---- - -### startExplore - -▸ **startExplore**(): _void_ - -**Returns:** _void_ - ---- - -### startWormholeFrom - -▸ **startWormholeFrom**(`planet`: LocatablePlanet): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :-------------- | -| `planet` | LocatablePlanet | - -**Returns:** _Promise_ - ---- - -### stepConversation - -▸ **stepConversation**(`artifactId`: ArtifactId, `message`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | -| `message` | _string_ | - -**Returns:** _Promise_ - ---- - -### stopExplore - -▸ **stopExplore**(): _void_ - -**Returns:** _void_ - ---- - -### updateDiagnostics - -▸ **updateDiagnostics**(`updateFn`: (`d`: [_Diagnostics_](../interfaces/frontend_panes_diagnosticspane.diagnostics.md)) => _void_): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :-------------------------------------------------------------------------------------------- | -| `updateFn` | (`d`: [_Diagnostics_](../interfaces/frontend_panes_diagnosticspane.diagnostics.md)) => _void_ | - -**Returns:** _void_ - ---- - -### updateMouseHoveringOverCoords - -▸ `Private` **updateMouseHoveringOverCoords**(`coords`: WorldCoords): WorldCoords - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** WorldCoords - ---- - -### updatePlanets - -▸ `Private` **updatePlanets**(): _void_ - -**Returns:** _void_ - ---- - -### upgrade - -▸ **upgrade**(`planet`: Planet, `branch`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `planet` | Planet | -| `branch` | _number_ | - -**Returns:** _void_ - ---- - -### verifyTwitter - -▸ **verifyTwitter**(`twitter`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `twitter` | _string_ | - -**Returns:** _Promise_ - ---- - -### withdrawArtifact - -▸ **withdrawArtifact**(`locationId`: LocationId, `artifactId`: ArtifactId): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `locationId` | LocationId | -| `artifactId` | ArtifactId | - -**Returns:** _void_ - ---- - -### withdrawSilver - -▸ **withdrawSilver**(`locationId`: LocationId, `amount`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `locationId` | LocationId | -| `amount` | _number_ | - -**Returns:** _void_ - ---- - -### create - -▸ `Static` **create**(`gameManager`: [_default_](backend_gamelogic_gamemanager.default.md), `terminalHandle`: _MutableRefObject_): _Promise_<[_default_](backend_gamelogic_gameuimanager.default.md)\> - -#### Parameters - -| Name | Type | -| :--------------- | :------------------------------------------------------------------------------------------------------------ | -| `gameManager` | [_default_](backend_gamelogic_gamemanager.default.md) | -| `terminalHandle` | _MutableRefObject_ | - -**Returns:** _Promise_<[_default_](backend_gamelogic_gameuimanager.default.md)\> diff --git a/docs/classes/backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md b/docs/classes/backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md deleted file mode 100644 index fce41e0f..00000000 --- a/docs/classes/backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md +++ /dev/null @@ -1,67 +0,0 @@ -# Class: InitialGameStateDownloader - -[Backend/GameLogic/InitialGameStateDownloader](../modules/backend_gamelogic_initialgamestatedownloader.md).InitialGameStateDownloader - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md#constructor) - -### Properties - -- [terminal](backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md#terminal) - -### Methods - -- [download](backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md#download) -- [makeProgressListener](backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md#makeprogresslistener) - -## Constructors - -### constructor - -\+ **new InitialGameStateDownloader**(`terminal`: [_TerminalHandle_](../interfaces/frontend_views_terminal.terminalhandle.md)): [_InitialGameStateDownloader_](backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md) - -#### Parameters - -| Name | Type | -| :--------- | :-------------------------------------------------------------------------- | -| `terminal` | [_TerminalHandle_](../interfaces/frontend_views_terminal.terminalhandle.md) | - -**Returns:** [_InitialGameStateDownloader_](backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md) - -## Properties - -### terminal - -• `Private` **terminal**: [_TerminalHandle_](../interfaces/frontend_views_terminal.terminalhandle.md) - -## Methods - -### download - -▸ **download**(`contractsAPI`: [_default_](backend_gamelogic_contractsapi.default.md), `persistentChunkStore`: [_default_](backend_storage_persistentchunkstore.default.md)): _Promise_<[_InitialGameState_](../interfaces/backend_gamelogic_initialgamestatedownloader.initialgamestate.md)\> - -#### Parameters - -| Name | Type | -| :--------------------- | :----------------------------------------------------------- | -| `contractsAPI` | [_default_](backend_gamelogic_contractsapi.default.md) | -| `persistentChunkStore` | [_default_](backend_storage_persistentchunkstore.default.md) | - -**Returns:** _Promise_<[_InitialGameState_](../interfaces/backend_gamelogic_initialgamestatedownloader.initialgamestate.md)\> - ---- - -### makeProgressListener - -▸ `Private` **makeProgressListener**(`prettyEntityName`: _string_): _function_ - -#### Parameters - -| Name | Type | -| :----------------- | :------- | -| `prettyEntityName` | _string_ | - -**Returns:** (`percent`: _number_) => _void_ diff --git a/docs/classes/backend_gamelogic_layeredmap.layeredmap.md b/docs/classes/backend_gamelogic_layeredmap.layeredmap.md deleted file mode 100644 index 4b47b65b..00000000 --- a/docs/classes/backend_gamelogic_layeredmap.layeredmap.md +++ /dev/null @@ -1,89 +0,0 @@ -# Class: LayeredMap - -[Backend/GameLogic/LayeredMap](../modules/backend_gamelogic_layeredmap.md).LayeredMap - -Data structure which allows us to efficiently query for "which planets between level X and X + n -(for positive n) are present in the given world rectangle", as well as, in the future, "which -chunks are visible in the vieport". - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_layeredmap.layeredmap.md#constructor) - -### Properties - -- [insertedLocations](backend_gamelogic_layeredmap.layeredmap.md#insertedlocations) -- [perLevelPlanetQuadtrees](backend_gamelogic_layeredmap.layeredmap.md#perlevelplanetquadtrees) - -### Methods - -- [getPlanets](backend_gamelogic_layeredmap.layeredmap.md#getplanets) -- [insertPlanet](backend_gamelogic_layeredmap.layeredmap.md#insertplanet) - -## Constructors - -### constructor - -\+ **new LayeredMap**(`worldRadius`: _number_): [_LayeredMap_](backend_gamelogic_layeredmap.layeredmap.md) - -#### Parameters - -| Name | Type | -| :------------ | :------- | -| `worldRadius` | _number_ | - -**Returns:** [_LayeredMap_](backend_gamelogic_layeredmap.layeredmap.md) - -## Properties - -### insertedLocations - -• `Private` **insertedLocations**: _Set_ - ---- - -### perLevelPlanetQuadtrees - -• `Private` **perLevelPlanetQuadtrees**: _Map_ - -## Methods - -### getPlanets - -▸ **getPlanets**(`worldX`: _number_, `worldY`: _number_, `worldWidth`: _number_, `worldHeight`: _number_, `planetLevels`: _number_[], `planetLevelToRadii`: _Map_): LocationId[] - -Gets the ids of all the planets that are both within the given bounding box (defined by its bottom -left coordinate, width, and height) in the world and of a level that was passed in via the -`planetLevels` parameter. - -#### Parameters - -| Name | Type | -| :------------------- | :----------------------------------------------------------------------------------- | -| `worldX` | _number_ | -| `worldY` | _number_ | -| `worldWidth` | _number_ | -| `worldHeight` | _number_ | -| `planetLevels` | _number_[] | -| `planetLevelToRadii` | _Map_ | - -**Returns:** LocationId[] - ---- - -### insertPlanet - -▸ **insertPlanet**(`location`: WorldLocation, `planetLevel`: _number_): _void_ - -Records the fact that there is a planet at the given world location. - -#### Parameters - -| Name | Type | -| :------------ | :------------ | -| `location` | WorldLocation | -| `planetLevel` | _number_ | - -**Returns:** _void_ diff --git a/docs/classes/backend_gamelogic_paidconversationmanager.paidconversationmanager.md b/docs/classes/backend_gamelogic_paidconversationmanager.paidconversationmanager.md deleted file mode 100644 index 5299d0cc..00000000 --- a/docs/classes/backend_gamelogic_paidconversationmanager.paidconversationmanager.md +++ /dev/null @@ -1,158 +0,0 @@ -# Class: PaidConversationManager - -[Backend/GameLogic/PaidConversationManager](../modules/backend_gamelogic_paidconversationmanager.md).PaidConversationManager - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#constructor) - -### Properties - -- [artifact](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#artifact) -- [conversation](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#conversation) -- [gameUIManager](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#gameuimanager) -- [setConversation](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#setconversation) -- [setLoading](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#setloading) -- [terminal](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#terminal) - -### Methods - -- [getQuestionsRemaining](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#getquestionsremaining) -- [printAllMessages](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#printallmessages) -- [printClean](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#printclean) -- [printMessage](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#printmessage) -- [start](backend_gamelogic_paidconversationmanager.paidconversationmanager.md#start) - -## Constructors - -### constructor - -\+ **new PaidConversationManager**(`gameUIManager`: [_default_](backend_gamelogic_gameuimanager.default.md), `terminal`: _MutableRefObject_, `setConversation`: (`conversation`: Conversation) => _void_, `setLoading`: (`loading`: _boolean_) => _void_, `artifact`: Artifact): [_PaidConversationManager_](backend_gamelogic_paidconversationmanager.paidconversationmanager.md) - -#### Parameters - -| Name | Type | -| :---------------- | :------------------------------------------------------------------------------------------------------------ | -| `gameUIManager` | [_default_](backend_gamelogic_gameuimanager.default.md) | -| `terminal` | _MutableRefObject_ | -| `setConversation` | (`conversation`: Conversation) => _void_ | -| `setLoading` | (`loading`: _boolean_) => _void_ | -| `artifact` | Artifact | - -**Returns:** [_PaidConversationManager_](backend_gamelogic_paidconversationmanager.paidconversationmanager.md) - -## Properties - -### artifact - -• `Private` **artifact**: Artifact - ---- - -### conversation - -• `Private` **conversation**: _undefined_ \| Conversation - ---- - -### gameUIManager - -• `Private` **gameUIManager**: [_default_](backend_gamelogic_gameuimanager.default.md) - ---- - -### setConversation - -• `Private` **setConversation**: (`conversation`: _undefined_ \| Conversation) => _void_ - -#### Type declaration - -▸ (`conversation`: _undefined_ \| Conversation): _void_ - -#### Parameters - -| Name | Type | -| :------------- | :-------------------------- | -| `conversation` | _undefined_ \| Conversation | - -**Returns:** _void_ - ---- - -### setLoading - -• `Private` **setLoading**: (`loading`: _boolean_) => _void_ - -#### Type declaration - -▸ (`loading`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :-------- | -| `loading` | _boolean_ | - -**Returns:** _void_ - ---- - -### terminal - -• `Private` **terminal**: _MutableRefObject_ - -## Methods - -### getQuestionsRemaining - -▸ **getQuestionsRemaining**(): _undefined_ \| _number_ - -**Returns:** _undefined_ \| _number_ - ---- - -### printAllMessages - -▸ `Private` **printAllMessages**(): _void_ - -**Returns:** _void_ - ---- - -### printClean - -▸ `Private` **printClean**(`message`: _string_, `style?`: [_Green_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#green) \| [_Sub_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#sub) \| [_White_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#white) \| [_Red_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#red) \| [_Blue_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#blue) \| [_Invisible_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#invisible) \| [_Default_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#default) \| [_Underline_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#underline) \| [_Hoverable_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#hoverable), `hoverContents?`: () => _Element_): _void_ - -#### Parameters - -| Name | Type | -| :--------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `message` | _string_ | -| `style?` | [_Green_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#green) \| [_Sub_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#sub) \| [_White_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#white) \| [_Red_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#red) \| [_Blue_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#blue) \| [_Invisible_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#invisible) \| [_Default_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#default) \| [_Underline_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#underline) \| [_Hoverable_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#hoverable) | -| `hoverContents?` | () => _Element_ | - -**Returns:** _void_ - ---- - -### printMessage - -▸ `Private` **printMessage**(`message`: Message): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :------ | -| `message` | Message | - -**Returns:** _void_ - ---- - -### start - -▸ **start**(): _Promise_ - -**Returns:** _Promise_ diff --git a/docs/classes/backend_gamelogic_pluginmanager.pluginmanager.md b/docs/classes/backend_gamelogic_pluginmanager.pluginmanager.md deleted file mode 100644 index 803e386c..00000000 --- a/docs/classes/backend_gamelogic_pluginmanager.pluginmanager.md +++ /dev/null @@ -1,373 +0,0 @@ -# Class: PluginManager - -[Backend/GameLogic/PluginManager](../modules/backend_gamelogic_pluginmanager.md).PluginManager - -This class keeps track of all the plugins that this player has loaded -into their game. Acts as a task manager, supports all CRUD operations -for plugins, as well as instantiating and destroying running plugins. -All library operations are also persisted to IndexDB. - -Important! Does not run plugins until the user clicks 'run' somewhere in -this UI. This is important, because if someone develops a buggy plugin, -it would suck if that bricked their game. - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_pluginmanager.pluginmanager.md#constructor) - -### Properties - -- [gameManager](backend_gamelogic_pluginmanager.pluginmanager.md#gamemanager) -- [pluginLibrary](backend_gamelogic_pluginmanager.pluginmanager.md#pluginlibrary) -- [pluginProcessInfos](backend_gamelogic_pluginmanager.pluginmanager.md#pluginprocessinfos) -- [pluginProcesses](backend_gamelogic_pluginmanager.pluginmanager.md#pluginprocesses) -- [plugins$](backend_gamelogic_pluginmanager.pluginmanager.md#plugins$) - -### Methods - -- [addPluginToLibrary](backend_gamelogic_pluginmanager.pluginmanager.md#addplugintolibrary) -- [deletePlugin](backend_gamelogic_pluginmanager.pluginmanager.md#deleteplugin) -- [destroy](backend_gamelogic_pluginmanager.pluginmanager.md#destroy) -- [drawAllRunningPlugins](backend_gamelogic_pluginmanager.pluginmanager.md#drawallrunningplugins) -- [getAllProcessInfos](backend_gamelogic_pluginmanager.pluginmanager.md#getallprocessinfos) -- [getLibrary](backend_gamelogic_pluginmanager.pluginmanager.md#getlibrary) -- [getPluginFromLibrary](backend_gamelogic_pluginmanager.pluginmanager.md#getpluginfromlibrary) -- [getProcessInfo](backend_gamelogic_pluginmanager.pluginmanager.md#getprocessinfo) -- [hasPlugin](backend_gamelogic_pluginmanager.pluginmanager.md#hasplugin) -- [load](backend_gamelogic_pluginmanager.pluginmanager.md#load) -- [notifyPluginLibraryUpdated](backend_gamelogic_pluginmanager.pluginmanager.md#notifypluginlibraryupdated) -- [onNewEmbeddedPlugins](backend_gamelogic_pluginmanager.pluginmanager.md#onnewembeddedplugins) -- [overwritePlugin](backend_gamelogic_pluginmanager.pluginmanager.md#overwriteplugin) -- [render](backend_gamelogic_pluginmanager.pluginmanager.md#render) -- [reorderPlugins](backend_gamelogic_pluginmanager.pluginmanager.md#reorderplugins) -- [spawn](backend_gamelogic_pluginmanager.pluginmanager.md#spawn) -- [copy](backend_gamelogic_pluginmanager.pluginmanager.md#copy) - -## Constructors - -### constructor - -\+ **new PluginManager**(`gameManager`: [_default_](backend_gamelogic_gamemanager.default.md)): [_PluginManager_](backend_gamelogic_pluginmanager.pluginmanager.md) - -#### Parameters - -| Name | Type | -| :------------ | :---------------------------------------------------- | -| `gameManager` | [_default_](backend_gamelogic_gamemanager.default.md) | - -**Returns:** [_PluginManager_](backend_gamelogic_pluginmanager.pluginmanager.md) - -## Properties - -### gameManager - -• `Private` **gameManager**: [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### pluginLibrary - -• `Private` **pluginLibrary**: [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[] - -All the plugins in the player's library. Not all of the player's plugins -are running, and therefore not all exist in `pluginInstances`. -`PluginsManager` keeps this field in sync with the plugins the user has -saved in the IndexDB via {@link PersistentChunkStore} - ---- - -### pluginProcessInfos - -• `Private` **pluginProcessInfos**: _Record_ - -parallel to pluginProcesses - ---- - -### pluginProcesses - -• `Private` **pluginProcesses**: _Record_ - -Plugins that are currently loaded into the game, and are rendering into a -window. `PluginsManager` makes sure that when a plugin starts executing, it -is added into `pluginInstances`, and that once a plugin is unloaded, its -`.destroy()` method is called, and that the plugin is removed from -`pluginInstances`. - ---- - -### plugins$ - -• **plugins$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter)<[_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[]\> - -Event emitter that publishes whenever the set of plugins changes. - -## Methods - -### addPluginToLibrary - -▸ **addPluginToLibrary**(`id`: [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid), `name`: _string_, `code`: _string_): [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md) - -adds a new plugin into the plugin library. - -#### Parameters - -| Name | Type | -| :----- | :-------------------------------------------------------------------- | -| `id` | [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid) | -| `name` | _string_ | -| `code` | _string_ | - -**Returns:** [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md) - ---- - -### deletePlugin - -▸ **deletePlugin**(`pluginId`: [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid)): _Promise_ - -Remove the given plugin both from the player's library, and kills -the plugin if it is running. - -#### Parameters - -| Name | Type | -| :--------- | :-------------------------------------------------------------------- | -| `pluginId` | [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid) | - -**Returns:** _Promise_ - ---- - -### destroy - -▸ **destroy**(`id`: [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid)): _void_ - -If a plugin with the given id is running, call its `.destroy()` method, -and remove it from `pluginInstances`. Stop listening for new local plugins. - -#### Parameters - -| Name | Type | -| :--- | :-------------------------------------------------------------------- | -| `id` | [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid) | - -**Returns:** _void_ - ---- - -### drawAllRunningPlugins - -▸ **drawAllRunningPlugins**(`ctx`: CanvasRenderingContext2D): _void_ - -For each currently running plugin, if the plugin has a 'draw' -function, then draw that plugin to the screen. - -#### Parameters - -| Name | Type | -| :---- | :----------------------- | -| `ctx` | CanvasRenderingContext2D | - -**Returns:** _void_ - ---- - -### getAllProcessInfos - -▸ **getAllProcessInfos**(): _Map_<[_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid), [_ProcessInfo_](backend_gamelogic_pluginmanager.processinfo.md)\> - -Gets a map of all the currently running processes - -**Returns:** _Map_<[_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid), [_ProcessInfo_](backend_gamelogic_pluginmanager.processinfo.md)\> - ---- - -### getLibrary - -▸ **getLibrary**(): [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[] - -Gets all the plugins in this player's library. - -**Returns:** [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[] - ---- - -### getPluginFromLibrary - -▸ **getPluginFromLibrary**(`id?`: [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid)): _undefined_ \| [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md) - -Gets the serialized plugin with the given id from the player's plugin -library. `undefined` if no plugin exists. - -#### Parameters - -| Name | Type | -| :---- | :-------------------------------------------------------------------- | -| `id?` | [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid) | - -**Returns:** _undefined_ \| [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md) - ---- - -### getProcessInfo - -▸ **getProcessInfo**(`id`: [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid)): [_ProcessInfo_](backend_gamelogic_pluginmanager.processinfo.md) - -If this process has been started, gets its info - -#### Parameters - -| Name | Type | -| :--- | :-------------------------------------------------------------------- | -| `id` | [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid) | - -**Returns:** [_ProcessInfo_](backend_gamelogic_pluginmanager.processinfo.md) - ---- - -### hasPlugin - -▸ `Private` **hasPlugin**(`plugin`: [_EmbeddedPlugin_](../interfaces/backend_plugins_embeddedpluginloader.embeddedplugin.md)): _boolean_ - -#### Parameters - -| Name | Type | -| :------- | :--------------------------------------------------------------------------------------- | -| `plugin` | [_EmbeddedPlugin_](../interfaces/backend_plugins_embeddedpluginloader.embeddedplugin.md) | - -**Returns:** _boolean_ - ---- - -### load - -▸ **load**(): _Promise_ - -Load all plugins from this disk into `pluginLibrary`. Insert the default -plugins into the player's library if the default plugins have never been -added before. Effectively idempotent after the first time you call it. - -**Returns:** _Promise_ - ---- - -### notifyPluginLibraryUpdated - -▸ `Private` **notifyPluginLibraryUpdated**(): _void_ - -**Returns:** _void_ - ---- - -### onNewEmbeddedPlugins - -▸ `Private` **onNewEmbeddedPlugins**(`newPlugins`: [_EmbeddedPlugin_](../interfaces/backend_plugins_embeddedpluginloader.embeddedplugin.md)[]): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :----------------------------------------------------------------------------------------- | -| `newPlugins` | [_EmbeddedPlugin_](../interfaces/backend_plugins_embeddedpluginloader.embeddedplugin.md)[] | - -**Returns:** _void_ - ---- - -### overwritePlugin - -▸ **overwritePlugin**(`newName`: _string_, `pluginCode`: _string_, `id`: [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid)): _void_ - -1. kills the plugin if it's running -2. edits the plugin-library version of this plugin -3. if a plugin was edited, save the plugin library to disk - -#### Parameters - -| Name | Type | -| :----------- | :-------------------------------------------------------------------- | -| `newName` | _string_ | -| `pluginCode` | _string_ | -| `id` | [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid) | - -**Returns:** _void_ - ---- - -### render - -▸ **render**(`id`: [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid), `element`: HTMLDivElement): _Promise_ - -If this plugin's `render` method has not been called yet, then -call it! Remembers that this plugin has been rendered. - -#### Parameters - -| Name | Type | -| :-------- | :-------------------------------------------------------------------- | -| `id` | [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid) | -| `element` | HTMLDivElement | - -**Returns:** _Promise_ - ---- - -### reorderPlugins - -▸ **reorderPlugins**(`newPluginIdOrder`: _string_[]): _void_ - -Reorders the current plugins. plugin ids in `newPluginIdOrder` must correspond -1:1 to plugins in the plugin library. - -#### Parameters - -| Name | Type | -| :----------------- | :--------- | -| `newPluginIdOrder` | _string_[] | - -**Returns:** _void_ - ---- - -### spawn - -▸ **spawn**(`id`: [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid)): _Promise_ - -Either spawns the given plugin by evaluating its `pluginCode`, or -returns the already running plugin instance. If starting a plugin -throws an error then returns `undefined`. - -#### Parameters - -| Name | Type | -| :--- | :-------------------------------------------------------------------- | -| `id` | [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid) | - -**Returns:** _Promise_ - ---- - -### copy - -▸ `Static` `Private` **copy**(`plugin`: T): T - -To prevent users of this class from modifying our plugins library, -we return clones of the plugins. This should probably be a function -in a Utils file somewhere, but I thought I should leave a good comment -about why we return copies of the plugins from the library. - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :------- | :--- | -| `plugin` | T | - -**Returns:** T diff --git a/docs/classes/backend_gamelogic_pluginmanager.processinfo.md b/docs/classes/backend_gamelogic_pluginmanager.processinfo.md deleted file mode 100644 index ff80019b..00000000 --- a/docs/classes/backend_gamelogic_pluginmanager.processinfo.md +++ /dev/null @@ -1,38 +0,0 @@ -# Class: ProcessInfo - -[Backend/GameLogic/PluginManager](../modules/backend_gamelogic_pluginmanager.md).ProcessInfo - -Represents book-keeping information about a running process. We keep it -separate from the process code, so that the plugin doesn't accidentally -overwrite this information. - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_pluginmanager.processinfo.md#constructor) - -### Properties - -- [hasError](backend_gamelogic_pluginmanager.processinfo.md#haserror) -- [rendered](backend_gamelogic_pluginmanager.processinfo.md#rendered) - -## Constructors - -### constructor - -\+ **new ProcessInfo**(): [_ProcessInfo_](backend_gamelogic_pluginmanager.processinfo.md) - -**Returns:** [_ProcessInfo_](backend_gamelogic_pluginmanager.processinfo.md) - -## Properties - -### hasError - -• **hasError**: _boolean_= false - ---- - -### rendered - -• **rendered**: _boolean_= false diff --git a/docs/classes/backend_gamelogic_tutorialmanager.default.md b/docs/classes/backend_gamelogic_tutorialmanager.default.md deleted file mode 100644 index 37f43e00..00000000 --- a/docs/classes/backend_gamelogic_tutorialmanager.default.md +++ /dev/null @@ -1,123 +0,0 @@ -# Class: default - -[Backend/GameLogic/TutorialManager](../modules/backend_gamelogic_tutorialmanager.md).default - -## Hierarchy - -- _EventEmitter_ - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_tutorialmanager.default.md#constructor) - -### Properties - -- [tutorialState](backend_gamelogic_tutorialmanager.default.md#tutorialstate) -- [instance](backend_gamelogic_tutorialmanager.default.md#instance) - -### Methods - -- [acceptInput](backend_gamelogic_tutorialmanager.default.md#acceptinput) -- [advance](backend_gamelogic_tutorialmanager.default.md#advance) -- [complete](backend_gamelogic_tutorialmanager.default.md#complete) -- [reset](backend_gamelogic_tutorialmanager.default.md#reset) -- [setTutorialState](backend_gamelogic_tutorialmanager.default.md#settutorialstate) -- [getInstance](backend_gamelogic_tutorialmanager.default.md#getinstance) - -## Constructors - -### constructor - -\+ `Private` **new default**(): [_default_](backend_gamelogic_tutorialmanager.default.md) - -**Returns:** [_default_](backend_gamelogic_tutorialmanager.default.md) - -Overrides: EventEmitter.constructor - -## Properties - -### tutorialState - -• `Private` **tutorialState**: [_TutorialState_](../enums/backend_gamelogic_tutorialmanager.tutorialstate.md) - ---- - -### instance - -▪ `Static` **instance**: [_default_](backend_gamelogic_tutorialmanager.default.md) - -## Methods - -### acceptInput - -▸ **acceptInput**(`state`: [_TutorialState_](../enums/backend_gamelogic_tutorialmanager.tutorialstate.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :----------------------------------------------------------------------------- | -| `state` | [_TutorialState_](../enums/backend_gamelogic_tutorialmanager.tutorialstate.md) | - -**Returns:** _void_ - ---- - -### advance - -▸ `Private` **advance**(): _void_ - -**Returns:** _void_ - ---- - -### complete - -▸ **complete**(`gameUiManager`: [_default_](backend_gamelogic_gameuimanager.default.md)): _void_ - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------ | -| `gameUiManager` | [_default_](backend_gamelogic_gameuimanager.default.md) | - -**Returns:** _void_ - ---- - -### reset - -▸ **reset**(`account`: _undefined_ \| EthAddress): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :------------------------ | -| `account` | _undefined_ \| EthAddress | - -**Returns:** _void_ - ---- - -### setTutorialState - -▸ `Private` **setTutorialState**(`newState`: [_TutorialState_](../enums/backend_gamelogic_tutorialmanager.tutorialstate.md)): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :----------------------------------------------------------------------------- | -| `newState` | [_TutorialState_](../enums/backend_gamelogic_tutorialmanager.tutorialstate.md) | - -**Returns:** _void_ - ---- - -### getInstance - -▸ `Static` **getInstance**(): [_default_](backend_gamelogic_tutorialmanager.default.md) - -**Returns:** [_default_](backend_gamelogic_tutorialmanager.default.md) diff --git a/docs/classes/backend_gamelogic_viewportentities.viewportentities.md b/docs/classes/backend_gamelogic_viewportentities.viewportentities.md deleted file mode 100644 index fb402533..00000000 --- a/docs/classes/backend_gamelogic_viewportentities.viewportentities.md +++ /dev/null @@ -1,213 +0,0 @@ -# Class: ViewportEntities - -[Backend/GameLogic/ViewportEntities](../modules/backend_gamelogic_viewportentities.md).ViewportEntities - -Efficiently calculates which planets are in the viewport, and allows you to find the nearest -visible planet to the mouse. - -## Table of contents - -### Constructors - -- [constructor](backend_gamelogic_viewportentities.viewportentities.md#constructor) - -### Properties - -- [cachedExploredChunks](backend_gamelogic_viewportentities.viewportentities.md#cachedexploredchunks) -- [cachedPlanets](backend_gamelogic_viewportentities.viewportentities.md#cachedplanets) -- [cachedPlanetsAsList](backend_gamelogic_viewportentities.viewportentities.md#cachedplanetsaslist) -- [gameManager](backend_gamelogic_viewportentities.viewportentities.md#gamemanager) -- [uiManager](backend_gamelogic_viewportentities.viewportentities.md#uimanager) - -### Methods - -- [getNearestVisiblePlanet](backend_gamelogic_viewportentities.viewportentities.md#getnearestvisibleplanet) -- [getPlanetRadii](backend_gamelogic_viewportentities.viewportentities.md#getplanetradii) -- [getPlanetsAndChunks](backend_gamelogic_viewportentities.viewportentities.md#getplanetsandchunks) -- [getVisiblePlanetLevels](backend_gamelogic_viewportentities.viewportentities.md#getvisibleplanetlevels) -- [loadPlanetMessages](backend_gamelogic_viewportentities.viewportentities.md#loadplanetmessages) -- [recalculateViewportChunks](backend_gamelogic_viewportentities.viewportentities.md#recalculateviewportchunks) -- [recalculateViewportPlanets](backend_gamelogic_viewportentities.viewportentities.md#recalculateviewportplanets) -- [replacePlanets](backend_gamelogic_viewportentities.viewportentities.md#replaceplanets) -- [startRefreshing](backend_gamelogic_viewportentities.viewportentities.md#startrefreshing) -- [updateLocationsAndChunks](backend_gamelogic_viewportentities.viewportentities.md#updatelocationsandchunks) - -## Constructors - -### constructor - -\+ **new ViewportEntities**(`gameManager`: [_default_](backend_gamelogic_gamemanager.default.md), `gameUIManager`: [_default_](backend_gamelogic_gameuimanager.default.md)): [_ViewportEntities_](backend_gamelogic_viewportentities.viewportentities.md) - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------ | -| `gameManager` | [_default_](backend_gamelogic_gamemanager.default.md) | -| `gameUIManager` | [_default_](backend_gamelogic_gameuimanager.default.md) | - -**Returns:** [_ViewportEntities_](backend_gamelogic_viewportentities.viewportentities.md) - -## Properties - -### cachedExploredChunks - -• `Private` **cachedExploredChunks**: _Set_<[_Chunk_](_types_global_globaltypes.chunk.md)\> - ---- - -### cachedPlanets - -• `Private` **cachedPlanets**: _Map_ - ---- - -### cachedPlanetsAsList - -• `Private` **cachedPlanetsAsList**: [_PlanetRenderInfo_](../interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md)[]= [] - ---- - -### gameManager - -• `Private` `Readonly` **gameManager**: [_default_](backend_gamelogic_gamemanager.default.md) - ---- - -### uiManager - -• `Private` `Readonly` **uiManager**: [_default_](backend_gamelogic_gameuimanager.default.md) - -## Methods - -### getNearestVisiblePlanet - -▸ **getNearestVisiblePlanet**(`coords`: WorldCoords): _undefined_ \| LocatablePlanet - -Gets the planet that is closest to the given coordinates. Filters out irrelevant planets -using the `radiusMap` parameter, which specifies how close a planet must be in order to -be returned from this function, given that planet's level. Smaller planets have a smaller -radius, and larger planets have a larger radius. - -If a smaller and a larger planet are both within respective radii of coords, the smaller -planet is returned. - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _undefined_ \| LocatablePlanet - ---- - -### getPlanetRadii - -▸ `Private` **getPlanetRadii**(`viewport`: [_default_](frontend_game_viewport.default.md)): _Map_ - -One entry per planet level - radius in screen pixels of that planet level given the current -viewport configuration, as well as the world radius. - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------- | -| `viewport` | [_default_](frontend_game_viewport.default.md) | - -**Returns:** _Map_ - ---- - -### getPlanetsAndChunks - -▸ **getPlanetsAndChunks**(): _object_ - -**Returns:** _object_ - -| Name | Type | -| :-------------- | :------------------------------------------------------------------------------------------------------------- | -| `cachedPlanets` | _Map_ | -| `chunks` | _Set_<[_Chunk_](_types_global_globaltypes.chunk.md)\> | - ---- - -### getVisiblePlanetLevels - -▸ `Private` **getVisiblePlanetLevels**(`viewport`: [_default_](frontend_game_viewport.default.md)): _number_[] - -Returns a list of planet levels which, when rendered, would result in a planet that has a size -larger than one pixel. - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------- | -| `viewport` | [_default_](frontend_game_viewport.default.md) | - -**Returns:** _number_[] - ---- - -### loadPlanetMessages - -▸ `Private` **loadPlanetMessages**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### recalculateViewportChunks - -▸ `Private` **recalculateViewportChunks**(`viewport`: [_default_](frontend_game_viewport.default.md)): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------- | -| `viewport` | [_default_](frontend_game_viewport.default.md) | - -**Returns:** _void_ - ---- - -### recalculateViewportPlanets - -▸ `Private` **recalculateViewportPlanets**(`viewport`: [_default_](frontend_game_viewport.default.md)): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------- | -| `viewport` | [_default_](frontend_game_viewport.default.md) | - -**Returns:** _void_ - ---- - -### replacePlanets - -▸ `Private` **replacePlanets**(`newPlanetsInViewport`: LocatablePlanet[]): _void_ - -#### Parameters - -| Name | Type | -| :--------------------- | :---------------- | -| `newPlanetsInViewport` | LocatablePlanet[] | - -**Returns:** _void_ - ---- - -### startRefreshing - -▸ **startRefreshing**(): _void_ - -**Returns:** _void_ - ---- - -### updateLocationsAndChunks - -▸ `Private` **updateLocationsAndChunks**(): _void_ - -**Returns:** _void_ diff --git a/docs/classes/backend_miner_minermanager.default.md b/docs/classes/backend_miner_minermanager.default.md deleted file mode 100644 index c14a00a4..00000000 --- a/docs/classes/backend_miner_minermanager.default.md +++ /dev/null @@ -1,399 +0,0 @@ -# Class: default - -[Backend/Miner/MinerManager](../modules/backend_miner_minermanager.md).default - -## Hierarchy - -- _EventEmitter_ - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](backend_miner_minermanager.default.md#constructor) - -### Properties - -- [WorkerCtor](backend_miner_minermanager.default.md#workerctor) -- [cores](backend_miner_minermanager.default.md#cores) -- [currentJobId](backend_miner_minermanager.default.md#currentjobid) -- [exploringChunk](backend_miner_minermanager.default.md#exploringchunk) -- [exploringChunkStart](backend_miner_minermanager.default.md#exploringchunkstart) -- [hashConfig](backend_miner_minermanager.default.md#hashconfig) -- [isExploring](backend_miner_minermanager.default.md#isexploring) -- [minedChunksStore](backend_miner_minermanager.default.md#minedchunksstore) -- [minersComplete](backend_miner_minermanager.default.md#minerscomplete) -- [miningPattern](backend_miner_minermanager.default.md#miningpattern) -- [perlinOptions](backend_miner_minermanager.default.md#perlinoptions) -- [planetRarity](backend_miner_minermanager.default.md#planetrarity) -- [useMockHash](backend_miner_minermanager.default.md#usemockhash) -- [workers](backend_miner_minermanager.default.md#workers) -- [worldRadius](backend_miner_minermanager.default.md#worldradius) - -### Methods - -- [chunkKeyToLocation](backend_miner_minermanager.default.md#chunkkeytolocation) -- [chunkLocationToKey](backend_miner_minermanager.default.md#chunklocationtokey) -- [destroy](backend_miner_minermanager.default.md#destroy) -- [exploreNext](backend_miner_minermanager.default.md#explorenext) -- [getCurrentlyExploringChunk](backend_miner_minermanager.default.md#getcurrentlyexploringchunk) -- [getMiningPattern](backend_miner_minermanager.default.md#getminingpattern) -- [initWorker](backend_miner_minermanager.default.md#initworker) -- [isMining](backend_miner_minermanager.default.md#ismining) -- [isValidExploreTarget](backend_miner_minermanager.default.md#isvalidexploretarget) -- [nextValidExploreTarget](backend_miner_minermanager.default.md#nextvalidexploretarget) -- [onDiscovered](backend_miner_minermanager.default.md#ondiscovered) -- [sendMessageToWorkers](backend_miner_minermanager.default.md#sendmessagetoworkers) -- [setCores](backend_miner_minermanager.default.md#setcores) -- [setMiningPattern](backend_miner_minermanager.default.md#setminingpattern) -- [setRadius](backend_miner_minermanager.default.md#setradius) -- [startExplore](backend_miner_minermanager.default.md#startexplore) -- [stopExplore](backend_miner_minermanager.default.md#stopexplore) -- [create](backend_miner_minermanager.default.md#create) - -## Constructors - -### constructor - -\+ `Private` **new default**(`minedChunksStore`: [_ChunkStore_](../interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md), `miningPattern`: [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md), `worldRadius`: _number_, `planetRarity`: _number_, `hashConfig`: [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig), `useMockHash`: _boolean_, `WorkerCtor`: _typeof_ [_default_](_types_worker_loader_workertypes.default.md)): [_default_](backend_miner_minermanager.default.md) - -#### Parameters - -| Name | Type | -| :----------------- | :-------------------------------------------------------------------------------- | -| `minedChunksStore` | [_ChunkStore_](../interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md) | -| `miningPattern` | [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) | -| `worldRadius` | _number_ | -| `planetRarity` | _number_ | -| `hashConfig` | [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) | -| `useMockHash` | _boolean_ | -| `WorkerCtor` | _typeof_ [_default_](_types_worker_loader_workertypes.default.md) | - -**Returns:** [_default_](backend_miner_minermanager.default.md) - -Overrides: EventEmitter.constructor - -## Properties - -### WorkerCtor - -• `Private` **WorkerCtor**: _typeof_ [_default_](_types_worker_loader_workertypes.default.md) - ---- - -### cores - -• `Private` **cores**: _number_= 1 - ---- - -### currentJobId - -• `Private` **currentJobId**: _number_= 0 - ---- - -### exploringChunk - -• `Private` **exploringChunk**: _object_= {} - -#### Type declaration - ---- - -### exploringChunkStart - -• `Private` **exploringChunkStart**: _object_= {} - -#### Type declaration - ---- - -### hashConfig - -• `Private` **hashConfig**: [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) - ---- - -### isExploring - -• `Private` **isExploring**: _boolean_= false - ---- - -### minedChunksStore - -• `Private` `Readonly` **minedChunksStore**: [_ChunkStore_](../interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md) - ---- - -### minersComplete - -• `Private` **minersComplete**: _object_= {} - -#### Type declaration - ---- - -### miningPattern - -• `Private` **miningPattern**: [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) - ---- - -### perlinOptions - -• `Private` **perlinOptions**: PerlinConfig - ---- - -### planetRarity - -• `Private` `Readonly` **planetRarity**: _number_ - ---- - -### useMockHash - -• `Private` **useMockHash**: _boolean_ - ---- - -### workers - -• `Private` **workers**: [_default_](_types_worker_loader_workertypes.default.md)[] - ---- - -### worldRadius - -• `Private` **worldRadius**: _number_ - -## Methods - -### chunkKeyToLocation - -▸ `Private` **chunkKeyToLocation**(`chunkKey`: _string_): _undefined_ \| [[_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), _number_] - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `chunkKey` | _string_ | - -**Returns:** _undefined_ \| [[_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), _number_] - ---- - -### chunkLocationToKey - -▸ `Private` **chunkLocationToKey**(`chunkLocation`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), `jobId`: _number_): _string_ - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------------------ | -| `chunkLocation` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | -| `jobId` | _number_ | - -**Returns:** _string_ - ---- - -### destroy - -▸ **destroy**(): _void_ - -**Returns:** _void_ - ---- - -### exploreNext - -▸ `Private` **exploreNext**(`fromChunk`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), `jobId`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :------------------------------------------------------------------ | -| `fromChunk` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | -| `jobId` | _number_ | - -**Returns:** _void_ - ---- - -### getCurrentlyExploringChunk - -▸ **getCurrentlyExploringChunk**(): _undefined_ \| [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - -**Returns:** _undefined_ \| [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - ---- - -### getMiningPattern - -▸ **getMiningPattern**(): [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) - -**Returns:** [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) - ---- - -### initWorker - -▸ `Private` **initWorker**(`index`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------ | :------- | -| `index` | _number_ | - -**Returns:** _void_ - ---- - -### isMining - -▸ **isMining**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### isValidExploreTarget - -▸ `Private` **isValidExploreTarget**(`chunkLocation`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): _boolean_ - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------------------ | -| `chunkLocation` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** _boolean_ - ---- - -### nextValidExploreTarget - -▸ `Private` **nextValidExploreTarget**(`chunkLocation`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), `jobId`: _number_): _Promise_ - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------------------ | -| `chunkLocation` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | -| `jobId` | _number_ | - -**Returns:** _Promise_ - ---- - -### onDiscovered - -▸ `Private` **onDiscovered**(`exploredChunk`: [_Chunk_](_types_global_globaltypes.chunk.md), `jobId`: _number_): _Promise_ - -#### Parameters - -| Name | Type | -| :-------------- | :-------------------------------------------- | -| `exploredChunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | -| `jobId` | _number_ | - -**Returns:** _Promise_ - ---- - -### sendMessageToWorkers - -▸ `Private` **sendMessageToWorkers**(`chunkToExplore`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), `jobId`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :--------------- | :------------------------------------------------------------------ | -| `chunkToExplore` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | -| `jobId` | _number_ | - -**Returns:** _void_ - ---- - -### setCores - -▸ **setCores**(`nCores`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `nCores` | _number_ | - -**Returns:** _void_ - ---- - -### setMiningPattern - -▸ **setMiningPattern**(`pattern`: [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md)): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------- | -| `pattern` | [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) | - -**Returns:** _void_ - ---- - -### setRadius - -▸ **setRadius**(`radius`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `radius` | _number_ | - -**Returns:** _void_ - ---- - -### startExplore - -▸ **startExplore**(): _void_ - -**Returns:** _void_ - ---- - -### stopExplore - -▸ **stopExplore**(): _void_ - -**Returns:** _void_ - ---- - -### create - -▸ `Static` **create**(`chunkStore`: [_ChunkStore_](../interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md), `miningPattern`: [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md), `worldRadius`: _number_, `planetRarity`: _number_, `hashConfig`: [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig), `useMockHash?`: _boolean_, `WorkerCtor?`: _typeof_ [_default_](_types_worker_loader_workertypes.default.md)): [_default_](backend_miner_minermanager.default.md) - -#### Parameters - -| Name | Type | Default value | -| :-------------- | :-------------------------------------------------------------------------------- | :------------ | -| `chunkStore` | [_ChunkStore_](../interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md) | - | -| `miningPattern` | [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) | - | -| `worldRadius` | _number_ | - | -| `planetRarity` | _number_ | - | -| `hashConfig` | [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) | - | -| `useMockHash` | _boolean_ | false | -| `WorkerCtor` | _typeof_ [_default_](_types_worker_loader_workertypes.default.md) | - | - -**Returns:** [_default_](backend_miner_minermanager.default.md) diff --git a/docs/classes/backend_miner_minermanager.homeplanetminerchunkstore.md b/docs/classes/backend_miner_minermanager.homeplanetminerchunkstore.md deleted file mode 100644 index a9c7e592..00000000 --- a/docs/classes/backend_miner_minermanager.homeplanetminerchunkstore.md +++ /dev/null @@ -1,95 +0,0 @@ -# Class: HomePlanetMinerChunkStore - -[Backend/Miner/MinerManager](../modules/backend_miner_minermanager.md).HomePlanetMinerChunkStore - -## Implements - -- [_ChunkStore_](../interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md) - -## Table of contents - -### Constructors - -- [constructor](backend_miner_minermanager.homeplanetminerchunkstore.md#constructor) - -### Properties - -- [initPerlinMax](backend_miner_minermanager.homeplanetminerchunkstore.md#initperlinmax) -- [initPerlinMin](backend_miner_minermanager.homeplanetminerchunkstore.md#initperlinmin) -- [minedChunkKeys](backend_miner_minermanager.homeplanetminerchunkstore.md#minedchunkkeys) -- [perlinOptions](backend_miner_minermanager.homeplanetminerchunkstore.md#perlinoptions) - -### Methods - -- [addChunk](backend_miner_minermanager.homeplanetminerchunkstore.md#addchunk) -- [hasMinedChunk](backend_miner_minermanager.homeplanetminerchunkstore.md#hasminedchunk) - -## Constructors - -### constructor - -\+ **new HomePlanetMinerChunkStore**(`initPerlinMin`: _number_, `initPerlinMax`: _number_, `hashConfig`: [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig)): [_HomePlanetMinerChunkStore_](backend_miner_minermanager.homeplanetminerchunkstore.md) - -#### Parameters - -| Name | Type | -| :-------------- | :----------------------------------------------------------------- | -| `initPerlinMin` | _number_ | -| `initPerlinMax` | _number_ | -| `hashConfig` | [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) | - -**Returns:** [_HomePlanetMinerChunkStore_](backend_miner_minermanager.homeplanetminerchunkstore.md) - -## Properties - -### initPerlinMax - -• `Private` **initPerlinMax**: _number_ - ---- - -### initPerlinMin - -• `Private` **initPerlinMin**: _number_ - ---- - -### minedChunkKeys - -• `Private` **minedChunkKeys**: _Set_ - ---- - -### perlinOptions - -• `Private` **perlinOptions**: PerlinConfig - -## Methods - -### addChunk - -▸ **addChunk**(`exploredChunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :-------------- | :-------------------------------------------- | -| `exploredChunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### hasMinedChunk - -▸ **hasMinedChunk**(`chunkFootprint`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): _boolean_ - -#### Parameters - -| Name | Type | -| :--------------- | :------------------------------------------------------------------ | -| `chunkFootprint` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** _boolean_ - -Implementation of: ChunkStore.hasMinedChunk diff --git a/docs/classes/backend_miner_miningpatterns.spiralpattern.md b/docs/classes/backend_miner_miningpatterns.spiralpattern.md deleted file mode 100644 index c734d186..00000000 --- a/docs/classes/backend_miner_miningpatterns.spiralpattern.md +++ /dev/null @@ -1,76 +0,0 @@ -# Class: SpiralPattern - -[Backend/Miner/MiningPatterns](../modules/backend_miner_miningpatterns.md).SpiralPattern - -## Implements - -- [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) - -## Table of contents - -### Constructors - -- [constructor](backend_miner_miningpatterns.spiralpattern.md#constructor) - -### Properties - -- [chunkSideLength](backend_miner_miningpatterns.spiralpattern.md#chunksidelength) -- [fromChunk](backend_miner_miningpatterns.spiralpattern.md#fromchunk) -- [type](backend_miner_miningpatterns.spiralpattern.md#type) - -### Methods - -- [nextChunk](backend_miner_miningpatterns.spiralpattern.md#nextchunk) - -## Constructors - -### constructor - -\+ **new SpiralPattern**(`center`: WorldCoords, `chunkSize`: _number_): [_SpiralPattern_](backend_miner_miningpatterns.spiralpattern.md) - -#### Parameters - -| Name | Type | -| :---------- | :---------- | -| `center` | WorldCoords | -| `chunkSize` | _number_ | - -**Returns:** [_SpiralPattern_](backend_miner_miningpatterns.spiralpattern.md) - -## Properties - -### chunkSideLength - -• **chunkSideLength**: _number_ - ---- - -### fromChunk - -• **fromChunk**: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - -Implementation of: [MiningPattern](../interfaces/backend_miner_miningpatterns.miningpattern.md).[fromChunk](../interfaces/backend_miner_miningpatterns.miningpattern.md#fromchunk) - ---- - -### type - -• **type**: [_MiningPatternType_](../enums/backend_miner_miningpatterns.miningpatterntype.md) - -Implementation of: [MiningPattern](../interfaces/backend_miner_miningpatterns.miningpattern.md).[type](../interfaces/backend_miner_miningpatterns.miningpattern.md#type) - -## Methods - -### nextChunk - -▸ **nextChunk**(`chunk`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - -#### Parameters - -| Name | Type | -| :------ | :------------------------------------------------------------------ | -| `chunk` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - -Implementation of: MiningPattern.nextChunk diff --git a/docs/classes/backend_miner_miningpatterns.swisscheesepattern.md b/docs/classes/backend_miner_miningpatterns.swisscheesepattern.md deleted file mode 100644 index c3205a83..00000000 --- a/docs/classes/backend_miner_miningpatterns.swisscheesepattern.md +++ /dev/null @@ -1,76 +0,0 @@ -# Class: SwissCheesePattern - -[Backend/Miner/MiningPatterns](../modules/backend_miner_miningpatterns.md).SwissCheesePattern - -## Implements - -- [_MiningPattern_](../interfaces/backend_miner_miningpatterns.miningpattern.md) - -## Table of contents - -### Constructors - -- [constructor](backend_miner_miningpatterns.swisscheesepattern.md#constructor) - -### Properties - -- [chunkSideLength](backend_miner_miningpatterns.swisscheesepattern.md#chunksidelength) -- [fromChunk](backend_miner_miningpatterns.swisscheesepattern.md#fromchunk) -- [type](backend_miner_miningpatterns.swisscheesepattern.md#type) - -### Methods - -- [nextChunk](backend_miner_miningpatterns.swisscheesepattern.md#nextchunk) - -## Constructors - -### constructor - -\+ **new SwissCheesePattern**(`center`: WorldCoords, `chunkSize`: _number_): [_SwissCheesePattern_](backend_miner_miningpatterns.swisscheesepattern.md) - -#### Parameters - -| Name | Type | -| :---------- | :---------- | -| `center` | WorldCoords | -| `chunkSize` | _number_ | - -**Returns:** [_SwissCheesePattern_](backend_miner_miningpatterns.swisscheesepattern.md) - -## Properties - -### chunkSideLength - -• **chunkSideLength**: _number_ - ---- - -### fromChunk - -• **fromChunk**: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - -Implementation of: [MiningPattern](../interfaces/backend_miner_miningpatterns.miningpattern.md).[fromChunk](../interfaces/backend_miner_miningpatterns.miningpattern.md#fromchunk) - ---- - -### type - -• **type**: [_MiningPatternType_](../enums/backend_miner_miningpatterns.miningpatterntype.md) - -Implementation of: [MiningPattern](../interfaces/backend_miner_miningpatterns.miningpattern.md).[type](../interfaces/backend_miner_miningpatterns.miningpattern.md#type) - -## Methods - -### nextChunk - -▸ **nextChunk**(`chunk`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - -#### Parameters - -| Name | Type | -| :------ | :------------------------------------------------------------------ | -| `chunk` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) - -Implementation of: MiningPattern.nextChunk diff --git a/docs/classes/backend_network_ethconnection.default.md b/docs/classes/backend_network_ethconnection.default.md deleted file mode 100644 index f78ba93d..00000000 --- a/docs/classes/backend_network_ethconnection.default.md +++ /dev/null @@ -1,446 +0,0 @@ -# Class: default - -[Backend/Network/EthConnection](../modules/backend_network_ethconnection.md).default - -Responsible for - -1. loading the contract -2. the in-memory wallet -3. connecting to the correct network - -## Hierarchy - -- _EventEmitter_ - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](backend_network_ethconnection.default.md#constructor) - -### Properties - -- [blockNumber](backend_network_ethconnection.default.md#blocknumber) -- [blockNumber$](backend_network_ethconnection.default.md#blocknumber$) -- [diagnosticsUpdater](backend_network_ethconnection.default.md#diagnosticsupdater) -- [gasPrices](backend_network_ethconnection.default.md#gasprices) -- [gasPrices$](backend_network_ethconnection.default.md#gasprices$) -- [knownAddresses](backend_network_ethconnection.default.md#knownaddresses) -- [provider](backend_network_ethconnection.default.md#provider) -- [rpcURL](backend_network_ethconnection.default.md#rpcurl) -- [signer](backend_network_ethconnection.default.md#signer) -- [XDAI_DEFAULT_URL](backend_network_ethconnection.default.md#xdai_default_url) - -### Methods - -- [addAccount](backend_network_ethconnection.default.md#addaccount) -- [adjustPollRateBasedOnVisibility](backend_network_ethconnection.default.md#adjustpollratebasedonvisibility) -- [getAddress](backend_network_ethconnection.default.md#getaddress) -- [getBalance](backend_network_ethconnection.default.md#getbalance) -- [getGasPriceGwei](backend_network_ethconnection.default.md#getgaspricegwei) -- [getGasPrices](backend_network_ethconnection.default.md#getgasprices) -- [getKnownAccounts](backend_network_ethconnection.default.md#getknownaccounts) -- [getNonce](backend_network_ethconnection.default.md#getnonce) -- [getPrivateKey](backend_network_ethconnection.default.md#getprivatekey) -- [getRpcEndpoint](backend_network_ethconnection.default.md#getrpcendpoint) -- [hasSigner](backend_network_ethconnection.default.md#hassigner) -- [isWhitelisted](backend_network_ethconnection.default.md#iswhitelisted) -- [loadContract](backend_network_ethconnection.default.md#loadcontract) -- [loadCoreContract](backend_network_ethconnection.default.md#loadcorecontract) -- [loadGPTCreditContract](backend_network_ethconnection.default.md#loadgptcreditcontract) -- [loadGettersContract](backend_network_ethconnection.default.md#loadgetterscontract) -- [loadWhitelistContract](backend_network_ethconnection.default.md#loadwhitelistcontract) -- [processEvents](backend_network_ethconnection.default.md#processevents) -- [refreshGasPrices](backend_network_ethconnection.default.md#refreshgasprices) -- [setAccount](backend_network_ethconnection.default.md#setaccount) -- [setDiagnosticUpdater](backend_network_ethconnection.default.md#setdiagnosticupdater) -- [setRpcEndpoint](backend_network_ethconnection.default.md#setrpcendpoint) -- [signMessage](backend_network_ethconnection.default.md#signmessage) -- [startPollingGasPrices](backend_network_ethconnection.default.md#startpollinggasprices) -- [subscribeToEvents](backend_network_ethconnection.default.md#subscribetoevents) -- [verifySignature](backend_network_ethconnection.default.md#verifysignature) -- [waitForTransaction](backend_network_ethconnection.default.md#waitfortransaction) - -## Constructors - -### constructor - -\+ **new default**(): [_default_](backend_network_ethconnection.default.md) - -**Returns:** [_default_](backend_network_ethconnection.default.md) - -Overrides: EventEmitter.constructor - -## Properties - -### blockNumber - -• `Private` **blockNumber**: _number_ - ---- - -### blockNumber$ - -• `Readonly` **blockNumber$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### diagnosticsUpdater - -• `Private` **diagnosticsUpdater**: _undefined_ \| [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) - ---- - -### gasPrices - -• `Private` **gasPrices**: GasPrices - ---- - -### gasPrices$ - -• `Readonly` **gasPrices$**: [_Monomitter_](../modules/frontend_utils_monomitter.md#monomitter) - ---- - -### knownAddresses - -• `Private` **knownAddresses**: EthAddress[] - ---- - -### provider - -• `Private` **provider**: _JsonRpcProvider_ - ---- - -### rpcURL - -• `Private` **rpcURL**: _string_ - ---- - -### signer - -• `Private` **signer**: _undefined_ \| _Wallet_ - ---- - -### XDAI_DEFAULT_URL - -▪ `Static` `Private` `Readonly` **XDAI_DEFAULT_URL**: _string_ - -## Methods - -### addAccount - -▸ **addAccount**(`skey`: _string_): _void_ - -#### Parameters - -| Name | Type | -| :----- | :------- | -| `skey` | _string_ | - -**Returns:** _void_ - ---- - -### adjustPollRateBasedOnVisibility - -▸ `Private` **adjustPollRateBasedOnVisibility**(): _void_ - -**Returns:** _void_ - ---- - -### getAddress - -▸ **getAddress**(): EthAddress - -**Returns:** EthAddress - ---- - -### getBalance - -▸ **getBalance**(`address`: EthAddress): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :--------- | -| `address` | EthAddress | - -**Returns:** _Promise_ - ---- - -### getGasPriceGwei - -▸ **getGasPriceGwei**(`txType`: EthTxType, `gasPrices`: GasPrices): _number_ - -Get the gas price, measured in gwei, that we should send for a given transaction type, given -the current prices for transaction speeds, and given the user's gas price setting. - -#### Parameters - -| Name | Type | -| :---------- | :-------- | -| `txType` | EthTxType | -| `gasPrices` | GasPrices | - -**Returns:** _number_ - ---- - -### getGasPrices - -▸ **getGasPrices**(): GasPrices - -**Returns:** GasPrices - ---- - -### getKnownAccounts - -▸ **getKnownAccounts**(): EthAddress[] - -**Returns:** EthAddress[] - ---- - -### getNonce - -▸ **getNonce**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### getPrivateKey - -▸ **getPrivateKey**(): _string_ - -**Returns:** _string_ - ---- - -### getRpcEndpoint - -▸ **getRpcEndpoint**(): _string_ - -**Returns:** _string_ - ---- - -### hasSigner - -▸ **hasSigner**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### isWhitelisted - -▸ **isWhitelisted**(`address`: EthAddress): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :--------- | -| `address` | EthAddress | - -**Returns:** _Promise_ - ---- - -### loadContract - -▸ **loadContract**(`contractAddress`: _string_, `contractABI`: ContractInterface): _Promise_ - -#### Type parameters - -| Name | Type | -| :--- | :------------- | -| `C` | _Contract_ | - -#### Parameters - -| Name | Type | -| :---------------- | :---------------- | -| `contractAddress` | _string_ | -| `contractABI` | ContractInterface | - -**Returns:** _Promise_ - ---- - -### loadCoreContract - -▸ **loadCoreContract**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### loadGPTCreditContract - -▸ **loadGPTCreditContract**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### loadGettersContract - -▸ **loadGettersContract**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### loadWhitelistContract - -▸ **loadWhitelistContract**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### processEvents - -▸ `Private` **processEvents**(`startBlock`: _number_, `endBlock`: _number_, `eventFilter`: EventFilter, `contract`: _DarkForestCore_, `handlers`: _Partial_\>): _Promise_ - -#### Parameters - -| Name | Type | -| :------------ | :------------------------------------------------------------------------------------------------------------- | -| `startBlock` | _number_ | -| `endBlock` | _number_ | -| `eventFilter` | EventFilter | -| `contract` | _DarkForestCore_ | -| `handlers` | _Partial_\> | - -**Returns:** _Promise_ - ---- - -### refreshGasPrices - -▸ `Private` **refreshGasPrices**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### setAccount - -▸ **setAccount**(`address`: EthAddress): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :--------- | -| `address` | EthAddress | - -**Returns:** _void_ - ---- - -### setDiagnosticUpdater - -▸ **setDiagnosticUpdater**(`diagnosticUpdater?`: [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md)): _void_ - -#### Parameters - -| Name | Type | -| :------------------- | :--------------------------------------------------------------------------------------------- | -| `diagnosticUpdater?` | [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) | - -**Returns:** _void_ - ---- - -### setRpcEndpoint - -▸ **setRpcEndpoint**(`url`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `url` | _string_ | - -**Returns:** _Promise_ - ---- - -### signMessage - -▸ **signMessage**(`message`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `message` | _string_ | - -**Returns:** _Promise_ - ---- - -### startPollingGasPrices - -▸ `Private` **startPollingGasPrices**(): _void_ - -**Returns:** _void_ - ---- - -### subscribeToEvents - -▸ **subscribeToEvents**(`contract`: _DarkForestCore_, `handlers`: _Partial_\>): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :------------------------------------------------------------------------------------------------------------- | -| `contract` | _DarkForestCore_ | -| `handlers` | _Partial_\> | - -**Returns:** _void_ - ---- - -### verifySignature - -▸ **verifySignature**(`message`: _string_, `signature`: _string_, `address`: EthAddress): _boolean_ - -#### Parameters - -| Name | Type | -| :---------- | :--------- | -| `message` | _string_ | -| `signature` | _string_ | -| `address` | EthAddress | - -**Returns:** _boolean_ - ---- - -### waitForTransaction - -▸ **waitForTransaction**(`txHash`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `txHash` | _string_ | - -**Returns:** _Promise_ diff --git a/docs/classes/backend_network_eventlogger.eventlogger.md b/docs/classes/backend_network_eventlogger.eventlogger.md deleted file mode 100644 index 192be452..00000000 --- a/docs/classes/backend_network_eventlogger.eventlogger.md +++ /dev/null @@ -1,69 +0,0 @@ -# Class: EventLogger - -[Backend/Network/EventLogger](../modules/backend_network_eventlogger.md).EventLogger - -## Table of contents - -### Constructors - -- [constructor](backend_network_eventlogger.eventlogger.md#constructor) - -### Properties - -- [instance](backend_network_eventlogger.eventlogger.md#instance) - -### Methods - -- [logEvent](backend_network_eventlogger.eventlogger.md#logevent) -- [augmentEvent](backend_network_eventlogger.eventlogger.md#augmentevent) -- [getInstance](backend_network_eventlogger.eventlogger.md#getinstance) - -## Constructors - -### constructor - -\+ **new EventLogger**(): [_EventLogger_](backend_network_eventlogger.eventlogger.md) - -**Returns:** [_EventLogger_](backend_network_eventlogger.eventlogger.md) - -## Properties - -### instance - -▪ `Static` `Private` **instance**: [_EventLogger_](backend_network_eventlogger.eventlogger.md) - -## Methods - -### logEvent - -▸ **logEvent**(`event`: _unknown_): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------- | -| `event` | _unknown_ | - -**Returns:** _void_ - ---- - -### augmentEvent - -▸ `Static` **augmentEvent**(`event`: _unknown_): _object_ - -#### Parameters - -| Name | Type | -| :------ | :-------- | -| `event` | _unknown_ | - -**Returns:** _object_ - ---- - -### getInstance - -▸ `Static` **getInstance**(): [_EventLogger_](backend_network_eventlogger.eventlogger.md) - -**Returns:** [_EventLogger_](backend_network_eventlogger.eventlogger.md) diff --git a/docs/classes/backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md b/docs/classes/backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md deleted file mode 100644 index 5ff283e6..00000000 --- a/docs/classes/backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md +++ /dev/null @@ -1,203 +0,0 @@ -# Class: ThrottledConcurrentQueue - -[Backend/Network/ThrottledConcurrentQueue](../modules/backend_network_throttledconcurrentqueue.md).ThrottledConcurrentQueue - -A queue that executes promises with a max throughput, and optionally max -concurrency. - -## Table of contents - -### Constructors - -- [constructor](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#constructor) - -### Properties - -- [concurrency](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#concurrency) -- [executionTimeout](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#executiontimeout) -- [executionTimestamps](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#executiontimestamps) -- [invocationIntervalMs](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#invocationintervalms) -- [maxConcurrency](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#maxconcurrency) -- [taskQueue](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#taskqueue) - -### Methods - -- [add](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#add) -- [concurrencyQuotaRemaining](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#concurrencyquotaremaining) -- [deleteOutdatedExecutionTimestamps](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#deleteoutdatedexecutiontimestamps) -- [executeNextTasks](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#executenexttasks) -- [next](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#next) -- [nextPossibleExecution](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#nextpossibleexecution) -- [size](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#size) -- [throttleQuotaRemaining](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#throttlequotaremaining) - -## Constructors - -### constructor - -\+ **new ThrottledConcurrentQueue**(`maxInvocationsPerIntervalMs`: _number_, `invocationIntervalMs`: _number_, `maxConcurrency?`: _number_): [_ThrottledConcurrentQueue_](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md) - -#### Parameters - -| Name | Type | -| :---------------------------- | :------- | -| `maxInvocationsPerIntervalMs` | _number_ | -| `invocationIntervalMs` | _number_ | -| `maxConcurrency` | _number_ | - -**Returns:** [_ThrottledConcurrentQueue_](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md) - -## Properties - -### concurrency - -• `Private` **concurrency**: _number_= 0 - -Amount of tasks being executed right now. - ---- - -### executionTimeout - -• `Private` **executionTimeout**: _Timeout_ - -When we schedule an attempt at executing another task in the future, -we don't want to schedule it more than once. Therefore, we keep track -of this scheduled attempt. - ---- - -### executionTimestamps - -• `Private` **executionTimestamps**: _default_ - -Each time a task is executed, record the start of its execution time. -Execution timestamps are removed when they become outdated. Used for -keeping the amount of executions under the throttle limit. - ---- - -### invocationIntervalMs - -• `Private` `Readonly` **invocationIntervalMs**: _number_ - -The interval during which we only allow a certain maximum amount of tasks -to be executed. - ---- - -### maxConcurrency - -• `Private` `Readonly` **maxConcurrency**: _number_ - -Maximum amount of tasks that can be executing at the same time. - ---- - -### taskQueue - -• `Private` **taskQueue**: _QueuedTask_[]= [] - -Queue of tasks to execute. Added to the front, popped off the back. - -## Methods - -### add - -▸ **add**(`generator`: () => _Promise_): _Promise_ - -Adds a task to be executed at some point in the future. Returns a promise -that resolves when the task finishes successfully, and rejects when there -is an error. - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Description | -| :---------- | :------------------ | :------------------------------------------------------ | -| `generator` | () => _Promise_ | a function that returns a promise representing the task | - -**Returns:** _Promise_ - ---- - -### concurrencyQuotaRemaining - -▸ `Private` **concurrencyQuotaRemaining**(): _number_ - -At this moment, how many more tasks we could execute without exceeding the -concurrency quota. - -**Returns:** _number_ - ---- - -### deleteOutdatedExecutionTimestamps - -▸ `Private` **deleteOutdatedExecutionTimestamps**(): _void_ - -Removes all task execution timestamps that are older than [[this.invocationIntervalMs]], -because those invocations have no bearing on whether or not we can execute another task. - -**Returns:** _void_ - ---- - -### executeNextTasks - -▸ `Private` **executeNextTasks**(): _Promise_ - -Runs tasks until it's at either the throttle or concurrency limit. If there are more -tasks to be executed after that, schedules itself to execute again at the soonest -possible moment. - -**Returns:** _Promise_ - ---- - -### next - -▸ `Private` **next**(): _Promise_ - -If there is a next task to execute, executes it. Records the time of execution in -[executionTimestamps](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md#executiontimestamps). Increments and decrements concurrency counter. Neither throttles -nor limits concurrency. - -**Returns:** _Promise_ - ---- - -### nextPossibleExecution - -▸ `Private` **nextPossibleExecution**(): _undefined_ \| _number_ - -Returns the soonest possible time from now we could execute another task without going -over the throttle limit. - -**Returns:** _undefined_ \| _number_ - ---- - -### size - -▸ **size**(): _number_ - -Returns the amount of queued items, not including the ones that are being executed at this moment. - -**Returns:** _number_ - ---- - -### throttleQuotaRemaining - -▸ `Private` **throttleQuotaRemaining**(): _number_ - -At this moment, how many more tasks we could execute without exceeding the -throttle quota. - -**Returns:** _number_ diff --git a/docs/classes/backend_network_txexecutor.txexecutor.md b/docs/classes/backend_network_txexecutor.txexecutor.md deleted file mode 100644 index 6ff6f9be..00000000 --- a/docs/classes/backend_network_txexecutor.txexecutor.md +++ /dev/null @@ -1,178 +0,0 @@ -# Class: TxExecutor - -[Backend/Network/TxExecutor](../modules/backend_network_txexecutor.md).TxExecutor - -## Hierarchy - -- _EventEmitter_ - - ↳ **TxExecutor** - -## Table of contents - -### Constructors - -- [constructor](backend_network_txexecutor.txexecutor.md#constructor) - -### Properties - -- [diagnosticsUpdater](backend_network_txexecutor.txexecutor.md#diagnosticsupdater) -- [eth](backend_network_txexecutor.txexecutor.md#eth) -- [lastTransaction](backend_network_txexecutor.txexecutor.md#lasttransaction) -- [nonce](backend_network_txexecutor.txexecutor.md#nonce) -- [txQueue](backend_network_txexecutor.txexecutor.md#txqueue) -- [MIN_BALANCE_ETH](backend_network_txexecutor.txexecutor.md#min_balance_eth) -- [NONCE_STALE_AFTER_MS](backend_network_txexecutor.txexecutor.md#nonce_stale_after_ms) -- [TX_SUBMIT_TIMEOUT](backend_network_txexecutor.txexecutor.md#tx_submit_timeout) - -### Methods - -- [checkBalance](backend_network_txexecutor.txexecutor.md#checkbalance) -- [execute](backend_network_txexecutor.txexecutor.md#execute) -- [makeRequest](backend_network_txexecutor.txexecutor.md#makerequest) -- [maybeUpdateNonce](backend_network_txexecutor.txexecutor.md#maybeupdatenonce) -- [setDiagnosticUpdater](backend_network_txexecutor.txexecutor.md#setdiagnosticupdater) - -## Constructors - -### constructor - -\+ **new TxExecutor**(`ethConnection`: [_default_](backend_network_ethconnection.default.md), `nonce`: _number_): [_TxExecutor_](backend_network_txexecutor.txexecutor.md) - -#### Parameters - -| Name | Type | -| :-------------- | :---------------------------------------------------- | -| `ethConnection` | [_default_](backend_network_ethconnection.default.md) | -| `nonce` | _number_ | - -**Returns:** [_TxExecutor_](backend_network_txexecutor.txexecutor.md) - -Overrides: EventEmitter.constructor - -## Properties - -### diagnosticsUpdater - -• `Private` `Optional` **diagnosticsUpdater**: [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) - ---- - -### eth - -• `Private` **eth**: [_default_](backend_network_ethconnection.default.md) - ---- - -### lastTransaction - -• `Private` **lastTransaction**: _number_ - ---- - -### nonce - -• `Private` **nonce**: _number_ - ---- - -### txQueue - -• `Private` **txQueue**: [_ThrottledConcurrentQueue_](backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md) - ---- - -### MIN_BALANCE_ETH - -▪ `Static` `Private` `Readonly` **MIN_BALANCE_ETH**: `0.002`= 0.002 - -don't allow users to submit txs if balance falls below - ---- - -### NONCE_STALE_AFTER_MS - -▪ `Static` `Private` `Readonly` **NONCE_STALE_AFTER_MS**: _number_ - -we refresh the nonce if it hasn't been updated in this amount of time - ---- - -### TX_SUBMIT_TIMEOUT - -▪ `Static` `Private` `Readonly` **TX_SUBMIT_TIMEOUT**: `30000`= 30000 - -tx is considered to have errored if haven't successfully -submitted to mempool within 30s - -## Methods - -### checkBalance - -▸ `Private` **checkBalance**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### execute - -▸ `Private` **execute**(`txRequest`: [_QueuedTxRequest_](../interfaces/backend_network_txexecutor.queuedtxrequest.md)): _Promise_ - -#### Parameters - -| Name | Type | -| :---------- | :------------------------------------------------------------------------------- | -| `txRequest` | [_QueuedTxRequest_](../interfaces/backend_network_txexecutor.queuedtxrequest.md) | - -**Returns:** _Promise_ - ---- - -### makeRequest - -▸ **makeRequest**(`type`: EthTxType, `actionId`: _string_, `contract`: _Contract_, `args`: _unknown_[], `overrides?`: TransactionRequest): [_PendingTransaction_](../interfaces/backend_network_txexecutor.pendingtransaction.md) - -Schedules this transaction to execute once all of the transactions -ahead of it have completed. - -#### Type parameters - -| Name | -| :--- | -| `T` | -| `U` | - -#### Parameters - -| Name | Type | -| :---------- | :----------------- | -| `type` | EthTxType | -| `actionId` | _string_ | -| `contract` | _Contract_ | -| `args` | _unknown_[] | -| `overrides` | TransactionRequest | - -**Returns:** [_PendingTransaction_](../interfaces/backend_network_txexecutor.pendingtransaction.md) - ---- - -### maybeUpdateNonce - -▸ `Private` **maybeUpdateNonce**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### setDiagnosticUpdater - -▸ **setDiagnosticUpdater**(`diagnosticUpdater?`: [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md)): _void_ - -#### Parameters - -| Name | Type | -| :------------------- | :--------------------------------------------------------------------------------------------- | -| `diagnosticUpdater?` | [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) | - -**Returns:** _void_ diff --git a/docs/classes/backend_procedural_noise.default.md b/docs/classes/backend_procedural_noise.default.md deleted file mode 100644 index 2ef34413..00000000 --- a/docs/classes/backend_procedural_noise.default.md +++ /dev/null @@ -1,71 +0,0 @@ -# Class: default - -[Backend/Procedural/Noise](../modules/backend_procedural_noise.md).default - -## Table of contents - -### Constructors - -- [constructor](backend_procedural_noise.default.md#constructor) - -### Properties - -- [noise](backend_procedural_noise.default.md#noise) -- [instance](backend_procedural_noise.default.md#instance) - -### Methods - -- [simplex2](backend_procedural_noise.default.md#simplex2) -- [getInstance](backend_procedural_noise.default.md#getinstance) -- [initialize](backend_procedural_noise.default.md#initialize) - -## Constructors - -### constructor - -\+ **new default**(): [_default_](backend_procedural_noise.default.md) - -**Returns:** [_default_](backend_procedural_noise.default.md) - -## Properties - -### noise - -• **noise**: _any_ - ---- - -### instance - -▪ `Static` **instance**: [_default_](backend_procedural_noise.default.md) - -## Methods - -### simplex2 - -▸ **simplex2**(`x`: _any_, `y`: _any_): _number_ - -#### Parameters - -| Name | Type | -| :--- | :---- | -| `x` | _any_ | -| `y` | _any_ | - -**Returns:** _number_ - ---- - -### getInstance - -▸ `Static` **getInstance**(): [_default_](backend_procedural_noise.default.md) - -**Returns:** [_default_](backend_procedural_noise.default.md) - ---- - -### initialize - -▸ `Static` **initialize**(): [_default_](backend_procedural_noise.default.md) - -**Returns:** [_default_](backend_procedural_noise.default.md) diff --git a/docs/classes/backend_procedural_procgenutils.procgenutils.md b/docs/classes/backend_procedural_procgenutils.procgenutils.md deleted file mode 100644 index dd6176ea..00000000 --- a/docs/classes/backend_procedural_procgenutils.procgenutils.md +++ /dev/null @@ -1,509 +0,0 @@ -# Class: ProcgenUtils - -[Backend/Procedural/ProcgenUtils](../modules/backend_procedural_procgenutils.md).ProcgenUtils - -## Table of contents - -### Constructors - -- [constructor](backend_procedural_procgenutils.procgenutils.md#constructor) - -### Properties - -- [baseByBiome](backend_procedural_procgenutils.procgenutils.md#basebybiome) -- [blurbs2ById](backend_procedural_procgenutils.procgenutils.md#blurbs2byid) -- [blurbsById](backend_procedural_procgenutils.procgenutils.md#blurbsbyid) -- [cosmeticByLocId](backend_procedural_procgenutils.procgenutils.md#cosmeticbylocid) -- [grayColors](backend_procedural_procgenutils.procgenutils.md#graycolors) -- [huesByHash](backend_procedural_procgenutils.procgenutils.md#huesbyhash) -- [namesById](backend_procedural_procgenutils.procgenutils.md#namesbyid) -- [oceanByBiome](backend_procedural_procgenutils.procgenutils.md#oceanbybiome) -- [rgbsByHash](backend_procedural_procgenutils.procgenutils.md#rgbsbyhash) -- [strByBiome](backend_procedural_procgenutils.procgenutils.md#strbybiome) -- [taglinesById](backend_procedural_procgenutils.procgenutils.md#taglinesbyid) - -### Methods - -- [artifactRandom](backend_procedural_procgenutils.procgenutils.md#artifactrandom) -- [artifactRandomInt](backend_procedural_procgenutils.procgenutils.md#artifactrandomint) -- [ellipsStrEnd](backend_procedural_procgenutils.procgenutils.md#ellipsstrend) -- [ellipsisStr](backend_procedural_procgenutils.procgenutils.md#ellipsisstr) -- [getBiomeRgbStr](backend_procedural_procgenutils.procgenutils.md#getbiomergbstr) -- [getHatSizeName](backend_procedural_procgenutils.procgenutils.md#gethatsizename) -- [getOwnerColor](backend_procedural_procgenutils.procgenutils.md#getownercolor) -- [getOwnerColorVec](backend_procedural_procgenutils.procgenutils.md#getownercolorvec) -- [getPlanetBlurb](backend_procedural_procgenutils.procgenutils.md#getplanetblurb) -- [getPlanetBlurb2](backend_procedural_procgenutils.procgenutils.md#getplanetblurb2) -- [getPlanetClass](backend_procedural_procgenutils.procgenutils.md#getplanetclass) -- [getPlanetCosmetic](backend_procedural_procgenutils.procgenutils.md#getplanetcosmetic) -- [getPlanetName](backend_procedural_procgenutils.procgenutils.md#getplanetname) -- [getPlanetNameHash](backend_procedural_procgenutils.procgenutils.md#getplanetnamehash) -- [getPlanetTagline](backend_procedural_procgenutils.procgenutils.md#getplanettagline) -- [getPlanetTitle](backend_procedural_procgenutils.procgenutils.md#getplanettitle) -- [getPlayerColor](backend_procedural_procgenutils.procgenutils.md#getplayercolor) -- [getPlayerColorVec](backend_procedural_procgenutils.procgenutils.md#getplayercolorvec) -- [getRuinsInfo](backend_procedural_procgenutils.procgenutils.md#getruinsinfo) -- [hashToHue](backend_procedural_procgenutils.procgenutils.md#hashtohue) -- [hashToInt](backend_procedural_procgenutils.procgenutils.md#hashtoint) -- [hslStr](backend_procedural_procgenutils.procgenutils.md#hslstr) -- [hslToRgb](backend_procedural_procgenutils.procgenutils.md#hsltorgb) -- [planetPerlin](backend_procedural_procgenutils.procgenutils.md#planetperlin) -- [planetRandom](backend_procedural_procgenutils.procgenutils.md#planetrandom) -- [planetRandomInt](backend_procedural_procgenutils.procgenutils.md#planetrandomint) -- [rgbStr](backend_procedural_procgenutils.procgenutils.md#rgbstr) - -## Constructors - -### constructor - -\+ **new ProcgenUtils**(): [_ProcgenUtils_](backend_procedural_procgenutils.procgenutils.md) - -**Returns:** [_ProcgenUtils_](backend_procedural_procgenutils.procgenutils.md) - -## Properties - -### baseByBiome - -▪ `Static` `Private` **baseByBiome**: _Record_ - ---- - -### blurbs2ById - -▪ `Static` `Private` **blurbs2ById**: _Map_ - ---- - -### blurbsById - -▪ `Static` `Private` **blurbsById**: _Map_ - ---- - -### cosmeticByLocId - -▪ `Static` `Private` **cosmeticByLocId**: _Map_ - ---- - -### grayColors - -▪ `Static` **grayColors**: [_PlanetCosmeticInfo_](../interfaces/backend_utils_utilstypes.planetcosmeticinfo.md) - ---- - -### huesByHash - -▪ `Static` `Private` **huesByHash**: _Map_ - ---- - -### namesById - -▪ `Static` `Private` **namesById**: _Map_ - ---- - -### oceanByBiome - -▪ `Static` `Private` **oceanByBiome**: _Record_ - ---- - -### rgbsByHash - -▪ `Static` `Private` **rgbsByHash**: _Map_ - ---- - -### strByBiome - -▪ `Static` `Private` **strByBiome**: _Map_ - ---- - -### taglinesById - -▪ `Static` `Private` **taglinesById**: _Map_ - -## Methods - -### artifactRandom - -▸ `Static` **artifactRandom**(`loc`: ArtifactId): _function_ - -#### Parameters - -| Name | Type | -| :---- | :--------- | -| `loc` | ArtifactId | - -**Returns:** () => _number_ - ---- - -### artifactRandomInt - -▸ `Static` **artifactRandomInt**(`loc`: ArtifactId): _function_ - -#### Parameters - -| Name | Type | -| :---- | :--------- | -| `loc` | ArtifactId | - -**Returns:** () => _number_ - ---- - -### ellipsStrEnd - -▸ `Static` **ellipsStrEnd**(`str`: _string_, `maxLen`: _number_): _string_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `str` | _string_ | -| `maxLen` | _number_ | - -**Returns:** _string_ - ---- - -### ellipsisStr - -▸ `Static` **ellipsisStr**(`str`: _string_, `maxLen`: _number_): _string_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `str` | _string_ | -| `maxLen` | _number_ | - -**Returns:** _string_ - ---- - -### getBiomeRgbStr - -▸ `Static` **getBiomeRgbStr**(`biome`: Biome): _string_ - -#### Parameters - -| Name | Type | -| :------ | :---- | -| `biome` | Biome | - -**Returns:** _string_ - ---- - -### getHatSizeName - -▸ `Static` **getHatSizeName**(`planet`: Planet): _string_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _string_ - ---- - -### getOwnerColor - -▸ `Static` **getOwnerColor**(`planet`: Planet): _string_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _string_ - ---- - -### getOwnerColorVec - -▸ `Static` **getOwnerColorVec**(`planet`: Planet): [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) - ---- - -### getPlanetBlurb - -▸ `Static` **getPlanetBlurb**(`planet`: _undefined_ \| Planet): _string_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _string_ - ---- - -### getPlanetBlurb2 - -▸ `Static` **getPlanetBlurb2**(`planet`: _undefined_ \| Planet): _string_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _string_ - ---- - -### getPlanetClass - -▸ `Static` **getPlanetClass**(`planet`: Planet): UpgradeBranchName - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** UpgradeBranchName - ---- - -### getPlanetCosmetic - -▸ `Static` **getPlanetCosmetic**(`planet`: _undefined_ \| Planet): [_PlanetCosmeticInfo_](../interfaces/backend_utils_utilstypes.planetcosmeticinfo.md) - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** [_PlanetCosmeticInfo_](../interfaces/backend_utils_utilstypes.planetcosmeticinfo.md) - ---- - -### getPlanetName - -▸ `Static` **getPlanetName**(`planet`: _undefined_ \| Planet): _string_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _string_ - ---- - -### getPlanetNameHash - -▸ `Static` **getPlanetNameHash**(`locId`: LocationId): _string_ - -#### Parameters - -| Name | Type | -| :------ | :--------- | -| `locId` | LocationId | - -**Returns:** _string_ - ---- - -### getPlanetTagline - -▸ `Static` **getPlanetTagline**(`planet`: _undefined_ \| Planet): _string_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _string_ - ---- - -### getPlanetTitle - -▸ `Static` **getPlanetTitle**(`planet`: _undefined_ \| Planet): _string_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _string_ - ---- - -### getPlayerColor - -▸ `Static` **getPlayerColor**(`player`: EthAddress): _string_ - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `player` | EthAddress | - -**Returns:** _string_ - ---- - -### getPlayerColorVec - -▸ `Static` **getPlayerColorVec**(`player`: EthAddress): [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `player` | EthAddress | - -**Returns:** [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) - ---- - -### getRuinsInfo - -▸ `Static` **getRuinsInfo**(`loc`: LocationId): _Record_ - -#### Parameters - -| Name | Type | -| :---- | :--------- | -| `loc` | LocationId | - -**Returns:** _Record_ - ---- - -### hashToHue - -▸ `Static` **hashToHue**(`hash`: _string_): _number_ - -#### Parameters - -| Name | Type | -| :----- | :------- | -| `hash` | _string_ | - -**Returns:** _number_ - ---- - -### hashToInt - -▸ `Static` **hashToInt**(`hash`: _string_): _number_ - -#### Parameters - -| Name | Type | -| :----- | :------- | -| `hash` | _string_ | - -**Returns:** _number_ - ---- - -### hslStr - -▸ `Static` **hslStr**(`h`: _number_, `s`: _number_, `l`: _number_): _string_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `h` | _number_ | -| `s` | _number_ | -| `l` | _number_ | - -**Returns:** _string_ - ---- - -### hslToRgb - -▸ `Static` **hslToRgb**(`__namedParameters`: [_HSLVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#hslvec)): [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - -#### Parameters - -| Name | Type | -| :------------------ | :--------------------------------------------------------------------------- | -| `__namedParameters` | [_HSLVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#hslvec) | - -**Returns:** [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### planetPerlin - -▸ `Static` **planetPerlin**(`loc`: LocationId): _function_ - -#### Parameters - -| Name | Type | -| :---- | :--------- | -| `loc` | LocationId | - -**Returns:** (`coords`: [_PixelCoords_](../modules/backend_procedural_procgenutils.md#pixelcoords)) => _number_ - ---- - -### planetRandom - -▸ `Static` **planetRandom**(`loc`: LocationId): _function_ - -#### Parameters - -| Name | Type | -| :---- | :--------- | -| `loc` | LocationId | - -**Returns:** () => _number_ - ---- - -### planetRandomInt - -▸ `Static` **planetRandomInt**(`loc`: LocationId): _function_ - -#### Parameters - -| Name | Type | -| :---- | :--------- | -| `loc` | LocationId | - -**Returns:** () => _number_ - ---- - -### rgbStr - -▸ `Static` **rgbStr**(`rgb`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec)): _string_ - -#### Parameters - -| Name | Type | -| :---- | :--------------------------------------------------------------------------- | -| `rgb` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - -**Returns:** _string_ diff --git a/docs/classes/backend_storage_persistentchunkstore.default.md b/docs/classes/backend_storage_persistentchunkstore.default.md deleted file mode 100644 index 8d794882..00000000 --- a/docs/classes/backend_storage_persistentchunkstore.default.md +++ /dev/null @@ -1,495 +0,0 @@ -# Class: default - -[Backend/Storage/PersistentChunkStore](../modules/backend_storage_persistentchunkstore.md).default - -## Implements - -- [_ChunkStore_](../interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md) - -## Table of contents - -### Constructors - -- [constructor](backend_storage_persistentchunkstore.default.md#constructor) - -### Properties - -- [account](backend_storage_persistentchunkstore.default.md#account) -- [chunkMap](backend_storage_persistentchunkstore.default.md#chunkmap) -- [confirmedTxHashes](backend_storage_persistentchunkstore.default.md#confirmedtxhashes) -- [db](backend_storage_persistentchunkstore.default.md#db) -- [diagnosticUpdater](backend_storage_persistentchunkstore.default.md#diagnosticupdater) -- [nUpdatesLastTwoMins](backend_storage_persistentchunkstore.default.md#nupdateslasttwomins) -- [queuedChunkWrites](backend_storage_persistentchunkstore.default.md#queuedchunkwrites) -- [throttledSaveChunkCacheToDisk](backend_storage_persistentchunkstore.default.md#throttledsavechunkcachetodisk) - -### Methods - -- [addChunk](backend_storage_persistentchunkstore.default.md#addchunk) -- [addHomeLocation](backend_storage_persistentchunkstore.default.md#addhomelocation) -- [allChunks](backend_storage_persistentchunkstore.default.md#allchunks) -- [bulkSetKeyInCollection](backend_storage_persistentchunkstore.default.md#bulksetkeyincollection) -- [confirmHomeLocation](backend_storage_persistentchunkstore.default.md#confirmhomelocation) -- [destroy](backend_storage_persistentchunkstore.default.md#destroy) -- [getChunkByFootprint](backend_storage_persistentchunkstore.default.md#getchunkbyfootprint) -- [getChunkById](backend_storage_persistentchunkstore.default.md#getchunkbyid) -- [getHomeLocations](backend_storage_persistentchunkstore.default.md#gethomelocations) -- [getKey](backend_storage_persistentchunkstore.default.md#getkey) -- [getMinedSubChunks](backend_storage_persistentchunkstore.default.md#getminedsubchunks) -- [getSavedRevealedCoords](backend_storage_persistentchunkstore.default.md#getsavedrevealedcoords) -- [getSavedTouchedPlanetIds](backend_storage_persistentchunkstore.default.md#getsavedtouchedplanetids) -- [getUnconfirmedSubmittedEthTxs](backend_storage_persistentchunkstore.default.md#getunconfirmedsubmittedethtxs) -- [hasMinedChunk](backend_storage_persistentchunkstore.default.md#hasminedchunk) -- [loadChunks](backend_storage_persistentchunkstore.default.md#loadchunks) -- [loadPlugins](backend_storage_persistentchunkstore.default.md#loadplugins) -- [onEthTxComplete](backend_storage_persistentchunkstore.default.md#onethtxcomplete) -- [onEthTxSubmit](backend_storage_persistentchunkstore.default.md#onethtxsubmit) -- [persistQueuedChunks](backend_storage_persistentchunkstore.default.md#persistqueuedchunks) -- [recomputeSaveThrottleAfterUpdate](backend_storage_persistentchunkstore.default.md#recomputesavethrottleafterupdate) -- [removeKey](backend_storage_persistentchunkstore.default.md#removekey) -- [savePlugins](backend_storage_persistentchunkstore.default.md#saveplugins) -- [saveRevealedCoords](backend_storage_persistentchunkstore.default.md#saverevealedcoords) -- [saveTouchedPlanetIds](backend_storage_persistentchunkstore.default.md#savetouchedplanetids) -- [setDiagnosticUpdater](backend_storage_persistentchunkstore.default.md#setdiagnosticupdater) -- [setKey](backend_storage_persistentchunkstore.default.md#setkey) -- [create](backend_storage_persistentchunkstore.default.md#create) - -## Constructors - -### constructor - -\+ **new default**(`db`: _IDBPDatabase_, `account`: EthAddress): [_default_](backend_storage_persistentchunkstore.default.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------- | -| `db` | _IDBPDatabase_ | -| `account` | EthAddress | - -**Returns:** [_default_](backend_storage_persistentchunkstore.default.md) - -## Properties - -### account - -• `Private` **account**: EthAddress - ---- - -### chunkMap - -• `Private` **chunkMap**: _Map_<[_ChunkId_](../modules/_types_darkforest_api_chunkstoretypes.md#chunkid), [_Chunk_](_types_global_globaltypes.chunk.md)\> - ---- - -### confirmedTxHashes - -• `Private` **confirmedTxHashes**: _Set_ - ---- - -### db - -• `Private` **db**: _IDBPDatabase_ - ---- - -### diagnosticUpdater - -• `Private` `Optional` **diagnosticUpdater**: [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) - ---- - -### nUpdatesLastTwoMins - -• `Private` **nUpdatesLastTwoMins**: _number_= 0 - ---- - -### queuedChunkWrites - -• `Private` **queuedChunkWrites**: DBTx[] - ---- - -### throttledSaveChunkCacheToDisk - -• `Private` **throttledSaveChunkCacheToDisk**: _DebouncedFunc_<() => _Promise_\> - -## Methods - -### addChunk - -▸ **addChunk**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md), `persistChunk?`: _boolean_): _void_ - -When a chunk is mined, or a chunk is imported via map import, or a chunk is loaded from -persistent storage for the first time, we need to add this chunk to the game. This function -allows you to add a new chunk to the game, and optionally persist that chunk. The reason you -might not want to persist the chunk is if you are sure that you got it from persistent storage. -i.e. it already exists in persistent storage. - -#### Parameters - -| Name | Type | Default value | -| :------------- | :-------------------------------------------- | :------------ | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - | -| `persistChunk` | _boolean_ | true | - -**Returns:** _void_ - ---- - -### addHomeLocation - -▸ **addHomeLocation**(`location`: WorldLocation): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :------------ | -| `location` | WorldLocation | - -**Returns:** _Promise_ - ---- - -### allChunks - -▸ **allChunks**(): _Iterable_<[_Chunk_](_types_global_globaltypes.chunk.md)\> - -**Returns:** _Iterable_<[_Chunk_](_types_global_globaltypes.chunk.md)\> - ---- - -### bulkSetKeyInCollection - -▸ `Private` **bulkSetKeyInCollection**(`updateChunkTxs`: DBTx[], `collection`: ObjectStore): _Promise_ - -#### Parameters - -| Name | Type | -| :--------------- | :---------- | -| `updateChunkTxs` | DBTx[] | -| `collection` | ObjectStore | - -**Returns:** _Promise_ - ---- - -### confirmHomeLocation - -▸ **confirmHomeLocation**(`location`: WorldLocation): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :------------ | -| `location` | WorldLocation | - -**Returns:** _Promise_ - ---- - -### destroy - -▸ **destroy**(): _void_ - -**Returns:** _void_ - ---- - -### getChunkByFootprint - -▸ **getChunkByFootprint**(`chunkLoc`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): _undefined_ \| [_Chunk_](_types_global_globaltypes.chunk.md) - -Returns the explored chunk data for the given rectangle if that chunk has been mined. If this -chunk is entirely contained within another bigger chunk that has been mined, return that chunk. -`chunkLoc` is an aligned square, as defined in ChunkUtils.ts in the `getSiblingLocations` -function. - -#### Parameters - -| Name | Type | -| :--------- | :------------------------------------------------------------------ | -| `chunkLoc` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** _undefined_ \| [_Chunk_](_types_global_globaltypes.chunk.md) - ---- - -### getChunkById - -▸ `Private` **getChunkById**(`chunkId`: [_ChunkId_](../modules/_types_darkforest_api_chunkstoretypes.md#chunkid)): _undefined_ \| [_Chunk_](_types_global_globaltypes.chunk.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------- | -| `chunkId` | [_ChunkId_](../modules/_types_darkforest_api_chunkstoretypes.md#chunkid) | - -**Returns:** _undefined_ \| [_Chunk_](_types_global_globaltypes.chunk.md) - ---- - -### getHomeLocations - -▸ **getHomeLocations**(): _Promise_ - -we keep a list rather than a single location, since client/contract can -often go out of sync on initialization - if client thinks that init -failed but is wrong, it will prompt user to initialize with new home coords, -which bricks the user's account. - -**Returns:** _Promise_ - ---- - -### getKey - -▸ `Private` **getKey**(`key`: _string_, `objStore?`: ObjectStore): _Promise_ - -Important! This sets the key in indexed db per account and per contract. This means the same -client can connect to multiple different dark forest contracts, with multiple different -accounts, and the persistent storage will not overwrite data that is not relevant for the -current configuration of the client. - -#### Parameters - -| Name | Type | -| :--------- | :---------- | -| `key` | _string_ | -| `objStore` | ObjectStore | - -**Returns:** _Promise_ - ---- - -### getMinedSubChunks - -▸ `Private` **getMinedSubChunks**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): [_Chunk_](_types_global_globaltypes.chunk.md)[] - -Returns all the mined chunks with smaller sidelength strictly contained in the chunk. - -TODO: move this into ChunkUtils, and also make use of it, the way that it is currently used, in -the function named `addToChunkMap`. - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** [_Chunk_](_types_global_globaltypes.chunk.md)[] - ---- - -### getSavedRevealedCoords - -▸ **getSavedRevealedCoords**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### getSavedTouchedPlanetIds - -▸ **getSavedTouchedPlanetIds**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### getUnconfirmedSubmittedEthTxs - -▸ **getUnconfirmedSubmittedEthTxs**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### hasMinedChunk - -▸ **hasMinedChunk**(`chunkLoc`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): _boolean_ - -#### Parameters - -| Name | Type | -| :--------- | :------------------------------------------------------------------ | -| `chunkLoc` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** _boolean_ - -Implementation of: ChunkStore.hasMinedChunk - ---- - -### loadChunks - -▸ `Private` **loadChunks**(): _Promise_ - -This function loads all chunks persisted in the user's storage into the game. - -**Returns:** _Promise_ - ---- - -### loadPlugins - -▸ **loadPlugins**(): _Promise_<[_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[]\> - -**Returns:** _Promise_<[_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[]\> - ---- - -### onEthTxComplete - -▸ **onEthTxComplete**(`txHash`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `txHash` | _string_ | - -**Returns:** _Promise_ - ---- - -### onEthTxSubmit - -▸ **onEthTxSubmit**(`tx`: SubmittedTx): _Promise_ - -#### Parameters - -| Name | Type | -| :--- | :---------- | -| `tx` | SubmittedTx | - -**Returns:** _Promise_ - ---- - -### persistQueuedChunks - -▸ `Private` **persistQueuedChunks**(): _Promise_ - -Rather than saving a chunk immediately after it's mined, we queue up new chunks, and -periodically save them. This function gets all of the queued new chunks, and persists them to -indexed db. - -**Returns:** _Promise_ - ---- - -### recomputeSaveThrottleAfterUpdate - -▸ `Private` **recomputeSaveThrottleAfterUpdate**(): _void_ - -**Returns:** _void_ - ---- - -### removeKey - -▸ `Private` **removeKey**(`key`: _string_, `objStore?`: ObjectStore): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :---------- | -| `key` | _string_ | -| `objStore` | ObjectStore | - -**Returns:** _Promise_ - ---- - -### savePlugins - -▸ **savePlugins**(`plugins`: [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[]): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------------- | -| `plugins` | [_SerializedPlugin_](../interfaces/backend_plugins_serializedplugin.serializedplugin.md)[] | - -**Returns:** _Promise_ - ---- - -### saveRevealedCoords - -▸ **saveRevealedCoords**(`revealedCoordTups`: RevealedCoords[]): _Promise_ - -#### Parameters - -| Name | Type | -| :------------------ | :--------------- | -| `revealedCoordTups` | RevealedCoords[] | - -**Returns:** _Promise_ - ---- - -### saveTouchedPlanetIds - -▸ **saveTouchedPlanetIds**(`ids`: LocationId[]): _Promise_ - -#### Parameters - -| Name | Type | -| :---- | :----------- | -| `ids` | LocationId[] | - -**Returns:** _Promise_ - ---- - -### setDiagnosticUpdater - -▸ **setDiagnosticUpdater**(`diagnosticUpdater?`: [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md)): _void_ - -#### Parameters - -| Name | Type | -| :------------------- | :--------------------------------------------------------------------------------------------- | -| `diagnosticUpdater?` | [_DiagnosticUpdater_](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) | - -**Returns:** _void_ - ---- - -### setKey - -▸ `Private` **setKey**(`key`: _string_, `value`: _string_, `objStore?`: ObjectStore): _Promise_ - -Important! This sets the key in indexed db per account and per contract. This means the same -client can connect to multiple different dark forest contracts, with multiple different -accounts, and the persistent storage will not overwrite data that is not relevant for the -current configuration of the client. - -#### Parameters - -| Name | Type | -| :--------- | :---------- | -| `key` | _string_ | -| `value` | _string_ | -| `objStore` | ObjectStore | - -**Returns:** _Promise_ - ---- - -### create - -▸ `Static` **create**(`account`: EthAddress): _Promise_<[_default_](backend_storage_persistentchunkstore.default.md)\> - -#### Parameters - -| Name | Type | -| :-------- | :--------- | -| `account` | EthAddress | - -**Returns:** _Promise_<[_default_](backend_storage_persistentchunkstore.default.md)\> diff --git a/docs/classes/backend_storage_readerdatastore.default.md b/docs/classes/backend_storage_readerdatastore.default.md deleted file mode 100644 index 9cfe7a61..00000000 --- a/docs/classes/backend_storage_readerdatastore.default.md +++ /dev/null @@ -1,197 +0,0 @@ -# Class: default - -[Backend/Storage/ReaderDataStore](../modules/backend_storage_readerdatastore.md).default - -A data store that allows you to retrieve data from the contract, -and combine it with data that is stored in this browser about a -particular user. - -## Table of contents - -### Constructors - -- [constructor](backend_storage_readerdatastore.default.md#constructor) - -### Properties - -- [addressTwitterMap](backend_storage_readerdatastore.default.md#addresstwittermap) -- [contractConstants](backend_storage_readerdatastore.default.md#contractconstants) -- [contractsAPI](backend_storage_readerdatastore.default.md#contractsapi) -- [persistentChunkStore](backend_storage_readerdatastore.default.md#persistentchunkstore) -- [viewer](backend_storage_readerdatastore.default.md#viewer) - -### Methods - -- [destroy](backend_storage_readerdatastore.default.md#destroy) -- [getBiome](backend_storage_readerdatastore.default.md#getbiome) -- [getTwitter](backend_storage_readerdatastore.default.md#gettwitter) -- [getViewer](backend_storage_readerdatastore.default.md#getviewer) -- [loadArtifactFromContract](backend_storage_readerdatastore.default.md#loadartifactfromcontract) -- [loadPlanetFromContract](backend_storage_readerdatastore.default.md#loadplanetfromcontract) -- [setPlanetLocationIfKnown](backend_storage_readerdatastore.default.md#setplanetlocationifknown) -- [spaceTypeFromPerlin](backend_storage_readerdatastore.default.md#spacetypefromperlin) -- [create](backend_storage_readerdatastore.default.md#create) - -## Constructors - -### constructor - -\+ `Private` **new default**(`viewer`: _undefined_ \| EthAddress, `addressTwitterMap`: [_AddressTwitterMap_](../modules/_types_darkforest_api_utilityserverapitypes.md#addresstwittermap), `contractConstants`: [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md), `contractsAPI`: [_default_](backend_gamelogic_contractsapi.default.md), `persistentChunkStore`: _undefined_ \| [_default_](backend_storage_persistentchunkstore.default.md)): [_default_](backend_storage_readerdatastore.default.md) - -#### Parameters - -| Name | Type | -| :--------------------- | :------------------------------------------------------------------------------------------------- | -| `viewer` | _undefined_ \| EthAddress | -| `addressTwitterMap` | [_AddressTwitterMap_](../modules/_types_darkforest_api_utilityserverapitypes.md#addresstwittermap) | -| `contractConstants` | [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) | -| `contractsAPI` | [_default_](backend_gamelogic_contractsapi.default.md) | -| `persistentChunkStore` | _undefined_ \| [_default_](backend_storage_persistentchunkstore.default.md) | - -**Returns:** [_default_](backend_storage_readerdatastore.default.md) - -## Properties - -### addressTwitterMap - -• `Private` `Readonly` **addressTwitterMap**: [_AddressTwitterMap_](../modules/_types_darkforest_api_utilityserverapitypes.md#addresstwittermap) - ---- - -### contractConstants - -• `Private` `Readonly` **contractConstants**: [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) - ---- - -### contractsAPI - -• `Private` `Readonly` **contractsAPI**: [_default_](backend_gamelogic_contractsapi.default.md) - ---- - -### persistentChunkStore - -• `Private` `Readonly` **persistentChunkStore**: _undefined_ \| [_default_](backend_storage_persistentchunkstore.default.md) - ---- - -### viewer - -• `Private` `Readonly` **viewer**: _undefined_ \| EthAddress - -## Methods - -### destroy - -▸ **destroy**(): _void_ - -**Returns:** _void_ - ---- - -### getBiome - -▸ `Private` **getBiome**(`loc`: WorldLocation): Biome - -#### Parameters - -| Name | Type | -| :---- | :------------ | -| `loc` | WorldLocation | - -**Returns:** Biome - ---- - -### getTwitter - -▸ **getTwitter**(`owner`: _undefined_ \| EthAddress): _undefined_ \| _string_ - -#### Parameters - -| Name | Type | -| :------ | :------------------------ | -| `owner` | _undefined_ \| EthAddress | - -**Returns:** _undefined_ \| _string_ - ---- - -### getViewer - -▸ **getViewer**(): _undefined_ \| EthAddress - -**Returns:** _undefined_ \| EthAddress - ---- - -### loadArtifactFromContract - -▸ **loadArtifactFromContract**(`artifactId`: ArtifactId): _Promise_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _Promise_ - ---- - -### loadPlanetFromContract - -▸ **loadPlanetFromContract**(`planetId`: LocationId): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :--------- | -| `planetId` | LocationId | - -**Returns:** _Promise_ - ---- - -### setPlanetLocationIfKnown - -▸ `Private` **setPlanetLocationIfKnown**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### spaceTypeFromPerlin - -▸ `Private` **spaceTypeFromPerlin**(`perlin`: _number_): SpaceType - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `perlin` | _number_ | - -**Returns:** SpaceType - ---- - -### create - -▸ `Static` **create**(`terminal`: _MutableRefObject_, `ethConnection`: [_default_](backend_network_ethconnection.default.md), `viewer`: _undefined_ \| EthAddress): _Promise_<[_default_](backend_storage_readerdatastore.default.md)\> - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------------------------------------------------------------ | -| `terminal` | _MutableRefObject_ | -| `ethConnection` | [_default_](backend_network_ethconnection.default.md) | -| `viewer` | _undefined_ \| EthAddress | - -**Returns:** _Promise_<[_default_](backend_storage_readerdatastore.default.md)\> diff --git a/docs/classes/backend_utils_blockwaiter.blockwaiter.md b/docs/classes/backend_utils_blockwaiter.blockwaiter.md deleted file mode 100644 index 708015f3..00000000 --- a/docs/classes/backend_utils_blockwaiter.blockwaiter.md +++ /dev/null @@ -1,61 +0,0 @@ -# Class: BlockWaiter - -[Backend/Utils/BlockWaiter](../modules/backend_utils_blockwaiter.md).BlockWaiter - -You can schedule a function to be executed {@code waitThisLong} in the future. If you -schedule again, the previously scheduled function will not be executed. - -## Table of contents - -### Constructors - -- [constructor](backend_utils_blockwaiter.blockwaiter.md#constructor) - -### Properties - -- [timeout](backend_utils_blockwaiter.blockwaiter.md#timeout) -- [waitThisLong](backend_utils_blockwaiter.blockwaiter.md#waitthislong) - -### Methods - -- [schedule](backend_utils_blockwaiter.blockwaiter.md#schedule) - -## Constructors - -### constructor - -\+ **new BlockWaiter**(`waitThisLong`: _number_): [_BlockWaiter_](backend_utils_blockwaiter.blockwaiter.md) - -#### Parameters - -| Name | Type | -| :------------- | :------- | -| `waitThisLong` | _number_ | - -**Returns:** [_BlockWaiter_](backend_utils_blockwaiter.blockwaiter.md) - -## Properties - -### timeout - -• `Private` `Optional` **timeout**: _Timeout_ - ---- - -### waitThisLong - -• `Private` **waitThisLong**: _number_ - -## Methods - -### schedule - -▸ **schedule**(`func`: () => _void_): _void_ - -#### Parameters - -| Name | Type | -| :----- | :----------- | -| `func` | () => _void_ | - -**Returns:** _void_ diff --git a/docs/classes/backend_utils_snarkargshelper.default.md b/docs/classes/backend_utils_snarkargshelper.default.md deleted file mode 100644 index e6879e9e..00000000 --- a/docs/classes/backend_utils_snarkargshelper.default.md +++ /dev/null @@ -1,278 +0,0 @@ -# Class: default - -[Backend/Utils/SnarkArgsHelper](../modules/backend_utils_snarkargshelper.md).default - -## Table of contents - -### Constructors - -- [constructor](backend_utils_snarkargshelper.default.md#constructor) - -### Properties - -- [biomebasePerlinOpts](backend_utils_snarkargshelper.default.md#biomebaseperlinopts) -- [hashConfig](backend_utils_snarkargshelper.default.md#hashconfig) -- [moveSnarkCache](backend_utils_snarkargshelper.default.md#movesnarkcache) -- [planetHashMimc](backend_utils_snarkargshelper.default.md#planethashmimc) -- [snarkProverQueue](backend_utils_snarkargshelper.default.md#snarkproverqueue) -- [spaceTypePerlinOpts](backend_utils_snarkargshelper.default.md#spacetypeperlinopts) -- [terminal](backend_utils_snarkargshelper.default.md#terminal) -- [useMockHash](backend_utils_snarkargshelper.default.md#usemockhash) -- [DEFAULT_SNARK_CACHE_SIZE](backend_utils_snarkargshelper.default.md#default_snark_cache_size) - -### Methods - -- [fakeBiomebaseProof](backend_utils_snarkargshelper.default.md#fakebiomebaseproof) -- [fakeInitProof](backend_utils_snarkargshelper.default.md#fakeinitproof) -- [fakeMoveProof](backend_utils_snarkargshelper.default.md#fakemoveproof) -- [fakeRevealProof](backend_utils_snarkargshelper.default.md#fakerevealproof) -- [getFindArtifactArgs](backend_utils_snarkargshelper.default.md#getfindartifactargs) -- [getInitArgs](backend_utils_snarkargshelper.default.md#getinitargs) -- [getMoveArgs](backend_utils_snarkargshelper.default.md#getmoveargs) -- [getRevealArgs](backend_utils_snarkargshelper.default.md#getrevealargs) -- [setSnarkCacheSize](backend_utils_snarkargshelper.default.md#setsnarkcachesize) -- [create](backend_utils_snarkargshelper.default.md#create) - -## Constructors - -### constructor - -\+ `Private` **new default**(`hashConfig`: [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig), `terminal`: _MutableRefObject_, `useMockHash`: _boolean_): [_default_](backend_utils_snarkargshelper.default.md) - -#### Parameters - -| Name | Type | -| :------------ | :------------------------------------------------------------------------------------------------------------ | -| `hashConfig` | [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) | -| `terminal` | _MutableRefObject_ | -| `useMockHash` | _boolean_ | - -**Returns:** [_default_](backend_utils_snarkargshelper.default.md) - -## Properties - -### biomebasePerlinOpts - -• `Private` `Readonly` **biomebasePerlinOpts**: PerlinConfig - ---- - -### hashConfig - -• `Private` `Readonly` **hashConfig**: [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) - ---- - -### moveSnarkCache - -• `Private` **moveSnarkCache**: _default_ - ---- - -### planetHashMimc - -• `Private` `Readonly` **planetHashMimc**: (...`inputs`: _number_[]) => BigInteger - -#### Type declaration - -▸ (...`inputs`: _number_[]): BigInteger - -#### Parameters - -| Name | Type | -| :---------- | :--------- | -| `...inputs` | _number_[] | - -**Returns:** BigInteger - ---- - -### snarkProverQueue - -• `Private` `Readonly` **snarkProverQueue**: _SnarkProverQueue_ - ---- - -### spaceTypePerlinOpts - -• `Private` `Readonly` **spaceTypePerlinOpts**: PerlinConfig - ---- - -### terminal - -• `Private` `Readonly` **terminal**: _MutableRefObject_ - ---- - -### useMockHash - -• `Private` `Readonly` **useMockHash**: _boolean_ - ---- - -### DEFAULT_SNARK_CACHE_SIZE - -▪ `Static` `Private` `Readonly` **DEFAULT_SNARK_CACHE_SIZE**: `20`= 20 - -How many snark results to keep in an LRU cache. - -## Methods - -### fakeBiomebaseProof - -▸ `Private` **fakeBiomebaseProof**(`x`: _number_, `y`: _number_): SnarkJSProofAndSignals - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | - -**Returns:** SnarkJSProofAndSignals - ---- - -### fakeInitProof - -▸ `Private` **fakeInitProof**(`x`: _number_, `y`: _number_, `r`: _number_): SnarkJSProofAndSignals - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | -| `r` | _number_ | - -**Returns:** SnarkJSProofAndSignals - ---- - -### fakeMoveProof - -▸ `Private` **fakeMoveProof**(`x1`: _number_, `y1`: _number_, `x2`: _number_, `y2`: _number_, `r`: _number_, `distMax`: _number_): SnarkJSProofAndSignals - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `x1` | _number_ | -| `y1` | _number_ | -| `x2` | _number_ | -| `y2` | _number_ | -| `r` | _number_ | -| `distMax` | _number_ | - -**Returns:** SnarkJSProofAndSignals - ---- - -### fakeRevealProof - -▸ `Private` **fakeRevealProof**(`x`: _number_, `y`: _number_): SnarkJSProofAndSignals - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | - -**Returns:** SnarkJSProofAndSignals - ---- - -### getFindArtifactArgs - -▸ **getFindArtifactArgs**(`x`: _number_, `y`: _number_): _Promise_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | - -**Returns:** _Promise_ - ---- - -### getInitArgs - -▸ **getInitArgs**(`x`: _number_, `y`: _number_, `r`: _number_): _Promise_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | -| `r` | _number_ | - -**Returns:** _Promise_ - ---- - -### getMoveArgs - -▸ **getMoveArgs**(`x1`: _number_, `y1`: _number_, `x2`: _number_, `y2`: _number_, `r`: _number_, `distMax`: _number_): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `x1` | _number_ | -| `y1` | _number_ | -| `x2` | _number_ | -| `y2` | _number_ | -| `r` | _number_ | -| `distMax` | _number_ | - -**Returns:** _Promise_ - ---- - -### getRevealArgs - -▸ **getRevealArgs**(`x`: _number_, `y`: _number_): _Promise_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | - -**Returns:** _Promise_ - ---- - -### setSnarkCacheSize - -▸ **setSnarkCacheSize**(`size`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :----- | :------- | -| `size` | _number_ | - -**Returns:** _void_ - ---- - -### create - -▸ `Static` **create**(`hashConfig`: [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig), `terminal`: _MutableRefObject_, `fakeHash?`: _boolean_): [_default_](backend_utils_snarkargshelper.default.md) - -#### Parameters - -| Name | Type | Default value | -| :----------- | :------------------------------------------------------------------------------------------------------------ | :------------ | -| `hashConfig` | [_HashConfig_](../modules/_types_global_globaltypes.md#hashconfig) | - | -| `terminal` | _MutableRefObject_ | - | -| `fakeHash` | _boolean_ | false | - -**Returns:** [_default_](backend_utils_snarkargshelper.default.md) diff --git a/docs/classes/frontend_game_notificationmanager.default.md b/docs/classes/frontend_game_notificationmanager.default.md deleted file mode 100644 index f1000e06..00000000 --- a/docs/classes/frontend_game_notificationmanager.default.md +++ /dev/null @@ -1,369 +0,0 @@ -# Class: default - -[Frontend/Game/NotificationManager](../modules/frontend_game_notificationmanager.md).default - -## Hierarchy - -- _EventEmitter_ - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_game_notificationmanager.default.md#constructor) - -### Properties - -- [instance](frontend_game_notificationmanager.default.md#instance) - -### Methods - -- [balanceEmpty](frontend_game_notificationmanager.default.md#balanceempty) -- [foundArtifact](frontend_game_notificationmanager.default.md#foundartifact) -- [foundBiome](frontend_game_notificationmanager.default.md#foundbiome) -- [foundComet](frontend_game_notificationmanager.default.md#foundcomet) -- [foundDeadSpace](frontend_game_notificationmanager.default.md#founddeadspace) -- [foundDeepSpace](frontend_game_notificationmanager.default.md#founddeepspace) -- [foundPirates](frontend_game_notificationmanager.default.md#foundpirates) -- [foundSilver](frontend_game_notificationmanager.default.md#foundsilver) -- [foundSilverBank](frontend_game_notificationmanager.default.md#foundsilverbank) -- [foundSpace](frontend_game_notificationmanager.default.md#foundspace) -- [foundTradingPost](frontend_game_notificationmanager.default.md#foundtradingpost) -- [getIcon](frontend_game_notificationmanager.default.md#geticon) -- [notify](frontend_game_notificationmanager.default.md#notify) -- [notifyTx](frontend_game_notificationmanager.default.md#notifytx) -- [planetCanUpgrade](frontend_game_notificationmanager.default.md#planetcanupgrade) -- [receivedPlanet](frontend_game_notificationmanager.default.md#receivedplanet) -- [txConfirm](frontend_game_notificationmanager.default.md#txconfirm) -- [txInit](frontend_game_notificationmanager.default.md#txinit) -- [txRevert](frontend_game_notificationmanager.default.md#txrevert) -- [txSubmit](frontend_game_notificationmanager.default.md#txsubmit) -- [unsubmittedTxFail](frontend_game_notificationmanager.default.md#unsubmittedtxfail) -- [welcomePlayer](frontend_game_notificationmanager.default.md#welcomeplayer) -- [getInstance](frontend_game_notificationmanager.default.md#getinstance) - -## Constructors - -### constructor - -\+ `Private` **new default**(): [_default_](frontend_game_notificationmanager.default.md) - -**Returns:** [_default_](frontend_game_notificationmanager.default.md) - -Overrides: EventEmitter.constructor - -## Properties - -### instance - -▪ `Static` **instance**: [_default_](frontend_game_notificationmanager.default.md) - -## Methods - -### balanceEmpty - -▸ **balanceEmpty**(): _void_ - -**Returns:** _void_ - ---- - -### foundArtifact - -▸ **foundArtifact**(`planet`: LocatablePlanet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------- | -| `planet` | LocatablePlanet | - -**Returns:** _void_ - ---- - -### foundBiome - -▸ **foundBiome**(`planet`: LocatablePlanet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------- | -| `planet` | LocatablePlanet | - -**Returns:** _void_ - ---- - -### foundComet - -▸ **foundComet**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### foundDeadSpace - -▸ **foundDeadSpace**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### foundDeepSpace - -▸ **foundDeepSpace**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### foundPirates - -▸ **foundPirates**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### foundSilver - -▸ **foundSilver**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### foundSilverBank - -▸ **foundSilverBank**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### foundSpace - -▸ **foundSpace**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### foundTradingPost - -▸ **foundTradingPost**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### getIcon - -▸ `Private` **getIcon**(`type`: [_NotificationType_](../enums/frontend_game_notificationmanager.notificationtype.md)): _Element_ - -#### Parameters - -| Name | Type | -| :----- | :----------------------------------------------------------------------------------- | -| `type` | [_NotificationType_](../enums/frontend_game_notificationmanager.notificationtype.md) | - -**Returns:** _Element_ - ---- - -### notify - -▸ **notify**(`type`: [_NotificationType_](../enums/frontend_game_notificationmanager.notificationtype.md), `message`: ReactNode): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `type` | [_NotificationType_](../enums/frontend_game_notificationmanager.notificationtype.md) | -| `message` | ReactNode | - -**Returns:** _void_ - ---- - -### notifyTx - -▸ **notifyTx**(`txData`: TxIntent, `message`: ReactNode, `txStatus`: EthTxStatus): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :---------- | -| `txData` | TxIntent | -| `message` | ReactNode | -| `txStatus` | EthTxStatus | - -**Returns:** _void_ - ---- - -### planetCanUpgrade - -▸ **planetCanUpgrade**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### receivedPlanet - -▸ **receivedPlanet**(`planet`: Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _void_ - ---- - -### txConfirm - -▸ **txConfirm**(`tx`: SubmittedTx): _void_ - -#### Parameters - -| Name | Type | -| :--- | :---------- | -| `tx` | SubmittedTx | - -**Returns:** _void_ - ---- - -### txInit - -▸ **txInit**(`txIntent`: TxIntent): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** _void_ - ---- - -### txRevert - -▸ **txRevert**(`tx`: SubmittedTx): _void_ - -#### Parameters - -| Name | Type | -| :--- | :---------- | -| `tx` | SubmittedTx | - -**Returns:** _void_ - ---- - -### txSubmit - -▸ **txSubmit**(`tx`: SubmittedTx): _void_ - -#### Parameters - -| Name | Type | -| :--- | :---------- | -| `tx` | SubmittedTx | - -**Returns:** _void_ - ---- - -### unsubmittedTxFail - -▸ **unsubmittedTxFail**(`txIntent`: TxIntent, `_e`: Error): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | -| `_e` | Error | - -**Returns:** _void_ - ---- - -### welcomePlayer - -▸ **welcomePlayer**(): _void_ - -**Returns:** _void_ - ---- - -### getInstance - -▸ `Static` **getInstance**(): [_default_](frontend_game_notificationmanager.default.md) - -**Returns:** [_default_](frontend_game_notificationmanager.default.md) diff --git a/docs/classes/frontend_game_viewport.default.md b/docs/classes/frontend_game_viewport.default.md deleted file mode 100644 index d46f13d3..00000000 --- a/docs/classes/frontend_game_viewport.default.md +++ /dev/null @@ -1,773 +0,0 @@ -# Class: default - -[Frontend/Game/Viewport](../modules/frontend_game_viewport.md).default - -## Table of contents - -### Constructors - -- [constructor](frontend_game_viewport.default.md#constructor) - -### Properties - -- [animationManager](frontend_game_viewport.default.md#animationmanager) -- [canvas](frontend_game_viewport.default.md#canvas) -- [centerWorldCoords](frontend_game_viewport.default.md#centerworldcoords) -- [frameRequestId](frontend_game_viewport.default.md#framerequestid) -- [gameUIManager](frontend_game_viewport.default.md#gameuimanager) -- [heightInWorldUnits](frontend_game_viewport.default.md#heightinworldunits) -- [intervalId](frontend_game_viewport.default.md#intervalid) -- [isFirefox](frontend_game_viewport.default.md#isfirefox) -- [isPanning](frontend_game_viewport.default.md#ispanning) -- [isSending](frontend_game_viewport.default.md#issending) -- [momentum](frontend_game_viewport.default.md#momentum) -- [mouseLastCoords](frontend_game_viewport.default.md#mouselastcoords) -- [mouseSensitivity](frontend_game_viewport.default.md#mousesensitivity) -- [mousedownCoords](frontend_game_viewport.default.md#mousedowncoords) -- [scale](frontend_game_viewport.default.md#scale) -- [velocity](frontend_game_viewport.default.md#velocity) -- [viewportHeight](frontend_game_viewport.default.md#viewportheight) -- [viewportWidth](frontend_game_viewport.default.md#viewportwidth) -- [widthInWorldUnits](frontend_game_viewport.default.md#widthinworldunits) -- [instance](frontend_game_viewport.default.md#instance) - -### Accessors - -- [maxWorldWidth](frontend_game_viewport.default.md#maxworldwidth) -- [minWorldWidth](frontend_game_viewport.default.md#minworldwidth) - -### Methods - -- [canvasToWorldCoords](frontend_game_viewport.default.md#canvastoworldcoords) -- [canvasToWorldDist](frontend_game_viewport.default.md#canvastoworlddist) -- [canvasToWorldX](frontend_game_viewport.default.md#canvastoworldx) -- [canvasToWorldY](frontend_game_viewport.default.md#canvastoworldy) -- [centerChunk](frontend_game_viewport.default.md#centerchunk) -- [centerCoords](frontend_game_viewport.default.md#centercoords) -- [centerPlanet](frontend_game_viewport.default.md#centerplanet) -- [centerPlanetAnimated](frontend_game_viewport.default.md#centerplanetanimated) -- [getBottomBound](frontend_game_viewport.default.md#getbottombound) -- [getDetailLevel](frontend_game_viewport.default.md#getdetaillevel) -- [getLeftBound](frontend_game_viewport.default.md#getleftbound) -- [getRightBound](frontend_game_viewport.default.md#getrightbound) -- [getStorage](frontend_game_viewport.default.md#getstorage) -- [getStorageKey](frontend_game_viewport.default.md#getstoragekey) -- [getTopBound](frontend_game_viewport.default.md#gettopbound) -- [getViewportPosition](frontend_game_viewport.default.md#getviewportposition) -- [getViewportWorldHeight](frontend_game_viewport.default.md#getviewportworldheight) -- [getViewportWorldWidth](frontend_game_viewport.default.md#getviewportworldwidth) -- [intersectsViewport](frontend_game_viewport.default.md#intersectsviewport) -- [isInOrAroundViewport](frontend_game_viewport.default.md#isinoraroundviewport) -- [isInViewport](frontend_game_viewport.default.md#isinviewport) -- [isValidWorldWidth](frontend_game_viewport.default.md#isvalidworldwidth) -- [onMouseDown](frontend_game_viewport.default.md#onmousedown) -- [onMouseMove](frontend_game_viewport.default.md#onmousemove) -- [onMouseOut](frontend_game_viewport.default.md#onmouseout) -- [onMouseUp](frontend_game_viewport.default.md#onmouseup) -- [onResize](frontend_game_viewport.default.md#onresize) -- [onScroll](frontend_game_viewport.default.md#onscroll) -- [onSendComplete](frontend_game_viewport.default.md#onsendcomplete) -- [onSendInit](frontend_game_viewport.default.md#onsendinit) -- [onWindowResize](frontend_game_viewport.default.md#onwindowresize) -- [setData](frontend_game_viewport.default.md#setdata) -- [setMouseSensitivty](frontend_game_viewport.default.md#setmousesensitivty) -- [setStorage](frontend_game_viewport.default.md#setstorage) -- [setWorldHeight](frontend_game_viewport.default.md#setworldheight) -- [setWorldWidth](frontend_game_viewport.default.md#setworldwidth) -- [worldToCanvasCoords](frontend_game_viewport.default.md#worldtocanvascoords) -- [worldToCanvasDist](frontend_game_viewport.default.md#worldtocanvasdist) -- [worldToCanvasX](frontend_game_viewport.default.md#worldtocanvasx) -- [worldToCanvasY](frontend_game_viewport.default.md#worldtocanvasy) -- [zoomIn](frontend_game_viewport.default.md#zoomin) -- [zoomOut](frontend_game_viewport.default.md#zoomout) -- [zoomPlanet](frontend_game_viewport.default.md#zoomplanet) -- [destroyInstance](frontend_game_viewport.default.md#destroyinstance) -- [getInstance](frontend_game_viewport.default.md#getinstance) -- [initialize](frontend_game_viewport.default.md#initialize) - -## Constructors - -### constructor - -\+ `Private` **new default**(`gameUIManager`: [_default_](backend_gamelogic_gameuimanager.default.md), `centerWorldCoords`: WorldCoords, `widthInWorldUnits`: _number_, `viewportWidth`: _number_, `viewportHeight`: _number_, `canvas`: HTMLCanvasElement): [_default_](frontend_game_viewport.default.md) - -#### Parameters - -| Name | Type | -| :------------------ | :------------------------------------------------------ | -| `gameUIManager` | [_default_](backend_gamelogic_gameuimanager.default.md) | -| `centerWorldCoords` | WorldCoords | -| `widthInWorldUnits` | _number_ | -| `viewportWidth` | _number_ | -| `viewportHeight` | _number_ | -| `canvas` | HTMLCanvasElement | - -**Returns:** [_default_](frontend_game_viewport.default.md) - -## Properties - -### animationManager - -• `Private` **animationManager**: [_AnimationManager_](frontend_game_viewportanimation.animationmanager.md) - ---- - -### canvas - -• **canvas**: HTMLCanvasElement - ---- - -### centerWorldCoords - -• **centerWorldCoords**: WorldCoords - ---- - -### frameRequestId - -• **frameRequestId**: _number_ - ---- - -### gameUIManager - -• **gameUIManager**: [_default_](backend_gamelogic_gameuimanager.default.md) - ---- - -### heightInWorldUnits - -• **heightInWorldUnits**: _number_ - ---- - -### intervalId - -• **intervalId**: _Timeout_ - ---- - -### isFirefox - -• **isFirefox**: _boolean_ - ---- - -### isPanning - -• **isPanning**: _boolean_= false - ---- - -### isSending - -• `Private` **isSending**: _boolean_= false - ---- - -### momentum - -• **momentum**: _boolean_= false - ---- - -### mouseLastCoords - -• **mouseLastCoords**: _undefined_ \| [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) - ---- - -### mouseSensitivity - -• **mouseSensitivity**: _number_ - ---- - -### mousedownCoords - -• **mousedownCoords**: _undefined_ \| [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) - ---- - -### scale - -• **scale**: _number_ - ---- - -### velocity - -• **velocity**: _undefined_ \| WorldCoords - ---- - -### viewportHeight - -• **viewportHeight**: _number_ - ---- - -### viewportWidth - -• **viewportWidth**: _number_ - ---- - -### widthInWorldUnits - -• **widthInWorldUnits**: _number_ - ---- - -### instance - -▪ `Static` **instance**: _undefined_ \| [_default_](frontend_game_viewport.default.md) - -## Accessors - -### maxWorldWidth - -• get **maxWorldWidth**(): _number_ - -**Returns:** _number_ - ---- - -### minWorldWidth - -• get **minWorldWidth**(): _number_ - -**Returns:** _number_ - -## Methods - -### canvasToWorldCoords - -▸ **canvasToWorldCoords**(`canvasCoords`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md)): WorldCoords - -#### Parameters - -| Name | Type | -| :------------- | :------------------------------------------------------------------------ | -| `canvasCoords` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - -**Returns:** WorldCoords - ---- - -### canvasToWorldDist - -▸ **canvasToWorldDist**(`d`: _number_): _number_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `d` | _number_ | - -**Returns:** _number_ - ---- - -### canvasToWorldX - -▸ `Private` **canvasToWorldX**(`x`: _number_): _number_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | - -**Returns:** _number_ - ---- - -### canvasToWorldY - -▸ `Private` **canvasToWorldY**(`y`: _number_): _number_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `y` | _number_ | - -**Returns:** _number_ - ---- - -### centerChunk - -▸ **centerChunk**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### centerCoords - -▸ **centerCoords**(`coords`: WorldCoords): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _void_ - ---- - -### centerPlanet - -▸ **centerPlanet**(`planet`: _undefined_ \| Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _void_ - ---- - -### centerPlanetAnimated - -▸ **centerPlanetAnimated**(`planet`: _undefined_ \| Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _void_ - ---- - -### getBottomBound - -▸ **getBottomBound**(): _number_ - -**Returns:** _number_ - ---- - -### getDetailLevel - -▸ `Private` **getDetailLevel**(): _number_ - -**Returns:** _number_ - ---- - -### getLeftBound - -▸ **getLeftBound**(): _number_ - -**Returns:** _number_ - ---- - -### getRightBound - -▸ **getRightBound**(): _number_ - -**Returns:** _number_ - ---- - -### getStorage - -▸ **getStorage**(): _undefined_ \| ViewportData - -**Returns:** _undefined_ \| ViewportData - ---- - -### getStorageKey - -▸ `Private` **getStorageKey**(): _string_ - -**Returns:** _string_ - ---- - -### getTopBound - -▸ **getTopBound**(): _number_ - -**Returns:** _number_ - ---- - -### getViewportPosition - -▸ **getViewportPosition**(): _object_ - -**Returns:** _object_ - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | - ---- - -### getViewportWorldHeight - -▸ **getViewportWorldHeight**(): _number_ - -**Returns:** _number_ - ---- - -### getViewportWorldWidth - -▸ **getViewportWorldWidth**(): _number_ - -**Returns:** _number_ - ---- - -### intersectsViewport - -▸ **intersectsViewport**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _boolean_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _boolean_ - ---- - -### isInOrAroundViewport - -▸ **isInOrAroundViewport**(`coords`: WorldCoords): _boolean_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _boolean_ - ---- - -### isInViewport - -▸ **isInViewport**(`coords`: WorldCoords): _boolean_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | - -**Returns:** _boolean_ - ---- - -### isValidWorldWidth - -▸ `Private` **isValidWorldWidth**(`width`: _number_): _boolean_ - -#### Parameters - -| Name | Type | -| :------ | :------- | -| `width` | _number_ | - -**Returns:** _boolean_ - ---- - -### onMouseDown - -▸ **onMouseDown**(`canvasCoords`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md)): _void_ - -#### Parameters - -| Name | Type | -| :------------- | :------------------------------------------------------------------------ | -| `canvasCoords` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - -**Returns:** _void_ - ---- - -### onMouseMove - -▸ **onMouseMove**(`canvasCoords`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md)): _void_ - -#### Parameters - -| Name | Type | -| :------------- | :------------------------------------------------------------------------ | -| `canvasCoords` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - -**Returns:** _void_ - ---- - -### onMouseOut - -▸ **onMouseOut**(): _void_ - -**Returns:** _void_ - ---- - -### onMouseUp - -▸ **onMouseUp**(`canvasCoords`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md)): _void_ - -#### Parameters - -| Name | Type | -| :------------- | :------------------------------------------------------------------------ | -| `canvasCoords` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - -**Returns:** _void_ - ---- - -### onResize - -▸ **onResize**(): _void_ - -**Returns:** _void_ - ---- - -### onScroll - -▸ **onScroll**(`deltaY`: _number_, `forceZoom?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :---------- | :-------- | :------------ | -| `deltaY` | _number_ | - | -| `forceZoom` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### onSendComplete - -▸ **onSendComplete**(): _void_ - -**Returns:** _void_ - ---- - -### onSendInit - -▸ **onSendInit**(): _void_ - -**Returns:** _void_ - ---- - -### onWindowResize - -▸ **onWindowResize**(): _void_ - -**Returns:** _void_ - ---- - -### setData - -▸ **setData**(`data`: ViewportData): _void_ - -#### Parameters - -| Name | Type | -| :----- | :----------- | -| `data` | ViewportData | - -**Returns:** _void_ - ---- - -### setMouseSensitivty - -▸ **setMouseSensitivty**(`mouseSensitivity`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :----------------- | :------- | -| `mouseSensitivity` | _number_ | - -**Returns:** _void_ - ---- - -### setStorage - -▸ **setStorage**(): _void_ - -**Returns:** _void_ - ---- - -### setWorldHeight - -▸ **setWorldHeight**(`height`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `height` | _number_ | - -**Returns:** _void_ - ---- - -### setWorldWidth - -▸ `Private` **setWorldWidth**(`width`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------ | :------- | -| `width` | _number_ | - -**Returns:** _void_ - ---- - -### worldToCanvasCoords - -▸ **worldToCanvasCoords**(`worldCoords`: WorldCoords): [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) - -#### Parameters - -| Name | Type | -| :------------ | :---------- | -| `worldCoords` | WorldCoords | - -**Returns:** [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) - ---- - -### worldToCanvasDist - -▸ **worldToCanvasDist**(`d`: _number_): _number_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `d` | _number_ | - -**Returns:** _number_ - ---- - -### worldToCanvasX - -▸ `Private` **worldToCanvasX**(`x`: _number_): _number_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | - -**Returns:** _number_ - ---- - -### worldToCanvasY - -▸ `Private` **worldToCanvasY**(`y`: _number_): _number_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `y` | _number_ | - -**Returns:** _number_ - ---- - -### zoomIn - -▸ **zoomIn**(): _void_ - -**Returns:** _void_ - ---- - -### zoomOut - -▸ **zoomOut**(): _void_ - -**Returns:** _void_ - ---- - -### zoomPlanet - -▸ **zoomPlanet**(`planet`: _undefined_ \| Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _void_ - ---- - -### destroyInstance - -▸ `Static` **destroyInstance**(): _void_ - -**Returns:** _void_ - ---- - -### getInstance - -▸ `Static` **getInstance**(): [_default_](frontend_game_viewport.default.md) - -**Returns:** [_default_](frontend_game_viewport.default.md) - ---- - -### initialize - -▸ `Static` **initialize**(`gameUIManager`: [_default_](backend_gamelogic_gameuimanager.default.md), `widthInWorldUnits`: _number_, `canvas`: HTMLCanvasElement): [_default_](frontend_game_viewport.default.md) - -#### Parameters - -| Name | Type | -| :------------------ | :------------------------------------------------------ | -| `gameUIManager` | [_default_](backend_gamelogic_gameuimanager.default.md) | -| `widthInWorldUnits` | _number_ | -| `canvas` | HTMLCanvasElement | - -**Returns:** [_default_](frontend_game_viewport.default.md) diff --git a/docs/classes/frontend_game_viewportanimation.animationmanager.md b/docs/classes/frontend_game_viewportanimation.animationmanager.md deleted file mode 100644 index 3e487c7c..00000000 --- a/docs/classes/frontend_game_viewportanimation.animationmanager.md +++ /dev/null @@ -1,54 +0,0 @@ -# Class: AnimationManager - -[Frontend/Game/ViewportAnimation](../modules/frontend_game_viewportanimation.md).AnimationManager - -## Table of contents - -### Constructors - -- [constructor](frontend_game_viewportanimation.animationmanager.md#constructor) - -### Properties - -- [currentAnimation](frontend_game_viewportanimation.animationmanager.md#currentanimation) - -### Methods - -- [replaceAnimation](frontend_game_viewportanimation.animationmanager.md#replaceanimation) -- [stopCurrentAnimation](frontend_game_viewportanimation.animationmanager.md#stopcurrentanimation) - -## Constructors - -### constructor - -\+ **new AnimationManager**(): [_AnimationManager_](frontend_game_viewportanimation.animationmanager.md) - -**Returns:** [_AnimationManager_](frontend_game_viewportanimation.animationmanager.md) - -## Properties - -### currentAnimation - -• `Private` `Optional` **currentAnimation**: AnimeInstance - -## Methods - -### replaceAnimation - -▸ **replaceAnimation**(`animation`: [_ViewportAnimation_](frontend_game_viewportanimation.viewportanimation.md)): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :-------------------------------------------------------------------------- | -| `animation` | [_ViewportAnimation_](frontend_game_viewportanimation.viewportanimation.md) | - -**Returns:** _void_ - ---- - -### stopCurrentAnimation - -▸ **stopCurrentAnimation**(): _void_ - -**Returns:** _void_ diff --git a/docs/classes/frontend_game_viewportanimation.viewportanimation.md b/docs/classes/frontend_game_viewportanimation.viewportanimation.md deleted file mode 100644 index c04fa183..00000000 --- a/docs/classes/frontend_game_viewportanimation.viewportanimation.md +++ /dev/null @@ -1,111 +0,0 @@ -# Class: ViewportAnimation - -[Frontend/Game/ViewportAnimation](../modules/frontend_game_viewportanimation.md).ViewportAnimation - -## Table of contents - -### Constructors - -- [constructor](frontend_game_viewportanimation.viewportanimation.md#constructor) - -### Properties - -- [coordsEnd](frontend_game_viewportanimation.viewportanimation.md#coordsend) -- [coordsStart](frontend_game_viewportanimation.viewportanimation.md#coordsstart) -- [durationMs](frontend_game_viewportanimation.viewportanimation.md#durationms) -- [heightEnd](frontend_game_viewportanimation.viewportanimation.md#heightend) -- [heightStart](frontend_game_viewportanimation.viewportanimation.md#heightstart) -- [timeStarted](frontend_game_viewportanimation.viewportanimation.md#timestarted) - -### Methods - -- [apply](frontend_game_viewportanimation.viewportanimation.md#apply) -- [between](frontend_game_viewportanimation.viewportanimation.md#between) - -## Constructors - -### constructor - -\+ **new ViewportAnimation**(`timeStarted`: _number_, `coordsStart`: WorldCoords, `coordsEnd`: WorldCoords, `heightStart`: _number_, `heightEnd`: _number_, `durationMs`: _number_): [_ViewportAnimation_](frontend_game_viewportanimation.viewportanimation.md) - -#### Parameters - -| Name | Type | -| :------------ | :---------- | -| `timeStarted` | _number_ | -| `coordsStart` | WorldCoords | -| `coordsEnd` | WorldCoords | -| `heightStart` | _number_ | -| `heightEnd` | _number_ | -| `durationMs` | _number_ | - -**Returns:** [_ViewportAnimation_](frontend_game_viewportanimation.viewportanimation.md) - -## Properties - -### coordsEnd - -• `Readonly` **coordsEnd**: WorldCoords - ---- - -### coordsStart - -• `Readonly` **coordsStart**: WorldCoords - ---- - -### durationMs - -• `Readonly` **durationMs**: _number_ - ---- - -### heightEnd - -• `Readonly` **heightEnd**: _number_ - ---- - -### heightStart - -• `Readonly` **heightStart**: _number_ - ---- - -### timeStarted - -• `Readonly` **timeStarted**: _number_ - -## Methods - -### apply - -▸ **apply**(`percent`: _number_, `viewport`: [_default_](frontend_game_viewport.default.md)): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------- | -| `percent` | _number_ | -| `viewport` | [_default_](frontend_game_viewport.default.md) | - -**Returns:** _void_ - ---- - -### between - -▸ `Static` **between**(`timeStarted`: _number_, `from`: WorldCoords, `to`: WorldCoords, `heightStart`: _number_, `heightEnd`: _number_): [_ViewportAnimation_](frontend_game_viewportanimation.viewportanimation.md) - -#### Parameters - -| Name | Type | -| :------------ | :---------- | -| `timeStarted` | _number_ | -| `from` | WorldCoords | -| `to` | WorldCoords | -| `heightStart` | _number_ | -| `heightEnd` | _number_ | - -**Returns:** [_ViewportAnimation_](frontend_game_viewportanimation.viewportanimation.md) diff --git a/docs/classes/frontend_game_windowmanager.default.md b/docs/classes/frontend_game_windowmanager.default.md deleted file mode 100644 index 0873cd23..00000000 --- a/docs/classes/frontend_game_windowmanager.default.md +++ /dev/null @@ -1,163 +0,0 @@ -# Class: default - -[Frontend/Game/WindowManager](../modules/frontend_game_windowmanager.md).default - -## Hierarchy - -- _EventEmitter_ - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_game_windowmanager.default.md#constructor) - -### Properties - -- [currentTooltip](frontend_game_windowmanager.default.md#currenttooltip) -- [cursorState](frontend_game_windowmanager.default.md#cursorstate) -- [lastZIndex](frontend_game_windowmanager.default.md#lastzindex) -- [mousePos](frontend_game_windowmanager.default.md#mousepos) -- [mousedownPos](frontend_game_windowmanager.default.md#mousedownpos) -- [instance](frontend_game_windowmanager.default.md#instance) - -### Methods - -- [acceptInputForTarget](frontend_game_windowmanager.default.md#acceptinputfortarget) -- [getClickDelta](frontend_game_windowmanager.default.md#getclickdelta) -- [getCursorState](frontend_game_windowmanager.default.md#getcursorstate) -- [getIndex](frontend_game_windowmanager.default.md#getindex) -- [getTooltip](frontend_game_windowmanager.default.md#gettooltip) -- [setCursorState](frontend_game_windowmanager.default.md#setcursorstate) -- [setTooltip](frontend_game_windowmanager.default.md#settooltip) -- [getInstance](frontend_game_windowmanager.default.md#getinstance) - -## Constructors - -### constructor - -\+ `Private` **new default**(): [_default_](frontend_game_windowmanager.default.md) - -**Returns:** [_default_](frontend_game_windowmanager.default.md) - -Overrides: EventEmitter.constructor - -## Properties - -### currentTooltip - -• `Private` **currentTooltip**: [_TooltipName_](../enums/frontend_game_windowmanager.tooltipname.md) - ---- - -### cursorState - -• `Private` **cursorState**: [_CursorState_](../enums/frontend_game_windowmanager.cursorstate.md) - ---- - -### lastZIndex - -• `Private` **lastZIndex**: _number_ - ---- - -### mousePos - -• `Private` **mousePos**: [_MousePos_](../modules/frontend_game_windowmanager.md#mousepos) - ---- - -### mousedownPos - -• `Private` **mousedownPos**: `null` \| [_MousePos_](../modules/frontend_game_windowmanager.md#mousepos) - ---- - -### instance - -▪ `Static` **instance**: [_default_](frontend_game_windowmanager.default.md) - -## Methods - -### acceptInputForTarget - -▸ **acceptInputForTarget**(`input`: WorldCoords): _void_ - -#### Parameters - -| Name | Type | -| :------ | :---------- | -| `input` | WorldCoords | - -**Returns:** _void_ - ---- - -### getClickDelta - -▸ **getClickDelta**(): [_MousePos_](../modules/frontend_game_windowmanager.md#mousepos) - -**Returns:** [_MousePos_](../modules/frontend_game_windowmanager.md#mousepos) - ---- - -### getCursorState - -▸ **getCursorState**(): [_CursorState_](../enums/frontend_game_windowmanager.cursorstate.md) - -**Returns:** [_CursorState_](../enums/frontend_game_windowmanager.cursorstate.md) - ---- - -### getIndex - -▸ **getIndex**(): _number_ - -**Returns:** _number_ - ---- - -### getTooltip - -▸ **getTooltip**(): [_TooltipName_](../enums/frontend_game_windowmanager.tooltipname.md) - -**Returns:** [_TooltipName_](../enums/frontend_game_windowmanager.tooltipname.md) - ---- - -### setCursorState - -▸ **setCursorState**(`newstate`: [_CursorState_](../enums/frontend_game_windowmanager.cursorstate.md)): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :------------------------------------------------------------------- | -| `newstate` | [_CursorState_](../enums/frontend_game_windowmanager.cursorstate.md) | - -**Returns:** _void_ - ---- - -### setTooltip - -▸ **setTooltip**(`tooltip`: [_TooltipName_](../enums/frontend_game_windowmanager.tooltipname.md)): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------------- | -| `tooltip` | [_TooltipName_](../enums/frontend_game_windowmanager.tooltipname.md) | - -**Returns:** _void_ - ---- - -### getInstance - -▸ `Static` **getInstance**(): [_default_](frontend_game_windowmanager.default.md) - -**Returns:** [_default_](frontend_game_windowmanager.default.md) diff --git a/docs/classes/frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md b/docs/classes/frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md deleted file mode 100644 index 3f7dec13..00000000 --- a/docs/classes/frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md +++ /dev/null @@ -1,302 +0,0 @@ -# Class: ArtifactRenderer - -[Frontend/Renderers/Artifacts/ArtifactRenderer](../modules/frontend_renderers_artifacts_artifactrenderer.md).ArtifactRenderer - -## Hierarchy - -- [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - - ↳ **ArtifactRenderer** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#constructor) - -### Properties - -- [artifacts](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#artifacts) -- [canvas](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#canvas) -- [frameRequestId](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#framerequestid) -- [gl](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#gl) -- [isDex](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#isdex) -- [projectionMatrix](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#projectionmatrix) -- [scroll](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#scroll) -- [spriteRenderer](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#spriterenderer) -- [visible](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#visible) - -### Methods - -- [clear](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#clear) -- [containsArtifact](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#containsartifact) -- [destroy](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#destroy) -- [draw](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#draw) -- [drawDex](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#drawdex) -- [drawList](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#drawlist) -- [getTexIdx](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#gettexidx) -- [loop](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#loop) -- [queueArtifactColumn](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#queueartifactcolumn) -- [queueRarityColumn](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#queueraritycolumn) -- [setArtifacts](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#setartifacts) -- [setIsDex](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#setisdex) -- [setProjectionMatrix](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#setprojectionmatrix) -- [setScroll](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#setscroll) -- [setVisible](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md#setvisible) - -## Constructors - -### constructor - -\+ **new ArtifactRenderer**(`canvas`: HTMLCanvasElement, `isDex?`: _boolean_): [_ArtifactRenderer_](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md) - -#### Parameters - -| Name | Type | Default value | -| :------- | :---------------- | :------------ | -| `canvas` | HTMLCanvasElement | - | -| `isDex` | _boolean_ | true | - -**Returns:** [_ArtifactRenderer_](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md) - -Overrides: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -## Properties - -### artifacts - -• `Private` **artifacts**: Artifact[] - ---- - -### canvas - -• **canvas**: HTMLCanvasElement - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[canvas](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#canvas) - ---- - -### frameRequestId - -• `Private` **frameRequestId**: _number_ - ---- - -### gl - -• **gl**: WebGL2RenderingContext - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[gl](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#gl) - ---- - -### isDex - -• `Private` **isDex**: _boolean_ - ---- - -### projectionMatrix - -• **projectionMatrix**: mat4 - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[projectionMatrix](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#projectionmatrix) - ---- - -### scroll - -• `Private` **scroll**: _number_= 0 - ---- - -### spriteRenderer - -• `Private` **spriteRenderer**: [_SpriteRenderer_](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md) - ---- - -### visible - -• `Private` **visible**: _boolean_= false - -## Methods - -### clear - -▸ **clear**(`bits?`: _number_, `color?`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec)): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----------------------------------------------------------------------------- | -| `bits?` | _number_ | -| `color?` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | - -**Returns:** _void_ - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### containsArtifact - -▸ `Private` **containsArtifact**(`biome`: Biome, `rarity`: ArtifactRarity, `type`: ArtifactType): _boolean_ - -#### Parameters - -| Name | Type | -| :------- | :------------- | -| `biome` | Biome | -| `rarity` | ArtifactRarity | -| `type` | ArtifactType | - -**Returns:** _boolean_ - ---- - -### destroy - -▸ **destroy**(): _void_ - -**Returns:** _void_ - ---- - -### draw - -▸ `Private` **draw**(): _void_ - -**Returns:** _void_ - ---- - -### drawDex - -▸ `Private` **drawDex**(): _void_ - -**Returns:** _void_ - ---- - -### drawList - -▸ `Private` **drawList**(): _void_ - -**Returns:** _void_ - ---- - -### getTexIdx - -▸ **getTexIdx**(): _number_ - -**Returns:** _number_ - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### loop - -▸ `Private` **loop**(): _void_ - -**Returns:** _void_ - ---- - -### queueArtifactColumn - -▸ `Private` **queueArtifactColumn**(`type`: ArtifactType, `rarity`: ArtifactRarity, `startX`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------------- | -| `type` | ArtifactType | -| `rarity` | ArtifactRarity | -| `startX` | _number_ | - -**Returns:** _void_ - ---- - -### queueRarityColumn - -▸ `Private` **queueRarityColumn**(`rarity`: ArtifactRarity, `startX`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------------- | -| `rarity` | ArtifactRarity | -| `startX` | _number_ | - -**Returns:** _void_ - ---- - -### setArtifacts - -▸ **setArtifacts**(`artifacts`: Artifact[]): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :--------- | -| `artifacts` | Artifact[] | - -**Returns:** _void_ - ---- - -### setIsDex - -▸ **setIsDex**(`isDex`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------- | -| `isDex` | _boolean_ | - -**Returns:** _void_ - ---- - -### setProjectionMatrix - -▸ **setProjectionMatrix**(): _void_ - -**Returns:** _void_ - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### setScroll - -▸ **setScroll**(`scroll`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `scroll` | _number_ | - -**Returns:** _void_ - ---- - -### setVisible - -▸ **setVisible**(`visible`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :-------- | -| `visible` | _boolean_ | - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_engineutils.default.md b/docs/classes/frontend_renderers_gamerenderer_engineutils.default.md deleted file mode 100644 index ab713bc2..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_engineutils.default.md +++ /dev/null @@ -1,300 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/EngineUtils](../modules/frontend_renderers_gamerenderer_engineutils.md).default - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_engineutils.default.md#constructor) - -### Methods - -- [fillTexture](frontend_renderers_gamerenderer_engineutils.default.md#filltexture) -- [getNow](frontend_renderers_gamerenderer_engineutils.default.md#getnow) -- [getPlanetZIndex](frontend_renderers_gamerenderer_engineutils.default.md#getplanetzindex) -- [makeDoubleQuadBuffered](frontend_renderers_gamerenderer_engineutils.default.md#makedoublequadbuffered) -- [makeEmptyDoubleQuad](frontend_renderers_gamerenderer_engineutils.default.md#makeemptydoublequad) -- [makeEmptyQuad](frontend_renderers_gamerenderer_engineutils.default.md#makeemptyquad) -- [makeEmptyQuadVec2](frontend_renderers_gamerenderer_engineutils.default.md#makeemptyquadvec2) -- [makeQuad](frontend_renderers_gamerenderer_engineutils.default.md#makequad) -- [makeQuadBuffered](frontend_renderers_gamerenderer_engineutils.default.md#makequadbuffered) -- [makeQuadVec2](frontend_renderers_gamerenderer_engineutils.default.md#makequadvec2) -- [makeQuadVec2Buffered](frontend_renderers_gamerenderer_engineutils.default.md#makequadvec2buffered) -- [rgbVecToHex](frontend_renderers_gamerenderer_engineutils.default.md#rgbvectohex) -- [rotateIndices](frontend_renderers_gamerenderer_engineutils.default.md#rotateindices) -- [rotateQuad](frontend_renderers_gamerenderer_engineutils.default.md#rotatequad) -- [rotateQuadVec2](frontend_renderers_gamerenderer_engineutils.default.md#rotatequadvec2) -- [translateIndices](frontend_renderers_gamerenderer_engineutils.default.md#translateindices) -- [translateQuad](frontend_renderers_gamerenderer_engineutils.default.md#translatequad) -- [translateQuadVec2](frontend_renderers_gamerenderer_engineutils.default.md#translatequadvec2) - -## Constructors - -### constructor - -\+ **new default**(): [_default_](frontend_renderers_gamerenderer_engineutils.default.md) - -**Returns:** [_default_](frontend_renderers_gamerenderer_engineutils.default.md) - -## Methods - -### fillTexture - -▸ `Static` **fillTexture**(`gl`: WebGL2RenderingContext): _void_ - -#### Parameters - -| Name | Type | -| :--- | :--------------------- | -| `gl` | WebGL2RenderingContext | - -**Returns:** _void_ - ---- - -### getNow - -▸ `Static` **getNow**(): _number_ - -**Returns:** _number_ - ---- - -### getPlanetZIndex - -▸ `Static` **getPlanetZIndex**(`planet`: Planet): _number_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _number_ - ---- - -### makeDoubleQuadBuffered - -▸ `Static` **makeDoubleQuadBuffered**(`b`: _number_[], `ax1`: _number_, `ay1`: _number_, `ax2`: _number_, `ay2`: _number_, `bx1`: _number_, `by1`: _number_, `bx2`: _number_, `by2`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :---- | :--------- | -| `b` | _number_[] | -| `ax1` | _number_ | -| `ay1` | _number_ | -| `ax2` | _number_ | -| `ay2` | _number_ | -| `bx1` | _number_ | -| `by1` | _number_ | -| `bx2` | _number_ | -| `by2` | _number_ | - -**Returns:** _void_ - ---- - -### makeEmptyDoubleQuad - -▸ `Static` **makeEmptyDoubleQuad**(): _number_[] - -**Returns:** _number_[] - ---- - -### makeEmptyQuad - -▸ `Static` **makeEmptyQuad**(): _number_[] - -**Returns:** _number_[] - ---- - -### makeEmptyQuadVec2 - -▸ `Static` **makeEmptyQuadVec2**(): _number_[] - -**Returns:** _number_[] - ---- - -### makeQuad - -▸ `Static` **makeQuad**(`x1`: _number_, `y1`: _number_, `x2`: _number_, `y2`: _number_, `z`: _number_): _number_[] - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `x1` | _number_ | -| `y1` | _number_ | -| `x2` | _number_ | -| `y2` | _number_ | -| `z` | _number_ | - -**Returns:** _number_[] - ---- - -### makeQuadBuffered - -▸ `Static` **makeQuadBuffered**(`b`: _number_[], `x1`: _number_, `y1`: _number_, `x2`: _number_, `y2`: _number_, `z`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :--- | :--------- | -| `b` | _number_[] | -| `x1` | _number_ | -| `y1` | _number_ | -| `x2` | _number_ | -| `y2` | _number_ | -| `z` | _number_ | - -**Returns:** _void_ - ---- - -### makeQuadVec2 - -▸ `Static` **makeQuadVec2**(`x1`: _number_, `y1`: _number_, `x2`: _number_, `y2`: _number_): _number_[] - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `x1` | _number_ | -| `y1` | _number_ | -| `x2` | _number_ | -| `y2` | _number_ | - -**Returns:** _number_[] - ---- - -### makeQuadVec2Buffered - -▸ `Static` **makeQuadVec2Buffered**(`b`: _number_[], `x1`: _number_, `y1`: _number_, `x2`: _number_, `y2`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :--- | :--------- | -| `b` | _number_[] | -| `x1` | _number_ | -| `y1` | _number_ | -| `x2` | _number_ | -| `y2` | _number_ | - -**Returns:** _void_ - ---- - -### rgbVecToHex - -▸ `Static` **rgbVecToHex**(`rgb`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec)): _string_ - -#### Parameters - -| Name | Type | -| :---- | :--------------------------------------------------------------------------- | -| `rgb` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - -**Returns:** _string_ - ---- - -### rotateIndices - -▸ `Static` `Private` **rotateIndices**(`b`: _number_[], `i`: _number_, `j`: _number_, `angle`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------ | :--------- | -| `b` | _number_[] | -| `i` | _number_ | -| `j` | _number_ | -| `angle` | _number_ | - -**Returns:** _void_ - ---- - -### rotateQuad - -▸ `Static` **rotateQuad**(`b`: _number_[], `angle`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------ | :--------- | -| `b` | _number_[] | -| `angle` | _number_ | - -**Returns:** _void_ - ---- - -### rotateQuadVec2 - -▸ `Static` **rotateQuadVec2**(`b`: _number_[], `angle`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------ | :--------- | -| `b` | _number_[] | -| `angle` | _number_ | - -**Returns:** _void_ - ---- - -### translateIndices - -▸ `Static` `Private` **translateIndices**(`b`: _number_[], `i`: _number_, `j`: _number_, `__namedParameters`: [*number*, *number*]): _void_ - -#### Parameters - -| Name | Type | -| :------------------ | :------------------- | -| `b` | _number_[] | -| `i` | _number_ | -| `j` | _number_ | -| `__namedParameters` | [*number*, *number*] | - -**Returns:** _void_ - ---- - -### translateQuad - -▸ `Static` **translateQuad**(`b`: _number_[], `t`: [*number*, *number*]): _void_ - -#### Parameters - -| Name | Type | -| :--- | :------------------- | -| `b` | _number_[] | -| `t` | [*number*, *number*] | - -**Returns:** _void_ - ---- - -### translateQuadVec2 - -▸ `Static` **translateQuadVec2**(`b`: _number_[], `t`: [*number*, *number*]): _void_ - -#### Parameters - -| Name | Type | -| :--- | :------------------- | -| `b` | _number_[] | -| `t` | [*number*, *number*] | - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md deleted file mode 100644 index 79cf996b..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md +++ /dev/null @@ -1,175 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/AsteroidRenderer](../modules/frontend_renderers_gamerenderer_entities_asteroidrenderer.md).default - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_ASTEROID_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_asteroidprogram.md#asteroid_program_definition)\> - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#manager) -- [program](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#program) -- [uniformData](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#verts) -- [viewport](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#viewport) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#flush) -- [queueAsteroid](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#queueasteroid) -- [setUniforms](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md#setuniforms) - -## Constructors - -### constructor - -\+ **new default**(`manager`: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md)): [_default_](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md) - -#### Parameters - -| Name | Type | -| :-------- | :-------------------------------------------------------------------------------------- | -| `manager` | [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `radius`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `seed`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `theta`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `radius`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `seed`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `theta`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `radius`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `seed`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `theta`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - ---- - -### viewport - -• **viewport**: [_default_](frontend_game_viewport.default.md) - -## Methods - -### flush - -▸ **flush**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueAsteroid - -▸ **queueAsteroid**(`planet`: Planet, `centerW`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radiusW`: _number_, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec)): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :--------------------------------------------------------------------------- | -| `planet` | Planet | -| `centerW` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `radiusW` | _number_ | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md deleted file mode 100644 index 23503290..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md +++ /dev/null @@ -1,94 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/BackgroundRenderer](../modules/frontend_renderers_gamerenderer_entities_backgroundrenderer.md).default - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md#constructor) - -### Properties - -- [borderRenderer](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md#borderrenderer) -- [manager](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md#manager) -- [perlinRenderer](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md#perlinrenderer) -- [renderer](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md#renderer) - -### Methods - -- [drawChunks](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md#drawchunks) -- [fillPerlin](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md#fillperlin) -- [flush](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md#flush) - -## Constructors - -### constructor - -\+ **new default**(`manager`: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md), `config`: PerlinConfig, `thresholds`: [*number*, *number*, *number*]): [_default_](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md) - -#### Parameters - -| Name | Type | -| :----------- | :-------------------------------------------------------------------------------------- | -| `manager` | [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) | -| `config` | PerlinConfig | -| `thresholds` | [*number*, *number*, *number*] | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md) - -## Properties - -### borderRenderer - -• **borderRenderer**: [_default_](frontend_renderers_gamerenderer_entities_rectrenderer.default.md) - ---- - -### manager - -• **manager**: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) - ---- - -### perlinRenderer - -• **perlinRenderer**: [_PerlinRenderer_](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md) - ---- - -### renderer - -• **renderer**: [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -## Methods - -### drawChunks - -▸ **drawChunks**(`exploredChunks`: _Iterable_<[_Chunk_](_types_global_globaltypes.chunk.md)\>, `highPerfMode`: _boolean_, `drawChunkBorders`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :----------------- | :--------------------------------------------------------- | -| `exploredChunks` | _Iterable_<[_Chunk_](_types_global_globaltypes.chunk.md)\> | -| `highPerfMode` | _boolean_ | -| `drawChunkBorders` | _boolean_ | - -**Returns:** _void_ - ---- - -### fillPerlin - -▸ **fillPerlin**(): _void_ - -**Returns:** _void_ - ---- - -### flush - -▸ **flush**(): _void_ - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_beltrenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_beltrenderer.default.md deleted file mode 100644 index b8aa02ff..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_beltrenderer.default.md +++ /dev/null @@ -1,244 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/BeltRenderer](../modules/frontend_renderers_gamerenderer_entities_beltrenderer.md).default - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_BELT_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_beltprogram.md#belt_program_definition)\> - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#attribmanagers) -- [botRectPosBuffer](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#botrectposbuffer) -- [manager](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#manager) -- [posBuffer](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#posbuffer) -- [program](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#program) -- [topRectPosBuffer](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#toprectposbuffer) -- [uniformData](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#flush) -- [queueBelt](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#queuebelt) -- [queueBeltAtIdx](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#queuebeltatidx) -- [queueBeltWorld](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#queuebeltworld) -- [setUniforms](frontend_renderers_gamerenderer_entities_beltrenderer.default.md#setuniforms) - -## Constructors - -### constructor - -\+ **new default**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md)): [_default_](frontend_renderers_gamerenderer_entities_beltrenderer.default.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_beltrenderer.default.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### botRectPosBuffer - -• **botRectPosBuffer**: _number_[] - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### posBuffer - -• **posBuffer**: _number_[] - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### topRectPosBuffer - -• **topRectPosBuffer**: _number_[] - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueBelt - -▸ **queueBelt**(`center`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `l?`: _number_, `z?`: _number_, `delZ?`: _number_, `props?`: [_BeltProps_](../modules/frontend_renderers_gamerenderer_programs_beltprogram.md#beltprops), `angle?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :------------------------------------------------------------------------------------------ | :------------ | -| `center` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `radius` | _number_ | - | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `l` | _number_ | 1 | -| `z` | _number_ | 0 | -| `delZ` | _number_ | 0 | -| `props` | [_BeltProps_](../modules/frontend_renderers_gamerenderer_programs_beltprogram.md#beltprops) | - | -| `angle` | _number_ | 0 | - -**Returns:** _void_ - ---- - -### queueBeltAtIdx - -▸ **queueBeltAtIdx**(`planet`: Planet, `center`: WorldCoords \| [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `beltIdx`: _number_, `angle?`: _number_, `screen?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :-------- | :--------------------------------------------------------------------------------------- | :------------ | -| `planet` | Planet | - | -| `center` | WorldCoords \| [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `radius` | _number_ | - | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `beltIdx` | _number_ | - | -| `angle` | _number_ | 0 | -| `screen` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### queueBeltWorld - -▸ **queueBeltWorld**(`centerW`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radiusW`: _number_, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `l?`: _number_, `z?`: _number_, `delZ?`: _number_, `props?`: [_BeltProps_](../modules/frontend_renderers_gamerenderer_programs_beltprogram.md#beltprops), `angle?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :-------- | :------------------------------------------------------------------------------------------ | :------------ | -| `centerW` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `radiusW` | _number_ | - | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `l` | _number_ | 1 | -| `z` | _number_ | 0 | -| `delZ` | _number_ | 0 | -| `props` | [_BeltProps_](../modules/frontend_renderers_gamerenderer_programs_beltprogram.md#beltprops) | - | -| `angle` | _number_ | 0 | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md deleted file mode 100644 index 190a4cba..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md +++ /dev/null @@ -1,209 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/BlackDomainRenderer](../modules/frontend_renderers_gamerenderer_entities_blackdomainrenderer.md).default - -Renders a shadow-type thing over destroyed planets - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_BLACKDOMAIN_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_blackdomainprogram.md#blackdomain_program_definition)\> - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#manager) -- [program](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#program) -- [quad2Buffer](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#quad2buffer) -- [quad3Buffer](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#quad3buffer) -- [uniformData](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#flush) -- [queueBlackDomain](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#queueblackdomain) -- [queueBlackDomainScreen](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#queueblackdomainscreen) -- [setUniforms](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md#setuniforms) - -## Constructors - -### constructor - -\+ **new default**(`manager`: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md)): [_default_](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md) - -#### Parameters - -| Name | Type | -| :-------- | :-------------------------------------------------------------------------------------- | -| `manager` | [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### quad2Buffer - -• **quad2Buffer**: _number_[] - ---- - -### quad3Buffer - -• **quad3Buffer**: _number_[] - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueBlackDomain - -▸ **queueBlackDomain**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------- | -| `planet` | Planet | -| `centerW` | WorldCoords | -| `radiusW` | _number_ | - -**Returns:** _void_ - ---- - -### queueBlackDomainScreen - -▸ **queueBlackDomainScreen**(`_planet`: Planet, `center`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `z`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------------------ | -| `_planet` | Planet | -| `center` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `radius` | _number_ | -| `z` | _number_ | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_circlerenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_circlerenderer.default.md deleted file mode 100644 index 76302929..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_circlerenderer.default.md +++ /dev/null @@ -1,229 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/CircleRenderer](../modules/frontend_renderers_gamerenderer_entities_circlerenderer.md).default - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_CIRCLE_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_circleprogram.md#circle_program_definition)\> - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#manager) -- [program](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#program) -- [quadBuffer](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#quadbuffer) -- [uniformData](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#verts) -- [viewport](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#viewport) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#flush) -- [queueCircle](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#queuecircle) -- [queueCircleWorld](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#queuecircleworld) -- [queueCircleWorldCenterOnly](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#queuecircleworldcenteronly) -- [setUniforms](frontend_renderers_gamerenderer_entities_circlerenderer.default.md#setuniforms) - -## Constructors - -### constructor - -\+ **new default**(`manager`: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md)): [_default_](frontend_renderers_gamerenderer_entities_circlerenderer.default.md) - -#### Parameters - -| Name | Type | -| :-------- | :-------------------------------------------------------------------------------------- | -| `manager` | [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_circlerenderer.default.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `eps`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### quadBuffer - -• **quadBuffer**: _number_[] - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `eps`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `eps`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - ---- - -### viewport - -• **viewport**: [_default_](frontend_game_viewport.default.md) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueCircle - -▸ **queueCircle**(`center`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `color?`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec), `stroke?`: _number_, `angle?`: _number_, `dashed?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :----------------------------------------------------------------------------- | :------------ | -| `center` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `radius` | _number_ | - | -| `color` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | - | -| `stroke` | _number_ | -1 | -| `angle` | _number_ | 1 | -| `dashed` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### queueCircleWorld - -▸ **queueCircleWorld**(`center`: WorldCoords, `radius`: _number_, `color?`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec), `stroke?`: _number_, `angle?`: _number_, `dashed?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :----------------------------------------------------------------------------- | :------------ | -| `center` | WorldCoords | - | -| `radius` | _number_ | - | -| `color` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | - | -| `stroke` | _number_ | -1 | -| `angle` | _number_ | 1 | -| `dashed` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### queueCircleWorldCenterOnly - -▸ **queueCircleWorldCenterOnly**(`center`: WorldCoords, `radius`: _number_, `color?`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec)): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----------------------------------------------------------------------------- | -| `center` | WorldCoords | -| `radius` | _number_ | -| `color` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_linerenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_linerenderer.default.md deleted file mode 100644 index 232c2050..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_linerenderer.default.md +++ /dev/null @@ -1,206 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/LineRenderer](../modules/frontend_renderers_gamerenderer_entities_linerenderer.md).default - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_LINE_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_lineprogram.md#line_program_definition)\> - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_linerenderer.default.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_linerenderer.default.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_linerenderer.default.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_linerenderer.default.md#manager) -- [program](frontend_renderers_gamerenderer_entities_linerenderer.default.md#program) -- [uniformData](frontend_renderers_gamerenderer_entities_linerenderer.default.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_linerenderer.default.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_linerenderer.default.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_linerenderer.default.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_linerenderer.default.md#flush) -- [getOffset](frontend_renderers_gamerenderer_entities_linerenderer.default.md#getoffset) -- [queueLine](frontend_renderers_gamerenderer_entities_linerenderer.default.md#queueline) -- [queueLineWorld](frontend_renderers_gamerenderer_entities_linerenderer.default.md#queuelineworld) -- [setUniforms](frontend_renderers_gamerenderer_entities_linerenderer.default.md#setuniforms) - -## Constructors - -### constructor - -\+ **new default**(`glManager`: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md)): [_default_](frontend_renderers_gamerenderer_entities_linerenderer.default.md) - -#### Parameters - -| Name | Type | -| :---------- | :-------------------------------------------------------------------------------------- | -| `glManager` | [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_linerenderer.default.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `dist`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `dist`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `dist`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### getOffset - -▸ `Private` **getOffset**(`start`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `end`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md)): [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) - -#### Parameters - -| Name | Type | -| :------ | :------------------------------------------------------------------------ | -| `start` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `end` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - -**Returns:** [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) - ---- - -### queueLine - -▸ **queueLine**(`start`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `end`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `color?`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec), `width?`: _number_, `zIdx?`: _number_, `dashed?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :----------------------------------------------------------------------------- | :------------ | -| `start` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `end` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `color` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | - | -| `width` | _number_ | 1 | -| `zIdx` | _number_ | - | -| `dashed` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### queueLineWorld - -▸ **queueLineWorld**(`start`: WorldCoords, `end`: WorldCoords, `color?`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec), `width?`: _number_, `zIdx?`: _number_, `dashed?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :----------------------------------------------------------------------------- | :------------ | -| `start` | WorldCoords | - | -| `end` | WorldCoords | - | -| `color` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | - | -| `width` | _number_ | 1 | -| `zIdx` | _number_ | - | -| `dashed` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_maskrenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_maskrenderer.default.md deleted file mode 100644 index f0c24613..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_maskrenderer.default.md +++ /dev/null @@ -1,194 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/MaskRenderer](../modules/frontend_renderers_gamerenderer_entities_maskrenderer.md).default - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_MASK_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_maskprogram.md#mask_program_definition)\> - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#attribmanagers) -- [bgCanvas](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#bgcanvas) -- [manager](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#manager) -- [perlinThresholds](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#perlinthresholds) -- [program](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#program) -- [quadBuffer](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#quadbuffer) -- [uniformData](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#flush) -- [queueChunk](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#queuechunk) -- [setUniforms](frontend_renderers_gamerenderer_entities_maskrenderer.default.md#setuniforms) - -## Constructors - -### constructor - -\+ **new default**(`manager`: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md)): [_default_](frontend_renderers_gamerenderer_entities_maskrenderer.default.md) - -#### Parameters - -| Name | Type | -| :-------- | :-------------------------------------------------------------------------------------- | -| `manager` | [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_maskrenderer.default.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### bgCanvas - -• **bgCanvas**: HTMLCanvasElement - ---- - -### manager - -• **manager**: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) - -WebGLManager corresponding to this program. - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### perlinThresholds - -• **perlinThresholds**: _number_[] - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### quadBuffer - -• **quadBuffer**: _number_[] - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueChunk - -▸ **queueChunk**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md b/docs/classes/frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md deleted file mode 100644 index 06da32b5..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md +++ /dev/null @@ -1,207 +0,0 @@ -# Class: MineBodyRenderer - -[Frontend/Renderers/GameRenderer/Entities/MineBodyRenderer](../modules/frontend_renderers_gamerenderer_entities_minebodyrenderer.md).MineBodyRenderer - -Renderers asteroids at the center of silver mines - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_MINE_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_mineprogram.md#mine_program_definition)\> - - ↳ **MineBodyRenderer** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#manager) -- [program](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#program) -- [uniformData](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#flush) -- [queueMine](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#queuemine) -- [queueMineScreen](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#queueminescreen) -- [queuePoint](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#queuepoint) -- [setUniforms](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md#setuniforms) - -## Constructors - -### constructor - -\+ **new MineBodyRenderer**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md)): [_MineBodyRenderer_](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - -**Returns:** [_MineBodyRenderer_](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `offset`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `radius`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `seed`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `offset`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `radius`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `seed`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `offset`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `radius`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `seed`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueMine - -▸ **queueMine**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------- | -| `planet` | Planet | -| `centerW` | WorldCoords | -| `radiusW` | _number_ | - -**Returns:** _void_ - ---- - -### queueMineScreen - -▸ **queueMineScreen**(`planet`: Planet, `center`: WorldCoords, `radius`: _number_, `z`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `planet` | Planet | -| `center` | WorldCoords | -| `radius` | _number_ | -| `z` | _number_ | - -**Returns:** _void_ - ---- - -### queuePoint - -▸ `Private` **queuePoint**(`__namedParameters`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `z`: _number_, `radius`: _number_, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `seed`: _number_, `offset`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------------------ | :--------------------------------------------------------------------------- | -| `__namedParameters` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `z` | _number_ | -| `radius` | _number_ | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `seed` | _number_ | -| `offset` | _number_ | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md b/docs/classes/frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md deleted file mode 100644 index 343e9a8f..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md +++ /dev/null @@ -1,96 +0,0 @@ -# Class: MineRenderer - -[Frontend/Renderers/GameRenderer/Entities/MineRenderer](../modules/frontend_renderers_gamerenderer_entities_minerenderer.md).MineRenderer - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md#constructor) - -### Properties - -- [beltRenderer](frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md#beltrenderer) -- [mineBodyRenderer](frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md#minebodyrenderer) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md#flush) -- [queueMine](frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md#queuemine) -- [queueMineScreen](frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md#queueminescreen) -- [setUniforms](frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md#setuniforms) - -## Constructors - -### constructor - -\+ **new MineRenderer**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md)): [_MineRenderer_](frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - -**Returns:** [_MineRenderer_](frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md) - -## Properties - -### beltRenderer - -• **beltRenderer**: [_default_](frontend_renderers_gamerenderer_entities_beltrenderer.default.md) - ---- - -### mineBodyRenderer - -• **mineBodyRenderer**: [_MineBodyRenderer_](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md) - -## Methods - -### flush - -▸ **flush**(): _void_ - -**Returns:** _void_ - ---- - -### queueMine - -▸ **queueMine**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------- | -| `planet` | Planet | -| `centerW` | WorldCoords | -| `radiusW` | _number_ | - -**Returns:** _void_ - ---- - -### queueMineScreen - -▸ **queueMineScreen**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_, `z`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------- | -| `planet` | Planet | -| `centerW` | WorldCoords | -| `radiusW` | _number_ | -| `z` | _number_ | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md b/docs/classes/frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md deleted file mode 100644 index 32bd3a05..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md +++ /dev/null @@ -1,244 +0,0 @@ -# Class: PerlinRenderer - -[Frontend/Renderers/GameRenderer/Entities/PerlinRenderer](../modules/frontend_renderers_gamerenderer_entities_perlinrenderer.md).PerlinRenderer - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_PERLIN_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_perlinprogram.md#perlin_program_definition)\> - - ↳ **PerlinRenderer** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#attribmanagers) -- [config](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#config) -- [coordsBuffer](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#coordsbuffer) -- [manager](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#manager) -- [posBuffer](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#posbuffer) -- [program](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#program) -- [rectRenderer](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#rectrenderer) -- [thresholds](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#thresholds) -- [uniformData](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#verts) - -### Methods - -- [bufferGradients](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#buffergradients) -- [flush](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#flush) -- [queueChunk](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#queuechunk) -- [queueRect](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#queuerect) -- [setUniforms](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md#setuniforms) - -## Constructors - -### constructor - -\+ **new PerlinRenderer**(`manager`: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md), `config`: PerlinConfig, `thresholds`: [*number*, *number*, *number*], `rectRenderer?`: _undefined_ \| [_default_](frontend_renderers_gamerenderer_entities_rectrenderer.default.md)): [_PerlinRenderer_](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md) - -#### Parameters - -| Name | Type | -| :------------- | :------------------------------------------------------------------------------------------- | -| `manager` | [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) | -| `config` | PerlinConfig | -| `thresholds` | [*number*, *number*, *number*] | -| `rectRenderer` | _undefined_ \| [_default_](frontend_renderers_gamerenderer_entities_rectrenderer.default.md) | - -**Returns:** [_PerlinRenderer_](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `p0botGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p0topGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p1botGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p1topGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p2botGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p2topGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `worldCoords`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `lengthScale`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `thresholds`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### config - -• **config**: PerlinConfig - ---- - -### coordsBuffer - -• **coordsBuffer**: _number_[] - ---- - -### manager - -• **manager**: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) - -WebGLManager corresponding to this program. - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### posBuffer - -• **posBuffer**: _number_[] - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### rectRenderer - -• **rectRenderer**: _undefined_ \| [_default_](frontend_renderers_gamerenderer_entities_rectrenderer.default.md) - ---- - -### thresholds - -• **thresholds**: [_Vec3_](../modules/frontend_renderers_gamerenderer_enginetypes.md#vec3) - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `p0botGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p0topGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p1botGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p1topGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p2botGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p2topGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `worldCoords`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `lengthScale`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `thresholds`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `p0botGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p0topGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p1botGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p1topGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p2botGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `p2topGrad`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `worldCoords`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `lengthScale`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `thresholds`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### bufferGradients - -▸ `Private` **bufferGradients**(`rect`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), `octave`: [_PerlinOctave_](../enums/frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md), `topGrad`: [_default_](frontend_renderers_gamerenderer_webgl_attribmanager.default.md), `botGrad`: [_default_](frontend_renderers_gamerenderer_webgl_attribmanager.default.md)): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------------------------------------------------------------------------------------------- | -| `rect` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | -| `octave` | [_PerlinOctave_](../enums/frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md) | -| `topGrad` | [_default_](frontend_renderers_gamerenderer_webgl_attribmanager.default.md) | -| `botGrad` | [_default_](frontend_renderers_gamerenderer_webgl_attribmanager.default.md) | - -**Returns:** _void_ - ---- - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueChunk - -▸ **queueChunk**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### queueRect - -▸ `Private` **queueRect**(`rect`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): _void_ - -#### Parameters - -| Name | Type | -| :----- | :------------------------------------------------------------------ | -| `rect` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_planetrenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_planetrenderer.default.md deleted file mode 100644 index 5175c668..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_planetrenderer.default.md +++ /dev/null @@ -1,216 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/PlanetRenderer](../modules/frontend_renderers_gamerenderer_entities_planetrenderer.md).default - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_PLANET_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_planetprogram.md#planet_program_definition)\> - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#manager) -- [program](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#program) -- [quad2Buffer](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#quad2buffer) -- [quad3Buffer](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#quad3buffer) -- [timeMatrix](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#timematrix) -- [uniformData](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#flush) -- [queuePlanetBody](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#queueplanetbody) -- [queuePlanetBodyScreen](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#queueplanetbodyscreen) -- [setUniforms](frontend_renderers_gamerenderer_entities_planetrenderer.default.md#setuniforms) - -## Constructors - -### constructor - -\+ **new default**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md)): [_default_](frontend_renderers_gamerenderer_entities_planetrenderer.default.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_planetrenderer.default.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `color2`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `color3`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props2`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `timeMatrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### quad2Buffer - -• **quad2Buffer**: _number_[] - ---- - -### quad3Buffer - -• **quad3Buffer**: _number_[] - ---- - -### timeMatrix - -• **timeMatrix**: mat4 - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `color2`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `color3`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props2`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `timeMatrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `color2`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `color3`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props2`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `timeMatrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queuePlanetBody - -▸ **queuePlanetBody**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------- | -| `planet` | Planet | -| `centerW` | WorldCoords | -| `radiusW` | _number_ | - -**Returns:** _void_ - ---- - -### queuePlanetBodyScreen - -▸ **queuePlanetBodyScreen**(`planet`: Planet, `radius`: _number_, `x1`: _number_, `y1`: _number_, `x2`: _number_, `y2`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `planet` | Planet | -| `radius` | _number_ | -| `x1` | _number_ | -| `y1` | _number_ | -| `x2` | _number_ | -| `y2` | _number_ | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_planetrendermanager.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_planetrendermanager.default.md deleted file mode 100644 index b8bf0c25..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_planetrendermanager.default.md +++ /dev/null @@ -1,282 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager](../modules/frontend_renderers_gamerenderer_entities_planetrendermanager.md).default - -this guy is always going to call things in worldcoords, we'll convert them -to CanvasCoords. responsible for rendering planets by calling primitive renderers - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#constructor) - -### Properties - -- [renderer](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#renderer) - -### Methods - -- [drawPlanetMessages](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#drawplanetmessages) -- [flush](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#flush) -- [getLockedEnergy](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#getlockedenergy) -- [getMouseAtk](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#getmouseatk) -- [queueArtifactIcon](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queueartifacticon) -- [queueArtifactsAroundPlanet](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queueartifactsaroundplanet) -- [queueAsteroids](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queueasteroids) -- [queueBlackDomain](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queueblackdomain) -- [queueHat](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queuehat) -- [queueLocation](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queuelocation) -- [queuePlanetBody](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queueplanetbody) -- [queuePlanetEnergyText](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queueplanetenergytext) -- [queuePlanetSilverText](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queueplanetsilvertext) -- [queuePlanets](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queueplanets) -- [queueRings](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md#queuerings) - -## Constructors - -### constructor - -\+ **new default**(`renderer`: [_default_](frontend_renderers_gamerenderer_renderer.default.md)): [_default_](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md) - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------------------------- | -| `renderer` | [_default_](frontend_renderers_gamerenderer_renderer.default.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md) - -## Properties - -### renderer - -• **renderer**: [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -## Methods - -### drawPlanetMessages - -▸ `Private` **drawPlanetMessages**(`renderInfo`: [_PlanetRenderInfo_](../interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md), `coords`: WorldCoords, `radiusW`: _number_, `textAlpha`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :----------------------------------------------------------------------------------------- | -| `renderInfo` | [_PlanetRenderInfo_](../interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md) | -| `coords` | WorldCoords | -| `radiusW` | _number_ | -| `textAlpha` | _number_ | - -**Returns:** _void_ - ---- - -### flush - -▸ **flush**(): _void_ - -**Returns:** _void_ - ---- - -### getLockedEnergy - -▸ `Private` **getLockedEnergy**(`planet`: Planet): _number_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _number_ - ---- - -### getMouseAtk - -▸ `Private` **getMouseAtk**(): _undefined_ \| _number_ - -**Returns:** _undefined_ \| _number_ - ---- - -### queueArtifactIcon - -▸ `Private` **queueArtifactIcon**(`planet`: Planet, `__namedParameters`: WorldCoords, `radius`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------------------ | :---------- | -| `planet` | Planet | -| `__namedParameters` | WorldCoords | -| `radius` | _number_ | - -**Returns:** _void_ - ---- - -### queueArtifactsAroundPlanet - -▸ `Private` **queueArtifactsAroundPlanet**(`planet`: Planet, `artifacts`: Artifact[], `centerW`: WorldCoords, `radiusW`: _number_, `now`: _number_, `alpha`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :---------- | -| `planet` | Planet | -| `artifacts` | Artifact[] | -| `centerW` | WorldCoords | -| `radiusW` | _number_ | -| `now` | _number_ | -| `alpha` | _number_ | - -**Returns:** _void_ - ---- - -### queueAsteroids - -▸ `Private` **queueAsteroids**(`planet`: Planet, `center`: WorldCoords, `radius`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `planet` | Planet | -| `center` | WorldCoords | -| `radius` | _number_ | - -**Returns:** _void_ - ---- - -### queueBlackDomain - -▸ `Private` **queueBlackDomain**(`planet`: Planet, `center`: WorldCoords, `radius`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `planet` | Planet | -| `center` | WorldCoords | -| `radius` | _number_ | - -**Returns:** _void_ - ---- - -### queueHat - -▸ `Private` **queueHat**(`planet`: Planet, `center`: WorldCoords, `radius`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `planet` | Planet | -| `center` | WorldCoords | -| `radius` | _number_ | - -**Returns:** _void_ - ---- - -### queueLocation - -▸ **queueLocation**(`renderInfo`: [_PlanetRenderInfo_](../interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md), `now`: _number_, `highPerfMode`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :------------- | :----------------------------------------------------------------------------------------- | -| `renderInfo` | [_PlanetRenderInfo_](../interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md) | -| `now` | _number_ | -| `highPerfMode` | _boolean_ | - -**Returns:** _void_ - ---- - -### queuePlanetBody - -▸ `Private` **queuePlanetBody**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------- | -| `planet` | Planet | -| `centerW` | WorldCoords | -| `radiusW` | _number_ | - -**Returns:** _void_ - ---- - -### queuePlanetEnergyText - -▸ `Private` **queuePlanetEnergyText**(`planet`: Planet, `center`: WorldCoords, `radius`: _number_, `alpha`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `planet` | Planet | -| `center` | WorldCoords | -| `radius` | _number_ | -| `alpha` | _number_ | - -**Returns:** _void_ - ---- - -### queuePlanetSilverText - -▸ `Private` **queuePlanetSilverText**(`planet`: Planet, `center`: WorldCoords, `radius`: _number_, `alpha`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `planet` | Planet | -| `center` | WorldCoords | -| `radius` | _number_ | -| `alpha` | _number_ | - -**Returns:** _void_ - ---- - -### queuePlanets - -▸ **queuePlanets**(`cachedPlanets`: _Map_, `now`: _number_, `highPerfMode`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------------------------------------------------------------- | -| `cachedPlanets` | _Map_ | -| `now` | _number_ | -| `highPerfMode` | _boolean_ | - -**Returns:** _void_ - ---- - -### queueRings - -▸ `Private` **queueRings**(`planet`: Planet, `center`: WorldCoords, `radius`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `planet` | Planet | -| `center` | WorldCoords | -| `radius` | _number_ | - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md b/docs/classes/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md deleted file mode 100644 index c296c6b3..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md +++ /dev/null @@ -1,210 +0,0 @@ -# Class: QuasarBodyRenderer - -[Frontend/Renderers/GameRenderer/Entities/QuasarBodyRenderer](../modules/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.md).QuasarBodyRenderer - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_QUASARBODY_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_quasarbodyprogram.md#quasarbody_program_definition)\> - - ↳ **QuasarBodyRenderer** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#manager) -- [program](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#program) -- [quad2Buffer](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#quad2buffer) -- [quad3Buffer](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#quad3buffer) -- [uniformData](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#flush) -- [queueQuasarBody](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#queuequasarbody) -- [queueQuasarBodyScreen](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#queuequasarbodyscreen) -- [setUniforms](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md#setuniforms) - -## Constructors - -### constructor - -\+ **new QuasarBodyRenderer**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md)): [_QuasarBodyRenderer_](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - -**Returns:** [_QuasarBodyRenderer_](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### quad2Buffer - -• **quad2Buffer**: _number_[] - ---- - -### quad3Buffer - -• **quad3Buffer**: _number_[] - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueQuasarBody - -▸ **queueQuasarBody**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_, `z`: _number_, `angle?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :-------- | :---------- | :------------ | -| `planet` | Planet | - | -| `centerW` | WorldCoords | - | -| `radiusW` | _number_ | - | -| `z` | _number_ | - | -| `angle` | _number_ | 0 | - -**Returns:** _void_ - ---- - -### queueQuasarBodyScreen - -▸ **queueQuasarBodyScreen**(`planet`: Planet, `center`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `z`: _number_, `angle?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :------------------------------------------------------------------------ | :------------ | -| `planet` | Planet | - | -| `center` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `radius` | _number_ | - | -| `z` | _number_ | - | -| `angle` | _number_ | 0 | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md b/docs/classes/frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md deleted file mode 100644 index 78979814..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md +++ /dev/null @@ -1,219 +0,0 @@ -# Class: QuasarRayRenderer - -[Frontend/Renderers/GameRenderer/Entities/QuasarRayRenderer](../modules/frontend_renderers_gamerenderer_entities_quasarrayrenderer.md).QuasarRayRenderer - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_QUASARRAY_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_quasarrayprogram.md#quasarray_program_definition)\> - - ↳ **QuasarRayRenderer** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#manager) -- [program](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#program) -- [quad2BufferBot](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#quad2bufferbot) -- [quad2BufferTop](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#quad2buffertop) -- [quad3Buffer](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#quad3buffer) -- [uniformData](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#flush) -- [queueQuasarRay](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#queuequasarray) -- [queueQuasarRayScreen](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#queuequasarrayscreen) -- [setUniforms](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md#setuniforms) - -## Constructors - -### constructor - -\+ **new QuasarRayRenderer**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md)): [_QuasarRayRenderer_](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - -**Returns:** [_QuasarRayRenderer_](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### quad2BufferBot - -• **quad2BufferBot**: _number_[] - ---- - -### quad2BufferTop - -• **quad2BufferTop**: _number_[] - ---- - -### quad3Buffer - -• **quad3Buffer**: _number_[] - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueQuasarRay - -▸ **queueQuasarRay**(`top?`: _boolean_, `planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_, `z`: _number_, `angle?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :-------- | :---------- | :------------ | -| `top` | _boolean_ | true | -| `planet` | Planet | - | -| `centerW` | WorldCoords | - | -| `radiusW` | _number_ | - | -| `z` | _number_ | - | -| `angle` | _number_ | 0 | - -**Returns:** _void_ - ---- - -### queueQuasarRayScreen - -▸ **queueQuasarRayScreen**(`top?`: _boolean_, `planet`: Planet, `center`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `z`: _number_, `angle?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :------------------------------------------------------------------------ | :------------ | -| `top` | _boolean_ | true | -| `planet` | Planet | - | -| `center` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `radius` | _number_ | - | -| `z` | _number_ | - | -| `angle` | _number_ | 0 | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md b/docs/classes/frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md deleted file mode 100644 index 0593ca4f..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md +++ /dev/null @@ -1,126 +0,0 @@ -# Class: QuasarRenderer - -[Frontend/Renderers/GameRenderer/Entities/QuasarRenderer](../modules/frontend_renderers_gamerenderer_entities_quasarrenderer.md).QuasarRenderer - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#constructor) - -### Properties - -- [manager](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#manager) -- [quasarBodyRenderer](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#quasarbodyrenderer) -- [quasarRayRendererBot](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#quasarrayrendererbot) -- [quasarRayRendererTop](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#quasarrayrenderertop) -- [renderer](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#renderer) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#flush) -- [getAngle](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#getangle) -- [queueQuasar](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#queuequasar) -- [queueQuasarScreen](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#queuequasarscreen) -- [setUniforms](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md#setuniforms) - -## Constructors - -### constructor - -\+ **new QuasarRenderer**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md)): [_QuasarRenderer_](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - -**Returns:** [_QuasarRenderer_](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md) - -## Properties - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### quasarBodyRenderer - -• **quasarBodyRenderer**: [_QuasarBodyRenderer_](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md) - ---- - -### quasarRayRendererBot - -• **quasarRayRendererBot**: [_QuasarRayRenderer_](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md) - ---- - -### quasarRayRendererTop - -• **quasarRayRendererTop**: [_QuasarRayRenderer_](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md) - ---- - -### renderer - -• **renderer**: [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -## Methods - -### flush - -▸ **flush**(): _void_ - -**Returns:** _void_ - ---- - -### getAngle - -▸ `Private` **getAngle**(): _number_ - -**Returns:** _number_ - ---- - -### queueQuasar - -▸ **queueQuasar**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------- | -| `planet` | Planet | -| `centerW` | WorldCoords | -| `radiusW` | _number_ | - -**Returns:** _void_ - ---- - -### queueQuasarScreen - -▸ **queueQuasarScreen**(`planet`: Planet, `center`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `z`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------------------------------------------------------------------------ | -| `planet` | Planet | -| `center` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `radius` | _number_ | -| `z` | _number_ | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_rectrenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_rectrenderer.default.md deleted file mode 100644 index 3367ae08..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_rectrenderer.default.md +++ /dev/null @@ -1,247 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/RectRenderer](../modules/frontend_renderers_gamerenderer_entities_rectrenderer.md).default - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_RECT_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_rectprogram.md#rect_program_definition)\> - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#manager) -- [program](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#program) -- [quad2Buffer](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#quad2buffer) -- [quad3Buffer](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#quad3buffer) -- [uniformData](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#flush) -- [queueChunkBorder](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#queuechunkborder) -- [queueRect](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#queuerect) -- [queueRectCenterWorld](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#queuerectcenterworld) -- [queueRectWorld](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#queuerectworld) -- [setUniforms](frontend_renderers_gamerenderer_entities_rectrenderer.default.md#setuniforms) - -## Constructors - -### constructor - -\+ **new default**(`manager`: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md)): [_default_](frontend_renderers_gamerenderer_entities_rectrenderer.default.md) - -#### Parameters - -| Name | Type | -| :-------- | :-------------------------------------------------------------------------------------- | -| `manager` | [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_rectrenderer.default.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `strokeX`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `strokeY`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### quad2Buffer - -• **quad2Buffer**: _number_[] - ---- - -### quad3Buffer - -• **quad3Buffer**: _number_[] - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `strokeX`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `strokeY`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `strokeX`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `strokeY`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueChunkBorder - -▸ **queueChunkBorder**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### queueRect - -▸ **queueRect**(`__namedParameters`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `width`: _number_, `height`: _number_, `color?`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `stroke?`: _number_, `zIdx?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------------------ | :--------------------------------------------------------------------------- | :------------ | -| `__namedParameters` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `width` | _number_ | - | -| `height` | _number_ | - | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `stroke` | _number_ | -1 | -| `zIdx` | _number_ | - | - -**Returns:** _void_ - ---- - -### queueRectCenterWorld - -▸ **queueRectCenterWorld**(`center`: WorldCoords, `width`: _number_, `height`: _number_, `color?`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `stroke?`: _number_, `zIdx?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :--------------------------------------------------------------------------- | :------------ | -| `center` | WorldCoords | - | -| `width` | _number_ | - | -| `height` | _number_ | - | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `stroke` | _number_ | -1 | -| `zIdx` | _number_ | - | - -**Returns:** _void_ - ---- - -### queueRectWorld - -▸ **queueRectWorld**(`coords`: WorldCoords, `width`: _number_, `height`: _number_, `color?`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `stroke?`: _number_, `zIdx?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :--------------------------------------------------------------------------- | :------------ | -| `coords` | WorldCoords | - | -| `width` | _number_ | - | -| `height` | _number_ | - | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `stroke` | _number_ | -1 | -| `zIdx` | _number_ | - | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_ringrenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_ringrenderer.default.md deleted file mode 100644 index bc6ae4b3..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_ringrenderer.default.md +++ /dev/null @@ -1,250 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/RingRenderer](../modules/frontend_renderers_gamerenderer_entities_ringrenderer.md).default - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_RING_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_ringprogram.md#ring_program_definition)\> - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#attribmanagers) -- [botRectPosBuffer](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#botrectposbuffer) -- [manager](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#manager) -- [posBuffer](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#posbuffer) -- [program](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#program) -- [topRectPosBuffer](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#toprectposbuffer) -- [uniformData](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#verts) -- [viewport](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#viewport) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#flush) -- [queueBelt](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#queuebelt) -- [queueBeltAtIdx](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#queuebeltatidx) -- [queueBeltWorld](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#queuebeltworld) -- [setUniforms](frontend_renderers_gamerenderer_entities_ringrenderer.default.md#setuniforms) - -## Constructors - -### constructor - -\+ **new default**(`manager`: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md)): [_default_](frontend_renderers_gamerenderer_entities_ringrenderer.default.md) - -#### Parameters - -| Name | Type | -| :-------- | :-------------------------------------------------------------------------------------- | -| `manager` | [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_ringrenderer.default.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### botRectPosBuffer - -• **botRectPosBuffer**: _number_[] - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### posBuffer - -• **posBuffer**: _number_[] - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### topRectPosBuffer - -• **topRectPosBuffer**: _number_[] - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `now`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - ---- - -### viewport - -• **viewport**: [_default_](frontend_game_viewport.default.md) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueBelt - -▸ **queueBelt**(`center`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `l?`: _number_, `z?`: _number_, `delZ?`: _number_, `props?`: [_RingProps_](../modules/frontend_renderers_gamerenderer_programs_ringprogram.md#ringprops), `angle?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :------------------------------------------------------------------------------------------ | :------------ | -| `center` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `radius` | _number_ | - | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `l` | _number_ | 1 | -| `z` | _number_ | 0 | -| `delZ` | _number_ | 0 | -| `props` | [_RingProps_](../modules/frontend_renderers_gamerenderer_programs_ringprogram.md#ringprops) | - | -| `angle` | _number_ | 0 | - -**Returns:** _void_ - ---- - -### queueBeltAtIdx - -▸ **queueBeltAtIdx**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `beltIdx`: _number_, `angle?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :-------- | :--------------------------------------------------------------------------- | :------------ | -| `planet` | Planet | - | -| `centerW` | WorldCoords | - | -| `radiusW` | _number_ | - | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `beltIdx` | _number_ | - | -| `angle` | _number_ | 0 | - -**Returns:** _void_ - ---- - -### queueBeltWorld - -▸ **queueBeltWorld**(`centerW`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radiusW`: _number_, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `l?`: _number_, `z?`: _number_, `delZ?`: _number_, `props?`: [_RingProps_](../modules/frontend_renderers_gamerenderer_programs_ringprogram.md#ringprops), `angle?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :-------- | :------------------------------------------------------------------------------------------ | :------------ | -| `centerW` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `radiusW` | _number_ | - | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `l` | _number_ | 1 | -| `z` | _number_ | 0 | -| `delZ` | _number_ | 0 | -| `props` | [_RingProps_](../modules/frontend_renderers_gamerenderer_programs_ringprogram.md#ringprops) | - | -| `angle` | _number_ | 0 | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md b/docs/classes/frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md deleted file mode 100644 index b1f615b2..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md +++ /dev/null @@ -1,227 +0,0 @@ -# Class: RuinsRenderer - -[Frontend/Renderers/GameRenderer/Entities/RuinsRenderer](../modules/frontend_renderers_gamerenderer_entities_ruinsrenderer.md).RuinsRenderer - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_RUINS_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_ruinsprogram.md#ruins_program_definition)\> - - ↳ **RuinsRenderer** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#manager) -- [program](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#program) -- [quad2Buffer](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#quad2buffer) -- [quad3Buffer](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#quad3buffer) -- [uniformData](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#flush) -- [queueBloom](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#queuebloom) -- [queueRuins](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#queueruins) -- [queueRuinsScreen](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#queueruinsscreen) -- [setUniforms](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md#setuniforms) - -## Constructors - -### constructor - -\+ **new RuinsRenderer**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md)): [_RuinsRenderer_](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - -**Returns:** [_RuinsRenderer_](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `weights`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### quad2Buffer - -• **quad2Buffer**: _number_[] - ---- - -### quad3Buffer - -• **quad3Buffer**: _number_[] - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `weights`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `props`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `weights`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueBloom - -▸ `Private` **queueBloom**(`center`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `z`: _number_, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `weights`: [*number*, *number*, *number*, *number*], `props`: [*number*, *number*, *number*, *number*]): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :--------------------------------------------------------------------------- | -| `center` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `radius` | _number_ | -| `z` | _number_ | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `weights` | [*number*, *number*, *number*, *number*] | -| `props` | [*number*, *number*, *number*, *number*] | - -**Returns:** _void_ - ---- - -### queueRuins - -▸ **queueRuins**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------- | -| `planet` | Planet | -| `centerW` | WorldCoords | -| `radiusW` | _number_ | - -**Returns:** _void_ - ---- - -### queueRuinsScreen - -▸ **queueRuinsScreen**(`planet`: Planet, `center`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `z`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------------------------------------------------------------------------ | -| `planet` | Planet | -| `center` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `radius` | _number_ | -| `z` | _number_ | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md b/docs/classes/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md deleted file mode 100644 index fa41dd67..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md +++ /dev/null @@ -1,207 +0,0 @@ -# Class: SpacetimeRipRenderer - -[Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer](../modules/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.md).SpacetimeRipRenderer - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_SPACETIMERIP_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_spacetimeripprogram.md#spacetimerip_program_definition)\> - - ↳ **SpacetimeRipRenderer** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#manager) -- [program](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#program) -- [quad2Buffer](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#quad2buffer) -- [quad3Buffer](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#quad3buffer) -- [uniformData](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#flush) -- [queueRip](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#queuerip) -- [queueRipScreen](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#queueripscreen) -- [setUniforms](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md#setuniforms) - -## Constructors - -### constructor - -\+ **new SpacetimeRipRenderer**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md)): [_SpacetimeRipRenderer_](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - -**Returns:** [_SpacetimeRipRenderer_](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `inColor1`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `inColor2`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `inColor3`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### quad2Buffer - -• **quad2Buffer**: _number_[] - ---- - -### quad3Buffer - -• **quad3Buffer**: _number_[] - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `inColor1`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `inColor2`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `inColor3`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `inColor1`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `inColor2`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `inColor3`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `time`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueRip - -▸ **queueRip**(`planet`: Planet, `centerW`: WorldCoords, `radiusW`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :---------- | -| `planet` | Planet | -| `centerW` | WorldCoords | -| `radiusW` | _number_ | - -**Returns:** _void_ - ---- - -### queueRipScreen - -▸ **queueRipScreen**(`planet`: Planet, `center`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `radius`: _number_, `z`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------------------------------------------------------------------------ | -| `planet` | Planet | -| `center` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `radius` | _number_ | -| `z` | _number_ | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md b/docs/classes/frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md deleted file mode 100644 index eb3e2c8e..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md +++ /dev/null @@ -1,335 +0,0 @@ -# Class: SpriteRenderer - -[Frontend/Renderers/GameRenderer/Entities/SpriteRenderer](../modules/frontend_renderers_gamerenderer_entities_spriterenderer.md).SpriteRenderer - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_SPRITE_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_spriteprogram.md#sprite_program_definition)\> - - ↳ **SpriteRenderer** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#attribmanagers) -- [flip](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#flip) -- [loaded](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#loaded) -- [manager](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#manager) -- [posBuffer](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#posbuffer) -- [program](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#program) -- [rectposBuffer](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#rectposbuffer) -- [texBuffer](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#texbuffer) -- [texIdx](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#texidx) -- [thumb](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#thumb) -- [uniformData](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#flush) -- [loadAtlas](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#loadatlas) -- [loadTexture](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#loadtexture) -- [queueArtifact](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#queueartifact) -- [queueArtifactWorld](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#queueartifactworld) -- [queueIconWorld](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#queueiconworld) -- [queueOutline](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#queueoutline) -- [queueSprite](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#queuesprite) -- [setUniforms](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md#setuniforms) - -## Constructors - -### constructor - -\+ **new SpriteRenderer**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md), `thumb?`: _boolean_, `flip?`: _boolean_): [_SpriteRenderer_](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md) - -#### Parameters - -| Name | Type | Default value | -| :-------- | :----------------------------------------------------------------------------------- | :------------ | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - | -| `thumb` | _boolean_ | false | -| `flip` | _boolean_ | false | - -**Returns:** [_SpriteRenderer_](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `invert`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `mythic`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `shine`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `texcoord`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `texture`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### flip - -• `Private` **flip**: _boolean_ - ---- - -### loaded - -• `Private` **loaded**: _boolean_ - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### posBuffer - -• `Private` **posBuffer**: _number_[] - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### rectposBuffer - -• `Private` **rectposBuffer**: _number_[] - ---- - -### texBuffer - -• `Private` **texBuffer**: _number_[] - ---- - -### texIdx - -• `Private` **texIdx**: _number_ - ---- - -### thumb - -• `Private` **thumb**: _boolean_ - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `invert`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `mythic`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `shine`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `texcoord`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `texture`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `invert`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `mythic`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `rectPos`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `shine`: { `dim`: _number_ = 1; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `texcoord`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `texture`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### flush - -▸ **flush**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### loadAtlas - -▸ `Private` **loadAtlas**(`thumb`: _boolean_): _Promise_ - -#### Parameters - -| Name | Type | -| :------ | :-------- | -| `thumb` | _boolean_ | - -**Returns:** _Promise_ - ---- - -### loadTexture - -▸ `Private` **loadTexture**(`img`: HTMLImageElement, `texIdx`: _number_): _Promise_ - -#### Parameters - -| Name | Type | -| :------- | :--------------- | -| `img` | HTMLImageElement | -| `texIdx` | _number_ | - -**Returns:** _Promise_ - ---- - -### queueArtifact - -▸ **queueArtifact**(`artifact`: [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md), `pos`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `width?`: _number_, `alpha?`: _number_, `atFrame?`: _undefined_ \| _number_, `color?`: _undefined_ \| [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `theta?`: _undefined_ \| _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :--------- | :------------------------------------------------------------------------------------------ | :------------ | -| `artifact` | [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md) | - | -| `pos` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `width` | _number_ | 128 | -| `alpha` | _number_ | 255 | -| `atFrame` | _undefined_ \| _number_ | - | -| `color` | _undefined_ \| [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `theta` | _undefined_ \| _number_ | - | - -**Returns:** _void_ - ---- - -### queueArtifactWorld - -▸ **queueArtifactWorld**(`artifact`: [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md), `posW`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `widthW`: _number_, `alpha?`: _number_, `atFrame?`: _undefined_ \| _number_, `color?`: _undefined_ \| [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `theta?`: _undefined_ \| _number_): _void_ - -Queue artifact to worldcoords, centered - -#### Parameters - -| Name | Type | Default value | -| :--------- | :------------------------------------------------------------------------------------------ | :------------ | -| `artifact` | [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md) | - | -| `posW` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - | -| `widthW` | _number_ | - | -| `alpha` | _number_ | 255 | -| `atFrame` | _undefined_ \| _number_ | - | -| `color` | _undefined_ \| [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - | -| `theta` | _undefined_ \| _number_ | - | - -**Returns:** _void_ - ---- - -### queueIconWorld - -▸ **queueIconWorld**(`artifact`: Artifact, `topLeft`: WorldCoords, `widthW`: _number_, `maxWidth?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :--------- | :---------- | :------------ | -| `artifact` | Artifact | - | -| `topLeft` | WorldCoords | - | -| `widthW` | _number_ | - | -| `maxWidth` | _number_ | 32 | - -**Returns:** _void_ - ---- - -### queueOutline - -▸ **queueOutline**(`artifact`: [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md), `__namedParameters`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `width`: _number_, `alpha`: _number_, `theta`: _undefined_ \| _number_, `color?`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec)): _void_ - -#### Parameters - -| Name | Type | -| :------------------ | :-------------------------------------------------------------------------------------- | -| `artifact` | [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md) | -| `__namedParameters` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `width` | _number_ | -| `alpha` | _number_ | -| `theta` | _undefined_ \| _number_ | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - -**Returns:** _void_ - ---- - -### queueSprite - -▸ **queueSprite**(`artifact`: [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md), `topLeft`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `width`: _number_, `alpha`: _number_, `color?`: _undefined_ \| [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec), `atFrame?`: _undefined_ \| _number_, `theta?`: _undefined_ \| _number_): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :------------------------------------------------------------------------------------------ | -| `artifact` | [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md) | -| `topLeft` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `width` | _number_ | -| `alpha` | _number_ | -| `color` | _undefined_ \| [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `atFrame` | _undefined_ \| _number_ | -| `theta` | _undefined_ \| _number_ | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_textrenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_textrenderer.default.md deleted file mode 100644 index 5d3f6d81..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_textrenderer.default.md +++ /dev/null @@ -1,276 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/TextRenderer](../modules/frontend_renderers_gamerenderer_entities_textrenderer.md).default - -## Hierarchy - -- [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md)<_typeof_ [_TEXT_PROGRAM_DEFINITION_](../modules/frontend_renderers_gamerenderer_programs_textprogram.md#text_program_definition)\> - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_textrenderer.default.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_entities_textrenderer.default.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_entities_textrenderer.default.md#attribmanagers) -- [bufferCanvas](frontend_renderers_gamerenderer_entities_textrenderer.default.md#buffercanvas) -- [glyphData](frontend_renderers_gamerenderer_entities_textrenderer.default.md#glyphdata) -- [manager](frontend_renderers_gamerenderer_entities_textrenderer.default.md#manager) -- [program](frontend_renderers_gamerenderer_entities_textrenderer.default.md#program) -- [quad2Buffer](frontend_renderers_gamerenderer_entities_textrenderer.default.md#quad2buffer) -- [quad3Buffer](frontend_renderers_gamerenderer_entities_textrenderer.default.md#quad3buffer) -- [texIdx](frontend_renderers_gamerenderer_entities_textrenderer.default.md#texidx) -- [uniformData](frontend_renderers_gamerenderer_entities_textrenderer.default.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_entities_textrenderer.default.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_entities_textrenderer.default.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_entities_textrenderer.default.md#verts) - -### Methods - -- [createGlyphs](frontend_renderers_gamerenderer_entities_textrenderer.default.md#createglyphs) -- [flush](frontend_renderers_gamerenderer_entities_textrenderer.default.md#flush) -- [queueGlyph](frontend_renderers_gamerenderer_entities_textrenderer.default.md#queueglyph) -- [queueText](frontend_renderers_gamerenderer_entities_textrenderer.default.md#queuetext) -- [queueTextWorld](frontend_renderers_gamerenderer_entities_textrenderer.default.md#queuetextworld) -- [setTexture](frontend_renderers_gamerenderer_entities_textrenderer.default.md#settexture) -- [setUniforms](frontend_renderers_gamerenderer_entities_textrenderer.default.md#setuniforms) - -## Constructors - -### constructor - -\+ **new default**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md), `bufferCanvas`: HTMLCanvasElement): [_default_](frontend_renderers_gamerenderer_entities_textrenderer.default.md) - -#### Parameters - -| Name | Type | -| :------------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | -| `bufferCanvas` | HTMLCanvasElement | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_textrenderer.default.md) - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_<{ `attribs`: { `color`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `texcoord`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `texture`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of attrib managers, keyed by attrib name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) - ---- - -### bufferCanvas - -• **bufferCanvas**: HTMLCanvasElement - ---- - -### glyphData - -• **glyphData**: _Map_ - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) - ---- - -### quad2Buffer - -• **quad2Buffer**: _number_[] - ---- - -### quad3Buffer - -• **quad3Buffer**: _number_[] - ---- - -### texIdx - -• **texIdx**: _number_ - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_<{ `attribs`: { `color`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `texcoord`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `texture`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_<{ `attribs`: { `color`: { `dim`: _number_ = 4; `name`: _string_ ; `normalize`: _boolean_ = true; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `position`: { `dim`: _number_ = 3; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } ; `texcoord`: { `dim`: _number_ = 2; `name`: _string_ ; `normalize`: _boolean_ = false; `type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) } } ; `fragmentShader`: _string_ ; `uniforms`: { `matrix`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } ; `texture`: { `name`: _string_ ; `type`: [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) } } ; `vertexShader`: _string_ }\> - -A dictionary of uniform setters, keyed by uniform name. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -Inherited from: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md).[verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -## Methods - -### createGlyphs - -▸ `Private` **createGlyphs**(`debug?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------ | :-------- | :------------ | -| `debug` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### flush - -▸ **flush**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - ---- - -### queueGlyph - -▸ `Private` **queueGlyph**(`glyph`: _string_, `x`: _number_, `y`: _number_, `color`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec), `zIdx`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------ | :----------------------------------------------------------------------------- | -| `glyph` | _string_ | -| `x` | _number_ | -| `y` | _number_ | -| `color` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | -| `zIdx` | _number_ | - -**Returns:** _void_ - ---- - -### queueText - -▸ **queueText**(`text`: _string_, `__namedParameters`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `color`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec), `align?`: [_TextAlign_](../enums/frontend_renderers_gamerenderer_enginetypes.textalign.md), `anchor?`: [_TextAnchor_](../enums/frontend_renderers_gamerenderer_enginetypes.textanchor.md), `zIdx?`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------------------ | :--------------------------------------------------------------------------------- | -| `text` | _string_ | -| `__namedParameters` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `color` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | -| `align` | [_TextAlign_](../enums/frontend_renderers_gamerenderer_enginetypes.textalign.md) | -| `anchor` | [_TextAnchor_](../enums/frontend_renderers_gamerenderer_enginetypes.textanchor.md) | -| `zIdx` | _number_ | - -**Returns:** _void_ - ---- - -### queueTextWorld - -▸ **queueTextWorld**(`text`: _string_, `coords`: WorldCoords, `color?`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec), `offY?`: _number_, `align?`: [_TextAlign_](../enums/frontend_renderers_gamerenderer_enginetypes.textalign.md), `anchor?`: [_TextAnchor_](../enums/frontend_renderers_gamerenderer_enginetypes.textanchor.md), `zIdx?`: _number_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :--------------------------------------------------------------------------------- | :------------ | -| `text` | _string_ | - | -| `coords` | WorldCoords | - | -| `color` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | - | -| `offY` | _number_ | 0 | -| `align` | [_TextAlign_](../enums/frontend_renderers_gamerenderer_enginetypes.textalign.md) | - | -| `anchor` | [_TextAnchor_](../enums/frontend_renderers_gamerenderer_enginetypes.textanchor.md) | - | -| `zIdx` | _number_ | - | - -**Returns:** _void_ - ---- - -### setTexture - -▸ `Private` **setTexture**(`texIdx`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `texIdx` | _number_ | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -**Returns:** _void_ - -Overrides: [GenericRenderer](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_voyagerenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_entities_voyagerenderer.default.md deleted file mode 100644 index a6da28f2..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_voyagerenderer.default.md +++ /dev/null @@ -1,78 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Entities/VoyageRenderer](../modules/frontend_renderers_gamerenderer_entities_voyagerenderer.md).default - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_voyagerenderer.default.md#constructor) - -### Properties - -- [renderer](frontend_renderers_gamerenderer_entities_voyagerenderer.default.md#renderer) - -### Methods - -- [drawFleet](frontend_renderers_gamerenderer_entities_voyagerenderer.default.md#drawfleet) -- [drawVoyagePath](frontend_renderers_gamerenderer_entities_voyagerenderer.default.md#drawvoyagepath) -- [queueVoyages](frontend_renderers_gamerenderer_entities_voyagerenderer.default.md#queuevoyages) - -## Constructors - -### constructor - -\+ **new default**(`renderer`: [_default_](frontend_renderers_gamerenderer_renderer.default.md)): [_default_](frontend_renderers_gamerenderer_entities_voyagerenderer.default.md) - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------------------------- | -| `renderer` | [_default_](frontend_renderers_gamerenderer_renderer.default.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_entities_voyagerenderer.default.md) - -## Properties - -### renderer - -• **renderer**: [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -## Methods - -### drawFleet - -▸ **drawFleet**(`voyage`: QueuedArrival): _void_ - -#### Parameters - -| Name | Type | -| :------- | :------------ | -| `voyage` | QueuedArrival | - -**Returns:** _void_ - ---- - -### drawVoyagePath - -▸ `Private` **drawVoyagePath**(`from`: LocationId, `to`: LocationId, `confirmed`: _boolean_, `isMyVoyage`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `from` | LocationId | -| `to` | LocationId | -| `confirmed` | _boolean_ | -| `isMyVoyage` | _boolean_ | - -**Returns:** _void_ - ---- - -### queueVoyages - -▸ **queueVoyages**(): _void_ - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md b/docs/classes/frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md deleted file mode 100644 index 65d962d6..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md +++ /dev/null @@ -1,62 +0,0 @@ -# Class: WormholeRenderer - -[Frontend/Renderers/GameRenderer/Entities/WormholeRenderer](../modules/frontend_renderers_gamerenderer_entities_wormholerenderer.md).WormholeRenderer - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md#constructor) - -### Properties - -- [renderer](frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md#renderer) - -### Methods - -- [drawVoyagePath](frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md#drawvoyagepath) -- [queueWormholes](frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md#queuewormholes) - -## Constructors - -### constructor - -\+ **new WormholeRenderer**(`renderer`: [_default_](frontend_renderers_gamerenderer_renderer.default.md)): [_WormholeRenderer_](frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md) - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------------------------- | -| `renderer` | [_default_](frontend_renderers_gamerenderer_renderer.default.md) | - -**Returns:** [_WormholeRenderer_](frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md) - -## Properties - -### renderer - -• **renderer**: [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -## Methods - -### drawVoyagePath - -▸ `Private` **drawVoyagePath**(`from`: LocationId, `to`: LocationId, `confirmed`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :--------- | -| `from` | LocationId | -| `to` | LocationId | -| `confirmed` | _boolean_ | - -**Returns:** _void_ - ---- - -### queueWormholes - -▸ **queueWormholes**(): _void_ - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_overlay2drenderer.default.md b/docs/classes/frontend_renderers_gamerenderer_overlay2drenderer.default.md deleted file mode 100644 index 417d99f1..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_overlay2drenderer.default.md +++ /dev/null @@ -1,276 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Overlay2DRenderer](../modules/frontend_renderers_gamerenderer_overlay2drenderer.md).default - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_overlay2drenderer.default.md#constructor) - -### Properties - -- [canvas](frontend_renderers_gamerenderer_overlay2drenderer.default.md#canvas) -- [ctx](frontend_renderers_gamerenderer_overlay2drenderer.default.md#ctx) -- [renderer](frontend_renderers_gamerenderer_overlay2drenderer.default.md#renderer) - -### Methods - -- [clear](frontend_renderers_gamerenderer_overlay2drenderer.default.md#clear) -- [drawArcWorld](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawarcworld) -- [drawArtifactAroundPlanet](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawartifactaroundplanet) -- [drawArtifactIcon](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawartifacticon) -- [drawChunk](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawchunk) -- [drawEmojiMessage](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawemojimessage) -- [drawHat](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawhat) -- [drawLine](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawline) -- [drawLoopWorld](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawloopworld) -- [drawMiner](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawminer) -- [drawPlanetMessages](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawplanetmessages) -- [drawRectStrokeAtCenterWorld](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawrectstrokeatcenterworld) -- [drawText](frontend_renderers_gamerenderer_overlay2drenderer.default.md#drawtext) - -## Constructors - -### constructor - -\+ **new default**(`engine`: [_default_](frontend_renderers_gamerenderer_renderer.default.md), `canvas`: HTMLCanvasElement): [_default_](frontend_renderers_gamerenderer_overlay2drenderer.default.md) - -#### Parameters - -| Name | Type | -| :------- | :--------------------------------------------------------------- | -| `engine` | [_default_](frontend_renderers_gamerenderer_renderer.default.md) | -| `canvas` | HTMLCanvasElement | - -**Returns:** [_default_](frontend_renderers_gamerenderer_overlay2drenderer.default.md) - -## Properties - -### canvas - -• **canvas**: HTMLCanvasElement - ---- - -### ctx - -• **ctx**: CanvasRenderingContext2D - ---- - -### renderer - -• **renderer**: [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -## Methods - -### clear - -▸ **clear**(): _void_ - -**Returns:** _void_ - ---- - -### drawArcWorld - -▸ **drawArcWorld**(`center`: WorldCoords, `radius`: _number_, `width`: _number_, `percent`: _number_, `color?`: _string_, `dotted?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :-------- | :---------- | :------------ | -| `center` | WorldCoords | - | -| `radius` | _number_ | - | -| `width` | _number_ | - | -| `percent` | _number_ | - | -| `color` | _string_ | 'white' | -| `dotted` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### drawArtifactAroundPlanet - -▸ **drawArtifactAroundPlanet**(`artifact`: Artifact, `coords`: [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `size`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :------------------------------------------------------------------------ | -| `artifact` | Artifact | -| `coords` | [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `size` | _number_ | - -**Returns:** _void_ - ---- - -### drawArtifactIcon - -▸ **drawArtifactIcon**(`glassLoc`: WorldCoords, `scale`: _number_, `color?`: _string_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :--------- | :---------- | :------------ | -| `glassLoc` | WorldCoords | - | -| `scale` | _number_ | - | -| `color` | _string_ | 'white' | - -**Returns:** _void_ - ---- - -### drawChunk - -▸ **drawChunk**(`chunk`: [_Chunk_](_types_global_globaltypes.chunk.md)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :-------------------------------------------- | -| `chunk` | [_Chunk_](_types_global_globaltypes.chunk.md) | - -**Returns:** _void_ - ---- - -### drawEmojiMessage - -▸ **drawEmojiMessage**(`centerWorld`: WorldCoords, `radiusWorld`: _number_, `renderInfo`: [_PlanetRenderInfo_](../interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md), `message`: _PlanetMessage_, `textAlpha`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------------ | :----------------------------------------------------------------------------------------- | -| `centerWorld` | WorldCoords | -| `radiusWorld` | _number_ | -| `renderInfo` | [_PlanetRenderInfo_](../interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md) | -| `message` | _PlanetMessage_ | -| `textAlpha` | _number_ | - -**Returns:** _void_ - ---- - -### drawHat - -▸ **drawHat**(`hatType`: [_HatType_](../enums/frontend_utils_hats.hattype.md), `pathHeight`: _number_, `pathWidth`: _number_, `center`: WorldCoords, `width`: _number_, `height`: _number_, `radius`: _number_, `rotation`: _number_, `fill1?`: _string_ \| CanvasPattern, `fill2?`: _string_ \| CanvasPattern, `hoverCoords?`: `null` \| WorldCoords): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------------ | :--------------------------------------------------- | :------------ | -| `hatType` | [_HatType_](../enums/frontend_utils_hats.hattype.md) | - | -| `pathHeight` | _number_ | - | -| `pathWidth` | _number_ | - | -| `center` | WorldCoords | - | -| `width` | _number_ | - | -| `height` | _number_ | - | -| `radius` | _number_ | - | -| `rotation` | _number_ | - | -| `fill1` | _string_ \| CanvasPattern | 'white' | -| `fill2` | _string_ \| CanvasPattern | 'red' | -| `hoverCoords` | `null` \| WorldCoords | null | - -**Returns:** _void_ - ---- - -### drawLine - -▸ **drawLine**(`startCoords`: WorldCoords, `endCoords`: WorldCoords, `lineWidth`: _number_, `color?`: _string_, `dotted?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------------ | :---------- | :------------ | -| `startCoords` | WorldCoords | - | -| `endCoords` | WorldCoords | - | -| `lineWidth` | _number_ | - | -| `color` | _string_ | 'white' | -| `dotted` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### drawLoopWorld - -▸ **drawLoopWorld**(`center`: WorldCoords, `radius`: _number_, `width`: _number_, `color?`: _string_, `dotted?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------- | :---------- | :------------ | -| `center` | WorldCoords | - | -| `radius` | _number_ | - | -| `width` | _number_ | - | -| `color` | _string_ | 'white' | -| `dotted` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### drawMiner - -▸ **drawMiner**(): _void_ - -**Returns:** _void_ - ---- - -### drawPlanetMessages - -▸ **drawPlanetMessages**(`centerWorld`: WorldCoords, `radiusWorld`: _number_, `renderInfo`: [_PlanetRenderInfo_](../interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md), `textAlpha`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------------ | :----------------------------------------------------------------------------------------- | -| `centerWorld` | WorldCoords | -| `radiusWorld` | _number_ | -| `renderInfo` | [_PlanetRenderInfo_](../interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md) | -| `textAlpha` | _number_ | - -**Returns:** _void_ - ---- - -### drawRectStrokeAtCenterWorld - -▸ **drawRectStrokeAtCenterWorld**(`center`: WorldCoords, `width`: _number_, `height`: _number_, `strokeWidth`: _number_, `color?`: _string_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------------ | :---------- | :------------ | -| `center` | WorldCoords | - | -| `width` | _number_ | - | -| `height` | _number_ | - | -| `strokeWidth` | _number_ | - | -| `color` | _string_ | 'white' | - -**Returns:** _void_ - ---- - -### drawText - -▸ **drawText**(`text`: _string_, `x`: _number_, `y`: _number_, `color?`: _string_, `align?`: [_TextAlign_](../enums/frontend_renderers_gamerenderer_enginetypes.textalign.md)): _void_ - -#### Parameters - -| Name | Type | Default value | -| :------ | :------------------------------------------------------------------------------- | :------------ | -| `text` | _string_ | - | -| `x` | _number_ | - | -| `y` | _number_ | - | -| `color` | _string_ | 'white' | -| `align` | [_TextAlign_](../enums/frontend_renderers_gamerenderer_enginetypes.textalign.md) | - | - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_renderer.default.md b/docs/classes/frontend_renderers_gamerenderer_renderer.default.md deleted file mode 100644 index 96bfceee..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_renderer.default.md +++ /dev/null @@ -1,311 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/Renderer](../modules/frontend_renderers_gamerenderer_renderer.md).default - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_renderer.default.md#constructor) - -### Properties - -- [asteroidRenderer](frontend_renderers_gamerenderer_renderer.default.md#asteroidrenderer) -- [beltRenderer](frontend_renderers_gamerenderer_renderer.default.md#beltrenderer) -- [bgRenderer](frontend_renderers_gamerenderer_renderer.default.md#bgrenderer) -- [blackDomainRenderer](frontend_renderers_gamerenderer_renderer.default.md#blackdomainrenderer) -- [bufferCanvas](frontend_renderers_gamerenderer_renderer.default.md#buffercanvas) -- [canvas](frontend_renderers_gamerenderer_renderer.default.md#canvas) -- [circleRenderer](frontend_renderers_gamerenderer_renderer.default.md#circlerenderer) -- [frameCount](frontend_renderers_gamerenderer_renderer.default.md#framecount) -- [frameRequestId](frontend_renderers_gamerenderer_renderer.default.md#framerequestid) -- [gameUIManager](frontend_renderers_gamerenderer_renderer.default.md#gameuimanager) -- [glCanvas](frontend_renderers_gamerenderer_renderer.default.md#glcanvas) -- [glManager](frontend_renderers_gamerenderer_renderer.default.md#glmanager) -- [lineRenderer](frontend_renderers_gamerenderer_renderer.default.md#linerenderer) -- [mineRenderer](frontend_renderers_gamerenderer_renderer.default.md#minerenderer) -- [now](frontend_renderers_gamerenderer_renderer.default.md#now) -- [overlay2dRenderer](frontend_renderers_gamerenderer_renderer.default.md#overlay2drenderer) -- [planetRenderManager](frontend_renderers_gamerenderer_renderer.default.md#planetrendermanager) -- [planetRenderer](frontend_renderers_gamerenderer_renderer.default.md#planetrenderer) -- [previousRenderTimestamp](frontend_renderers_gamerenderer_renderer.default.md#previousrendertimestamp) -- [quasarRenderer](frontend_renderers_gamerenderer_renderer.default.md#quasarrenderer) -- [rectRenderer](frontend_renderers_gamerenderer_renderer.default.md#rectrenderer) -- [ringRenderer](frontend_renderers_gamerenderer_renderer.default.md#ringrenderer) -- [ruinsRenderer](frontend_renderers_gamerenderer_renderer.default.md#ruinsrenderer) -- [spacetimeRipRenderer](frontend_renderers_gamerenderer_renderer.default.md#spacetimeriprenderer) -- [spriteRenderer](frontend_renderers_gamerenderer_renderer.default.md#spriterenderer) -- [textRenderer](frontend_renderers_gamerenderer_renderer.default.md#textrenderer) -- [uiRenderManager](frontend_renderers_gamerenderer_renderer.default.md#uirendermanager) -- [voyageRenderManager](frontend_renderers_gamerenderer_renderer.default.md#voyagerendermanager) -- [wormholeRenderManager](frontend_renderers_gamerenderer_renderer.default.md#wormholerendermanager) -- [instance](frontend_renderers_gamerenderer_renderer.default.md#instance) - -### Methods - -- [draw](frontend_renderers_gamerenderer_renderer.default.md#draw) -- [loop](frontend_renderers_gamerenderer_renderer.default.md#loop) -- [recordRender](frontend_renderers_gamerenderer_renderer.default.md#recordrender) -- [setup](frontend_renderers_gamerenderer_renderer.default.md#setup) -- [destroy](frontend_renderers_gamerenderer_renderer.default.md#destroy) -- [initialize](frontend_renderers_gamerenderer_renderer.default.md#initialize) - -## Constructors - -### constructor - -\+ `Private` **new default**(`canvas`: HTMLCanvasElement, `glCanvas`: HTMLCanvasElement, `bufferCanvas`: HTMLCanvasElement, `gameUIManager`: [_default_](backend_gamelogic_gameuimanager.default.md)): [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------ | -| `canvas` | HTMLCanvasElement | -| `glCanvas` | HTMLCanvasElement | -| `bufferCanvas` | HTMLCanvasElement | -| `gameUIManager` | [_default_](backend_gamelogic_gameuimanager.default.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -## Properties - -### asteroidRenderer - -• **asteroidRenderer**: [_default_](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md) - ---- - -### beltRenderer - -• **beltRenderer**: [_default_](frontend_renderers_gamerenderer_entities_beltrenderer.default.md) - ---- - -### bgRenderer - -• **bgRenderer**: [_default_](frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md) - ---- - -### blackDomainRenderer - -• **blackDomainRenderer**: [_default_](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md) - ---- - -### bufferCanvas - -• **bufferCanvas**: HTMLCanvasElement - ---- - -### canvas - -• **canvas**: HTMLCanvasElement - ---- - -### circleRenderer - -• **circleRenderer**: [_default_](frontend_renderers_gamerenderer_entities_circlerenderer.default.md) - ---- - -### frameCount - -• **frameCount**: _number_ - ---- - -### frameRequestId - -• **frameRequestId**: _number_ - ---- - -### gameUIManager - -• **gameUIManager**: [_default_](backend_gamelogic_gameuimanager.default.md) - ---- - -### glCanvas - -• **glCanvas**: HTMLCanvasElement - ---- - -### glManager - -• **glManager**: [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) - ---- - -### lineRenderer - -• **lineRenderer**: [_default_](frontend_renderers_gamerenderer_entities_linerenderer.default.md) - ---- - -### mineRenderer - -• **mineRenderer**: [_MineRenderer_](frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md) - ---- - -### now - -• **now**: _number_ - ---- - -### overlay2dRenderer - -• **overlay2dRenderer**: [_default_](frontend_renderers_gamerenderer_overlay2drenderer.default.md) - ---- - -### planetRenderManager - -• **planetRenderManager**: [_default_](frontend_renderers_gamerenderer_entities_planetrendermanager.default.md) - ---- - -### planetRenderer - -• **planetRenderer**: [_default_](frontend_renderers_gamerenderer_entities_planetrenderer.default.md) - ---- - -### previousRenderTimestamp - -• `Private` **previousRenderTimestamp**: _number_ - ---- - -### quasarRenderer - -• **quasarRenderer**: [_QuasarRenderer_](frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md) - ---- - -### rectRenderer - -• **rectRenderer**: [_default_](frontend_renderers_gamerenderer_entities_rectrenderer.default.md) - ---- - -### ringRenderer - -• **ringRenderer**: [_default_](frontend_renderers_gamerenderer_entities_ringrenderer.default.md) - ---- - -### ruinsRenderer - -• **ruinsRenderer**: [_RuinsRenderer_](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md) - ---- - -### spacetimeRipRenderer - -• **spacetimeRipRenderer**: [_SpacetimeRipRenderer_](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md) - ---- - -### spriteRenderer - -• **spriteRenderer**: [_SpriteRenderer_](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md) - ---- - -### textRenderer - -• **textRenderer**: [_default_](frontend_renderers_gamerenderer_entities_textrenderer.default.md) - ---- - -### uiRenderManager - -• **uiRenderManager**: [_UIRenderer_](frontend_renderers_gamerenderer_uirenderer.uirenderer.md) - ---- - -### voyageRenderManager - -• **voyageRenderManager**: [_default_](frontend_renderers_gamerenderer_entities_voyagerenderer.default.md) - ---- - -### wormholeRenderManager - -• **wormholeRenderManager**: [_WormholeRenderer_](frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md) - ---- - -### instance - -▪ `Static` **instance**: `null` \| [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -## Methods - -### draw - -▸ `Private` **draw**(): _void_ - -**Returns:** _void_ - ---- - -### loop - -▸ `Private` **loop**(): _void_ - -**Returns:** _void_ - ---- - -### recordRender - -▸ `Private` **recordRender**(`now`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `now` | _number_ | - -**Returns:** _void_ - ---- - -### setup - -▸ `Private` **setup**(): _void_ - -**Returns:** _void_ - ---- - -### destroy - -▸ `Static` **destroy**(): _void_ - -**Returns:** _void_ - ---- - -### initialize - -▸ `Static` **initialize**(`canvas`: HTMLCanvasElement, `glCanvas`: HTMLCanvasElement, `bufferCanvas`: HTMLCanvasElement, `gameUIManager`: [_default_](backend_gamelogic_gameuimanager.default.md)): [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------ | -| `canvas` | HTMLCanvasElement | -| `glCanvas` | HTMLCanvasElement | -| `bufferCanvas` | HTMLCanvasElement | -| `gameUIManager` | [_default_](backend_gamelogic_gameuimanager.default.md) | - -**Returns:** [_default_](frontend_renderers_gamerenderer_renderer.default.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_uirenderer.uirenderer.md b/docs/classes/frontend_renderers_gamerenderer_uirenderer.uirenderer.md deleted file mode 100644 index b4160036..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_uirenderer.uirenderer.md +++ /dev/null @@ -1,107 +0,0 @@ -# Class: UIRenderer - -[Frontend/Renderers/GameRenderer/UIRenderer](../modules/frontend_renderers_gamerenderer_uirenderer.md).UIRenderer - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_uirenderer.uirenderer.md#constructor) - -### Properties - -- [renderer](frontend_renderers_gamerenderer_uirenderer.uirenderer.md#renderer) - -### Methods - -- [drawMiner](frontend_renderers_gamerenderer_uirenderer.uirenderer.md#drawminer) -- [queueBorders](frontend_renderers_gamerenderer_uirenderer.uirenderer.md#queueborders) -- [queueHoveringRect](frontend_renderers_gamerenderer_uirenderer.uirenderer.md#queuehoveringrect) -- [queueMousePath](frontend_renderers_gamerenderer_uirenderer.uirenderer.md#queuemousepath) -- [queueRectAtPlanet](frontend_renderers_gamerenderer_uirenderer.uirenderer.md#queuerectatplanet) -- [queueSelectedRangeRing](frontend_renderers_gamerenderer_uirenderer.uirenderer.md#queueselectedrangering) -- [queueSelectedRect](frontend_renderers_gamerenderer_uirenderer.uirenderer.md#queueselectedrect) - -## Constructors - -### constructor - -\+ **new UIRenderer**(`renderer`: [_default_](frontend_renderers_gamerenderer_renderer.default.md)): [_UIRenderer_](frontend_renderers_gamerenderer_uirenderer.uirenderer.md) - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------------------------- | -| `renderer` | [_default_](frontend_renderers_gamerenderer_renderer.default.md) | - -**Returns:** [_UIRenderer_](frontend_renderers_gamerenderer_uirenderer.uirenderer.md) - -## Properties - -### renderer - -• **renderer**: [_default_](frontend_renderers_gamerenderer_renderer.default.md) - -## Methods - -### drawMiner - -▸ **drawMiner**(): _void_ - -**Returns:** _void_ - ---- - -### queueBorders - -▸ **queueBorders**(): _void_ - -**Returns:** _void_ - ---- - -### queueHoveringRect - -▸ **queueHoveringRect**(): _void_ - -**Returns:** _void_ - ---- - -### queueMousePath - -▸ **queueMousePath**(): _void_ - -**Returns:** _void_ - ---- - -### queueRectAtPlanet - -▸ `Private` **queueRectAtPlanet**(`planet`: Planet, `coords`: WorldCoords, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec)): _void_ - -#### Parameters - -| Name | Type | -| :------- | :--------------------------------------------------------------------------- | -| `planet` | Planet | -| `coords` | WorldCoords | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - -**Returns:** _void_ - ---- - -### queueSelectedRangeRing - -▸ **queueSelectedRangeRing**(): _void_ - -**Returns:** _void_ - ---- - -### queueSelectedRect - -▸ **queueSelectedRect**(): _void_ - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md b/docs/classes/frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md deleted file mode 100644 index 783a8610..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md +++ /dev/null @@ -1,101 +0,0 @@ -# Class: AttribArray - -[Frontend/Renderers/GameRenderer/WebGL/AttribArray](../modules/frontend_renderers_gamerenderer_webgl_attribarray.md).AttribArray - -Helper class - essentially an implementation of ArrayList from Java, but using -typed JS Arrays so that we can efficiently write our WebGL data without converting. - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md#constructor) - -### Properties - -- [array](frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md#array) -- [size](frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md#size) -- [type](frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md#type) - -### Methods - -- [createArray](frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md#createarray) -- [doubleLen](frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md#doublelen) -- [set](frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md#set) - -## Constructors - -### constructor - -\+ **new AttribArray**(`type`: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md), `startSize?`: _number_): [_AttribArray_](frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md) - -#### Parameters - -| Name | Type | Default value | -| :---------- | :--------------------------------------------------------------------------------- | :------------ | -| `type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | - | -| `startSize` | _number_ | 4 | - -**Returns:** [_AttribArray_](frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md) - -## Properties - -### array - -• **array**: [_GLArray_](../modules/frontend_renderers_gamerenderer_webgl_attribarray.md#glarray) - -A typed array, representing the data in this array. - ---- - -### size - -• `Private` **size**: _number_ - -The number of bytes per data entry in this array. - ---- - -### type - -• `Private` **type**: [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) - -The WebGL data type that this array represents. - -## Methods - -### createArray - -▸ `Private` **createArray**(): _void_ - -Initialize a new blank array of size this.size. - -**Returns:** _void_ - ---- - -### doubleLen - -▸ `Private` **doubleLen**(): _void_ - -Initialize a new array of 2x the length, and copy in the old data. - -**Returns:** _void_ - ---- - -### set - -▸ **set**(`els`: _ArrayLike_, `idx`: _number_): _void_ - -Copy in an array of data starting at an index. Writing past the maximum -array length will trigger doubleLen(). - -#### Parameters - -| Name | Type | Description | -| :---- | :------------------- | :--------------------------- | -| `els` | _ArrayLike_ | The array of data to copy. | -| `idx` | _number_ | The array index to start at. | - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md b/docs/classes/frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md deleted file mode 100644 index 024b687a..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md +++ /dev/null @@ -1,119 +0,0 @@ -# Class: GameGLManager - -[Frontend/Renderers/GameRenderer/WebGL/GameGLManager](../modules/frontend_renderers_gamerenderer_webgl_gameglmanager.md).GameGLManager - -## Hierarchy - -- [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - - ↳ **GameGLManager** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md#constructor) - -### Properties - -- [canvas](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md#canvas) -- [gl](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md#gl) -- [isHighPerf](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md#ishighperf) -- [projectionMatrix](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md#projectionmatrix) -- [renderer](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md#renderer) -- [stencil](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md#stencil) - -### Methods - -- [clear](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md#clear) -- [getTexIdx](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md#gettexidx) -- [setProjectionMatrix](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md#setprojectionmatrix) - -## Constructors - -### constructor - -\+ **new GameGLManager**(`engine`: [_default_](frontend_renderers_gamerenderer_renderer.default.md), `glCanvas`: HTMLCanvasElement): [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------------------------- | -| `engine` | [_default_](frontend_renderers_gamerenderer_renderer.default.md) | -| `glCanvas` | HTMLCanvasElement | - -**Returns:** [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) - -Overrides: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -## Properties - -### canvas - -• **canvas**: HTMLCanvasElement - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[canvas](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#canvas) - ---- - -### gl - -• **gl**: WebGL2RenderingContext - -Overrides: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[gl](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#gl) - ---- - -### isHighPerf - -• **isHighPerf**: _boolean_ - ---- - -### projectionMatrix - -• **projectionMatrix**: mat4 - -Overrides: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[projectionMatrix](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#projectionmatrix) - ---- - -### renderer - -• **renderer**: [_default_](frontend_renderers_gamerenderer_renderer.default.md) - ---- - -### stencil - -• **stencil**: _boolean_ - -## Methods - -### clear - -▸ **clear**(): _void_ - -**Returns:** _void_ - -Overrides: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### getTexIdx - -▸ **getTexIdx**(): _number_ - -**Returns:** _number_ - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### setProjectionMatrix - -▸ **setProjectionMatrix**(): _void_ - -**Returns:** _void_ - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) diff --git a/docs/classes/frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md b/docs/classes/frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md deleted file mode 100644 index 117452ed..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md +++ /dev/null @@ -1,193 +0,0 @@ -# Class: GenericRenderer - -[Frontend/Renderers/GameRenderer/WebGL/GenericRenderer](../modules/frontend_renderers_gamerenderer_webgl_genericrenderer.md).GenericRenderer - -Takes in a gl context, program sources (frag and vert shader), -and data about attribs / uniforms and provides: - -- attrib managers -- uniform setters -- skeleton code for rendering in our engine via `flush()` - -## Type parameters - -| Name | Type | -| :--- | :---------------------- | -| `T` | EngineProgramDefinition | - -## Hierarchy - -- **GenericRenderer** - - ↳ [_default_](frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md) - - ↳ [_default_](frontend_renderers_gamerenderer_entities_beltrenderer.default.md) - - ↳ [_default_](frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md) - - ↳ [_default_](frontend_renderers_gamerenderer_entities_circlerenderer.default.md) - - ↳ [_default_](frontend_renderers_gamerenderer_entities_linerenderer.default.md) - - ↳ [_default_](frontend_renderers_gamerenderer_entities_maskrenderer.default.md) - - ↳ [_MineBodyRenderer_](frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md) - - ↳ [_PerlinRenderer_](frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md) - - ↳ [_default_](frontend_renderers_gamerenderer_entities_planetrenderer.default.md) - - ↳ [_QuasarBodyRenderer_](frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md) - - ↳ [_QuasarRayRenderer_](frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md) - - ↳ [_default_](frontend_renderers_gamerenderer_entities_rectrenderer.default.md) - - ↳ [_default_](frontend_renderers_gamerenderer_entities_ringrenderer.default.md) - - ↳ [_RuinsRenderer_](frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md) - - ↳ [_SpacetimeRipRenderer_](frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md) - - ↳ [_SpriteRenderer_](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md) - - ↳ [_default_](frontend_renderers_gamerenderer_entities_textrenderer.default.md) - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#constructor) - -### Properties - -- [attribData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribdata) -- [attribManagers](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#attribmanagers) -- [manager](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#manager) -- [program](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#program) -- [uniformData](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformdata) -- [uniformLocs](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformlocs) -- [uniformSetters](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#uniformsetters) -- [verts](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#verts) - -### Methods - -- [flush](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#flush) -- [setUniforms](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md#setuniforms) - -## Constructors - -### constructor - -\+ **new GenericRenderer**(`glManager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md), `programData`: T): [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -Create a renderer from a WebGLManager and program data. - -#### Type parameters - -| Name | Type | -| :--- | :---------------------- | -| `T` | EngineProgramDefinition | - -#### Parameters - -| Name | Type | Description | -| :------------ | :----------------------------------------------------------------------------------- | :----------------------------------------------------------- | -| `glManager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | WebGLManager which holds context for rendering this program. | -| `programData` | T | ProgramData describing this program. | - -**Returns:** [_GenericRenderer_](frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) - -## Properties - -### attribData - -• **attribData**: AttribData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - ---- - -### attribManagers - -• **attribManagers**: _AttribManagers_ - -A dictionary of attrib managers, keyed by attrib name. - ---- - -### manager - -• **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -WebGLManager corresponding to this program. - ---- - -### program - -• **program**: WebGLProgram - -The program corresponding to this renderer. - ---- - -### uniformData - -• **uniformData**: UniformData - -Uniform data for this program. Typically not used after construction. -Kept for use in inherited classes. - ---- - -### uniformLocs - -• **uniformLocs**: _UniformLocs_ - -Uniform locs for this program. Typically not referenced directly, -but rather through generated uniformSetters. Kept for use in inherited classes. - ---- - -### uniformSetters - -• **uniformSetters**: _UniformSetters_ - -A dictionary of uniform setters, keyed by uniform name. - ---- - -### verts - -• **verts**: _number_ - -The number of queued vertices so far. Used for batch rendering. - -## Methods - -### flush - -▸ **flush**(`drawMode?`: [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md)): _void_ - -Draw all buffered vertices to the screen. - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------------------------------------------------------- | :-------------------------------------------------------------- | -| `drawMode` | [_DrawMode_](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) | The drawing mode for the buffered vertices. Default: Triangles. | - -**Returns:** _void_ - ---- - -### setUniforms - -▸ **setUniforms**(): _void_ - -Run by flush(). Override this in child classes. Programs with uniformss -should always override this. - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gamerenderer_webgl_programutils.default.md b/docs/classes/frontend_renderers_gamerenderer_webgl_programutils.default.md deleted file mode 100644 index 5b0e392d..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_webgl_programutils.default.md +++ /dev/null @@ -1,71 +0,0 @@ -# Class: default - -[Frontend/Renderers/GameRenderer/WebGL/ProgramUtils](../modules/frontend_renderers_gamerenderer_webgl_programutils.md).default - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_webgl_programutils.default.md#constructor) - -### Methods - -- [createProgram](frontend_renderers_gamerenderer_webgl_programutils.default.md#createprogram) -- [createShader](frontend_renderers_gamerenderer_webgl_programutils.default.md#createshader) -- [programFromSources](frontend_renderers_gamerenderer_webgl_programutils.default.md#programfromsources) - -## Constructors - -### constructor - -\+ **new default**(): [_default_](frontend_renderers_gamerenderer_webgl_programutils.default.md) - -**Returns:** [_default_](frontend_renderers_gamerenderer_webgl_programutils.default.md) - -## Methods - -### createProgram - -▸ `Static` **createProgram**(`gl`: WebGL2RenderingContext, `vertexShader`: WebGLShader, `fragShader`: WebGLShader): `null` \| WebGLProgram - -#### Parameters - -| Name | Type | -| :------------- | :--------------------- | -| `gl` | WebGL2RenderingContext | -| `vertexShader` | WebGLShader | -| `fragShader` | WebGLShader | - -**Returns:** `null` \| WebGLProgram - ---- - -### createShader - -▸ `Static` **createShader**(`gl`: WebGL2RenderingContext, `type`: _number_, `source`: _string_): `null` \| WebGLShader - -#### Parameters - -| Name | Type | -| :------- | :--------------------- | -| `gl` | WebGL2RenderingContext | -| `type` | _number_ | -| `source` | _string_ | - -**Returns:** `null` \| WebGLShader - ---- - -### programFromSources - -▸ `Static` **programFromSources**(`gl`: WebGL2RenderingContext, `vertexShaderSource`: _string_, `fragShaderSource`: _string_): `null` \| WebGLProgram - -#### Parameters - -| Name | Type | -| :------------------- | :--------------------- | -| `gl` | WebGL2RenderingContext | -| `vertexShaderSource` | _string_ | -| `fragShaderSource` | _string_ | - -**Returns:** `null` \| WebGLProgram diff --git a/docs/classes/frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md b/docs/classes/frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md deleted file mode 100644 index 82f291f7..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md +++ /dev/null @@ -1,136 +0,0 @@ -# Class: ShaderMixins - -[Frontend/Renderers/GameRenderer/WebGL/ShaderMixins](../modules/frontend_renderers_gamerenderer_webgl_shadermixins.md).ShaderMixins - -these are 'includes' that you can add into shader template strings as in `${include}` - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#constructor) - -### Properties - -- [PI](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#pi) -- [arcTan](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#arctan) -- [blend](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#blend) -- [desaturate](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#desaturate) -- [fade](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#fade) -- [hueShift](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#hueshift) -- [invertBrightness](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#invertbrightness) -- [invertColors](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#invertcolors) -- [mod2pi](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#mod2pi) -- [modFloat](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#modfloat) -- [noiseVec3](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#noisevec3) -- [radAtAngle](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#radatangle) -- [seededRandom](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#seededrandom) -- [seededRandomVec2](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#seededrandomvec2) -- [simplex4](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md#simplex4) - -## Constructors - -### constructor - -\+ **new ShaderMixins**(): [_ShaderMixins_](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md) - -**Returns:** [_ShaderMixins_](frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md) - -## Properties - -### PI - -▪ `Static` **PI**: _string_ - ---- - -### arcTan - -▪ `Static` **arcTan**: _string_ - -Good atan that returns [0, 2Pi) - ---- - -### blend - -▪ `Static` **blend**: _string_ - -1 minus source alpha blend mode - ---- - -### desaturate - -▪ `Static` **desaturate**: _string_ - ---- - -### fade - -▪ `Static` **fade**: _string_ - -Fade out the last `tail * 100` percent of `value` to 0 - a plateau with a steep dropoff - ---- - -### hueShift - -▪ `Static` **hueShift**: _string_ - ---- - -### invertBrightness - -▪ `Static` **invertBrightness**: _string_ - ---- - -### invertColors - -▪ `Static` **invertColors**: _string_ - ---- - -### mod2pi - -▪ `Static` **mod2pi**: _string_ - ---- - -### modFloat - -▪ `Static` **modFloat**: _string_ - ---- - -### noiseVec3 - -▪ `Static` **noiseVec3**: _string_ - ---- - -### radAtAngle - -▪ `Static` **radAtAngle**: _string_ - ---- - -### seededRandom - -▪ `Static` **seededRandom**: _string_ - ---- - -### seededRandomVec2 - -▪ `Static` **seededRandomVec2**: _string_ - ---- - -### simplex4 - -▪ `Static` **simplex4**: _string_ - -4d simplex noise - `snoise(vec4)`, seems to return `[-1, 1]` -https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83 diff --git a/docs/classes/frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md b/docs/classes/frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md deleted file mode 100644 index 9a5165aa..00000000 --- a/docs/classes/frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md +++ /dev/null @@ -1,104 +0,0 @@ -# Class: WebGLManager - -[Frontend/Renderers/GameRenderer/WebGL/WebGLManager](../modules/frontend_renderers_gamerenderer_webgl_webglmanager.md).WebGLManager - -## Hierarchy - -- **WebGLManager** - - ↳ [_ArtifactRenderer_](frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md) - - ↳ [_GameGLManager_](frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) - - ↳ [_GifRenderer_](frontend_renderers_gifrenderer.gifrenderer.md) - - ↳ [_PlanetscapeRenderer_](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md) - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#constructor) - -### Properties - -- [canvas](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#canvas) -- [gl](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#gl) -- [projectionMatrix](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#projectionmatrix) -- [texIdx](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#texidx) - -### Methods - -- [clear](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#clear) -- [getTexIdx](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#gettexidx) -- [setProjectionMatrix](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#setprojectionmatrix) - -## Constructors - -### constructor - -\+ **new WebGLManager**(`canvas`: HTMLCanvasElement, `attr?`: WebGLContextAttributes): [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -#### Parameters - -| Name | Type | -| :------- | :--------------------- | -| `canvas` | HTMLCanvasElement | -| `attr?` | WebGLContextAttributes | - -**Returns:** [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -## Properties - -### canvas - -• **canvas**: HTMLCanvasElement - ---- - -### gl - -• **gl**: WebGL2RenderingContext - ---- - -### projectionMatrix - -• **projectionMatrix**: mat4 - ---- - -### texIdx - -• `Private` **texIdx**: _number_= 0 - -## Methods - -### clear - -▸ **clear**(`bits?`: _number_, `color?`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec)): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----------------------------------------------------------------------------- | -| `bits?` | _number_ | -| `color?` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | - -**Returns:** _void_ - ---- - -### getTexIdx - -▸ **getTexIdx**(): _number_ - -**Returns:** _number_ - ---- - -### setProjectionMatrix - -▸ **setProjectionMatrix**(): _void_ - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_gifrenderer.gifrenderer.md b/docs/classes/frontend_renderers_gifrenderer.gifrenderer.md deleted file mode 100644 index 9a76d3f1..00000000 --- a/docs/classes/frontend_renderers_gifrenderer.gifrenderer.md +++ /dev/null @@ -1,303 +0,0 @@ -# Class: GifRenderer - -[Frontend/Renderers/GifRenderer](../modules/frontend_renderers_gifrenderer.md).GifRenderer - -## Hierarchy - -- [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - - ↳ **GifRenderer** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_gifrenderer.gifrenderer.md#constructor) - -### Properties - -- [artifactDim](frontend_renderers_gifrenderer.gifrenderer.md#artifactdim) -- [canvas](frontend_renderers_gifrenderer.gifrenderer.md#canvas) -- [canvasDim](frontend_renderers_gifrenderer.gifrenderer.md#canvasdim) -- [gl](frontend_renderers_gifrenderer.gifrenderer.md#gl) -- [margin](frontend_renderers_gifrenderer.gifrenderer.md#margin) -- [projectionMatrix](frontend_renderers_gifrenderer.gifrenderer.md#projectionmatrix) -- [resolution](frontend_renderers_gifrenderer.gifrenderer.md#resolution) -- [spriteRenderer](frontend_renderers_gifrenderer.gifrenderer.md#spriterenderer) -- [thumb](frontend_renderers_gifrenderer.gifrenderer.md#thumb) - -### Methods - -- [addAncient](frontend_renderers_gifrenderer.gifrenderer.md#addancient) -- [addBiomes](frontend_renderers_gifrenderer.gifrenderer.md#addbiomes) -- [addSprite](frontend_renderers_gifrenderer.gifrenderer.md#addsprite) -- [addVideo](frontend_renderers_gifrenderer.gifrenderer.md#addvideo) -- [clear](frontend_renderers_gifrenderer.gifrenderer.md#clear) -- [drawSprite](frontend_renderers_gifrenderer.gifrenderer.md#drawsprite) -- [getAll](frontend_renderers_gifrenderer.gifrenderer.md#getall) -- [getAllSprites](frontend_renderers_gifrenderer.gifrenderer.md#getallsprites) -- [getAllVideos](frontend_renderers_gifrenderer.gifrenderer.md#getallvideos) -- [getBase64](frontend_renderers_gifrenderer.gifrenderer.md#getbase64) -- [getFileName](frontend_renderers_gifrenderer.gifrenderer.md#getfilename) -- [getTexIdx](frontend_renderers_gifrenderer.gifrenderer.md#gettexidx) -- [setDim](frontend_renderers_gifrenderer.gifrenderer.md#setdim) -- [setProjectionMatrix](frontend_renderers_gifrenderer.gifrenderer.md#setprojectionmatrix) - -## Constructors - -### constructor - -\+ **new GifRenderer**(`canvas`: HTMLCanvasElement, `dim`: _number_, `isThumb`: _boolean_): [_GifRenderer_](frontend_renderers_gifrenderer.gifrenderer.md) - -#### Parameters - -| Name | Type | -| :-------- | :---------------- | -| `canvas` | HTMLCanvasElement | -| `dim` | _number_ | -| `isThumb` | _boolean_ | - -**Returns:** [_GifRenderer_](frontend_renderers_gifrenderer.gifrenderer.md) - -Overrides: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -## Properties - -### artifactDim - -• `Private` **artifactDim**: _number_ - ---- - -### canvas - -• **canvas**: HTMLCanvasElement - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[canvas](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#canvas) - ---- - -### canvasDim - -• `Private` **canvasDim**: _number_ - ---- - -### gl - -• **gl**: WebGL2RenderingContext - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[gl](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#gl) - ---- - -### margin - -• `Private` **margin**: _number_ - ---- - -### projectionMatrix - -• **projectionMatrix**: mat4 - -Overrides: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[projectionMatrix](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#projectionmatrix) - ---- - -### resolution - -• `Private` **resolution**: _number_ - ---- - -### spriteRenderer - -• `Private` **spriteRenderer**: [_SpriteRenderer_](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md) - ---- - -### thumb - -• `Private` **thumb**: _boolean_ - -## Methods - -### addAncient - -▸ `Private` **addAncient**(`videoMode`: _boolean_, `dir`: _JSZip_): _Promise_ - -#### Parameters - -| Name | Type | -| :---------- | :-------- | -| `videoMode` | _boolean_ | -| `dir` | _JSZip_ | - -**Returns:** _Promise_ - ---- - -### addBiomes - -▸ `Private` **addBiomes**(`videoMode`: _boolean_, `dir`: _JSZip_): _Promise_ - -#### Parameters - -| Name | Type | -| :---------- | :-------- | -| `videoMode` | _boolean_ | -| `dir` | _JSZip_ | - -**Returns:** _Promise_ - ---- - -### addSprite - -▸ `Private` **addSprite**(`dir`: _JSZip_, `type`: ArtifactType, `biome`: Biome, `rarity`: ArtifactRarity, `ancient?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :-------- | :------------- | :------------ | -| `dir` | _JSZip_ | - | -| `type` | ArtifactType | - | -| `biome` | Biome | - | -| `rarity` | ArtifactRarity | - | -| `ancient` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### addVideo - -▸ `Private` **addVideo**(`dir`: _JSZip_, `type`: ArtifactType, `biome`: Biome, `rarity`: ArtifactRarity, `ancient?`: _boolean_): _Promise_ - -#### Parameters - -| Name | Type | Default value | -| :-------- | :------------- | :------------ | -| `dir` | _JSZip_ | - | -| `type` | ArtifactType | - | -| `biome` | Biome | - | -| `rarity` | ArtifactRarity | - | -| `ancient` | _boolean_ | false | - -**Returns:** _Promise_ - ---- - -### clear - -▸ **clear**(): _void_ - -**Returns:** _void_ - -Overrides: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### drawSprite - -▸ `Private` **drawSprite**(`artifact`: Artifact, `atFrame?`: _undefined_ \| _number_): _void_ - -#### Parameters - -| Name | Type | -| :--------- | :---------------------- | -| `artifact` | Artifact | -| `atFrame` | _undefined_ \| _number_ | - -**Returns:** _void_ - ---- - -### getAll - -▸ `Private` **getAll**(`videoMode?`: _boolean_): _Promise_ - -#### Parameters - -| Name | Type | Default value | -| :---------- | :-------- | :------------ | -| `videoMode` | _boolean_ | false | - -**Returns:** _Promise_ - ---- - -### getAllSprites - -▸ **getAllSprites**(): _void_ - -**Returns:** _void_ - ---- - -### getAllVideos - -▸ **getAllVideos**(): _void_ - -**Returns:** _void_ - ---- - -### getBase64 - -▸ `Private` **getBase64**(): _string_ - -**Returns:** _string_ - ---- - -### getFileName - -▸ `Private` **getFileName**(`video`: _boolean_, `type`: ArtifactType, `biome`: Biome, `rarity`: ArtifactRarity, `ancient`: _boolean_): _string_ - -#### Parameters - -| Name | Type | -| :-------- | :------------- | -| `video` | _boolean_ | -| `type` | ArtifactType | -| `biome` | Biome | -| `rarity` | ArtifactRarity | -| `ancient` | _boolean_ | - -**Returns:** _string_ - ---- - -### getTexIdx - -▸ **getTexIdx**(): _number_ - -**Returns:** _number_ - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### setDim - -▸ `Private` **setDim**(`dim`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `dim` | _number_ | - -**Returns:** _void_ - ---- - -### setProjectionMatrix - -▸ **setProjectionMatrix**(): _void_ - -**Returns:** _void_ - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) diff --git a/docs/classes/frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md b/docs/classes/frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md deleted file mode 100644 index 25d40dc1..00000000 --- a/docs/classes/frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md +++ /dev/null @@ -1,80 +0,0 @@ -# Class: PathRenderer - -[Frontend/Renderers/PlanetscapeRenderer/PathRenderer](../modules/frontend_renderers_planetscaperenderer_pathrenderer.md).PathRenderer - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md#constructor) - -### Properties - -- [colorA](frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md#colora) -- [manager](frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md#manager) -- [matrixULoc](frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md#matrixuloc) -- [posA](frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md#posa) -- [program](frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md#program) - -### Methods - -- [drawPath](frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md#drawpath) - -## Constructors - -### constructor - -\+ **new PathRenderer**(`manager`: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md)): [_PathRenderer_](frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md) - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------- | -| `manager` | [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) | - -**Returns:** [_PathRenderer_](frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md) - -## Properties - -### colorA - -• `Private` **colorA**: [_default_](frontend_renderers_gamerenderer_webgl_attribmanager.default.md) - ---- - -### manager - -• `Private` **manager**: [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### matrixULoc - -• `Private` **matrixULoc**: `null` \| WebGLUniformLocation - ---- - -### posA - -• `Private` **posA**: [_default_](frontend_renderers_gamerenderer_webgl_attribmanager.default.md) - ---- - -### program - -• `Private` **program**: WebGLProgram - -## Methods - -### drawPath - -▸ **drawPath**(`arr`: [_PixelCoords_](../modules/backend_procedural_procgenutils.md#pixelcoords)[], `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :--------------------------------------------------------------------------- | -| `arr` | [_PixelCoords_](../modules/backend_procedural_procgenutils.md#pixelcoords)[] | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - -**Returns:** _void_ diff --git a/docs/classes/frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md b/docs/classes/frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md deleted file mode 100644 index d353060f..00000000 --- a/docs/classes/frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md +++ /dev/null @@ -1,285 +0,0 @@ -# Class: PlanetscapeRenderer - -[Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer](../modules/frontend_renderers_planetscaperenderer_planetscaperenderer.md).PlanetscapeRenderer - -## Hierarchy - -- [_WebGLManager_](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - - ↳ **PlanetscapeRenderer** - -## Table of contents - -### Constructors - -- [constructor](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#constructor) - -### Properties - -- [TICK_SIZE](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#tick_size) -- [artifacts](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#artifacts) -- [canvas](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#canvas) -- [frameRequestId](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#framerequestid) -- [gl](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#gl) -- [isPaused](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#ispaused) -- [moonCanvas](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#mooncanvas) -- [moonCtx](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#moonctx) -- [pathRenderer](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#pathrenderer) -- [planet](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#planet) -- [projectionMatrix](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#projectionmatrix) -- [spriteRenderer](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#spriterenderer) -- [uiManager](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#uimanager) - -### Methods - -- [clear](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#clear) -- [destroy](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#destroy) -- [draw](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#draw) -- [drawHill](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#drawhill) -- [drawMoon](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#drawmoon) -- [drawScape](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#drawscape) -- [flushArtifactOnce](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#flushartifactonce) -- [getTexIdx](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#gettexidx) -- [loop](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#loop) -- [queueArtifacts](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#queueartifacts) -- [setPaused](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#setpaused) -- [setPlanet](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#setplanet) -- [setProjectionMatrix](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md#setprojectionmatrix) - -## Constructors - -### constructor - -\+ **new PlanetscapeRenderer**(`canvas`: HTMLCanvasElement, `moonCanvas`: HTMLCanvasElement, `uiManager`: [_default_](backend_gamelogic_gameuimanager.default.md)): [_PlanetscapeRenderer_](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md) - -#### Parameters - -| Name | Type | -| :----------- | :------------------------------------------------------ | -| `canvas` | HTMLCanvasElement | -| `moonCanvas` | HTMLCanvasElement | -| `uiManager` | [_default_](backend_gamelogic_gameuimanager.default.md) | - -**Returns:** [_PlanetscapeRenderer_](frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md) - -Overrides: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - -## Properties - -### TICK_SIZE - -• `Private` **TICK_SIZE**: _number_= 3 - ---- - -### artifacts - -• `Private` **artifacts**: Artifact[] - ---- - -### canvas - -• **canvas**: HTMLCanvasElement - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[canvas](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#canvas) - ---- - -### frameRequestId - -• `Private` **frameRequestId**: _number_ - ---- - -### gl - -• **gl**: WebGL2RenderingContext - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[gl](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#gl) - ---- - -### isPaused - -• `Private` **isPaused**: _boolean_ - ---- - -### moonCanvas - -• `Private` **moonCanvas**: HTMLCanvasElement - ---- - -### moonCtx - -• `Private` **moonCtx**: CanvasRenderingContext2D - ---- - -### pathRenderer - -• `Private` **pathRenderer**: [_PathRenderer_](frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md) - ---- - -### planet - -• **planet**: _undefined_ \| Planet - ---- - -### projectionMatrix - -• **projectionMatrix**: mat4 - -Overrides: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md).[projectionMatrix](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md#projectionmatrix) - ---- - -### spriteRenderer - -• `Private` **spriteRenderer**: [_SpriteRenderer_](frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md) - ---- - -### uiManager - -• `Private` **uiManager**: [_default_](backend_gamelogic_gameuimanager.default.md) - -## Methods - -### clear - -▸ **clear**(`bits?`: _number_, `color?`: [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec)): _void_ - -#### Parameters - -| Name | Type | -| :------- | :----------------------------------------------------------------------------- | -| `bits?` | _number_ | -| `color?` | [_RGBAVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | - -**Returns:** _void_ - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### destroy - -▸ **destroy**(): _void_ - -**Returns:** _void_ - ---- - -### draw - -▸ `Private` **draw**(): _void_ - -**Returns:** _void_ - ---- - -### drawHill - -▸ `Private` **drawHill**(`fn`: (`x`: _number_) => _number_, `color`: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec)): _void_ - -#### Parameters - -| Name | Type | -| :------ | :--------------------------------------------------------------------------- | -| `fn` | (`x`: _number_) => _number_ | -| `color` | [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | - -**Returns:** _void_ - ---- - -### drawMoon - -▸ `Private` **drawMoon**(): _void_ - -**Returns:** _void_ - ---- - -### drawScape - -▸ `Private` **drawScape**(): _void_ - -**Returns:** _void_ - ---- - -### flushArtifactOnce - -▸ `Private` **flushArtifactOnce**(): _void_ - -**Returns:** _void_ - ---- - -### getTexIdx - -▸ **getTexIdx**(): _number_ - -**Returns:** _number_ - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) - ---- - -### loop - -▸ `Private` **loop**(): _void_ - -**Returns:** _void_ - ---- - -### queueArtifacts - -▸ `Private` **queueArtifacts**(): _void_ - -**Returns:** _void_ - ---- - -### setPaused - -▸ **setPaused**(`isPaused?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :---------- | :-------- | -| `isPaused?` | _boolean_ | - -**Returns:** _void_ - ---- - -### setPlanet - -▸ **setPlanet**(`planet`: _undefined_ \| Planet): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _void_ - ---- - -### setProjectionMatrix - -▸ **setProjectionMatrix**(): _void_ - -**Returns:** _void_ - -Inherited from: [WebGLManager](frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) diff --git a/docs/classes/frontend_utils_uiemitter.default.md b/docs/classes/frontend_utils_uiemitter.default.md deleted file mode 100644 index 74d33be2..00000000 --- a/docs/classes/frontend_utils_uiemitter.default.md +++ /dev/null @@ -1,56 +0,0 @@ -# Class: default - -[Frontend/Utils/UIEmitter](../modules/frontend_utils_uiemitter.md).default - -## Hierarchy - -- _EventEmitter_ - - ↳ **default** - -## Table of contents - -### Constructors - -- [constructor](frontend_utils_uiemitter.default.md#constructor) - -### Properties - -- [instance](frontend_utils_uiemitter.default.md#instance) - -### Methods - -- [getInstance](frontend_utils_uiemitter.default.md#getinstance) -- [initialize](frontend_utils_uiemitter.default.md#initialize) - -## Constructors - -### constructor - -\+ `Private` **new default**(): [_default_](frontend_utils_uiemitter.default.md) - -**Returns:** [_default_](frontend_utils_uiemitter.default.md) - -Overrides: EventEmitter.constructor - -## Properties - -### instance - -▪ `Static` **instance**: [_default_](frontend_utils_uiemitter.default.md) - -## Methods - -### getInstance - -▸ `Static` **getInstance**(): [_default_](frontend_utils_uiemitter.default.md) - -**Returns:** [_default_](frontend_utils_uiemitter.default.md) - ---- - -### initialize - -▸ `Static` **initialize**(): [_default_](frontend_utils_uiemitter.default.md) - -**Returns:** [_default_](frontend_utils_uiemitter.default.md) diff --git a/docs/classes/frontend_views_dferrorboundary.dferrorboundary.md b/docs/classes/frontend_views_dferrorboundary.dferrorboundary.md deleted file mode 100644 index ecfd1ff4..00000000 --- a/docs/classes/frontend_views_dferrorboundary.dferrorboundary.md +++ /dev/null @@ -1,82 +0,0 @@ -# Class: DFErrorBoundary - -[Frontend/Views/DFErrorBoundary](../modules/frontend_views_dferrorboundary.md).DFErrorBoundary - -## Hierarchy - -- _Component_ - - ↳ **DFErrorBoundary** - -## Table of contents - -### Constructors - -- [constructor](frontend_views_dferrorboundary.dferrorboundary.md#constructor) - -### Methods - -- [componentDidCatch](frontend_views_dferrorboundary.dferrorboundary.md#componentdidcatch) -- [render](frontend_views_dferrorboundary.dferrorboundary.md#render) -- [getDerivedStateFromError](frontend_views_dferrorboundary.dferrorboundary.md#getderivedstatefromerror) - -## Constructors - -### constructor - -\+ **new DFErrorBoundary**(`props`: _unknown_): [_DFErrorBoundary_](frontend_views_dferrorboundary.dferrorboundary.md) - -#### Parameters - -| Name | Type | -| :------ | :-------- | -| `props` | _unknown_ | - -**Returns:** [_DFErrorBoundary_](frontend_views_dferrorboundary.dferrorboundary.md) - -Overrides: React.Component<unknown, { hasError: boolean }\>.constructor - -## Methods - -### componentDidCatch - -▸ **componentDidCatch**(`error`: Error, `_errorInfo`: ErrorInfo): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :-------- | -| `error` | Error | -| `_errorInfo` | ErrorInfo | - -**Returns:** _void_ - -Overrides: React.Component.componentDidCatch - ---- - -### render - -▸ **render**(): _undefined_ \| `null` \| {} - -**Returns:** _undefined_ \| `null` \| {} - -Overrides: React.Component.render - ---- - -### getDerivedStateFromError - -▸ `Static` **getDerivedStateFromError**(`_error`: Error): _object_ - -#### Parameters - -| Name | Type | -| :------- | :---- | -| `_error` | Error | - -**Returns:** _object_ - -| Name | Type | -| :--------- | :-------- | -| `hasError` | _boolean_ | diff --git a/docs/classes/frontend_views_genericerrorboundary.genericerrorboundary.md b/docs/classes/frontend_views_genericerrorboundary.genericerrorboundary.md deleted file mode 100644 index c3c0f078..00000000 --- a/docs/classes/frontend_views_genericerrorboundary.genericerrorboundary.md +++ /dev/null @@ -1,85 +0,0 @@ -# Class: GenericErrorBoundary - -[Frontend/Views/GenericErrorBoundary](../modules/frontend_views_genericerrorboundary.md).GenericErrorBoundary - -## Hierarchy - -- _Component_ - - ↳ **GenericErrorBoundary** - -## Table of contents - -### Constructors - -- [constructor](frontend_views_genericerrorboundary.genericerrorboundary.md#constructor) - -### Methods - -- [componentDidCatch](frontend_views_genericerrorboundary.genericerrorboundary.md#componentdidcatch) -- [render](frontend_views_genericerrorboundary.genericerrorboundary.md#render) -- [getDerivedStateFromError](frontend_views_genericerrorboundary.genericerrorboundary.md#getderivedstatefromerror) - -## Constructors - -### constructor - -\+ **new GenericErrorBoundary**(`props`: GenericErrorBoundaryProps): [_GenericErrorBoundary_](frontend_views_genericerrorboundary.genericerrorboundary.md) - -#### Parameters - -| Name | Type | -| :------ | :------------------------ | -| `props` | GenericErrorBoundaryProps | - -**Returns:** [_GenericErrorBoundary_](frontend_views_genericerrorboundary.genericerrorboundary.md) - -Overrides: React.Component< -GenericErrorBoundaryProps, -{ hasError: boolean } -\>.constructor - -## Methods - -### componentDidCatch - -▸ **componentDidCatch**(`error`: Error, `_errorInfo`: ErrorInfo): _void_ - -#### Parameters - -| Name | Type | -| :----------- | :-------- | -| `error` | Error | -| `_errorInfo` | ErrorInfo | - -**Returns:** _void_ - -Overrides: React.Component.componentDidCatch - ---- - -### render - -▸ **render**(): _undefined_ \| `null` \| {} - -**Returns:** _undefined_ \| `null` \| {} - -Overrides: React.Component.render - ---- - -### getDerivedStateFromError - -▸ `Static` **getDerivedStateFromError**(`_error`: Error): _object_ - -#### Parameters - -| Name | Type | -| :------- | :---- | -| `_error` | Error | - -**Returns:** _object_ - -| Name | Type | -| :--------- | :-------- | -| `hasError` | _boolean_ | diff --git a/docs/classes/frontend_views_ownedpluginview.ownedpluginview.md b/docs/classes/frontend_views_ownedpluginview.ownedpluginview.md deleted file mode 100644 index 568d3770..00000000 --- a/docs/classes/frontend_views_ownedpluginview.ownedpluginview.md +++ /dev/null @@ -1,161 +0,0 @@ -# Class: OwnedPluginView - -[Frontend/Views/OwnedPluginView](../modules/frontend_views_ownedpluginview.md).OwnedPluginView - -One row in {@link PluginLibraryView}. Represents a single plugin. Allows -the user to edit, delete, or open the plugin. This class is responsible for -evaluating a plugin's source code (as safely as we can), and calling its -appropriate lifecycle methods. Loads and evaluates the plugin on mount, -and destroys and unloads the plugin on dismount. I'm not sure I like how tightly -coupled rendering is to evaluating here, so I'll probably move the evaluation -code into {@link PluginHost} at some point. - -## Hierarchy - -- _Component_ - - ↳ **OwnedPluginView** - -## Table of contents - -### Constructors - -- [constructor](frontend_views_ownedpluginview.ownedpluginview.md#constructor) - -### Properties - -- [closeEditor](frontend_views_ownedpluginview.ownedpluginview.md#closeeditor) -- [renderedPluginRef](frontend_views_ownedpluginview.ownedpluginview.md#renderedpluginref) -- [state](frontend_views_ownedpluginview.ownedpluginview.md#state) - -### Methods - -- [deletePluginClicked](frontend_views_ownedpluginview.ownedpluginview.md#deletepluginclicked) -- [editClicked](frontend_views_ownedpluginview.ownedpluginview.md#editclicked) -- [render](frontend_views_ownedpluginview.ownedpluginview.md#render) -- [runClicked](frontend_views_ownedpluginview.ownedpluginview.md#runclicked) -- [saveRef](frontend_views_ownedpluginview.ownedpluginview.md#saveref) -- [setModalIsOpen](frontend_views_ownedpluginview.ownedpluginview.md#setmodalisopen) - -## Constructors - -### constructor - -\+ **new OwnedPluginView**(`props`: Props \| _Readonly_): [_OwnedPluginView_](frontend_views_ownedpluginview.ownedpluginview.md) - -#### Parameters - -| Name | Type | -| :------ | :-------------------------- | -| `props` | Props \| _Readonly_ | - -**Returns:** [_OwnedPluginView_](frontend_views_ownedpluginview.ownedpluginview.md) - -Inherited from: React.Component.constructor - -\+ **new OwnedPluginView**(`props`: Props, `context`: _any_): [_OwnedPluginView_](frontend_views_ownedpluginview.ownedpluginview.md) - -**`deprecated`** - -**`see`** https://reactjs.org/docs/legacy-context.html - -#### Parameters - -| Name | Type | -| :-------- | :---- | -| `props` | Props | -| `context` | _any_ | - -**Returns:** [_OwnedPluginView_](frontend_views_ownedpluginview.ownedpluginview.md) - -Inherited from: React.Component.constructor - -## Properties - -### closeEditor - -• `Private` **closeEditor**: _undefined_ \| () => _void_ - ---- - -### renderedPluginRef - -• `Private` **renderedPluginRef**: `null` \| HTMLDivElement - ---- - -### state - -• **state**: _object_ - -#### Type declaration - -| Name | Type | -| :---------- | :---------- | -| `error` | _undefined_ | -| `modalOpen` | _boolean_ | -| `rendered` | _boolean_ | - -Overrides: React.Component.state - -## Methods - -### deletePluginClicked - -▸ `Private` **deletePluginClicked**(): _void_ - -**Returns:** _void_ - ---- - -### editClicked - -▸ `Private` **editClicked**(): _void_ - -**Returns:** _void_ - ---- - -### render - -▸ **render**(): _Element_ - -**Returns:** _Element_ - -Overrides: React.Component.render - ---- - -### runClicked - -▸ `Private` **runClicked**(): _void_ - -**Returns:** _void_ - ---- - -### saveRef - -▸ `Private` **saveRef**(`el`: `null` \| HTMLDivElement): _void_ - -#### Parameters - -| Name | Type | -| :--- | :----------------------- | -| `el` | `null` \| HTMLDivElement | - -**Returns:** _void_ - ---- - -### setModalIsOpen - -▸ `Private` **setModalIsOpen**(`isOpen`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :------- | :-------- | -| `isOpen` | _boolean_ | - -**Returns:** _void_ diff --git a/docs/enums/Backend_GameLogic_ArtifactUtils.ArtifactFileColor.md b/docs/enums/Backend_GameLogic_ArtifactUtils.ArtifactFileColor.md new file mode 100644 index 00000000..c094348a --- /dev/null +++ b/docs/enums/Backend_GameLogic_ArtifactUtils.ArtifactFileColor.md @@ -0,0 +1,22 @@ +# Enumeration: ArtifactFileColor + +[Backend/GameLogic/ArtifactUtils](../modules/Backend_GameLogic_ArtifactUtils.md).ArtifactFileColor + +## Table of contents + +### Enumeration members + +- [APP_BACKGROUND](Backend_GameLogic_ArtifactUtils.ArtifactFileColor.md#app_background) +- [BLUE](Backend_GameLogic_ArtifactUtils.ArtifactFileColor.md#blue) + +## Enumeration members + +### APP_BACKGROUND + +• **APP_BACKGROUND** = `1` + +--- + +### BLUE + +• **BLUE** = `0` diff --git a/docs/enums/Backend_GameLogic_GameManager.GameManagerEvent.md b/docs/enums/Backend_GameLogic_GameManager.GameManagerEvent.md new file mode 100644 index 00000000..cb1ef6d0 --- /dev/null +++ b/docs/enums/Backend_GameLogic_GameManager.GameManagerEvent.md @@ -0,0 +1,50 @@ +# Enumeration: GameManagerEvent + +[Backend/GameLogic/GameManager](../modules/Backend_GameLogic_GameManager.md).GameManagerEvent + +## Table of contents + +### Enumeration members + +- [ArtifactUpdate](Backend_GameLogic_GameManager.GameManagerEvent.md#artifactupdate) +- [DiscoveredNewChunk](Backend_GameLogic_GameManager.GameManagerEvent.md#discoverednewchunk) +- [InitializedPlayer](Backend_GameLogic_GameManager.GameManagerEvent.md#initializedplayer) +- [InitializedPlayerError](Backend_GameLogic_GameManager.GameManagerEvent.md#initializedplayererror) +- [Moved](Backend_GameLogic_GameManager.GameManagerEvent.md#moved) +- [PlanetUpdate](Backend_GameLogic_GameManager.GameManagerEvent.md#planetupdate) + +## Enumeration members + +### ArtifactUpdate + +• **ArtifactUpdate** = `"ArtifactUpdate"` + +--- + +### DiscoveredNewChunk + +• **DiscoveredNewChunk** = `"DiscoveredNewChunk"` + +--- + +### InitializedPlayer + +• **InitializedPlayer** = `"InitializedPlayer"` + +--- + +### InitializedPlayerError + +• **InitializedPlayerError** = `"InitializedPlayerError"` + +--- + +### Moved + +• **Moved** = `"Moved"` + +--- + +### PlanetUpdate + +• **PlanetUpdate** = `"PlanetUpdate"` diff --git a/docs/enums/Backend_GameLogic_GameUIManager.GameUIManagerEvent.md b/docs/enums/Backend_GameLogic_GameUIManager.GameUIManagerEvent.md new file mode 100644 index 00000000..dde80157 --- /dev/null +++ b/docs/enums/Backend_GameLogic_GameUIManager.GameUIManagerEvent.md @@ -0,0 +1,22 @@ +# Enumeration: GameUIManagerEvent + +[Backend/GameLogic/GameUIManager](../modules/Backend_GameLogic_GameUIManager.md).GameUIManagerEvent + +## Table of contents + +### Enumeration members + +- [InitializedPlayer](Backend_GameLogic_GameUIManager.GameUIManagerEvent.md#initializedplayer) +- [InitializedPlayerError](Backend_GameLogic_GameUIManager.GameUIManagerEvent.md#initializedplayererror) + +## Enumeration members + +### InitializedPlayer + +• **InitializedPlayer** = `"InitializedPlayer"` + +--- + +### InitializedPlayerError + +• **InitializedPlayerError** = `"InitializedPlayerError"` diff --git a/docs/enums/Backend_GameLogic_TutorialManager.TutorialManagerEvent.md b/docs/enums/Backend_GameLogic_TutorialManager.TutorialManagerEvent.md new file mode 100644 index 00000000..ae608e39 --- /dev/null +++ b/docs/enums/Backend_GameLogic_TutorialManager.TutorialManagerEvent.md @@ -0,0 +1,15 @@ +# Enumeration: TutorialManagerEvent + +[Backend/GameLogic/TutorialManager](../modules/Backend_GameLogic_TutorialManager.md).TutorialManagerEvent + +## Table of contents + +### Enumeration members + +- [StateChanged](Backend_GameLogic_TutorialManager.TutorialManagerEvent.md#statechanged) + +## Enumeration members + +### StateChanged + +• **StateChanged** = `"StateChanged"` diff --git a/docs/enums/Backend_GameLogic_TutorialManager.TutorialState.md b/docs/enums/Backend_GameLogic_TutorialManager.TutorialState.md new file mode 100644 index 00000000..48b35114 --- /dev/null +++ b/docs/enums/Backend_GameLogic_TutorialManager.TutorialState.md @@ -0,0 +1,92 @@ +# Enumeration: TutorialState + +[Backend/GameLogic/TutorialManager](../modules/Backend_GameLogic_TutorialManager.md).TutorialState + +## Table of contents + +### Enumeration members + +- [AlmostCompleted](Backend_GameLogic_TutorialManager.TutorialState.md#almostcompleted) +- [Completed](Backend_GameLogic_TutorialManager.TutorialState.md#completed) +- [Deselect](Backend_GameLogic_TutorialManager.TutorialState.md#deselect) +- [HomePlanet](Backend_GameLogic_TutorialManager.TutorialState.md#homeplanet) +- [HowToGetScore](Backend_GameLogic_TutorialManager.TutorialState.md#howtogetscore) +- [MinerMove](Backend_GameLogic_TutorialManager.TutorialState.md#minermove) +- [MinerPause](Backend_GameLogic_TutorialManager.TutorialState.md#minerpause) +- [None](Backend_GameLogic_TutorialManager.TutorialState.md#none) +- [SendFleet](Backend_GameLogic_TutorialManager.TutorialState.md#sendfleet) +- [Terminal](Backend_GameLogic_TutorialManager.TutorialState.md#terminal) +- [Valhalla](Backend_GameLogic_TutorialManager.TutorialState.md#valhalla) +- [ZoomOut](Backend_GameLogic_TutorialManager.TutorialState.md#zoomout) + +## Enumeration members + +### AlmostCompleted + +• **AlmostCompleted** = `10` + +--- + +### Completed + +• **Completed** = `11` + +--- + +### Deselect + +• **Deselect** = `3` + +--- + +### HomePlanet + +• **HomePlanet** = `1` + +--- + +### HowToGetScore + +• **HowToGetScore** = `8` + +--- + +### MinerMove + +• **MinerMove** = `5` + +--- + +### MinerPause + +• **MinerPause** = `6` + +--- + +### None + +• **None** = `0` + +--- + +### SendFleet + +• **SendFleet** = `2` + +--- + +### Terminal + +• **Terminal** = `7` + +--- + +### Valhalla + +• **Valhalla** = `9` + +--- + +### ZoomOut + +• **ZoomOut** = `4` diff --git a/docs/enums/backend_miner_minermanager.minermanagerevent.md b/docs/enums/Backend_Miner_MinerManager.MinerManagerEvent.md similarity index 50% rename from docs/enums/backend_miner_minermanager.minermanagerevent.md rename to docs/enums/Backend_Miner_MinerManager.MinerManagerEvent.md index 5391ece8..1883a47c 100644 --- a/docs/enums/backend_miner_minermanager.minermanagerevent.md +++ b/docs/enums/Backend_Miner_MinerManager.MinerManagerEvent.md @@ -1,15 +1,15 @@ # Enumeration: MinerManagerEvent -[Backend/Miner/MinerManager](../modules/backend_miner_minermanager.md).MinerManagerEvent +[Backend/Miner/MinerManager](../modules/Backend_Miner_MinerManager.md).MinerManagerEvent ## Table of contents ### Enumeration members -- [DiscoveredNewChunk](backend_miner_minermanager.minermanagerevent.md#discoverednewchunk) +- [DiscoveredNewChunk](Backend_Miner_MinerManager.MinerManagerEvent.md#discoverednewchunk) ## Enumeration members ### DiscoveredNewChunk -• **DiscoveredNewChunk**: = "DiscoveredNewChunk" +• **DiscoveredNewChunk** = `"DiscoveredNewChunk"` diff --git a/docs/enums/Backend_Miner_MiningPatterns.MiningPatternType.md b/docs/enums/Backend_Miner_MiningPatterns.MiningPatternType.md new file mode 100644 index 00000000..7c0c2dfd --- /dev/null +++ b/docs/enums/Backend_Miner_MiningPatterns.MiningPatternType.md @@ -0,0 +1,57 @@ +# Enumeration: MiningPatternType + +[Backend/Miner/MiningPatterns](../modules/Backend_Miner_MiningPatterns.md).MiningPatternType + +## Table of contents + +### Enumeration members + +- [Cone](Backend_Miner_MiningPatterns.MiningPatternType.md#cone) +- [ETH](Backend_Miner_MiningPatterns.MiningPatternType.md#eth) +- [Grid](Backend_Miner_MiningPatterns.MiningPatternType.md#grid) +- [Home](Backend_Miner_MiningPatterns.MiningPatternType.md#home) +- [Spiral](Backend_Miner_MiningPatterns.MiningPatternType.md#spiral) +- [SwissCheese](Backend_Miner_MiningPatterns.MiningPatternType.md#swisscheese) +- [Target](Backend_Miner_MiningPatterns.MiningPatternType.md#target) + +## Enumeration members + +### Cone + +• **Cone** = `3` + +--- + +### ETH + +• **ETH** = `5` + +--- + +### Grid + +• **Grid** = `4` + +--- + +### Home + +• **Home** = `0` + +--- + +### Spiral + +• **Spiral** = `2` + +--- + +### SwissCheese + +• **SwissCheese** = `6` + +--- + +### Target + +• **Target** = `1` diff --git a/docs/enums/Backend_Network_UtilityServerAPI.EmailResponse.md b/docs/enums/Backend_Network_UtilityServerAPI.EmailResponse.md new file mode 100644 index 00000000..b93c02a7 --- /dev/null +++ b/docs/enums/Backend_Network_UtilityServerAPI.EmailResponse.md @@ -0,0 +1,29 @@ +# Enumeration: EmailResponse + +[Backend/Network/UtilityServerAPI](../modules/Backend_Network_UtilityServerAPI.md).EmailResponse + +## Table of contents + +### Enumeration members + +- [Invalid](Backend_Network_UtilityServerAPI.EmailResponse.md#invalid) +- [ServerError](Backend_Network_UtilityServerAPI.EmailResponse.md#servererror) +- [Success](Backend_Network_UtilityServerAPI.EmailResponse.md#success) + +## Enumeration members + +### Invalid + +• **Invalid** = `1` + +--- + +### ServerError + +• **ServerError** = `2` + +--- + +### Success + +• **Success** = `0` diff --git a/docs/enums/Backend_Storage_ReaderDataStore.SinglePlanetDataStoreEvent.md b/docs/enums/Backend_Storage_ReaderDataStore.SinglePlanetDataStoreEvent.md new file mode 100644 index 00000000..5f43b187 --- /dev/null +++ b/docs/enums/Backend_Storage_ReaderDataStore.SinglePlanetDataStoreEvent.md @@ -0,0 +1,22 @@ +# Enumeration: SinglePlanetDataStoreEvent + +[Backend/Storage/ReaderDataStore](../modules/Backend_Storage_ReaderDataStore.md).SinglePlanetDataStoreEvent + +## Table of contents + +### Enumeration members + +- [REFRESHED_ARTIFACT](Backend_Storage_ReaderDataStore.SinglePlanetDataStoreEvent.md#refreshed_artifact) +- [REFRESHED_PLANET](Backend_Storage_ReaderDataStore.SinglePlanetDataStoreEvent.md#refreshed_planet) + +## Enumeration members + +### REFRESHED_ARTIFACT + +• **REFRESHED_ARTIFACT** = `"REFRESHED_ARTIFACT"` + +--- + +### REFRESHED_PLANET + +• **REFRESHED_PLANET** = `"REFRESHED_PLANET"` diff --git a/docs/enums/Frontend_Components_Email.EmailCTAMode.md b/docs/enums/Frontend_Components_Email.EmailCTAMode.md new file mode 100644 index 00000000..bb32b575 --- /dev/null +++ b/docs/enums/Frontend_Components_Email.EmailCTAMode.md @@ -0,0 +1,22 @@ +# Enumeration: EmailCTAMode + +[Frontend/Components/Email](../modules/Frontend_Components_Email.md).EmailCTAMode + +## Table of contents + +### Enumeration members + +- [SUBSCRIBE](Frontend_Components_Email.EmailCTAMode.md#subscribe) +- [UNSUBSCRIBE](Frontend_Components_Email.EmailCTAMode.md#unsubscribe) + +## Enumeration members + +### SUBSCRIBE + +• **SUBSCRIBE** = `0` + +--- + +### UNSUBSCRIBE + +• **UNSUBSCRIBE** = `1` diff --git a/docs/enums/Frontend_Game_NotificationManager.NotificationManagerEvent.md b/docs/enums/Frontend_Game_NotificationManager.NotificationManagerEvent.md new file mode 100644 index 00000000..edaaee0e --- /dev/null +++ b/docs/enums/Frontend_Game_NotificationManager.NotificationManagerEvent.md @@ -0,0 +1,15 @@ +# Enumeration: NotificationManagerEvent + +[Frontend/Game/NotificationManager](../modules/Frontend_Game_NotificationManager.md).NotificationManagerEvent + +## Table of contents + +### Enumeration members + +- [Notify](Frontend_Game_NotificationManager.NotificationManagerEvent.md#notify) + +## Enumeration members + +### Notify + +• **Notify** = `"Notify"` diff --git a/docs/enums/Frontend_Game_NotificationManager.NotificationType.md b/docs/enums/Frontend_Game_NotificationManager.NotificationType.md new file mode 100644 index 00000000..62a16fcd --- /dev/null +++ b/docs/enums/Frontend_Game_NotificationManager.NotificationType.md @@ -0,0 +1,225 @@ +# Enumeration: NotificationType + +[Frontend/Game/NotificationManager](../modules/Frontend_Game_NotificationManager.md).NotificationType + +## Table of contents + +### Enumeration members + +- [ArtifactFound](Frontend_Game_NotificationManager.NotificationType.md#artifactfound) +- [ArtifactProspected](Frontend_Game_NotificationManager.NotificationType.md#artifactprospected) +- [BalanceEmpty](Frontend_Game_NotificationManager.NotificationType.md#balanceempty) +- [CanUpgrade](Frontend_Game_NotificationManager.NotificationType.md#canupgrade) +- [FoundBiome](Frontend_Game_NotificationManager.NotificationType.md#foundbiome) +- [FoundBiomeCorrupted](Frontend_Game_NotificationManager.NotificationType.md#foundbiomecorrupted) +- [FoundBiomeDesert](Frontend_Game_NotificationManager.NotificationType.md#foundbiomedesert) +- [FoundBiomeForest](Frontend_Game_NotificationManager.NotificationType.md#foundbiomeforest) +- [FoundBiomeGrassland](Frontend_Game_NotificationManager.NotificationType.md#foundbiomegrassland) +- [FoundBiomeIce](Frontend_Game_NotificationManager.NotificationType.md#foundbiomeice) +- [FoundBiomeLava](Frontend_Game_NotificationManager.NotificationType.md#foundbiomelava) +- [FoundBiomeOcean](Frontend_Game_NotificationManager.NotificationType.md#foundbiomeocean) +- [FoundBiomeSwamp](Frontend_Game_NotificationManager.NotificationType.md#foundbiomeswamp) +- [FoundBiomeTundra](Frontend_Game_NotificationManager.NotificationType.md#foundbiometundra) +- [FoundBiomeWasteland](Frontend_Game_NotificationManager.NotificationType.md#foundbiomewasteland) +- [FoundComet](Frontend_Game_NotificationManager.NotificationType.md#foundcomet) +- [FoundDeadSpace](Frontend_Game_NotificationManager.NotificationType.md#founddeadspace) +- [FoundDeepSpace](Frontend_Game_NotificationManager.NotificationType.md#founddeepspace) +- [FoundFoundry](Frontend_Game_NotificationManager.NotificationType.md#foundfoundry) +- [FoundPirates](Frontend_Game_NotificationManager.NotificationType.md#foundpirates) +- [FoundSilver](Frontend_Game_NotificationManager.NotificationType.md#foundsilver) +- [FoundSilverBank](Frontend_Game_NotificationManager.NotificationType.md#foundsilverbank) +- [FoundSpace](Frontend_Game_NotificationManager.NotificationType.md#foundspace) +- [FoundTradingPost](Frontend_Game_NotificationManager.NotificationType.md#foundtradingpost) +- [Generic](Frontend_Game_NotificationManager.NotificationType.md#generic) +- [PlanetAttacked](Frontend_Game_NotificationManager.NotificationType.md#planetattacked) +- [PlanetLost](Frontend_Game_NotificationManager.NotificationType.md#planetlost) +- [PlanetWon](Frontend_Game_NotificationManager.NotificationType.md#planetwon) +- [ReceivedPlanet](Frontend_Game_NotificationManager.NotificationType.md#receivedplanet) +- [Tx](Frontend_Game_NotificationManager.NotificationType.md#tx) +- [WelcomePlayer](Frontend_Game_NotificationManager.NotificationType.md#welcomeplayer) + +## Enumeration members + +### ArtifactFound + +• **ArtifactFound** = `28` + +--- + +### ArtifactProspected + +• **ArtifactProspected** = `27` + +--- + +### BalanceEmpty + +• **BalanceEmpty** = `2` + +--- + +### CanUpgrade + +• **CanUpgrade** = `1` + +--- + +### FoundBiome + +• **FoundBiome** = `13` + +--- + +### FoundBiomeCorrupted + +• **FoundBiomeCorrupted** = `23` + +--- + +### FoundBiomeDesert + +• **FoundBiomeDesert** = `19` + +--- + +### FoundBiomeForest + +• **FoundBiomeForest** = `15` + +--- + +### FoundBiomeGrassland + +• **FoundBiomeGrassland** = `16` + +--- + +### FoundBiomeIce + +• **FoundBiomeIce** = `20` + +--- + +### FoundBiomeLava + +• **FoundBiomeLava** = `22` + +--- + +### FoundBiomeOcean + +• **FoundBiomeOcean** = `14` + +--- + +### FoundBiomeSwamp + +• **FoundBiomeSwamp** = `18` + +--- + +### FoundBiomeTundra + +• **FoundBiomeTundra** = `17` + +--- + +### FoundBiomeWasteland + +• **FoundBiomeWasteland** = `21` + +--- + +### FoundComet + +• **FoundComet** = `11` + +--- + +### FoundDeadSpace + +• **FoundDeadSpace** = `6` + +--- + +### FoundDeepSpace + +• **FoundDeepSpace** = `5` + +--- + +### FoundFoundry + +• **FoundFoundry** = `12` + +--- + +### FoundPirates + +• **FoundPirates** = `7` + +--- + +### FoundSilver + +• **FoundSilver** = `8` + +--- + +### FoundSilverBank + +• **FoundSilverBank** = `9` + +--- + +### FoundSpace + +• **FoundSpace** = `4` + +--- + +### FoundTradingPost + +• **FoundTradingPost** = `10` + +--- + +### Generic + +• **Generic** = `30` + +--- + +### PlanetAttacked + +• **PlanetAttacked** = `26` + +--- + +### PlanetLost + +• **PlanetLost** = `24` + +--- + +### PlanetWon + +• **PlanetWon** = `25` + +--- + +### ReceivedPlanet + +• **ReceivedPlanet** = `29` + +--- + +### Tx + +• **Tx** = `0` + +--- + +### WelcomePlayer + +• **WelcomePlayer** = `3` diff --git a/docs/enums/Frontend_Game_WindowManager.CursorState.md b/docs/enums/Frontend_Game_WindowManager.CursorState.md new file mode 100644 index 00000000..530e2728 --- /dev/null +++ b/docs/enums/Frontend_Game_WindowManager.CursorState.md @@ -0,0 +1,29 @@ +# Enumeration: CursorState + +[Frontend/Game/WindowManager](../modules/Frontend_Game_WindowManager.md).CursorState + +## Table of contents + +### Enumeration members + +- [Normal](Frontend_Game_WindowManager.CursorState.md#normal) +- [TargetingExplorer](Frontend_Game_WindowManager.CursorState.md#targetingexplorer) +- [TargetingForces](Frontend_Game_WindowManager.CursorState.md#targetingforces) + +## Enumeration members + +### Normal + +• **Normal** = `0` + +--- + +### TargetingExplorer + +• **TargetingExplorer** = `1` + +--- + +### TargetingForces + +• **TargetingForces** = `2` diff --git a/docs/enums/Frontend_Game_WindowManager.TooltipName.md b/docs/enums/Frontend_Game_WindowManager.TooltipName.md new file mode 100644 index 00000000..ee0197d1 --- /dev/null +++ b/docs/enums/Frontend_Game_WindowManager.TooltipName.md @@ -0,0 +1,358 @@ +# Enumeration: TooltipName + +[Frontend/Game/WindowManager](../modules/Frontend_Game_WindowManager.md).TooltipName + +## Table of contents + +### Enumeration members + +- [ArtifactBuff](Frontend_Game_WindowManager.TooltipName.md#artifactbuff) +- [ArtifactStored](Frontend_Game_WindowManager.TooltipName.md#artifactstored) +- [Bonus](Frontend_Game_WindowManager.TooltipName.md#bonus) +- [BonusDefense](Frontend_Game_WindowManager.TooltipName.md#bonusdefense) +- [BonusEnergyCap](Frontend_Game_WindowManager.TooltipName.md#bonusenergycap) +- [BonusEnergyGro](Frontend_Game_WindowManager.TooltipName.md#bonusenergygro) +- [BonusRange](Frontend_Game_WindowManager.TooltipName.md#bonusrange) +- [BonusSpeed](Frontend_Game_WindowManager.TooltipName.md#bonusspeed) +- [Clowntown](Frontend_Game_WindowManager.TooltipName.md#clowntown) +- [CurrentMining](Frontend_Game_WindowManager.TooltipName.md#currentmining) +- [Defense](Frontend_Game_WindowManager.TooltipName.md#defense) +- [Energy](Frontend_Game_WindowManager.TooltipName.md#energy) +- [EnergyGrowth](Frontend_Game_WindowManager.TooltipName.md#energygrowth) +- [FindArtifact](Frontend_Game_WindowManager.TooltipName.md#findartifact) +- [HashesPerSec](Frontend_Game_WindowManager.TooltipName.md#hashespersec) +- [HoverPlanet](Frontend_Game_WindowManager.TooltipName.md#hoverplanet) +- [MaxLevel](Frontend_Game_WindowManager.TooltipName.md#maxlevel) +- [MinEnergy](Frontend_Game_WindowManager.TooltipName.md#minenergy) +- [MiningPause](Frontend_Game_WindowManager.TooltipName.md#miningpause) +- [MiningTarget](Frontend_Game_WindowManager.TooltipName.md#miningtarget) +- [ModalFindArtifact](Frontend_Game_WindowManager.TooltipName.md#modalfindartifact) +- [ModalHats](Frontend_Game_WindowManager.TooltipName.md#modalhats) +- [ModalHelp](Frontend_Game_WindowManager.TooltipName.md#modalhelp) +- [ModalLeaderboard](Frontend_Game_WindowManager.TooltipName.md#modalleaderboard) +- [ModalPlanetDetails](Frontend_Game_WindowManager.TooltipName.md#modalplanetdetails) +- [ModalPlanetDex](Frontend_Game_WindowManager.TooltipName.md#modalplanetdex) +- [ModalPlugins](Frontend_Game_WindowManager.TooltipName.md#modalplugins) +- [ModalSettings](Frontend_Game_WindowManager.TooltipName.md#modalsettings) +- [ModalTwitterBroadcast](Frontend_Game_WindowManager.TooltipName.md#modaltwitterbroadcast) +- [ModalTwitterVerification](Frontend_Game_WindowManager.TooltipName.md#modaltwitterverification) +- [ModalUpgradeDetails](Frontend_Game_WindowManager.TooltipName.md#modalupgradedetails) +- [ModalWithdrawSilver](Frontend_Game_WindowManager.TooltipName.md#modalwithdrawsilver) +- [ModalYourArtifacts](Frontend_Game_WindowManager.TooltipName.md#modalyourartifacts) +- [None](Frontend_Game_WindowManager.TooltipName.md#none) +- [Pirates](Frontend_Game_WindowManager.TooltipName.md#pirates) +- [PlanetRank](Frontend_Game_WindowManager.TooltipName.md#planetrank) +- [Range](Frontend_Game_WindowManager.TooltipName.md#range) +- [Rank](Frontend_Game_WindowManager.TooltipName.md#rank) +- [Score](Frontend_Game_WindowManager.TooltipName.md#score) +- [SelectedEnergy](Frontend_Game_WindowManager.TooltipName.md#selectedenergy) +- [SelectedSilver](Frontend_Game_WindowManager.TooltipName.md#selectedsilver) +- [Silver](Frontend_Game_WindowManager.TooltipName.md#silver) +- [SilverCap](Frontend_Game_WindowManager.TooltipName.md#silvercap) +- [SilverGrowth](Frontend_Game_WindowManager.TooltipName.md#silvergrowth) +- [SilverProd](Frontend_Game_WindowManager.TooltipName.md#silverprod) +- [Speed](Frontend_Game_WindowManager.TooltipName.md#speed) +- [Time50](Frontend_Game_WindowManager.TooltipName.md#time50) +- [Time90](Frontend_Game_WindowManager.TooltipName.md#time90) +- [TwitterHandle](Frontend_Game_WindowManager.TooltipName.md#twitterhandle) +- [Upgrades](Frontend_Game_WindowManager.TooltipName.md#upgrades) + +## Enumeration members + +### ArtifactBuff + +• **ArtifactBuff** = `36` + +--- + +### ArtifactStored + +• **ArtifactStored** = `14` + +--- + +### Bonus + +• **Bonus** = `5` + +--- + +### BonusDefense + +• **BonusDefense** = `29` + +--- + +### BonusEnergyCap + +• **BonusEnergyCap** = `25` + +--- + +### BonusEnergyGro + +• **BonusEnergyGro** = `26` + +--- + +### BonusRange + +• **BonusRange** = `27` + +--- + +### BonusSpeed + +• **BonusSpeed** = `28` + +--- + +### Clowntown + +• **Clowntown** = `35` + +--- + +### CurrentMining + +• **CurrentMining** = `22` + +--- + +### Defense + +• **Defense** = `34` + +--- + +### Energy + +• **Energy** = `30` + +--- + +### EnergyGrowth + +• **EnergyGrowth** = `31` + +--- + +### FindArtifact + +• **FindArtifact** = `13` + +--- + +### HashesPerSec + +• **HashesPerSec** = `21` + +--- + +### HoverPlanet + +• **HoverPlanet** = `23` + +--- + +### MaxLevel + +• **MaxLevel** = `12` + +--- + +### MinEnergy + +• **MinEnergy** = `6` + +--- + +### MiningPause + +• **MiningPause** = `19` + +--- + +### MiningTarget + +• **MiningTarget** = `20` + +--- + +### ModalFindArtifact + +• **ModalFindArtifact** = `47` + +--- + +### ModalHats + +• **ModalHats** = `44` + +--- + +### ModalHelp + +• **ModalHelp** = `37` + +--- + +### ModalLeaderboard + +• **ModalLeaderboard** = `39` + +--- + +### ModalPlanetDetails + +• **ModalPlanetDetails** = `38` + +--- + +### ModalPlanetDex + +• **ModalPlanetDex** = `40` + +--- + +### ModalPlugins + +• **ModalPlugins** = `48` + +--- + +### ModalSettings + +• **ModalSettings** = `45` + +--- + +### ModalTwitterBroadcast + +• **ModalTwitterBroadcast** = `43` + +--- + +### ModalTwitterVerification + +• **ModalTwitterVerification** = `42` + +--- + +### ModalUpgradeDetails + +• **ModalUpgradeDetails** = `41` + +--- + +### ModalWithdrawSilver + +• **ModalWithdrawSilver** = `49` + +--- + +### ModalYourArtifacts + +• **ModalYourArtifacts** = `46` + +--- + +### None + +• **None** = `0` + +--- + +### Pirates + +• **Pirates** = `9` + +--- + +### PlanetRank + +• **PlanetRank** = `11` + +--- + +### Range + +• **Range** = `32` + +--- + +### Rank + +• **Rank** = `17` + +--- + +### Score + +• **Score** = `18` + +--- + +### SelectedEnergy + +• **SelectedEnergy** = `16` + +--- + +### SelectedSilver + +• **SelectedSilver** = `15` + +--- + +### Silver + +• **Silver** = `3` + +--- + +### SilverCap + +• **SilverCap** = `2` + +--- + +### SilverGrowth + +• **SilverGrowth** = `1` + +--- + +### SilverProd + +• **SilverProd** = `24` + +--- + +### Speed + +• **Speed** = `33` + +--- + +### Time50 + +• **Time50** = `7` + +--- + +### Time90 + +• **Time90** = `8` + +--- + +### TwitterHandle + +• **TwitterHandle** = `4` + +--- + +### Upgrades + +• **Upgrades** = `10` diff --git a/docs/enums/Frontend_Game_WindowManager.WindowManagerEvent.md b/docs/enums/Frontend_Game_WindowManager.WindowManagerEvent.md new file mode 100644 index 00000000..c3fdd74c --- /dev/null +++ b/docs/enums/Frontend_Game_WindowManager.WindowManagerEvent.md @@ -0,0 +1,43 @@ +# Enumeration: WindowManagerEvent + +[Frontend/Game/WindowManager](../modules/Frontend_Game_WindowManager.md).WindowManagerEvent + +## Table of contents + +### Enumeration members + +- [CtrlDown](Frontend_Game_WindowManager.WindowManagerEvent.md#ctrldown) +- [CtrlUp](Frontend_Game_WindowManager.WindowManagerEvent.md#ctrlup) +- [MiningCoordsUpdate](Frontend_Game_WindowManager.WindowManagerEvent.md#miningcoordsupdate) +- [StateChanged](Frontend_Game_WindowManager.WindowManagerEvent.md#statechanged) +- [TooltipUpdated](Frontend_Game_WindowManager.WindowManagerEvent.md#tooltipupdated) + +## Enumeration members + +### CtrlDown + +• **CtrlDown** = `"CtrlDown"` + +--- + +### CtrlUp + +• **CtrlUp** = `"CtrlUp"` + +--- + +### MiningCoordsUpdate + +• **MiningCoordsUpdate** = `"MiningCoordsUpdate"` + +--- + +### StateChanged + +• **StateChanged** = `"StateChanged"` + +--- + +### TooltipUpdated + +• **TooltipUpdated** = `"TooltipUpdated"` diff --git a/docs/enums/Frontend_Pages_GameLandingPage.InitRenderState.md b/docs/enums/Frontend_Pages_GameLandingPage.InitRenderState.md new file mode 100644 index 00000000..f5e32f92 --- /dev/null +++ b/docs/enums/Frontend_Pages_GameLandingPage.InitRenderState.md @@ -0,0 +1,29 @@ +# Enumeration: InitRenderState + +[Frontend/Pages/GameLandingPage](../modules/Frontend_Pages_GameLandingPage.md).InitRenderState + +## Table of contents + +### Enumeration members + +- [COMPLETE](Frontend_Pages_GameLandingPage.InitRenderState.md#complete) +- [LOADING](Frontend_Pages_GameLandingPage.InitRenderState.md#loading) +- [NONE](Frontend_Pages_GameLandingPage.InitRenderState.md#none) + +## Enumeration members + +### COMPLETE + +• **COMPLETE** = `2` + +--- + +### LOADING + +• **LOADING** = `1` + +--- + +### NONE + +• **NONE** = `0` diff --git a/docs/enums/Frontend_Pages_LandingPage.LandingPageZIndex.md b/docs/enums/Frontend_Pages_LandingPage.LandingPageZIndex.md new file mode 100644 index 00000000..27c18d77 --- /dev/null +++ b/docs/enums/Frontend_Pages_LandingPage.LandingPageZIndex.md @@ -0,0 +1,29 @@ +# Enumeration: LandingPageZIndex + +[Frontend/Pages/LandingPage](../modules/Frontend_Pages_LandingPage.md).LandingPageZIndex + +## Table of contents + +### Enumeration members + +- [Background](Frontend_Pages_LandingPage.LandingPageZIndex.md#background) +- [BasePage](Frontend_Pages_LandingPage.LandingPageZIndex.md#basepage) +- [Canvas](Frontend_Pages_LandingPage.LandingPageZIndex.md#canvas) + +## Enumeration members + +### Background + +• **Background** = `0` + +--- + +### BasePage + +• **BasePage** = `2` + +--- + +### Canvas + +• **Canvas** = `1` diff --git a/docs/enums/Frontend_Pages_UnsubscribePage.LandingPageZIndex.md b/docs/enums/Frontend_Pages_UnsubscribePage.LandingPageZIndex.md new file mode 100644 index 00000000..a2781953 --- /dev/null +++ b/docs/enums/Frontend_Pages_UnsubscribePage.LandingPageZIndex.md @@ -0,0 +1,29 @@ +# Enumeration: LandingPageZIndex + +[Frontend/Pages/UnsubscribePage](../modules/Frontend_Pages_UnsubscribePage.md).LandingPageZIndex + +## Table of contents + +### Enumeration members + +- [Background](Frontend_Pages_UnsubscribePage.LandingPageZIndex.md#background) +- [BasePage](Frontend_Pages_UnsubscribePage.LandingPageZIndex.md#basepage) +- [Canvas](Frontend_Pages_UnsubscribePage.LandingPageZIndex.md#canvas) + +## Enumeration members + +### Background + +• **Background** = `0` + +--- + +### BasePage + +• **BasePage** = `2` + +--- + +### Canvas + +• **Canvas** = `1` diff --git a/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md new file mode 100644 index 00000000..7a06119d --- /dev/null +++ b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md @@ -0,0 +1,22 @@ +# Enumeration: AttribType + +[Frontend/Renderers/GameRenderer/EngineTypes](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md).AttribType + +## Table of contents + +### Enumeration members + +- [Float](Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md#float) +- [UByte](Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md#ubyte) + +## Enumeration members + +### Float + +• **Float** + +--- + +### UByte + +• **UByte** diff --git a/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md new file mode 100644 index 00000000..30d2ee69 --- /dev/null +++ b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md @@ -0,0 +1,29 @@ +# Enumeration: DrawMode + +[Frontend/Renderers/GameRenderer/EngineTypes](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md).DrawMode + +## Table of contents + +### Enumeration members + +- [Lines](Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md#lines) +- [Points](Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md#points) +- [Triangles](Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md#triangles) + +## Enumeration members + +### Lines + +• **Lines** + +--- + +### Points + +• **Points** + +--- + +### Triangles + +• **Triangles** diff --git a/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md new file mode 100644 index 00000000..47b15e81 --- /dev/null +++ b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md @@ -0,0 +1,57 @@ +# Enumeration: RenderZIndex + +[Frontend/Renderers/GameRenderer/EngineTypes](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md).RenderZIndex + +## Table of contents + +### Enumeration members + +- [Background](Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md#background) +- [DEFAULT](Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md#default) +- [MAX](Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md#max) +- [Planets](Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md#planets) +- [Text](Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md#text) +- [UI](Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md#ui) +- [Voyages](Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md#voyages) + +## Enumeration members + +### Background + +• **Background** = `0` + +--- + +### DEFAULT + +• **DEFAULT** = `-98` + +--- + +### MAX + +• **MAX** = `-99` + +--- + +### Planets + +• **Planets** = `-10` + +--- + +### Text + +• **Text** = `-11` + +--- + +### UI + +• **UI** = `-12` + +--- + +### Voyages + +• **Voyages** = `-1` diff --git a/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md new file mode 100644 index 00000000..3c50d945 --- /dev/null +++ b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md @@ -0,0 +1,29 @@ +# Enumeration: TextAlign + +[Frontend/Renderers/GameRenderer/EngineTypes](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md).TextAlign + +## Table of contents + +### Enumeration members + +- [Center](Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md#center) +- [Left](Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md#left) +- [Right](Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md#right) + +## Enumeration members + +### Center + +• **Center** = `0.5` + +--- + +### Left + +• **Left** = `0` + +--- + +### Right + +• **Right** = `1` diff --git a/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAnchor.md b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAnchor.md new file mode 100644 index 00000000..b930a828 --- /dev/null +++ b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAnchor.md @@ -0,0 +1,29 @@ +# Enumeration: TextAnchor + +[Frontend/Renderers/GameRenderer/EngineTypes](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md).TextAnchor + +## Table of contents + +### Enumeration members + +- [Bottom](Frontend_Renderers_GameRenderer_EngineTypes.TextAnchor.md#bottom) +- [Middle](Frontend_Renderers_GameRenderer_EngineTypes.TextAnchor.md#middle) +- [Top](Frontend_Renderers_GameRenderer_EngineTypes.TextAnchor.md#top) + +## Enumeration members + +### Bottom + +• **Bottom** = `1` + +--- + +### Middle + +• **Middle** = `0.5` + +--- + +### Top + +• **Top** = `0` diff --git a/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md new file mode 100644 index 00000000..ad70f662 --- /dev/null +++ b/docs/enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md @@ -0,0 +1,50 @@ +# Enumeration: UniformType + +[Frontend/Renderers/GameRenderer/EngineTypes](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md).UniformType + +## Table of contents + +### Enumeration members + +- [Float](Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md#float) +- [Mat3](Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md#mat3) +- [Mat4](Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md#mat4) +- [Texture](Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md#texture) +- [UByte](Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md#ubyte) +- [Vec3](Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md#vec3) + +## Enumeration members + +### Float + +• **Float** = `3` + +--- + +### Mat3 + +• **Mat3** = `1` + +--- + +### Mat4 + +• **Mat4** = `0` + +--- + +### Texture + +• **Texture** = `4` + +--- + +### UByte + +• **UByte** = `2` + +--- + +### Vec3 + +• **Vec3** = `5` diff --git a/docs/enums/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.PerlinOctave.md b/docs/enums/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.PerlinOctave.md new file mode 100644 index 00000000..73cfee50 --- /dev/null +++ b/docs/enums/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.PerlinOctave.md @@ -0,0 +1,29 @@ +# Enumeration: PerlinOctave + +[Frontend/Renderers/GameRenderer/Entities/PerlinUtils](../modules/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md).PerlinOctave + +## Table of contents + +### Enumeration members + +- [\_0](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.PerlinOctave.md#_0) +- [\_1](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.PerlinOctave.md#_1) +- [\_2](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.PerlinOctave.md#_2) + +## Enumeration members + +### \_0 + +• **\_0** = `0` + +--- + +### \_1 + +• **\_1** = `1` + +--- + +### \_2 + +• **\_2** = `2` diff --git a/docs/enums/Frontend_Utils_BrowserChecks.Incompatibility.md b/docs/enums/Frontend_Utils_BrowserChecks.Incompatibility.md new file mode 100644 index 00000000..e510b0ec --- /dev/null +++ b/docs/enums/Frontend_Utils_BrowserChecks.Incompatibility.md @@ -0,0 +1,50 @@ +# Enumeration: Incompatibility + +[Frontend/Utils/BrowserChecks](../modules/Frontend_Utils_BrowserChecks.md).Incompatibility + +## Table of contents + +### Enumeration members + +- [MobileOrTablet](Frontend_Utils_BrowserChecks.Incompatibility.md#mobileortablet) +- [NoIDB](Frontend_Utils_BrowserChecks.Incompatibility.md#noidb) +- [NotLoggedInOrEnabled](Frontend_Utils_BrowserChecks.Incompatibility.md#notloggedinorenabled) +- [NotRopsten](Frontend_Utils_BrowserChecks.Incompatibility.md#notropsten) +- [UnexpectedError](Frontend_Utils_BrowserChecks.Incompatibility.md#unexpectederror) +- [UnsupportedBrowser](Frontend_Utils_BrowserChecks.Incompatibility.md#unsupportedbrowser) + +## Enumeration members + +### MobileOrTablet + +• **MobileOrTablet** = `"mobile_or_tablet"` + +--- + +### NoIDB + +• **NoIDB** = `"no_idb"` + +--- + +### NotLoggedInOrEnabled + +• **NotLoggedInOrEnabled** = `"not_logged_in_or_enabled"` + +--- + +### NotRopsten + +• **NotRopsten** = `"not_ropsten"` + +--- + +### UnexpectedError + +• **UnexpectedError** = `"unexpected_error"` + +--- + +### UnsupportedBrowser + +• **UnsupportedBrowser** = `"unsupported_browser"` diff --git a/docs/enums/Frontend_Utils_Hats.HatType.md b/docs/enums/Frontend_Utils_Hats.HatType.md new file mode 100644 index 00000000..38e5bd7b --- /dev/null +++ b/docs/enums/Frontend_Utils_Hats.HatType.md @@ -0,0 +1,78 @@ +# Enumeration: HatType + +[Frontend/Utils/Hats](../modules/Frontend_Utils_Hats.md).HatType + +## Table of contents + +### Enumeration members + +- [ChefHat](Frontend_Utils_Hats.HatType.md#chefhat) +- [CowboyHat](Frontend_Utils_Hats.HatType.md#cowboyhat) +- [Fez](Frontend_Utils_Hats.HatType.md#fez) +- [Fish](Frontend_Utils_Hats.HatType.md#fish) +- [GraduationCap](Frontend_Utils_Hats.HatType.md#graduationcap) +- [PartyHat](Frontend_Utils_Hats.HatType.md#partyhat) +- [PopeHat](Frontend_Utils_Hats.HatType.md#popehat) +- [SantaHat](Frontend_Utils_Hats.HatType.md#santahat) +- [Squid](Frontend_Utils_Hats.HatType.md#squid) +- [TopHat](Frontend_Utils_Hats.HatType.md#tophat) + +## Enumeration members + +### ChefHat + +• **ChefHat** = `"ChefHat"` + +--- + +### CowboyHat + +• **CowboyHat** = `"CowboyHat"` + +--- + +### Fez + +• **Fez** = `"Fez"` + +--- + +### Fish + +• **Fish** = `"Fish"` + +--- + +### GraduationCap + +• **GraduationCap** = `"GraduationCap"` + +--- + +### PartyHat + +• **PartyHat** = `"PartyHat"` + +--- + +### PopeHat + +• **PopeHat** = `"PopeHat"` + +--- + +### SantaHat + +• **SantaHat** = `"SantaHat"` + +--- + +### Squid + +• **Squid** = `"Squid"` + +--- + +### TopHat + +• **TopHat** = `"TopHat"` diff --git a/docs/enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md b/docs/enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md new file mode 100644 index 00000000..781ed446 --- /dev/null +++ b/docs/enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md @@ -0,0 +1,29 @@ +# Enumeration: AutoGasSetting + +[Frontend/Utils/SettingsHooks](../modules/Frontend_Utils_SettingsHooks.md).AutoGasSetting + +## Table of contents + +### Enumeration members + +- [Average](Frontend_Utils_SettingsHooks.AutoGasSetting.md#average) +- [Fast](Frontend_Utils_SettingsHooks.AutoGasSetting.md#fast) +- [Slow](Frontend_Utils_SettingsHooks.AutoGasSetting.md#slow) + +## Enumeration members + +### Average + +• **Average** = `"Average"` + +--- + +### Fast + +• **Fast** = `"Fast"` + +--- + +### Slow + +• **Slow** = `"Slow"` diff --git a/docs/enums/Frontend_Utils_SettingsHooks.Setting.md b/docs/enums/Frontend_Utils_SettingsHooks.Setting.md new file mode 100644 index 00000000..216be6e4 --- /dev/null +++ b/docs/enums/Frontend_Utils_SettingsHooks.Setting.md @@ -0,0 +1,151 @@ +# Enumeration: Setting + +[Frontend/Utils/SettingsHooks](../modules/Frontend_Utils_SettingsHooks.md).Setting + +Each setting has a unique identifier. Each account gets to store its own local storage setting, +per instance of the dark forest contract that it's connected to. + +## Table of contents + +### Enumeration members + +- [AutoApproveNonPurchaseTransactions](Frontend_Utils_SettingsHooks.Setting.md#autoapprovenonpurchasetransactions) +- [DrawChunkBorders](Frontend_Utils_SettingsHooks.Setting.md#drawchunkborders) +- [FoundArtifact](Frontend_Utils_SettingsHooks.Setting.md#foundartifact) +- [FoundComet](Frontend_Utils_SettingsHooks.Setting.md#foundcomet) +- [FoundDeepSpace](Frontend_Utils_SettingsHooks.Setting.md#founddeepspace) +- [FoundPirates](Frontend_Utils_SettingsHooks.Setting.md#foundpirates) +- [FoundSilver](Frontend_Utils_SettingsHooks.Setting.md#foundsilver) +- [FoundSilverBank](Frontend_Utils_SettingsHooks.Setting.md#foundsilverbank) +- [FoundSpace](Frontend_Utils_SettingsHooks.Setting.md#foundspace) +- [FoundTradingPost](Frontend_Utils_SettingsHooks.Setting.md#foundtradingpost) +- [GasFeeGwei](Frontend_Utils_SettingsHooks.Setting.md#gasfeegwei) +- [HasAcceptedPluginRisk](Frontend_Utils_SettingsHooks.Setting.md#hasacceptedpluginrisk) +- [HighPerformanceRendering](Frontend_Utils_SettingsHooks.Setting.md#highperformancerendering) +- [MiningCores](Frontend_Utils_SettingsHooks.Setting.md#miningcores) +- [MoveNotifications](Frontend_Utils_SettingsHooks.Setting.md#movenotifications) +- [NewPlayer](Frontend_Utils_SettingsHooks.Setting.md#newplayer) +- [OptOutMetrics](Frontend_Utils_SettingsHooks.Setting.md#optoutmetrics) +- [TerminalVisible](Frontend_Utils_SettingsHooks.Setting.md#terminalvisible) +- [TutorialCompleted](Frontend_Utils_SettingsHooks.Setting.md#tutorialcompleted) +- [TutorialOpen](Frontend_Utils_SettingsHooks.Setting.md#tutorialopen) + +## Enumeration members + +### AutoApproveNonPurchaseTransactions + +• **AutoApproveNonPurchaseTransactions** = `"AutoApproveNonPurchaseTransactions"` + +--- + +### DrawChunkBorders + +• **DrawChunkBorders** = `"DrawChunkBorders"` + +--- + +### FoundArtifact + +• **FoundArtifact** = `"FoundArtifact"` + +--- + +### FoundComet + +• **FoundComet** = `"FoundComet"` + +--- + +### FoundDeepSpace + +• **FoundDeepSpace** = `"FoundDeepSpace"` + +--- + +### FoundPirates + +• **FoundPirates** = `"FoundPirates"` + +--- + +### FoundSilver + +• **FoundSilver** = `"FoundSilver"` + +--- + +### FoundSilverBank + +• **FoundSilverBank** = `"FoundSilverBank"` + +--- + +### FoundSpace + +• **FoundSpace** = `"FoundSpace"` + +--- + +### FoundTradingPost + +• **FoundTradingPost** = `"FoundTradingPost"` + +--- + +### GasFeeGwei + +• **GasFeeGwei** = `"GasFeeGwei"` + +--- + +### HasAcceptedPluginRisk + +• **HasAcceptedPluginRisk** = `"HasAcceptedPluginRisk"` + +--- + +### HighPerformanceRendering + +• **HighPerformanceRendering** = `"HighPerformanceRendering"` + +--- + +### MiningCores + +• **MiningCores** = `"MiningCores"` + +--- + +### MoveNotifications + +• **MoveNotifications** = `"MoveNotifications"` + +--- + +### NewPlayer + +• **NewPlayer** = `"NewPlayer"` + +--- + +### OptOutMetrics + +• **OptOutMetrics** = `"OptOutMetrics"` + +--- + +### TerminalVisible + +• **TerminalVisible** = `"TerminalVisible"` + +--- + +### TutorialCompleted + +• **TutorialCompleted** = `"TutorialCompleted"` + +--- + +### TutorialOpen + +• **TutorialOpen** = `"TutorialOpen"` diff --git a/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md b/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md new file mode 100644 index 00000000..de165a96 --- /dev/null +++ b/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md @@ -0,0 +1,71 @@ +# Enumeration: TerminalTextStyle + +[Frontend/Utils/TerminalTypes](../modules/Frontend_Utils_TerminalTypes.md).TerminalTextStyle + +## Table of contents + +### Enumeration members + +- [Blue](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#blue) +- [Default](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#default) +- [Green](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#green) +- [Hoverable](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#hoverable) +- [Invisible](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#invisible) +- [Red](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#red) +- [Sub](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#sub) +- [Underline](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#underline) +- [White](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#white) + +## Enumeration members + +### Blue + +• **Blue** = `4` + +--- + +### Default + +• **Default** = `6` + +--- + +### Green + +• **Green** = `0` + +--- + +### Hoverable + +• **Hoverable** = `8` + +--- + +### Invisible + +• **Invisible** = `5` + +--- + +### Red + +• **Red** = `3` + +--- + +### Sub + +• **Sub** = `1` + +--- + +### Underline + +• **Underline** = `7` + +--- + +### White + +• **White** = `2` diff --git a/docs/enums/Frontend_Utils_UIEmitter.UIEmitterEvent.md b/docs/enums/Frontend_Utils_UIEmitter.UIEmitterEvent.md new file mode 100644 index 00000000..cdd1402c --- /dev/null +++ b/docs/enums/Frontend_Utils_UIEmitter.UIEmitterEvent.md @@ -0,0 +1,169 @@ +# Enumeration: UIEmitterEvent + +[Frontend/Utils/UIEmitter](../modules/Frontend_Utils_UIEmitter.md).UIEmitterEvent + +## Table of contents + +### Enumeration members + +- [CanvasMouseDown](Frontend_Utils_UIEmitter.UIEmitterEvent.md#canvasmousedown) +- [CanvasMouseMove](Frontend_Utils_UIEmitter.UIEmitterEvent.md#canvasmousemove) +- [CanvasMouseOut](Frontend_Utils_UIEmitter.UIEmitterEvent.md#canvasmouseout) +- [CanvasMouseUp](Frontend_Utils_UIEmitter.UIEmitterEvent.md#canvasmouseup) +- [CanvasScroll](Frontend_Utils_UIEmitter.UIEmitterEvent.md#canvasscroll) +- [CenterPlanet](Frontend_Utils_UIEmitter.UIEmitterEvent.md#centerplanet) +- [DepositArtifact](Frontend_Utils_UIEmitter.UIEmitterEvent.md#depositartifact) +- [DepositToPlanet](Frontend_Utils_UIEmitter.UIEmitterEvent.md#deposittoplanet) +- [GamePlanetSelected](Frontend_Utils_UIEmitter.UIEmitterEvent.md#gameplanetselected) +- [SelectArtifact](Frontend_Utils_UIEmitter.UIEmitterEvent.md#selectartifact) +- [SendCancelled](Frontend_Utils_UIEmitter.UIEmitterEvent.md#sendcancelled) +- [SendCompleted](Frontend_Utils_UIEmitter.UIEmitterEvent.md#sendcompleted) +- [SendInitiated](Frontend_Utils_UIEmitter.UIEmitterEvent.md#sendinitiated) +- [ShowArtifact](Frontend_Utils_UIEmitter.UIEmitterEvent.md#showartifact) +- [UIChange](Frontend_Utils_UIEmitter.UIEmitterEvent.md#uichange) +- [WindowResize](Frontend_Utils_UIEmitter.UIEmitterEvent.md#windowresize) +- [WorldMouseClick](Frontend_Utils_UIEmitter.UIEmitterEvent.md#worldmouseclick) +- [WorldMouseDown](Frontend_Utils_UIEmitter.UIEmitterEvent.md#worldmousedown) +- [WorldMouseMove](Frontend_Utils_UIEmitter.UIEmitterEvent.md#worldmousemove) +- [WorldMouseOut](Frontend_Utils_UIEmitter.UIEmitterEvent.md#worldmouseout) +- [WorldMouseUp](Frontend_Utils_UIEmitter.UIEmitterEvent.md#worldmouseup) +- [ZoomIn](Frontend_Utils_UIEmitter.UIEmitterEvent.md#zoomin) +- [ZoomOut](Frontend_Utils_UIEmitter.UIEmitterEvent.md#zoomout) + +## Enumeration members + +### CanvasMouseDown + +• **CanvasMouseDown** = `"CanvasMouseDown"` + +--- + +### CanvasMouseMove + +• **CanvasMouseMove** = `"CanvasMouseMove"` + +--- + +### CanvasMouseOut + +• **CanvasMouseOut** = `"CanvasMouseOut"` + +--- + +### CanvasMouseUp + +• **CanvasMouseUp** = `"CanvasMouseUp"` + +--- + +### CanvasScroll + +• **CanvasScroll** = `"CanvasScroll"` + +--- + +### CenterPlanet + +• **CenterPlanet** = `"CenterPlanet"` + +--- + +### DepositArtifact + +• **DepositArtifact** = `"DepositArtifact"` + +--- + +### DepositToPlanet + +• **DepositToPlanet** = `"DepositToPlanet"` + +--- + +### GamePlanetSelected + +• **GamePlanetSelected** = `"GamePlanetSelected"` + +--- + +### SelectArtifact + +• **SelectArtifact** = `"SelectArtifact"` + +--- + +### SendCancelled + +• **SendCancelled** = `"SendCancelled"` + +--- + +### SendCompleted + +• **SendCompleted** = `"SendCompleted"` + +--- + +### SendInitiated + +• **SendInitiated** = `"SendInitiated"` + +--- + +### ShowArtifact + +• **ShowArtifact** = `"ShowArtifact"` + +--- + +### UIChange + +• **UIChange** = `"UIChange"` + +--- + +### WindowResize + +• **WindowResize** = `"WindowResize"` + +--- + +### WorldMouseClick + +• **WorldMouseClick** = `"WorldMouseClick"` + +--- + +### WorldMouseDown + +• **WorldMouseDown** = `"WorldMouseDown"` + +--- + +### WorldMouseMove + +• **WorldMouseMove** = `"WorldMouseMove"` + +--- + +### WorldMouseOut + +• **WorldMouseOut** = `"WorldMouseOut"` + +--- + +### WorldMouseUp + +• **WorldMouseUp** = `"WorldMouseUp"` + +--- + +### ZoomIn + +• **ZoomIn** = `"ZoomIn"` + +--- + +### ZoomOut + +• **ZoomOut** = `"ZoomOut"` diff --git a/docs/enums/Frontend_Utils_constants.GameWindowZIndex.md b/docs/enums/Frontend_Utils_constants.GameWindowZIndex.md new file mode 100644 index 00000000..1cf4c622 --- /dev/null +++ b/docs/enums/Frontend_Utils_constants.GameWindowZIndex.md @@ -0,0 +1,36 @@ +# Enumeration: GameWindowZIndex + +[Frontend/Utils/constants](../modules/Frontend_Utils_constants.md).GameWindowZIndex + +## Table of contents + +### Enumeration members + +- [HoverPlanet](Frontend_Utils_constants.GameWindowZIndex.md#hoverplanet) +- [MenuBar](Frontend_Utils_constants.GameWindowZIndex.md#menubar) +- [Modal](Frontend_Utils_constants.GameWindowZIndex.md#modal) +- [Tooltip](Frontend_Utils_constants.GameWindowZIndex.md#tooltip) + +## Enumeration members + +### HoverPlanet + +• **HoverPlanet** = `999` + +--- + +### MenuBar + +• **MenuBar** = `4` + +--- + +### Modal + +• **Modal** = `1000` + +--- + +### Tooltip + +• **Tooltip** = `16000000` diff --git a/docs/enums/Frontend_Views_ModalPane.ModalName.md b/docs/enums/Frontend_Views_ModalPane.ModalName.md new file mode 100644 index 00000000..a64cd49e --- /dev/null +++ b/docs/enums/Frontend_Views_ModalPane.ModalName.md @@ -0,0 +1,141 @@ +# Enumeration: ModalName + +[Frontend/Views/ModalPane](../modules/Frontend_Views_ModalPane.md).ModalName + +## Table of contents + +### Enumeration members + +- [ArtifactConversation](Frontend_Views_ModalPane.ModalName.md#artifactconversation) +- [ArtifactDetails](Frontend_Views_ModalPane.ModalName.md#artifactdetails) +- [Hats](Frontend_Views_ModalPane.ModalName.md#hats) +- [Help](Frontend_Views_ModalPane.ModalName.md#help) +- [Leaderboard](Frontend_Views_ModalPane.ModalName.md#leaderboard) +- [ManageAccount](Frontend_Views_ModalPane.ModalName.md#manageaccount) +- [ManageArtifacts](Frontend_Views_ModalPane.ModalName.md#manageartifacts) +- [MapShare](Frontend_Views_ModalPane.ModalName.md#mapshare) +- [Onboarding](Frontend_Views_ModalPane.ModalName.md#onboarding) +- [PlanetDetails](Frontend_Views_ModalPane.ModalName.md#planetdetails) +- [PlanetDex](Frontend_Views_ModalPane.ModalName.md#planetdex) +- [Plugins](Frontend_Views_ModalPane.ModalName.md#plugins) +- [Private](Frontend_Views_ModalPane.ModalName.md#private) +- [Settings](Frontend_Views_ModalPane.ModalName.md#settings) +- [TwitterBroadcast](Frontend_Views_ModalPane.ModalName.md#twitterbroadcast) +- [TwitterVerify](Frontend_Views_ModalPane.ModalName.md#twitterverify) +- [UpgradeDetails](Frontend_Views_ModalPane.ModalName.md#upgradedetails) +- [WithdrawSilver](Frontend_Views_ModalPane.ModalName.md#withdrawsilver) +- [YourArtifacts](Frontend_Views_ModalPane.ModalName.md#yourartifacts) + +## Enumeration members + +### ArtifactConversation + +• **ArtifactConversation** = `13` + +--- + +### ArtifactDetails + +• **ArtifactDetails** = `14` + +--- + +### Hats + +• **Hats** = `7` + +--- + +### Help + +• **Help** = `0` + +--- + +### Leaderboard + +• **Leaderboard** = `2` + +--- + +### ManageAccount + +• **ManageAccount** = `16` + +--- + +### ManageArtifacts + +• **ManageArtifacts** = `10` + +--- + +### MapShare + +• **MapShare** = `15` + +--- + +### Onboarding + +• **Onboarding** = `17` + +--- + +### PlanetDetails + +• **PlanetDetails** = `1` + +--- + +### PlanetDex + +• **PlanetDex** = `3` + +--- + +### Plugins + +• **Plugins** = `11` + +--- + +### Private + +• **Private** = `18` + +--- + +### Settings + +• **Settings** = `8` + +--- + +### TwitterBroadcast + +• **TwitterBroadcast** = `6` + +--- + +### TwitterVerify + +• **TwitterVerify** = `5` + +--- + +### UpgradeDetails + +• **UpgradeDetails** = `4` + +--- + +### WithdrawSilver + +• **WithdrawSilver** = `12` + +--- + +### YourArtifacts + +• **YourArtifacts** = `9` diff --git a/docs/enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md b/docs/enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md new file mode 100644 index 00000000..61984179 --- /dev/null +++ b/docs/enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md @@ -0,0 +1,43 @@ +# Enumeration: PlanetNotifType + +[Frontend/Views/PlanetNotifications](../modules/Frontend_Views_PlanetNotifications.md).PlanetNotifType + +## Table of contents + +### Enumeration members + +- [CanAddEmoji](Frontend_Views_PlanetNotifications.PlanetNotifType.md#canaddemoji) +- [CanFindArtifact](Frontend_Views_PlanetNotifications.PlanetNotifType.md#canfindartifact) +- [CanProspect](Frontend_Views_PlanetNotifications.PlanetNotifType.md#canprospect) +- [MaxSilver](Frontend_Views_PlanetNotifications.PlanetNotifType.md#maxsilver) +- [PlanetCanUpgrade](Frontend_Views_PlanetNotifications.PlanetNotifType.md#planetcanupgrade) + +## Enumeration members + +### CanAddEmoji + +• **CanAddEmoji** = `4` + +--- + +### CanFindArtifact + +• **CanFindArtifact** = `2` + +--- + +### CanProspect + +• **CanProspect** = `1` + +--- + +### MaxSilver + +• **MaxSilver** = `3` + +--- + +### PlanetCanUpgrade + +• **PlanetCanUpgrade** = `0` diff --git a/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md b/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md new file mode 100644 index 00000000..4a9f0d5f --- /dev/null +++ b/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md @@ -0,0 +1,99 @@ +# Enumeration: ContractEvent + +[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_ContractsAPITypes.md).ContractEvent + +## Table of contents + +### Enumeration members + +- [ArrivalQueued](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#arrivalqueued) +- [ArtifactActivated](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#artifactactivated) +- [ArtifactDeactivated](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#artifactdeactivated) +- [ArtifactDeposited](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#artifactdeposited) +- [ArtifactFound](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#artifactfound) +- [ArtifactWithdrawn](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#artifactwithdrawn) +- [ChangedGPTCreditPrice](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#changedgptcreditprice) +- [LocationRevealed](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#locationrevealed) +- [PlanetHatBought](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#planethatbought) +- [PlanetSilverWithdrawn](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#planetsilverwithdrawn) +- [PlanetTransferred](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#planettransferred) +- [PlanetUpgraded](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#planetupgraded) +- [PlayerInitialized](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#playerinitialized) + +## Enumeration members + +### ArrivalQueued + +• **ArrivalQueued** = `"ArrivalQueued"` + +--- + +### ArtifactActivated + +• **ArtifactActivated** = `"ArtifactActivated"` + +--- + +### ArtifactDeactivated + +• **ArtifactDeactivated** = `"ArtifactDeactivated"` + +--- + +### ArtifactDeposited + +• **ArtifactDeposited** = `"ArtifactDeposited"` + +--- + +### ArtifactFound + +• **ArtifactFound** = `"ArtifactFound"` + +--- + +### ArtifactWithdrawn + +• **ArtifactWithdrawn** = `"ArtifactWithdrawn"` + +--- + +### ChangedGPTCreditPrice + +• **ChangedGPTCreditPrice** = `"ChangedCreditPrice"` + +--- + +### LocationRevealed + +• **LocationRevealed** = `"LocationRevealed"` + +--- + +### PlanetHatBought + +• **PlanetHatBought** = `"PlanetHatBought"` + +--- + +### PlanetSilverWithdrawn + +• **PlanetSilverWithdrawn** = `"PlanetSilverWithdrawn"` + +--- + +### PlanetTransferred + +• **PlanetTransferred** = `"PlanetTransferred"` + +--- + +### PlanetUpgraded + +• **PlanetUpgraded** = `"PlanetUpgraded"` + +--- + +### PlayerInitialized + +• **PlayerInitialized** = `"PlayerInitialized"` diff --git a/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md b/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md new file mode 100644 index 00000000..1f89fde0 --- /dev/null +++ b/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md @@ -0,0 +1,92 @@ +# Enumeration: ContractsAPIEvent + +[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_ContractsAPITypes.md).ContractsAPIEvent + +## Table of contents + +### Enumeration members + +- [ArrivalQueued](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#arrivalqueued) +- [ArtifactUpdate](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#artifactupdate) +- [ChangedGPTCreditPrice](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#changedgptcreditprice) +- [LocationRevealed](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#locationrevealed) +- [PlanetTransferred](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#planettransferred) +- [PlanetUpdate](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#planetupdate) +- [PlayerUpdate](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#playerupdate) +- [RadiusUpdated](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#radiusupdated) +- [TxConfirmed](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#txconfirmed) +- [TxInitFailed](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#txinitfailed) +- [TxReverted](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#txreverted) +- [TxSubmitted](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#txsubmitted) + +## Enumeration members + +### ArrivalQueued + +• **ArrivalQueued** = `"ArrivalQueued"` + +--- + +### ArtifactUpdate + +• **ArtifactUpdate** = `"ArtifactUpdate"` + +--- + +### ChangedGPTCreditPrice + +• **ChangedGPTCreditPrice** = `"ChangedCreditPrice"` + +--- + +### LocationRevealed + +• **LocationRevealed** = `"LocationRevealed"` + +--- + +### PlanetTransferred + +• **PlanetTransferred** = `"PlanetTransferred"` + +--- + +### PlanetUpdate + +• **PlanetUpdate** = `"PlanetUpdate"` + +--- + +### PlayerUpdate + +• **PlayerUpdate** = `"PlayerUpdate"` + +--- + +### RadiusUpdated + +• **RadiusUpdated** = `"RadiusUpdated"` + +--- + +### TxConfirmed + +• **TxConfirmed** = `"TxConfirmed"` + +--- + +### TxInitFailed + +• **TxInitFailed** = `"TxInitFailed"` + +--- + +### TxReverted + +• **TxReverted** = `"TxReverted"` + +--- + +### TxSubmitted + +• **TxSubmitted** = `"TxSubmitted"` diff --git a/docs/enums/_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md b/docs/enums/_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md new file mode 100644 index 00000000..3c2b6de8 --- /dev/null +++ b/docs/enums/_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md @@ -0,0 +1,64 @@ +# Enumeration: InitArgIdxs + +[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_ContractsAPITypes.md).InitArgIdxs + +## Table of contents + +### Enumeration members + +- [LOCATION_ID](_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md#location_id) +- [PERLIN](_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md#perlin) +- [PERLIN_LENGTH_SCALE](_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md#perlin_length_scale) +- [PERLIN_MIRROR_X](_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md#perlin_mirror_x) +- [PERLIN_MIRROR_Y](_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md#perlin_mirror_y) +- [PLANETHASH_KEY](_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md#planethash_key) +- [RADIUS](_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md#radius) +- [SPACETYPE_KEY](_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md#spacetype_key) + +## Enumeration members + +### LOCATION_ID + +• **LOCATION_ID** = `0` + +--- + +### PERLIN + +• **PERLIN** = `1` + +--- + +### PERLIN_LENGTH_SCALE + +• **PERLIN_LENGTH_SCALE** = `5` + +--- + +### PERLIN_MIRROR_X + +• **PERLIN_MIRROR_X** = `6` + +--- + +### PERLIN_MIRROR_Y + +• **PERLIN_MIRROR_Y** = `7` + +--- + +### PLANETHASH_KEY + +• **PLANETHASH_KEY** = `3` + +--- + +### RADIUS + +• **RADIUS** = `2` + +--- + +### SPACETYPE_KEY + +• **SPACETYPE_KEY** = `4` diff --git a/docs/enums/_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md b/docs/enums/_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md new file mode 100644 index 00000000..566f35db --- /dev/null +++ b/docs/enums/_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md @@ -0,0 +1,99 @@ +# Enumeration: MoveArgIdxs + +[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_ContractsAPITypes.md).MoveArgIdxs + +## Table of contents + +### Enumeration members + +- [ARTIFACT_SENT](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#artifact_sent) +- [DIST_MAX](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#dist_max) +- [FROM_ID](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#from_id) +- [PERLIN_LENGTH_SCALE](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#perlin_length_scale) +- [PERLIN_MIRROR_X](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#perlin_mirror_x) +- [PERLIN_MIRROR_Y](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#perlin_mirror_y) +- [PLANETHASH_KEY](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#planethash_key) +- [SHIPS_SENT](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#ships_sent) +- [SILVER_SENT](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#silver_sent) +- [SPACETYPE_KEY](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#spacetype_key) +- [TO_ID](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#to_id) +- [TO_PERLIN](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#to_perlin) +- [TO_RADIUS](_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md#to_radius) + +## Enumeration members + +### ARTIFACT_SENT + +• **ARTIFACT_SENT** = `12` + +--- + +### DIST_MAX + +• **DIST_MAX** = `4` + +--- + +### FROM_ID + +• **FROM_ID** = `0` + +--- + +### PERLIN_LENGTH_SCALE + +• **PERLIN_LENGTH_SCALE** = `7` + +--- + +### PERLIN_MIRROR_X + +• **PERLIN_MIRROR_X** = `8` + +--- + +### PERLIN_MIRROR_Y + +• **PERLIN_MIRROR_Y** = `9` + +--- + +### PLANETHASH_KEY + +• **PLANETHASH_KEY** = `5` + +--- + +### SHIPS_SENT + +• **SHIPS_SENT** = `10` + +--- + +### SILVER_SENT + +• **SILVER_SENT** = `11` + +--- + +### SPACETYPE_KEY + +• **SPACETYPE_KEY** = `6` + +--- + +### TO_ID + +• **TO_ID** = `1` + +--- + +### TO_PERLIN + +• **TO_PERLIN** = `2` + +--- + +### TO_RADIUS + +• **TO_RADIUS** = `3` diff --git a/docs/enums/_types_darkforest_api_contractsapitypes.planeteventtype.md b/docs/enums/_types_darkforest_api_ContractsAPITypes.PlanetEventType.md similarity index 59% rename from docs/enums/_types_darkforest_api_contractsapitypes.planeteventtype.md rename to docs/enums/_types_darkforest_api_ContractsAPITypes.PlanetEventType.md index ba8c762d..c42ba76d 100644 --- a/docs/enums/_types_darkforest_api_contractsapitypes.planeteventtype.md +++ b/docs/enums/_types_darkforest_api_ContractsAPITypes.PlanetEventType.md @@ -1,15 +1,15 @@ # Enumeration: PlanetEventType -[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_contractsapitypes.md).PlanetEventType +[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_ContractsAPITypes.md).PlanetEventType ## Table of contents ### Enumeration members -- [ARRIVAL](_types_darkforest_api_contractsapitypes.planeteventtype.md#arrival) +- [ARRIVAL](_types_darkforest_api_ContractsAPITypes.PlanetEventType.md#arrival) ## Enumeration members ### ARRIVAL -• **ARRIVAL**: = 0 +• **ARRIVAL** = `0` diff --git a/docs/enums/_types_darkforest_api_ContractsAPITypes.UpgradeArgIdxs.md b/docs/enums/_types_darkforest_api_ContractsAPITypes.UpgradeArgIdxs.md new file mode 100644 index 00000000..f107d9c7 --- /dev/null +++ b/docs/enums/_types_darkforest_api_ContractsAPITypes.UpgradeArgIdxs.md @@ -0,0 +1,22 @@ +# Enumeration: UpgradeArgIdxs + +[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_ContractsAPITypes.md).UpgradeArgIdxs + +## Table of contents + +### Enumeration members + +- [LOCATION_ID](_types_darkforest_api_ContractsAPITypes.UpgradeArgIdxs.md#location_id) +- [UPGRADE_BRANCH](_types_darkforest_api_ContractsAPITypes.UpgradeArgIdxs.md#upgrade_branch) + +## Enumeration members + +### LOCATION_ID + +• **LOCATION_ID** = `0` + +--- + +### UPGRADE_BRANCH + +• **UPGRADE_BRANCH** = `1` diff --git a/docs/enums/_types_darkforest_api_ContractsAPITypes.ZKArgIdx.md b/docs/enums/_types_darkforest_api_ContractsAPITypes.ZKArgIdx.md new file mode 100644 index 00000000..b56aa393 --- /dev/null +++ b/docs/enums/_types_darkforest_api_ContractsAPITypes.ZKArgIdx.md @@ -0,0 +1,36 @@ +# Enumeration: ZKArgIdx + +[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_ContractsAPITypes.md).ZKArgIdx + +## Table of contents + +### Enumeration members + +- [DATA](_types_darkforest_api_ContractsAPITypes.ZKArgIdx.md#data) +- [PROOF_A](_types_darkforest_api_ContractsAPITypes.ZKArgIdx.md#proof_a) +- [PROOF_B](_types_darkforest_api_ContractsAPITypes.ZKArgIdx.md#proof_b) +- [PROOF_C](_types_darkforest_api_ContractsAPITypes.ZKArgIdx.md#proof_c) + +## Enumeration members + +### DATA + +• **DATA** = `3` + +--- + +### PROOF_A + +• **PROOF_A** = `0` + +--- + +### PROOF_B + +• **PROOF_B** = `1` + +--- + +### PROOF_C + +• **PROOF_C** = `2` diff --git a/docs/enums/_types_darkforest_api_contractsapitypes.contractevent.md b/docs/enums/_types_darkforest_api_contractsapitypes.contractevent.md deleted file mode 100644 index 1bb6496c..00000000 --- a/docs/enums/_types_darkforest_api_contractsapitypes.contractevent.md +++ /dev/null @@ -1,99 +0,0 @@ -# Enumeration: ContractEvent - -[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_contractsapitypes.md).ContractEvent - -## Table of contents - -### Enumeration members - -- [ArrivalQueued](_types_darkforest_api_contractsapitypes.contractevent.md#arrivalqueued) -- [ArtifactActivated](_types_darkforest_api_contractsapitypes.contractevent.md#artifactactivated) -- [ArtifactDeactivated](_types_darkforest_api_contractsapitypes.contractevent.md#artifactdeactivated) -- [ArtifactDeposited](_types_darkforest_api_contractsapitypes.contractevent.md#artifactdeposited) -- [ArtifactFound](_types_darkforest_api_contractsapitypes.contractevent.md#artifactfound) -- [ArtifactWithdrawn](_types_darkforest_api_contractsapitypes.contractevent.md#artifactwithdrawn) -- [ChangedGPTCreditPrice](_types_darkforest_api_contractsapitypes.contractevent.md#changedgptcreditprice) -- [LocationRevealed](_types_darkforest_api_contractsapitypes.contractevent.md#locationrevealed) -- [PlanetHatBought](_types_darkforest_api_contractsapitypes.contractevent.md#planethatbought) -- [PlanetSilverWithdrawn](_types_darkforest_api_contractsapitypes.contractevent.md#planetsilverwithdrawn) -- [PlanetTransferred](_types_darkforest_api_contractsapitypes.contractevent.md#planettransferred) -- [PlanetUpgraded](_types_darkforest_api_contractsapitypes.contractevent.md#planetupgraded) -- [PlayerInitialized](_types_darkforest_api_contractsapitypes.contractevent.md#playerinitialized) - -## Enumeration members - -### ArrivalQueued - -• **ArrivalQueued**: = "ArrivalQueued" - ---- - -### ArtifactActivated - -• **ArtifactActivated**: = "ArtifactActivated" - ---- - -### ArtifactDeactivated - -• **ArtifactDeactivated**: = "ArtifactDeactivated" - ---- - -### ArtifactDeposited - -• **ArtifactDeposited**: = "ArtifactDeposited" - ---- - -### ArtifactFound - -• **ArtifactFound**: = "ArtifactFound" - ---- - -### ArtifactWithdrawn - -• **ArtifactWithdrawn**: = "ArtifactWithdrawn" - ---- - -### ChangedGPTCreditPrice - -• **ChangedGPTCreditPrice**: = "ChangedCreditPrice" - ---- - -### LocationRevealed - -• **LocationRevealed**: = "LocationRevealed" - ---- - -### PlanetHatBought - -• **PlanetHatBought**: = "PlanetHatBought" - ---- - -### PlanetSilverWithdrawn - -• **PlanetSilverWithdrawn**: = "PlanetSilverWithdrawn" - ---- - -### PlanetTransferred - -• **PlanetTransferred**: = "PlanetTransferred" - ---- - -### PlanetUpgraded - -• **PlanetUpgraded**: = "PlanetUpgraded" - ---- - -### PlayerInitialized - -• **PlayerInitialized**: = "PlayerInitialized" diff --git a/docs/enums/_types_darkforest_api_contractsapitypes.contractsapievent.md b/docs/enums/_types_darkforest_api_contractsapitypes.contractsapievent.md deleted file mode 100644 index 449a4922..00000000 --- a/docs/enums/_types_darkforest_api_contractsapitypes.contractsapievent.md +++ /dev/null @@ -1,92 +0,0 @@ -# Enumeration: ContractsAPIEvent - -[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_contractsapitypes.md).ContractsAPIEvent - -## Table of contents - -### Enumeration members - -- [ArrivalQueued](_types_darkforest_api_contractsapitypes.contractsapievent.md#arrivalqueued) -- [ArtifactUpdate](_types_darkforest_api_contractsapitypes.contractsapievent.md#artifactupdate) -- [ChangedGPTCreditPrice](_types_darkforest_api_contractsapitypes.contractsapievent.md#changedgptcreditprice) -- [LocationRevealed](_types_darkforest_api_contractsapitypes.contractsapievent.md#locationrevealed) -- [PlanetTransferred](_types_darkforest_api_contractsapitypes.contractsapievent.md#planettransferred) -- [PlanetUpdate](_types_darkforest_api_contractsapitypes.contractsapievent.md#planetupdate) -- [PlayerUpdate](_types_darkforest_api_contractsapitypes.contractsapievent.md#playerupdate) -- [RadiusUpdated](_types_darkforest_api_contractsapitypes.contractsapievent.md#radiusupdated) -- [TxConfirmed](_types_darkforest_api_contractsapitypes.contractsapievent.md#txconfirmed) -- [TxInitFailed](_types_darkforest_api_contractsapitypes.contractsapievent.md#txinitfailed) -- [TxReverted](_types_darkforest_api_contractsapitypes.contractsapievent.md#txreverted) -- [TxSubmitted](_types_darkforest_api_contractsapitypes.contractsapievent.md#txsubmitted) - -## Enumeration members - -### ArrivalQueued - -• **ArrivalQueued**: = "ArrivalQueued" - ---- - -### ArtifactUpdate - -• **ArtifactUpdate**: = "ArtifactUpdate" - ---- - -### ChangedGPTCreditPrice - -• **ChangedGPTCreditPrice**: = "ChangedCreditPrice" - ---- - -### LocationRevealed - -• **LocationRevealed**: = "LocationRevealed" - ---- - -### PlanetTransferred - -• **PlanetTransferred**: = "PlanetTransferred" - ---- - -### PlanetUpdate - -• **PlanetUpdate**: = "PlanetUpdate" - ---- - -### PlayerUpdate - -• **PlayerUpdate**: = "PlayerUpdate" - ---- - -### RadiusUpdated - -• **RadiusUpdated**: = "RadiusUpdated" - ---- - -### TxConfirmed - -• **TxConfirmed**: = "TxConfirmed" - ---- - -### TxInitFailed - -• **TxInitFailed**: = "TxInitFailed" - ---- - -### TxReverted - -• **TxReverted**: = "TxReverted" - ---- - -### TxSubmitted - -• **TxSubmitted**: = "TxSubmitted" diff --git a/docs/enums/_types_darkforest_api_contractsapitypes.initargidxs.md b/docs/enums/_types_darkforest_api_contractsapitypes.initargidxs.md deleted file mode 100644 index 15b7979c..00000000 --- a/docs/enums/_types_darkforest_api_contractsapitypes.initargidxs.md +++ /dev/null @@ -1,64 +0,0 @@ -# Enumeration: InitArgIdxs - -[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_contractsapitypes.md).InitArgIdxs - -## Table of contents - -### Enumeration members - -- [LOCATION_ID](_types_darkforest_api_contractsapitypes.initargidxs.md#location_id) -- [PERLIN](_types_darkforest_api_contractsapitypes.initargidxs.md#perlin) -- [PERLIN_LENGTH_SCALE](_types_darkforest_api_contractsapitypes.initargidxs.md#perlin_length_scale) -- [PERLIN_MIRROR_X](_types_darkforest_api_contractsapitypes.initargidxs.md#perlin_mirror_x) -- [PERLIN_MIRROR_Y](_types_darkforest_api_contractsapitypes.initargidxs.md#perlin_mirror_y) -- [PLANETHASH_KEY](_types_darkforest_api_contractsapitypes.initargidxs.md#planethash_key) -- [RADIUS](_types_darkforest_api_contractsapitypes.initargidxs.md#radius) -- [SPACETYPE_KEY](_types_darkforest_api_contractsapitypes.initargidxs.md#spacetype_key) - -## Enumeration members - -### LOCATION_ID - -• **LOCATION_ID**: = 0 - ---- - -### PERLIN - -• **PERLIN**: = 1 - ---- - -### PERLIN_LENGTH_SCALE - -• **PERLIN_LENGTH_SCALE**: = 5 - ---- - -### PERLIN_MIRROR_X - -• **PERLIN_MIRROR_X**: = 6 - ---- - -### PERLIN_MIRROR_Y - -• **PERLIN_MIRROR_Y**: = 7 - ---- - -### PLANETHASH_KEY - -• **PLANETHASH_KEY**: = 3 - ---- - -### RADIUS - -• **RADIUS**: = 2 - ---- - -### SPACETYPE_KEY - -• **SPACETYPE_KEY**: = 4 diff --git a/docs/enums/_types_darkforest_api_contractsapitypes.moveargidxs.md b/docs/enums/_types_darkforest_api_contractsapitypes.moveargidxs.md deleted file mode 100644 index 15bf3b02..00000000 --- a/docs/enums/_types_darkforest_api_contractsapitypes.moveargidxs.md +++ /dev/null @@ -1,99 +0,0 @@ -# Enumeration: MoveArgIdxs - -[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_contractsapitypes.md).MoveArgIdxs - -## Table of contents - -### Enumeration members - -- [ARTIFACT_SENT](_types_darkforest_api_contractsapitypes.moveargidxs.md#artifact_sent) -- [DIST_MAX](_types_darkforest_api_contractsapitypes.moveargidxs.md#dist_max) -- [FROM_ID](_types_darkforest_api_contractsapitypes.moveargidxs.md#from_id) -- [PERLIN_LENGTH_SCALE](_types_darkforest_api_contractsapitypes.moveargidxs.md#perlin_length_scale) -- [PERLIN_MIRROR_X](_types_darkforest_api_contractsapitypes.moveargidxs.md#perlin_mirror_x) -- [PERLIN_MIRROR_Y](_types_darkforest_api_contractsapitypes.moveargidxs.md#perlin_mirror_y) -- [PLANETHASH_KEY](_types_darkforest_api_contractsapitypes.moveargidxs.md#planethash_key) -- [SHIPS_SENT](_types_darkforest_api_contractsapitypes.moveargidxs.md#ships_sent) -- [SILVER_SENT](_types_darkforest_api_contractsapitypes.moveargidxs.md#silver_sent) -- [SPACETYPE_KEY](_types_darkforest_api_contractsapitypes.moveargidxs.md#spacetype_key) -- [TO_ID](_types_darkforest_api_contractsapitypes.moveargidxs.md#to_id) -- [TO_PERLIN](_types_darkforest_api_contractsapitypes.moveargidxs.md#to_perlin) -- [TO_RADIUS](_types_darkforest_api_contractsapitypes.moveargidxs.md#to_radius) - -## Enumeration members - -### ARTIFACT_SENT - -• **ARTIFACT_SENT**: = 12 - ---- - -### DIST_MAX - -• **DIST_MAX**: = 4 - ---- - -### FROM_ID - -• **FROM_ID**: = 0 - ---- - -### PERLIN_LENGTH_SCALE - -• **PERLIN_LENGTH_SCALE**: = 7 - ---- - -### PERLIN_MIRROR_X - -• **PERLIN_MIRROR_X**: = 8 - ---- - -### PERLIN_MIRROR_Y - -• **PERLIN_MIRROR_Y**: = 9 - ---- - -### PLANETHASH_KEY - -• **PLANETHASH_KEY**: = 5 - ---- - -### SHIPS_SENT - -• **SHIPS_SENT**: = 10 - ---- - -### SILVER_SENT - -• **SILVER_SENT**: = 11 - ---- - -### SPACETYPE_KEY - -• **SPACETYPE_KEY**: = 6 - ---- - -### TO_ID - -• **TO_ID**: = 1 - ---- - -### TO_PERLIN - -• **TO_PERLIN**: = 2 - ---- - -### TO_RADIUS - -• **TO_RADIUS**: = 3 diff --git a/docs/enums/_types_darkforest_api_contractsapitypes.upgradeargidxs.md b/docs/enums/_types_darkforest_api_contractsapitypes.upgradeargidxs.md deleted file mode 100644 index 857d0ad6..00000000 --- a/docs/enums/_types_darkforest_api_contractsapitypes.upgradeargidxs.md +++ /dev/null @@ -1,22 +0,0 @@ -# Enumeration: UpgradeArgIdxs - -[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_contractsapitypes.md).UpgradeArgIdxs - -## Table of contents - -### Enumeration members - -- [LOCATION_ID](_types_darkforest_api_contractsapitypes.upgradeargidxs.md#location_id) -- [UPGRADE_BRANCH](_types_darkforest_api_contractsapitypes.upgradeargidxs.md#upgrade_branch) - -## Enumeration members - -### LOCATION_ID - -• **LOCATION_ID**: = 0 - ---- - -### UPGRADE_BRANCH - -• **UPGRADE_BRANCH**: = 1 diff --git a/docs/enums/_types_darkforest_api_contractsapitypes.zkargidx.md b/docs/enums/_types_darkforest_api_contractsapitypes.zkargidx.md deleted file mode 100644 index 4e7e958c..00000000 --- a/docs/enums/_types_darkforest_api_contractsapitypes.zkargidx.md +++ /dev/null @@ -1,36 +0,0 @@ -# Enumeration: ZKArgIdx - -[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_contractsapitypes.md).ZKArgIdx - -## Table of contents - -### Enumeration members - -- [DATA](_types_darkforest_api_contractsapitypes.zkargidx.md#data) -- [PROOF_A](_types_darkforest_api_contractsapitypes.zkargidx.md#proof_a) -- [PROOF_B](_types_darkforest_api_contractsapitypes.zkargidx.md#proof_b) -- [PROOF_C](_types_darkforest_api_contractsapitypes.zkargidx.md#proof_c) - -## Enumeration members - -### DATA - -• **DATA**: = 3 - ---- - -### PROOF_A - -• **PROOF_A**: = 0 - ---- - -### PROOF_B - -• **PROOF_B**: = 1 - ---- - -### PROOF_C - -• **PROOF_C**: = 2 diff --git a/docs/enums/_types_global_GlobalTypes.StatIdx.md b/docs/enums/_types_global_GlobalTypes.StatIdx.md new file mode 100644 index 00000000..349ac33a --- /dev/null +++ b/docs/enums/_types_global_GlobalTypes.StatIdx.md @@ -0,0 +1,43 @@ +# Enumeration: StatIdx + +[\_types/global/GlobalTypes](../modules/_types_global_GlobalTypes.md).StatIdx + +## Table of contents + +### Enumeration members + +- [Defense](_types_global_GlobalTypes.StatIdx.md#defense) +- [EnergyCap](_types_global_GlobalTypes.StatIdx.md#energycap) +- [EnergyGro](_types_global_GlobalTypes.StatIdx.md#energygro) +- [Range](_types_global_GlobalTypes.StatIdx.md#range) +- [Speed](_types_global_GlobalTypes.StatIdx.md#speed) + +## Enumeration members + +### Defense + +• **Defense** = `4` + +--- + +### EnergyCap + +• **EnergyCap** = `0` + +--- + +### EnergyGro + +• **EnergyGro** = `1` + +--- + +### Range + +• **Range** = `2` + +--- + +### Speed + +• **Speed** = `3` diff --git a/docs/enums/_types_global_globaltypes.statidx.md b/docs/enums/_types_global_globaltypes.statidx.md deleted file mode 100644 index d7e49a70..00000000 --- a/docs/enums/_types_global_globaltypes.statidx.md +++ /dev/null @@ -1,43 +0,0 @@ -# Enumeration: StatIdx - -[\_types/global/GlobalTypes](../modules/_types_global_globaltypes.md).StatIdx - -## Table of contents - -### Enumeration members - -- [Defense](_types_global_globaltypes.statidx.md#defense) -- [EnergyCap](_types_global_globaltypes.statidx.md#energycap) -- [EnergyGro](_types_global_globaltypes.statidx.md#energygro) -- [Range](_types_global_globaltypes.statidx.md#range) -- [Speed](_types_global_globaltypes.statidx.md#speed) - -## Enumeration members - -### Defense - -• **Defense**: = 4 - ---- - -### EnergyCap - -• **EnergyCap**: = 0 - ---- - -### EnergyGro - -• **EnergyGro**: = 1 - ---- - -### Range - -• **Range**: = 2 - ---- - -### Speed - -• **Speed**: = 3 diff --git a/docs/enums/backend_gamelogic_artifactutils.artifactfilecolor.md b/docs/enums/backend_gamelogic_artifactutils.artifactfilecolor.md deleted file mode 100644 index fe3dc16c..00000000 --- a/docs/enums/backend_gamelogic_artifactutils.artifactfilecolor.md +++ /dev/null @@ -1,22 +0,0 @@ -# Enumeration: ArtifactFileColor - -[Backend/GameLogic/ArtifactUtils](../modules/backend_gamelogic_artifactutils.md).ArtifactFileColor - -## Table of contents - -### Enumeration members - -- [APP_BACKGROUND](backend_gamelogic_artifactutils.artifactfilecolor.md#app_background) -- [BLUE](backend_gamelogic_artifactutils.artifactfilecolor.md#blue) - -## Enumeration members - -### APP_BACKGROUND - -• **APP_BACKGROUND**: = 1 - ---- - -### BLUE - -• **BLUE**: = 0 diff --git a/docs/enums/backend_gamelogic_gamemanager.gamemanagerevent.md b/docs/enums/backend_gamelogic_gamemanager.gamemanagerevent.md deleted file mode 100644 index 17c8cc64..00000000 --- a/docs/enums/backend_gamelogic_gamemanager.gamemanagerevent.md +++ /dev/null @@ -1,50 +0,0 @@ -# Enumeration: GameManagerEvent - -[Backend/GameLogic/GameManager](../modules/backend_gamelogic_gamemanager.md).GameManagerEvent - -## Table of contents - -### Enumeration members - -- [ArtifactUpdate](backend_gamelogic_gamemanager.gamemanagerevent.md#artifactupdate) -- [DiscoveredNewChunk](backend_gamelogic_gamemanager.gamemanagerevent.md#discoverednewchunk) -- [InitializedPlayer](backend_gamelogic_gamemanager.gamemanagerevent.md#initializedplayer) -- [InitializedPlayerError](backend_gamelogic_gamemanager.gamemanagerevent.md#initializedplayererror) -- [Moved](backend_gamelogic_gamemanager.gamemanagerevent.md#moved) -- [PlanetUpdate](backend_gamelogic_gamemanager.gamemanagerevent.md#planetupdate) - -## Enumeration members - -### ArtifactUpdate - -• **ArtifactUpdate**: = "ArtifactUpdate" - ---- - -### DiscoveredNewChunk - -• **DiscoveredNewChunk**: = "DiscoveredNewChunk" - ---- - -### InitializedPlayer - -• **InitializedPlayer**: = "InitializedPlayer" - ---- - -### InitializedPlayerError - -• **InitializedPlayerError**: = "InitializedPlayerError" - ---- - -### Moved - -• **Moved**: = "Moved" - ---- - -### PlanetUpdate - -• **PlanetUpdate**: = "PlanetUpdate" diff --git a/docs/enums/backend_gamelogic_gameuimanager.gameuimanagerevent.md b/docs/enums/backend_gamelogic_gameuimanager.gameuimanagerevent.md deleted file mode 100644 index 39046898..00000000 --- a/docs/enums/backend_gamelogic_gameuimanager.gameuimanagerevent.md +++ /dev/null @@ -1,22 +0,0 @@ -# Enumeration: GameUIManagerEvent - -[Backend/GameLogic/GameUIManager](../modules/backend_gamelogic_gameuimanager.md).GameUIManagerEvent - -## Table of contents - -### Enumeration members - -- [InitializedPlayer](backend_gamelogic_gameuimanager.gameuimanagerevent.md#initializedplayer) -- [InitializedPlayerError](backend_gamelogic_gameuimanager.gameuimanagerevent.md#initializedplayererror) - -## Enumeration members - -### InitializedPlayer - -• **InitializedPlayer**: = "InitializedPlayer" - ---- - -### InitializedPlayerError - -• **InitializedPlayerError**: = "InitializedPlayerError" diff --git a/docs/enums/backend_gamelogic_tutorialmanager.tutorialmanagerevent.md b/docs/enums/backend_gamelogic_tutorialmanager.tutorialmanagerevent.md deleted file mode 100644 index 60b841cb..00000000 --- a/docs/enums/backend_gamelogic_tutorialmanager.tutorialmanagerevent.md +++ /dev/null @@ -1,15 +0,0 @@ -# Enumeration: TutorialManagerEvent - -[Backend/GameLogic/TutorialManager](../modules/backend_gamelogic_tutorialmanager.md).TutorialManagerEvent - -## Table of contents - -### Enumeration members - -- [StateChanged](backend_gamelogic_tutorialmanager.tutorialmanagerevent.md#statechanged) - -## Enumeration members - -### StateChanged - -• **StateChanged**: = "StateChanged" diff --git a/docs/enums/backend_gamelogic_tutorialmanager.tutorialstate.md b/docs/enums/backend_gamelogic_tutorialmanager.tutorialstate.md deleted file mode 100644 index e6eb3e3a..00000000 --- a/docs/enums/backend_gamelogic_tutorialmanager.tutorialstate.md +++ /dev/null @@ -1,92 +0,0 @@ -# Enumeration: TutorialState - -[Backend/GameLogic/TutorialManager](../modules/backend_gamelogic_tutorialmanager.md).TutorialState - -## Table of contents - -### Enumeration members - -- [AlmostCompleted](backend_gamelogic_tutorialmanager.tutorialstate.md#almostcompleted) -- [Completed](backend_gamelogic_tutorialmanager.tutorialstate.md#completed) -- [Deselect](backend_gamelogic_tutorialmanager.tutorialstate.md#deselect) -- [HomePlanet](backend_gamelogic_tutorialmanager.tutorialstate.md#homeplanet) -- [HowToGetScore](backend_gamelogic_tutorialmanager.tutorialstate.md#howtogetscore) -- [MinerMove](backend_gamelogic_tutorialmanager.tutorialstate.md#minermove) -- [MinerPause](backend_gamelogic_tutorialmanager.tutorialstate.md#minerpause) -- [None](backend_gamelogic_tutorialmanager.tutorialstate.md#none) -- [SendFleet](backend_gamelogic_tutorialmanager.tutorialstate.md#sendfleet) -- [Terminal](backend_gamelogic_tutorialmanager.tutorialstate.md#terminal) -- [Valhalla](backend_gamelogic_tutorialmanager.tutorialstate.md#valhalla) -- [ZoomOut](backend_gamelogic_tutorialmanager.tutorialstate.md#zoomout) - -## Enumeration members - -### AlmostCompleted - -• **AlmostCompleted**: = 10 - ---- - -### Completed - -• **Completed**: = 11 - ---- - -### Deselect - -• **Deselect**: = 3 - ---- - -### HomePlanet - -• **HomePlanet**: = 1 - ---- - -### HowToGetScore - -• **HowToGetScore**: = 8 - ---- - -### MinerMove - -• **MinerMove**: = 5 - ---- - -### MinerPause - -• **MinerPause**: = 6 - ---- - -### None - -• **None**: = 0 - ---- - -### SendFleet - -• **SendFleet**: = 2 - ---- - -### Terminal - -• **Terminal**: = 7 - ---- - -### Valhalla - -• **Valhalla**: = 9 - ---- - -### ZoomOut - -• **ZoomOut**: = 4 diff --git a/docs/enums/backend_miner_miningpatterns.miningpatterntype.md b/docs/enums/backend_miner_miningpatterns.miningpatterntype.md deleted file mode 100644 index 6c07b574..00000000 --- a/docs/enums/backend_miner_miningpatterns.miningpatterntype.md +++ /dev/null @@ -1,57 +0,0 @@ -# Enumeration: MiningPatternType - -[Backend/Miner/MiningPatterns](../modules/backend_miner_miningpatterns.md).MiningPatternType - -## Table of contents - -### Enumeration members - -- [Cone](backend_miner_miningpatterns.miningpatterntype.md#cone) -- [ETH](backend_miner_miningpatterns.miningpatterntype.md#eth) -- [Grid](backend_miner_miningpatterns.miningpatterntype.md#grid) -- [Home](backend_miner_miningpatterns.miningpatterntype.md#home) -- [Spiral](backend_miner_miningpatterns.miningpatterntype.md#spiral) -- [SwissCheese](backend_miner_miningpatterns.miningpatterntype.md#swisscheese) -- [Target](backend_miner_miningpatterns.miningpatterntype.md#target) - -## Enumeration members - -### Cone - -• **Cone**: = 3 - ---- - -### ETH - -• **ETH**: = 5 - ---- - -### Grid - -• **Grid**: = 4 - ---- - -### Home - -• **Home**: = 0 - ---- - -### Spiral - -• **Spiral**: = 2 - ---- - -### SwissCheese - -• **SwissCheese**: = 6 - ---- - -### Target - -• **Target**: = 1 diff --git a/docs/enums/backend_network_utilityserverapi.emailresponse.md b/docs/enums/backend_network_utilityserverapi.emailresponse.md deleted file mode 100644 index 5fb45e12..00000000 --- a/docs/enums/backend_network_utilityserverapi.emailresponse.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: EmailResponse - -[Backend/Network/UtilityServerAPI](../modules/backend_network_utilityserverapi.md).EmailResponse - -## Table of contents - -### Enumeration members - -- [Invalid](backend_network_utilityserverapi.emailresponse.md#invalid) -- [ServerError](backend_network_utilityserverapi.emailresponse.md#servererror) -- [Success](backend_network_utilityserverapi.emailresponse.md#success) - -## Enumeration members - -### Invalid - -• **Invalid**: = 1 - ---- - -### ServerError - -• **ServerError**: = 2 - ---- - -### Success - -• **Success**: = 0 diff --git a/docs/enums/backend_storage_readerdatastore.singleplanetdatastoreevent.md b/docs/enums/backend_storage_readerdatastore.singleplanetdatastoreevent.md deleted file mode 100644 index 1163745f..00000000 --- a/docs/enums/backend_storage_readerdatastore.singleplanetdatastoreevent.md +++ /dev/null @@ -1,22 +0,0 @@ -# Enumeration: SinglePlanetDataStoreEvent - -[Backend/Storage/ReaderDataStore](../modules/backend_storage_readerdatastore.md).SinglePlanetDataStoreEvent - -## Table of contents - -### Enumeration members - -- [REFRESHED_ARTIFACT](backend_storage_readerdatastore.singleplanetdatastoreevent.md#refreshed_artifact) -- [REFRESHED_PLANET](backend_storage_readerdatastore.singleplanetdatastoreevent.md#refreshed_planet) - -## Enumeration members - -### REFRESHED_ARTIFACT - -• **REFRESHED_ARTIFACT**: = "REFRESHED_ARTIFACT" - ---- - -### REFRESHED_PLANET - -• **REFRESHED_PLANET**: = "REFRESHED_PLANET" diff --git a/docs/enums/frontend_components_email.emailctamode.md b/docs/enums/frontend_components_email.emailctamode.md deleted file mode 100644 index 29d9b7aa..00000000 --- a/docs/enums/frontend_components_email.emailctamode.md +++ /dev/null @@ -1,22 +0,0 @@ -# Enumeration: EmailCTAMode - -[Frontend/Components/Email](../modules/frontend_components_email.md).EmailCTAMode - -## Table of contents - -### Enumeration members - -- [SUBSCRIBE](frontend_components_email.emailctamode.md#subscribe) -- [UNSUBSCRIBE](frontend_components_email.emailctamode.md#unsubscribe) - -## Enumeration members - -### SUBSCRIBE - -• **SUBSCRIBE**: = 0 - ---- - -### UNSUBSCRIBE - -• **UNSUBSCRIBE**: = 1 diff --git a/docs/enums/frontend_game_notificationmanager.notificationmanagerevent.md b/docs/enums/frontend_game_notificationmanager.notificationmanagerevent.md deleted file mode 100644 index 6e91577d..00000000 --- a/docs/enums/frontend_game_notificationmanager.notificationmanagerevent.md +++ /dev/null @@ -1,15 +0,0 @@ -# Enumeration: NotificationManagerEvent - -[Frontend/Game/NotificationManager](../modules/frontend_game_notificationmanager.md).NotificationManagerEvent - -## Table of contents - -### Enumeration members - -- [Notify](frontend_game_notificationmanager.notificationmanagerevent.md#notify) - -## Enumeration members - -### Notify - -• **Notify**: = "Notify" diff --git a/docs/enums/frontend_game_notificationmanager.notificationtype.md b/docs/enums/frontend_game_notificationmanager.notificationtype.md deleted file mode 100644 index 7c547521..00000000 --- a/docs/enums/frontend_game_notificationmanager.notificationtype.md +++ /dev/null @@ -1,120 +0,0 @@ -# Enumeration: NotificationType - -[Frontend/Game/NotificationManager](../modules/frontend_game_notificationmanager.md).NotificationType - -## Table of contents - -### Enumeration members - -- [BalanceEmpty](frontend_game_notificationmanager.notificationtype.md#balanceempty) -- [CanUpgrade](frontend_game_notificationmanager.notificationtype.md#canupgrade) -- [FoundArtifact](frontend_game_notificationmanager.notificationtype.md#foundartifact) -- [FoundBiome](frontend_game_notificationmanager.notificationtype.md#foundbiome) -- [FoundComet](frontend_game_notificationmanager.notificationtype.md#foundcomet) -- [FoundDeadSpace](frontend_game_notificationmanager.notificationtype.md#founddeadspace) -- [FoundDeepSpace](frontend_game_notificationmanager.notificationtype.md#founddeepspace) -- [FoundPirates](frontend_game_notificationmanager.notificationtype.md#foundpirates) -- [FoundSilver](frontend_game_notificationmanager.notificationtype.md#foundsilver) -- [FoundSilverBank](frontend_game_notificationmanager.notificationtype.md#foundsilverbank) -- [FoundSpace](frontend_game_notificationmanager.notificationtype.md#foundspace) -- [FoundTradingPost](frontend_game_notificationmanager.notificationtype.md#foundtradingpost) -- [Generic](frontend_game_notificationmanager.notificationtype.md#generic) -- [ReceivedPlanet](frontend_game_notificationmanager.notificationtype.md#receivedplanet) -- [Tx](frontend_game_notificationmanager.notificationtype.md#tx) -- [WelcomePlayer](frontend_game_notificationmanager.notificationtype.md#welcomeplayer) - -## Enumeration members - -### BalanceEmpty - -• **BalanceEmpty**: = 2 - ---- - -### CanUpgrade - -• **CanUpgrade**: = 1 - ---- - -### FoundArtifact - -• **FoundArtifact**: = 12 - ---- - -### FoundBiome - -• **FoundBiome**: = 13 - ---- - -### FoundComet - -• **FoundComet**: = 11 - ---- - -### FoundDeadSpace - -• **FoundDeadSpace**: = 6 - ---- - -### FoundDeepSpace - -• **FoundDeepSpace**: = 5 - ---- - -### FoundPirates - -• **FoundPirates**: = 7 - ---- - -### FoundSilver - -• **FoundSilver**: = 8 - ---- - -### FoundSilverBank - -• **FoundSilverBank**: = 9 - ---- - -### FoundSpace - -• **FoundSpace**: = 4 - ---- - -### FoundTradingPost - -• **FoundTradingPost**: = 10 - ---- - -### Generic - -• **Generic**: = 15 - ---- - -### ReceivedPlanet - -• **ReceivedPlanet**: = 14 - ---- - -### Tx - -• **Tx**: = 0 - ---- - -### WelcomePlayer - -• **WelcomePlayer**: = 3 diff --git a/docs/enums/frontend_game_windowmanager.cursorstate.md b/docs/enums/frontend_game_windowmanager.cursorstate.md deleted file mode 100644 index 33e31788..00000000 --- a/docs/enums/frontend_game_windowmanager.cursorstate.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: CursorState - -[Frontend/Game/WindowManager](../modules/frontend_game_windowmanager.md).CursorState - -## Table of contents - -### Enumeration members - -- [Normal](frontend_game_windowmanager.cursorstate.md#normal) -- [TargetingExplorer](frontend_game_windowmanager.cursorstate.md#targetingexplorer) -- [TargetingForces](frontend_game_windowmanager.cursorstate.md#targetingforces) - -## Enumeration members - -### Normal - -• **Normal**: = 0 - ---- - -### TargetingExplorer - -• **TargetingExplorer**: = 1 - ---- - -### TargetingForces - -• **TargetingForces**: = 2 diff --git a/docs/enums/frontend_game_windowmanager.tooltipname.md b/docs/enums/frontend_game_windowmanager.tooltipname.md deleted file mode 100644 index bf6fa8df..00000000 --- a/docs/enums/frontend_game_windowmanager.tooltipname.md +++ /dev/null @@ -1,358 +0,0 @@ -# Enumeration: TooltipName - -[Frontend/Game/WindowManager](../modules/frontend_game_windowmanager.md).TooltipName - -## Table of contents - -### Enumeration members - -- [ArtifactBuff](frontend_game_windowmanager.tooltipname.md#artifactbuff) -- [ArtifactStored](frontend_game_windowmanager.tooltipname.md#artifactstored) -- [Bonus](frontend_game_windowmanager.tooltipname.md#bonus) -- [BonusDefense](frontend_game_windowmanager.tooltipname.md#bonusdefense) -- [BonusEnergyCap](frontend_game_windowmanager.tooltipname.md#bonusenergycap) -- [BonusEnergyGro](frontend_game_windowmanager.tooltipname.md#bonusenergygro) -- [BonusRange](frontend_game_windowmanager.tooltipname.md#bonusrange) -- [BonusSpeed](frontend_game_windowmanager.tooltipname.md#bonusspeed) -- [Clowntown](frontend_game_windowmanager.tooltipname.md#clowntown) -- [CurrentMining](frontend_game_windowmanager.tooltipname.md#currentmining) -- [Defense](frontend_game_windowmanager.tooltipname.md#defense) -- [Energy](frontend_game_windowmanager.tooltipname.md#energy) -- [EnergyGrowth](frontend_game_windowmanager.tooltipname.md#energygrowth) -- [FindArtifact](frontend_game_windowmanager.tooltipname.md#findartifact) -- [HashesPerSec](frontend_game_windowmanager.tooltipname.md#hashespersec) -- [HoverPlanet](frontend_game_windowmanager.tooltipname.md#hoverplanet) -- [MaxLevel](frontend_game_windowmanager.tooltipname.md#maxlevel) -- [MinEnergy](frontend_game_windowmanager.tooltipname.md#minenergy) -- [MiningPause](frontend_game_windowmanager.tooltipname.md#miningpause) -- [MiningTarget](frontend_game_windowmanager.tooltipname.md#miningtarget) -- [ModalFindArtifact](frontend_game_windowmanager.tooltipname.md#modalfindartifact) -- [ModalHats](frontend_game_windowmanager.tooltipname.md#modalhats) -- [ModalHelp](frontend_game_windowmanager.tooltipname.md#modalhelp) -- [ModalLeaderboard](frontend_game_windowmanager.tooltipname.md#modalleaderboard) -- [ModalPlanetDetails](frontend_game_windowmanager.tooltipname.md#modalplanetdetails) -- [ModalPlanetDex](frontend_game_windowmanager.tooltipname.md#modalplanetdex) -- [ModalPlugins](frontend_game_windowmanager.tooltipname.md#modalplugins) -- [ModalSettings](frontend_game_windowmanager.tooltipname.md#modalsettings) -- [ModalTwitterBroadcast](frontend_game_windowmanager.tooltipname.md#modaltwitterbroadcast) -- [ModalTwitterVerification](frontend_game_windowmanager.tooltipname.md#modaltwitterverification) -- [ModalUpgradeDetails](frontend_game_windowmanager.tooltipname.md#modalupgradedetails) -- [ModalWithdrawSilver](frontend_game_windowmanager.tooltipname.md#modalwithdrawsilver) -- [ModalYourArtifacts](frontend_game_windowmanager.tooltipname.md#modalyourartifacts) -- [None](frontend_game_windowmanager.tooltipname.md#none) -- [Pirates](frontend_game_windowmanager.tooltipname.md#pirates) -- [PlanetRank](frontend_game_windowmanager.tooltipname.md#planetrank) -- [Range](frontend_game_windowmanager.tooltipname.md#range) -- [Rank](frontend_game_windowmanager.tooltipname.md#rank) -- [Score](frontend_game_windowmanager.tooltipname.md#score) -- [SelectedEnergy](frontend_game_windowmanager.tooltipname.md#selectedenergy) -- [SelectedSilver](frontend_game_windowmanager.tooltipname.md#selectedsilver) -- [Silver](frontend_game_windowmanager.tooltipname.md#silver) -- [SilverCap](frontend_game_windowmanager.tooltipname.md#silvercap) -- [SilverGrowth](frontend_game_windowmanager.tooltipname.md#silvergrowth) -- [SilverProd](frontend_game_windowmanager.tooltipname.md#silverprod) -- [Speed](frontend_game_windowmanager.tooltipname.md#speed) -- [Time50](frontend_game_windowmanager.tooltipname.md#time50) -- [Time90](frontend_game_windowmanager.tooltipname.md#time90) -- [TwitterHandle](frontend_game_windowmanager.tooltipname.md#twitterhandle) -- [Upgrades](frontend_game_windowmanager.tooltipname.md#upgrades) - -## Enumeration members - -### ArtifactBuff - -• **ArtifactBuff**: = 36 - ---- - -### ArtifactStored - -• **ArtifactStored**: = 14 - ---- - -### Bonus - -• **Bonus**: = 5 - ---- - -### BonusDefense - -• **BonusDefense**: = 29 - ---- - -### BonusEnergyCap - -• **BonusEnergyCap**: = 25 - ---- - -### BonusEnergyGro - -• **BonusEnergyGro**: = 26 - ---- - -### BonusRange - -• **BonusRange**: = 27 - ---- - -### BonusSpeed - -• **BonusSpeed**: = 28 - ---- - -### Clowntown - -• **Clowntown**: = 35 - ---- - -### CurrentMining - -• **CurrentMining**: = 22 - ---- - -### Defense - -• **Defense**: = 34 - ---- - -### Energy - -• **Energy**: = 30 - ---- - -### EnergyGrowth - -• **EnergyGrowth**: = 31 - ---- - -### FindArtifact - -• **FindArtifact**: = 13 - ---- - -### HashesPerSec - -• **HashesPerSec**: = 21 - ---- - -### HoverPlanet - -• **HoverPlanet**: = 23 - ---- - -### MaxLevel - -• **MaxLevel**: = 12 - ---- - -### MinEnergy - -• **MinEnergy**: = 6 - ---- - -### MiningPause - -• **MiningPause**: = 19 - ---- - -### MiningTarget - -• **MiningTarget**: = 20 - ---- - -### ModalFindArtifact - -• **ModalFindArtifact**: = 47 - ---- - -### ModalHats - -• **ModalHats**: = 44 - ---- - -### ModalHelp - -• **ModalHelp**: = 37 - ---- - -### ModalLeaderboard - -• **ModalLeaderboard**: = 39 - ---- - -### ModalPlanetDetails - -• **ModalPlanetDetails**: = 38 - ---- - -### ModalPlanetDex - -• **ModalPlanetDex**: = 40 - ---- - -### ModalPlugins - -• **ModalPlugins**: = 48 - ---- - -### ModalSettings - -• **ModalSettings**: = 45 - ---- - -### ModalTwitterBroadcast - -• **ModalTwitterBroadcast**: = 43 - ---- - -### ModalTwitterVerification - -• **ModalTwitterVerification**: = 42 - ---- - -### ModalUpgradeDetails - -• **ModalUpgradeDetails**: = 41 - ---- - -### ModalWithdrawSilver - -• **ModalWithdrawSilver**: = 49 - ---- - -### ModalYourArtifacts - -• **ModalYourArtifacts**: = 46 - ---- - -### None - -• **None**: = 0 - ---- - -### Pirates - -• **Pirates**: = 9 - ---- - -### PlanetRank - -• **PlanetRank**: = 11 - ---- - -### Range - -• **Range**: = 32 - ---- - -### Rank - -• **Rank**: = 17 - ---- - -### Score - -• **Score**: = 18 - ---- - -### SelectedEnergy - -• **SelectedEnergy**: = 16 - ---- - -### SelectedSilver - -• **SelectedSilver**: = 15 - ---- - -### Silver - -• **Silver**: = 3 - ---- - -### SilverCap - -• **SilverCap**: = 2 - ---- - -### SilverGrowth - -• **SilverGrowth**: = 1 - ---- - -### SilverProd - -• **SilverProd**: = 24 - ---- - -### Speed - -• **Speed**: = 33 - ---- - -### Time50 - -• **Time50**: = 7 - ---- - -### Time90 - -• **Time90**: = 8 - ---- - -### TwitterHandle - -• **TwitterHandle**: = 4 - ---- - -### Upgrades - -• **Upgrades**: = 10 diff --git a/docs/enums/frontend_game_windowmanager.windowmanagerevent.md b/docs/enums/frontend_game_windowmanager.windowmanagerevent.md deleted file mode 100644 index cfe382cd..00000000 --- a/docs/enums/frontend_game_windowmanager.windowmanagerevent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Enumeration: WindowManagerEvent - -[Frontend/Game/WindowManager](../modules/frontend_game_windowmanager.md).WindowManagerEvent - -## Table of contents - -### Enumeration members - -- [CtrlDown](frontend_game_windowmanager.windowmanagerevent.md#ctrldown) -- [CtrlUp](frontend_game_windowmanager.windowmanagerevent.md#ctrlup) -- [MiningCoordsUpdate](frontend_game_windowmanager.windowmanagerevent.md#miningcoordsupdate) -- [StateChanged](frontend_game_windowmanager.windowmanagerevent.md#statechanged) -- [TooltipUpdated](frontend_game_windowmanager.windowmanagerevent.md#tooltipupdated) - -## Enumeration members - -### CtrlDown - -• **CtrlDown**: = "CtrlDown" - ---- - -### CtrlUp - -• **CtrlUp**: = "CtrlUp" - ---- - -### MiningCoordsUpdate - -• **MiningCoordsUpdate**: = "MiningCoordsUpdate" - ---- - -### StateChanged - -• **StateChanged**: = "StateChanged" - ---- - -### TooltipUpdated - -• **TooltipUpdated**: = "TooltipUpdated" diff --git a/docs/enums/frontend_pages_gamelandingpage.initrenderstate.md b/docs/enums/frontend_pages_gamelandingpage.initrenderstate.md deleted file mode 100644 index 987d6f2f..00000000 --- a/docs/enums/frontend_pages_gamelandingpage.initrenderstate.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: InitRenderState - -[Frontend/Pages/GameLandingPage](../modules/frontend_pages_gamelandingpage.md).InitRenderState - -## Table of contents - -### Enumeration members - -- [COMPLETE](frontend_pages_gamelandingpage.initrenderstate.md#complete) -- [LOADING](frontend_pages_gamelandingpage.initrenderstate.md#loading) -- [NONE](frontend_pages_gamelandingpage.initrenderstate.md#none) - -## Enumeration members - -### COMPLETE - -• **COMPLETE**: = 2 - ---- - -### LOADING - -• **LOADING**: = 1 - ---- - -### NONE - -• **NONE**: = 0 diff --git a/docs/enums/frontend_pages_landingpage.landingpagezindex.md b/docs/enums/frontend_pages_landingpage.landingpagezindex.md deleted file mode 100644 index a7e556fa..00000000 --- a/docs/enums/frontend_pages_landingpage.landingpagezindex.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: LandingPageZIndex - -[Frontend/Pages/LandingPage](../modules/frontend_pages_landingpage.md).LandingPageZIndex - -## Table of contents - -### Enumeration members - -- [Background](frontend_pages_landingpage.landingpagezindex.md#background) -- [BasePage](frontend_pages_landingpage.landingpagezindex.md#basepage) -- [Canvas](frontend_pages_landingpage.landingpagezindex.md#canvas) - -## Enumeration members - -### Background - -• **Background**: = 0 - ---- - -### BasePage - -• **BasePage**: = 2 - ---- - -### Canvas - -• **Canvas**: = 1 diff --git a/docs/enums/frontend_pages_unsubscribepage.landingpagezindex.md b/docs/enums/frontend_pages_unsubscribepage.landingpagezindex.md deleted file mode 100644 index de12b178..00000000 --- a/docs/enums/frontend_pages_unsubscribepage.landingpagezindex.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: LandingPageZIndex - -[Frontend/Pages/UnsubscribePage](../modules/frontend_pages_unsubscribepage.md).LandingPageZIndex - -## Table of contents - -### Enumeration members - -- [Background](frontend_pages_unsubscribepage.landingpagezindex.md#background) -- [BasePage](frontend_pages_unsubscribepage.landingpagezindex.md#basepage) -- [Canvas](frontend_pages_unsubscribepage.landingpagezindex.md#canvas) - -## Enumeration members - -### Background - -• **Background**: = 0 - ---- - -### BasePage - -• **BasePage**: = 2 - ---- - -### Canvas - -• **Canvas**: = 1 diff --git a/docs/enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md b/docs/enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md deleted file mode 100644 index 64347c3c..00000000 --- a/docs/enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md +++ /dev/null @@ -1,22 +0,0 @@ -# Enumeration: AttribType - -[Frontend/Renderers/GameRenderer/EngineTypes](../modules/frontend_renderers_gamerenderer_enginetypes.md).AttribType - -## Table of contents - -### Enumeration members - -- [Float](frontend_renderers_gamerenderer_enginetypes.attribtype.md#float) -- [UByte](frontend_renderers_gamerenderer_enginetypes.attribtype.md#ubyte) - -## Enumeration members - -### Float - -• **Float**: - ---- - -### UByte - -• **UByte**: diff --git a/docs/enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md b/docs/enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md deleted file mode 100644 index 535c1398..00000000 --- a/docs/enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: DrawMode - -[Frontend/Renderers/GameRenderer/EngineTypes](../modules/frontend_renderers_gamerenderer_enginetypes.md).DrawMode - -## Table of contents - -### Enumeration members - -- [Lines](frontend_renderers_gamerenderer_enginetypes.drawmode.md#lines) -- [Points](frontend_renderers_gamerenderer_enginetypes.drawmode.md#points) -- [Triangles](frontend_renderers_gamerenderer_enginetypes.drawmode.md#triangles) - -## Enumeration members - -### Lines - -• **Lines**: - ---- - -### Points - -• **Points**: - ---- - -### Triangles - -• **Triangles**: diff --git a/docs/enums/frontend_renderers_gamerenderer_enginetypes.renderzindex.md b/docs/enums/frontend_renderers_gamerenderer_enginetypes.renderzindex.md deleted file mode 100644 index ff19e6e3..00000000 --- a/docs/enums/frontend_renderers_gamerenderer_enginetypes.renderzindex.md +++ /dev/null @@ -1,57 +0,0 @@ -# Enumeration: RenderZIndex - -[Frontend/Renderers/GameRenderer/EngineTypes](../modules/frontend_renderers_gamerenderer_enginetypes.md).RenderZIndex - -## Table of contents - -### Enumeration members - -- [Background](frontend_renderers_gamerenderer_enginetypes.renderzindex.md#background) -- [DEFAULT](frontend_renderers_gamerenderer_enginetypes.renderzindex.md#default) -- [MAX](frontend_renderers_gamerenderer_enginetypes.renderzindex.md#max) -- [Planets](frontend_renderers_gamerenderer_enginetypes.renderzindex.md#planets) -- [Text](frontend_renderers_gamerenderer_enginetypes.renderzindex.md#text) -- [UI](frontend_renderers_gamerenderer_enginetypes.renderzindex.md#ui) -- [Voyages](frontend_renderers_gamerenderer_enginetypes.renderzindex.md#voyages) - -## Enumeration members - -### Background - -• **Background**: = 0 - ---- - -### DEFAULT - -• **DEFAULT**: = -98 - ---- - -### MAX - -• **MAX**: = -99 - ---- - -### Planets - -• **Planets**: = -10 - ---- - -### Text - -• **Text**: = -11 - ---- - -### UI - -• **UI**: = -12 - ---- - -### Voyages - -• **Voyages**: = -1 diff --git a/docs/enums/frontend_renderers_gamerenderer_enginetypes.textalign.md b/docs/enums/frontend_renderers_gamerenderer_enginetypes.textalign.md deleted file mode 100644 index 6b979529..00000000 --- a/docs/enums/frontend_renderers_gamerenderer_enginetypes.textalign.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: TextAlign - -[Frontend/Renderers/GameRenderer/EngineTypes](../modules/frontend_renderers_gamerenderer_enginetypes.md).TextAlign - -## Table of contents - -### Enumeration members - -- [Center](frontend_renderers_gamerenderer_enginetypes.textalign.md#center) -- [Left](frontend_renderers_gamerenderer_enginetypes.textalign.md#left) -- [Right](frontend_renderers_gamerenderer_enginetypes.textalign.md#right) - -## Enumeration members - -### Center - -• **Center**: = 0.5 - ---- - -### Left - -• **Left**: = 0 - ---- - -### Right - -• **Right**: = 1 diff --git a/docs/enums/frontend_renderers_gamerenderer_enginetypes.textanchor.md b/docs/enums/frontend_renderers_gamerenderer_enginetypes.textanchor.md deleted file mode 100644 index 448ece3b..00000000 --- a/docs/enums/frontend_renderers_gamerenderer_enginetypes.textanchor.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: TextAnchor - -[Frontend/Renderers/GameRenderer/EngineTypes](../modules/frontend_renderers_gamerenderer_enginetypes.md).TextAnchor - -## Table of contents - -### Enumeration members - -- [Bottom](frontend_renderers_gamerenderer_enginetypes.textanchor.md#bottom) -- [Middle](frontend_renderers_gamerenderer_enginetypes.textanchor.md#middle) -- [Top](frontend_renderers_gamerenderer_enginetypes.textanchor.md#top) - -## Enumeration members - -### Bottom - -• **Bottom**: = 1 - ---- - -### Middle - -• **Middle**: = 0.5 - ---- - -### Top - -• **Top**: = 0 diff --git a/docs/enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md b/docs/enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md deleted file mode 100644 index c895d214..00000000 --- a/docs/enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md +++ /dev/null @@ -1,50 +0,0 @@ -# Enumeration: UniformType - -[Frontend/Renderers/GameRenderer/EngineTypes](../modules/frontend_renderers_gamerenderer_enginetypes.md).UniformType - -## Table of contents - -### Enumeration members - -- [Float](frontend_renderers_gamerenderer_enginetypes.uniformtype.md#float) -- [Mat3](frontend_renderers_gamerenderer_enginetypes.uniformtype.md#mat3) -- [Mat4](frontend_renderers_gamerenderer_enginetypes.uniformtype.md#mat4) -- [Texture](frontend_renderers_gamerenderer_enginetypes.uniformtype.md#texture) -- [UByte](frontend_renderers_gamerenderer_enginetypes.uniformtype.md#ubyte) -- [Vec3](frontend_renderers_gamerenderer_enginetypes.uniformtype.md#vec3) - -## Enumeration members - -### Float - -• **Float**: = 3 - ---- - -### Mat3 - -• **Mat3**: = 1 - ---- - -### Mat4 - -• **Mat4**: = 0 - ---- - -### Texture - -• **Texture**: = 4 - ---- - -### UByte - -• **UByte**: = 2 - ---- - -### Vec3 - -• **Vec3**: = 5 diff --git a/docs/enums/frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md b/docs/enums/frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md deleted file mode 100644 index 239dc3ce..00000000 --- a/docs/enums/frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: PerlinOctave - -[Frontend/Renderers/GameRenderer/Entities/PerlinUtils](../modules/frontend_renderers_gamerenderer_entities_perlinutils.md).PerlinOctave - -## Table of contents - -### Enumeration members - -- [\_0](frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md#_0) -- [\_1](frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md#_1) -- [\_2](frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md#_2) - -## Enumeration members - -### \_0 - -• **\_0**: = 0 - ---- - -### \_1 - -• **\_1**: = 1 - ---- - -### \_2 - -• **\_2**: = 2 diff --git a/docs/enums/frontend_utils_browserchecks.incompatibility.md b/docs/enums/frontend_utils_browserchecks.incompatibility.md deleted file mode 100644 index 2dad9f83..00000000 --- a/docs/enums/frontend_utils_browserchecks.incompatibility.md +++ /dev/null @@ -1,50 +0,0 @@ -# Enumeration: Incompatibility - -[Frontend/Utils/BrowserChecks](../modules/frontend_utils_browserchecks.md).Incompatibility - -## Table of contents - -### Enumeration members - -- [MobileOrTablet](frontend_utils_browserchecks.incompatibility.md#mobileortablet) -- [NoIDB](frontend_utils_browserchecks.incompatibility.md#noidb) -- [NotLoggedInOrEnabled](frontend_utils_browserchecks.incompatibility.md#notloggedinorenabled) -- [NotRopsten](frontend_utils_browserchecks.incompatibility.md#notropsten) -- [UnexpectedError](frontend_utils_browserchecks.incompatibility.md#unexpectederror) -- [UnsupportedBrowser](frontend_utils_browserchecks.incompatibility.md#unsupportedbrowser) - -## Enumeration members - -### MobileOrTablet - -• **MobileOrTablet**: = "mobile_or_tablet" - ---- - -### NoIDB - -• **NoIDB**: = "no_idb" - ---- - -### NotLoggedInOrEnabled - -• **NotLoggedInOrEnabled**: = "not_logged_in_or_enabled" - ---- - -### NotRopsten - -• **NotRopsten**: = "not_ropsten" - ---- - -### UnexpectedError - -• **UnexpectedError**: = "unexpected_error" - ---- - -### UnsupportedBrowser - -• **UnsupportedBrowser**: = "unsupported_browser" diff --git a/docs/enums/frontend_utils_constants.gamewindowzindex.md b/docs/enums/frontend_utils_constants.gamewindowzindex.md deleted file mode 100644 index 86ab1ecb..00000000 --- a/docs/enums/frontend_utils_constants.gamewindowzindex.md +++ /dev/null @@ -1,36 +0,0 @@ -# Enumeration: GameWindowZIndex - -[Frontend/Utils/constants](../modules/frontend_utils_constants.md).GameWindowZIndex - -## Table of contents - -### Enumeration members - -- [HoverPlanet](frontend_utils_constants.gamewindowzindex.md#hoverplanet) -- [MenuBar](frontend_utils_constants.gamewindowzindex.md#menubar) -- [Modal](frontend_utils_constants.gamewindowzindex.md#modal) -- [Tooltip](frontend_utils_constants.gamewindowzindex.md#tooltip) - -## Enumeration members - -### HoverPlanet - -• **HoverPlanet**: = 999 - ---- - -### MenuBar - -• **MenuBar**: = 4 - ---- - -### Modal - -• **Modal**: = 1000 - ---- - -### Tooltip - -• **Tooltip**: = 16000000 diff --git a/docs/enums/frontend_utils_hats.hattype.md b/docs/enums/frontend_utils_hats.hattype.md deleted file mode 100644 index d06aecf2..00000000 --- a/docs/enums/frontend_utils_hats.hattype.md +++ /dev/null @@ -1,78 +0,0 @@ -# Enumeration: HatType - -[Frontend/Utils/Hats](../modules/frontend_utils_hats.md).HatType - -## Table of contents - -### Enumeration members - -- [ChefHat](frontend_utils_hats.hattype.md#chefhat) -- [CowboyHat](frontend_utils_hats.hattype.md#cowboyhat) -- [Fez](frontend_utils_hats.hattype.md#fez) -- [Fish](frontend_utils_hats.hattype.md#fish) -- [GraduationCap](frontend_utils_hats.hattype.md#graduationcap) -- [PartyHat](frontend_utils_hats.hattype.md#partyhat) -- [PopeHat](frontend_utils_hats.hattype.md#popehat) -- [SantaHat](frontend_utils_hats.hattype.md#santahat) -- [Squid](frontend_utils_hats.hattype.md#squid) -- [TopHat](frontend_utils_hats.hattype.md#tophat) - -## Enumeration members - -### ChefHat - -• **ChefHat**: = "ChefHat" - ---- - -### CowboyHat - -• **CowboyHat**: = "CowboyHat" - ---- - -### Fez - -• **Fez**: = "Fez" - ---- - -### Fish - -• **Fish**: = "Fish" - ---- - -### GraduationCap - -• **GraduationCap**: = "GraduationCap" - ---- - -### PartyHat - -• **PartyHat**: = "PartyHat" - ---- - -### PopeHat - -• **PopeHat**: = "PopeHat" - ---- - -### SantaHat - -• **SantaHat**: = "SantaHat" - ---- - -### Squid - -• **Squid**: = "Squid" - ---- - -### TopHat - -• **TopHat**: = "TopHat" diff --git a/docs/enums/frontend_utils_settingshooks.autogassetting.md b/docs/enums/frontend_utils_settingshooks.autogassetting.md deleted file mode 100644 index eb43be9c..00000000 --- a/docs/enums/frontend_utils_settingshooks.autogassetting.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: AutoGasSetting - -[Frontend/Utils/SettingsHooks](../modules/frontend_utils_settingshooks.md).AutoGasSetting - -## Table of contents - -### Enumeration members - -- [Average](frontend_utils_settingshooks.autogassetting.md#average) -- [Fast](frontend_utils_settingshooks.autogassetting.md#fast) -- [Slow](frontend_utils_settingshooks.autogassetting.md#slow) - -## Enumeration members - -### Average - -• **Average**: = "Average" - ---- - -### Fast - -• **Fast**: = "Fast" - ---- - -### Slow - -• **Slow**: = "Slow" diff --git a/docs/enums/frontend_utils_settingshooks.setting.md b/docs/enums/frontend_utils_settingshooks.setting.md deleted file mode 100644 index 9de6c4d4..00000000 --- a/docs/enums/frontend_utils_settingshooks.setting.md +++ /dev/null @@ -1,151 +0,0 @@ -# Enumeration: Setting - -[Frontend/Utils/SettingsHooks](../modules/frontend_utils_settingshooks.md).Setting - -Each setting has a unique identifier. Each account gets to store its own local storage setting, -per instance of the dark forest contract that it's connected to. - -## Table of contents - -### Enumeration members - -- [AutoApproveNonPurchaseTransactions](frontend_utils_settingshooks.setting.md#autoapprovenonpurchasetransactions) -- [DrawChunkBorders](frontend_utils_settingshooks.setting.md#drawchunkborders) -- [FoundArtifact](frontend_utils_settingshooks.setting.md#foundartifact) -- [FoundComet](frontend_utils_settingshooks.setting.md#foundcomet) -- [FoundDeepSpace](frontend_utils_settingshooks.setting.md#founddeepspace) -- [FoundPirates](frontend_utils_settingshooks.setting.md#foundpirates) -- [FoundSilver](frontend_utils_settingshooks.setting.md#foundsilver) -- [FoundSilverBank](frontend_utils_settingshooks.setting.md#foundsilverbank) -- [FoundSpace](frontend_utils_settingshooks.setting.md#foundspace) -- [FoundTradingPost](frontend_utils_settingshooks.setting.md#foundtradingpost) -- [GasFeeGwei](frontend_utils_settingshooks.setting.md#gasfeegwei) -- [HasAcceptedPluginRisk](frontend_utils_settingshooks.setting.md#hasacceptedpluginrisk) -- [HighPerformanceRendering](frontend_utils_settingshooks.setting.md#highperformancerendering) -- [MiningCores](frontend_utils_settingshooks.setting.md#miningcores) -- [MoveNotifications](frontend_utils_settingshooks.setting.md#movenotifications) -- [NewPlayer](frontend_utils_settingshooks.setting.md#newplayer) -- [OptOutMetrics](frontend_utils_settingshooks.setting.md#optoutmetrics) -- [TerminalVisible](frontend_utils_settingshooks.setting.md#terminalvisible) -- [TutorialCompleted](frontend_utils_settingshooks.setting.md#tutorialcompleted) -- [TutorialOpen](frontend_utils_settingshooks.setting.md#tutorialopen) - -## Enumeration members - -### AutoApproveNonPurchaseTransactions - -• **AutoApproveNonPurchaseTransactions**: = "AutoApproveNonPurchaseTransactions" - ---- - -### DrawChunkBorders - -• **DrawChunkBorders**: = "DrawChunkBorders" - ---- - -### FoundArtifact - -• **FoundArtifact**: = "FoundArtifact" - ---- - -### FoundComet - -• **FoundComet**: = "FoundComet" - ---- - -### FoundDeepSpace - -• **FoundDeepSpace**: = "FoundDeepSpace" - ---- - -### FoundPirates - -• **FoundPirates**: = "FoundPirates" - ---- - -### FoundSilver - -• **FoundSilver**: = "FoundSilver" - ---- - -### FoundSilverBank - -• **FoundSilverBank**: = "FoundSilverBank" - ---- - -### FoundSpace - -• **FoundSpace**: = "FoundSpace" - ---- - -### FoundTradingPost - -• **FoundTradingPost**: = "FoundTradingPost" - ---- - -### GasFeeGwei - -• **GasFeeGwei**: = "GasFeeGwei" - ---- - -### HasAcceptedPluginRisk - -• **HasAcceptedPluginRisk**: = "HasAcceptedPluginRisk" - ---- - -### HighPerformanceRendering - -• **HighPerformanceRendering**: = "HighPerformanceRendering" - ---- - -### MiningCores - -• **MiningCores**: = "MiningCores" - ---- - -### MoveNotifications - -• **MoveNotifications**: = "MoveNotifications" - ---- - -### NewPlayer - -• **NewPlayer**: = "NewPlayer" - ---- - -### OptOutMetrics - -• **OptOutMetrics**: = "OptOutMetrics" - ---- - -### TerminalVisible - -• **TerminalVisible**: = "TerminalVisible" - ---- - -### TutorialCompleted - -• **TutorialCompleted**: = "TutorialCompleted" - ---- - -### TutorialOpen - -• **TutorialOpen**: = "TutorialOpen" diff --git a/docs/enums/frontend_utils_terminaltypes.terminaltextstyle.md b/docs/enums/frontend_utils_terminaltypes.terminaltextstyle.md deleted file mode 100644 index e9404534..00000000 --- a/docs/enums/frontend_utils_terminaltypes.terminaltextstyle.md +++ /dev/null @@ -1,71 +0,0 @@ -# Enumeration: TerminalTextStyle - -[Frontend/Utils/TerminalTypes](../modules/frontend_utils_terminaltypes.md).TerminalTextStyle - -## Table of contents - -### Enumeration members - -- [Blue](frontend_utils_terminaltypes.terminaltextstyle.md#blue) -- [Default](frontend_utils_terminaltypes.terminaltextstyle.md#default) -- [Green](frontend_utils_terminaltypes.terminaltextstyle.md#green) -- [Hoverable](frontend_utils_terminaltypes.terminaltextstyle.md#hoverable) -- [Invisible](frontend_utils_terminaltypes.terminaltextstyle.md#invisible) -- [Red](frontend_utils_terminaltypes.terminaltextstyle.md#red) -- [Sub](frontend_utils_terminaltypes.terminaltextstyle.md#sub) -- [Underline](frontend_utils_terminaltypes.terminaltextstyle.md#underline) -- [White](frontend_utils_terminaltypes.terminaltextstyle.md#white) - -## Enumeration members - -### Blue - -• **Blue**: = 4 - ---- - -### Default - -• **Default**: = 6 - ---- - -### Green - -• **Green**: = 0 - ---- - -### Hoverable - -• **Hoverable**: = 8 - ---- - -### Invisible - -• **Invisible**: = 5 - ---- - -### Red - -• **Red**: = 3 - ---- - -### Sub - -• **Sub**: = 1 - ---- - -### Underline - -• **Underline**: = 7 - ---- - -### White - -• **White**: = 2 diff --git a/docs/enums/frontend_utils_uiemitter.uiemitterevent.md b/docs/enums/frontend_utils_uiemitter.uiemitterevent.md deleted file mode 100644 index 3539bfe7..00000000 --- a/docs/enums/frontend_utils_uiemitter.uiemitterevent.md +++ /dev/null @@ -1,169 +0,0 @@ -# Enumeration: UIEmitterEvent - -[Frontend/Utils/UIEmitter](../modules/frontend_utils_uiemitter.md).UIEmitterEvent - -## Table of contents - -### Enumeration members - -- [CanvasMouseDown](frontend_utils_uiemitter.uiemitterevent.md#canvasmousedown) -- [CanvasMouseMove](frontend_utils_uiemitter.uiemitterevent.md#canvasmousemove) -- [CanvasMouseOut](frontend_utils_uiemitter.uiemitterevent.md#canvasmouseout) -- [CanvasMouseUp](frontend_utils_uiemitter.uiemitterevent.md#canvasmouseup) -- [CanvasScroll](frontend_utils_uiemitter.uiemitterevent.md#canvasscroll) -- [CenterPlanet](frontend_utils_uiemitter.uiemitterevent.md#centerplanet) -- [DepositArtifact](frontend_utils_uiemitter.uiemitterevent.md#depositartifact) -- [DepositToPlanet](frontend_utils_uiemitter.uiemitterevent.md#deposittoplanet) -- [GamePlanetSelected](frontend_utils_uiemitter.uiemitterevent.md#gameplanetselected) -- [SelectArtifact](frontend_utils_uiemitter.uiemitterevent.md#selectartifact) -- [SendCancelled](frontend_utils_uiemitter.uiemitterevent.md#sendcancelled) -- [SendCompleted](frontend_utils_uiemitter.uiemitterevent.md#sendcompleted) -- [SendInitiated](frontend_utils_uiemitter.uiemitterevent.md#sendinitiated) -- [ShowArtifact](frontend_utils_uiemitter.uiemitterevent.md#showartifact) -- [UIChange](frontend_utils_uiemitter.uiemitterevent.md#uichange) -- [WindowResize](frontend_utils_uiemitter.uiemitterevent.md#windowresize) -- [WorldMouseClick](frontend_utils_uiemitter.uiemitterevent.md#worldmouseclick) -- [WorldMouseDown](frontend_utils_uiemitter.uiemitterevent.md#worldmousedown) -- [WorldMouseMove](frontend_utils_uiemitter.uiemitterevent.md#worldmousemove) -- [WorldMouseOut](frontend_utils_uiemitter.uiemitterevent.md#worldmouseout) -- [WorldMouseUp](frontend_utils_uiemitter.uiemitterevent.md#worldmouseup) -- [ZoomIn](frontend_utils_uiemitter.uiemitterevent.md#zoomin) -- [ZoomOut](frontend_utils_uiemitter.uiemitterevent.md#zoomout) - -## Enumeration members - -### CanvasMouseDown - -• **CanvasMouseDown**: = "CanvasMouseDown" - ---- - -### CanvasMouseMove - -• **CanvasMouseMove**: = "CanvasMouseMove" - ---- - -### CanvasMouseOut - -• **CanvasMouseOut**: = "CanvasMouseOut" - ---- - -### CanvasMouseUp - -• **CanvasMouseUp**: = "CanvasMouseUp" - ---- - -### CanvasScroll - -• **CanvasScroll**: = "CanvasScroll" - ---- - -### CenterPlanet - -• **CenterPlanet**: = "CenterPlanet" - ---- - -### DepositArtifact - -• **DepositArtifact**: = "DepositArtifact" - ---- - -### DepositToPlanet - -• **DepositToPlanet**: = "DepositToPlanet" - ---- - -### GamePlanetSelected - -• **GamePlanetSelected**: = "GamePlanetSelected" - ---- - -### SelectArtifact - -• **SelectArtifact**: = "SelectArtifact" - ---- - -### SendCancelled - -• **SendCancelled**: = "SendCancelled" - ---- - -### SendCompleted - -• **SendCompleted**: = "SendCompleted" - ---- - -### SendInitiated - -• **SendInitiated**: = "SendInitiated" - ---- - -### ShowArtifact - -• **ShowArtifact**: = "ShowArtifact" - ---- - -### UIChange - -• **UIChange**: = "UIChange" - ---- - -### WindowResize - -• **WindowResize**: = "WindowResize" - ---- - -### WorldMouseClick - -• **WorldMouseClick**: = "WorldMouseClick" - ---- - -### WorldMouseDown - -• **WorldMouseDown**: = "WorldMouseDown" - ---- - -### WorldMouseMove - -• **WorldMouseMove**: = "WorldMouseMove" - ---- - -### WorldMouseOut - -• **WorldMouseOut**: = "WorldMouseOut" - ---- - -### WorldMouseUp - -• **WorldMouseUp**: = "WorldMouseUp" - ---- - -### ZoomIn - -• **ZoomIn**: = "ZoomIn" - ---- - -### ZoomOut - -• **ZoomOut**: = "ZoomOut" diff --git a/docs/enums/frontend_views_modalpane.modalname.md b/docs/enums/frontend_views_modalpane.modalname.md deleted file mode 100644 index 029ef2da..00000000 --- a/docs/enums/frontend_views_modalpane.modalname.md +++ /dev/null @@ -1,141 +0,0 @@ -# Enumeration: ModalName - -[Frontend/Views/ModalPane](../modules/frontend_views_modalpane.md).ModalName - -## Table of contents - -### Enumeration members - -- [ArtifactConversation](frontend_views_modalpane.modalname.md#artifactconversation) -- [ArtifactDetails](frontend_views_modalpane.modalname.md#artifactdetails) -- [Hats](frontend_views_modalpane.modalname.md#hats) -- [Help](frontend_views_modalpane.modalname.md#help) -- [Leaderboard](frontend_views_modalpane.modalname.md#leaderboard) -- [ManageAccount](frontend_views_modalpane.modalname.md#manageaccount) -- [ManageArtifacts](frontend_views_modalpane.modalname.md#manageartifacts) -- [MapShare](frontend_views_modalpane.modalname.md#mapshare) -- [Onboarding](frontend_views_modalpane.modalname.md#onboarding) -- [PlanetDetails](frontend_views_modalpane.modalname.md#planetdetails) -- [PlanetDex](frontend_views_modalpane.modalname.md#planetdex) -- [Plugins](frontend_views_modalpane.modalname.md#plugins) -- [Private](frontend_views_modalpane.modalname.md#private) -- [Settings](frontend_views_modalpane.modalname.md#settings) -- [TwitterBroadcast](frontend_views_modalpane.modalname.md#twitterbroadcast) -- [TwitterVerify](frontend_views_modalpane.modalname.md#twitterverify) -- [UpgradeDetails](frontend_views_modalpane.modalname.md#upgradedetails) -- [WithdrawSilver](frontend_views_modalpane.modalname.md#withdrawsilver) -- [YourArtifacts](frontend_views_modalpane.modalname.md#yourartifacts) - -## Enumeration members - -### ArtifactConversation - -• **ArtifactConversation**: = 13 - ---- - -### ArtifactDetails - -• **ArtifactDetails**: = 14 - ---- - -### Hats - -• **Hats**: = 7 - ---- - -### Help - -• **Help**: = 0 - ---- - -### Leaderboard - -• **Leaderboard**: = 2 - ---- - -### ManageAccount - -• **ManageAccount**: = 16 - ---- - -### ManageArtifacts - -• **ManageArtifacts**: = 10 - ---- - -### MapShare - -• **MapShare**: = 15 - ---- - -### Onboarding - -• **Onboarding**: = 17 - ---- - -### PlanetDetails - -• **PlanetDetails**: = 1 - ---- - -### PlanetDex - -• **PlanetDex**: = 3 - ---- - -### Plugins - -• **Plugins**: = 11 - ---- - -### Private - -• **Private**: = 18 - ---- - -### Settings - -• **Settings**: = 8 - ---- - -### TwitterBroadcast - -• **TwitterBroadcast**: = 6 - ---- - -### TwitterVerify - -• **TwitterVerify**: = 5 - ---- - -### UpgradeDetails - -• **UpgradeDetails**: = 4 - ---- - -### WithdrawSilver - -• **WithdrawSilver**: = 12 - ---- - -### YourArtifacts - -• **YourArtifacts**: = 9 diff --git a/docs/enums/frontend_views_planetnotifications.planetnotiftype.md b/docs/enums/frontend_views_planetnotifications.planetnotiftype.md deleted file mode 100644 index cc57bd2b..00000000 --- a/docs/enums/frontend_views_planetnotifications.planetnotiftype.md +++ /dev/null @@ -1,43 +0,0 @@ -# Enumeration: PlanetNotifType - -[Frontend/Views/PlanetNotifications](../modules/frontend_views_planetnotifications.md).PlanetNotifType - -## Table of contents - -### Enumeration members - -- [CanAddEmoji](frontend_views_planetnotifications.planetnotiftype.md#canaddemoji) -- [CanFindArtifact](frontend_views_planetnotifications.planetnotiftype.md#canfindartifact) -- [CanProspect](frontend_views_planetnotifications.planetnotiftype.md#canprospect) -- [MaxSilver](frontend_views_planetnotifications.planetnotiftype.md#maxsilver) -- [PlanetCanUpgrade](frontend_views_planetnotifications.planetnotiftype.md#planetcanupgrade) - -## Enumeration members - -### CanAddEmoji - -• **CanAddEmoji**: = 4 - ---- - -### CanFindArtifact - -• **CanFindArtifact**: = 2 - ---- - -### CanProspect - -• **CanProspect**: = 1 - ---- - -### MaxSilver - -• **MaxSilver**: = 3 - ---- - -### PlanetCanUpgrade - -• **PlanetCanUpgrade**: = 0 diff --git a/docs/interfaces/Backend_GameLogic_ArrivalUtils.PlanetDiff.md b/docs/interfaces/Backend_GameLogic_ArrivalUtils.PlanetDiff.md new file mode 100644 index 00000000..5dd3a360 --- /dev/null +++ b/docs/interfaces/Backend_GameLogic_ArrivalUtils.PlanetDiff.md @@ -0,0 +1,35 @@ +# Interface: PlanetDiff + +[Backend/GameLogic/ArrivalUtils](../modules/Backend_GameLogic_ArrivalUtils.md).PlanetDiff + +**`param`** The previously calculated state of a planet + +**`param`** The current calculated state of the planet + +**`param`** The Arrival that caused the state change + +## Table of contents + +### Properties + +- [arrival](Backend_GameLogic_ArrivalUtils.PlanetDiff.md#arrival) +- [current](Backend_GameLogic_ArrivalUtils.PlanetDiff.md#current) +- [previous](Backend_GameLogic_ArrivalUtils.PlanetDiff.md#previous) + +## Properties + +### arrival + +• **arrival**: `QueuedArrival` + +--- + +### current + +• **current**: `Planet` + +--- + +### previous + +• **previous**: `Planet` diff --git a/docs/interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md b/docs/interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md new file mode 100644 index 00000000..695cea34 --- /dev/null +++ b/docs/interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md @@ -0,0 +1,245 @@ +# Interface: RenderedArtifact + +[Backend/GameLogic/ArtifactUtils](../modules/Backend_GameLogic_ArtifactUtils.md).RenderedArtifact + +## Hierarchy + +- `Partial`<`Artifact`\> + + ↳ **`RenderedArtifact`** + +## Table of contents + +### Properties + +- [artifactType](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#artifacttype) +- [currentOwner](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#currentowner) +- [discoverer](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#discoverer) +- [id](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#id) +- [isInititalized](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#isinititalized) +- [lastActivated](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#lastactivated) +- [lastDeactivated](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#lastdeactivated) +- [mintedAtTimestamp](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#mintedattimestamp) +- [onPlanetId](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#onplanetid) +- [onVoyageId](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#onvoyageid) +- [planetBiome](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#planetbiome) +- [planetDiscoveredOn](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#planetdiscoveredon) +- [rarity](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#rarity) +- [timeDelayedUpgrade](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#timedelayedupgrade) +- [unconfirmedActivateArtifact](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#unconfirmedactivateartifact) +- [unconfirmedDeactivateArtifact](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#unconfirmeddeactivateartifact) +- [unconfirmedDepositArtifact](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#unconfirmeddepositartifact) +- [unconfirmedMove](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#unconfirmedmove) +- [unconfirmedWithdrawArtifact](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#unconfirmedwithdrawartifact) +- [upgrade](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#upgrade) +- [wormholeTo](Backend_GameLogic_ArtifactUtils.RenderedArtifact.md#wormholeto) + +## Properties + +### artifactType + +• **artifactType**: `ArtifactType` + +#### Overrides + +Partial.artifactType + +--- + +### currentOwner + +• `Optional` **currentOwner**: `EthAddress` + +#### Inherited from + +Partial.currentOwner + +--- + +### discoverer + +• `Optional` **discoverer**: `EthAddress` + +#### Inherited from + +Partial.discoverer + +--- + +### id + +• **id**: `ArtifactId` + +#### Overrides + +Partial.id + +--- + +### isInititalized + +• `Optional` **isInititalized**: `boolean` + +#### Inherited from + +Partial.isInititalized + +--- + +### lastActivated + +• `Optional` **lastActivated**: `number` + +#### Inherited from + +Partial.lastActivated + +--- + +### lastDeactivated + +• `Optional` **lastDeactivated**: `number` + +#### Inherited from + +Partial.lastDeactivated + +--- + +### mintedAtTimestamp + +• `Optional` **mintedAtTimestamp**: `number` + +#### Inherited from + +Partial.mintedAtTimestamp + +--- + +### onPlanetId + +• `Optional` **onPlanetId**: `LocationId` + +#### Inherited from + +Partial.onPlanetId + +--- + +### onVoyageId + +• `Optional` **onVoyageId**: `VoyageId` + +#### Inherited from + +Partial.onVoyageId + +--- + +### planetBiome + +• **planetBiome**: `Biome` + +#### Overrides + +Partial.planetBiome + +--- + +### planetDiscoveredOn + +• `Optional` **planetDiscoveredOn**: `LocationId` + +#### Inherited from + +Partial.planetDiscoveredOn + +--- + +### rarity + +• **rarity**: `ArtifactRarity` + +#### Overrides + +Partial.rarity + +--- + +### timeDelayedUpgrade + +• `Optional` **timeDelayedUpgrade**: `Upgrade` + +#### Inherited from + +Partial.timeDelayedUpgrade + +--- + +### unconfirmedActivateArtifact + +• `Optional` **unconfirmedActivateArtifact**: `UnconfirmedActivateArtifact` + +#### Inherited from + +Partial.unconfirmedActivateArtifact + +--- + +### unconfirmedDeactivateArtifact + +• `Optional` **unconfirmedDeactivateArtifact**: `UnconfirmedDeactivateArtifact` + +#### Inherited from + +Partial.unconfirmedDeactivateArtifact + +--- + +### unconfirmedDepositArtifact + +• `Optional` **unconfirmedDepositArtifact**: `UnconfirmedDepositArtifact` + +#### Inherited from + +Partial.unconfirmedDepositArtifact + +--- + +### unconfirmedMove + +• `Optional` **unconfirmedMove**: `UnconfirmedMove` + +#### Inherited from + +Partial.unconfirmedMove + +--- + +### unconfirmedWithdrawArtifact + +• `Optional` **unconfirmedWithdrawArtifact**: `UnconfirmedWithdrawArtifact` + +#### Inherited from + +Partial.unconfirmedWithdrawArtifact + +--- + +### upgrade + +• `Optional` **upgrade**: `Upgrade` + +#### Inherited from + +Partial.upgrade + +--- + +### wormholeTo + +• `Optional` **wormholeTo**: `LocationId` + +#### Inherited from + +Partial.wormholeTo diff --git a/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md b/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md new file mode 100644 index 00000000..7b7ddfe5 --- /dev/null +++ b/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md @@ -0,0 +1,127 @@ +# Interface: InitialGameState + +[Backend/GameLogic/InitialGameStateDownloader](../modules/Backend_GameLogic_InitialGameStateDownloader.md).InitialGameState + +## Table of contents + +### Properties + +- [allRevealedCoords](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#allrevealedcoords) +- [allTouchedPlanetIds](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#alltouchedplanetids) +- [arrivals](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#arrivals) +- [artifactsOnVoyages](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#artifactsonvoyages) +- [balance](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#balance) +- [contractConstants](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#contractconstants) +- [gptCreditPriceEther](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#gptcreditpriceether) +- [heldArtifacts](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#heldartifacts) +- [loadedPlanets](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#loadedplanets) +- [myArtifacts](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#myartifacts) +- [myGPTCredits](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#mygptcredits) +- [pendingMoves](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#pendingmoves) +- [planetVoyageIdMap](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#planetvoyageidmap) +- [players](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#players) +- [revealedCoordsMap](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#revealedcoordsmap) +- [touchedAndLocatedPlanets](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#touchedandlocatedplanets) +- [worldRadius](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#worldradius) + +## Properties + +### allRevealedCoords + +• **allRevealedCoords**: `RevealedCoords`[] + +--- + +### allTouchedPlanetIds + +• **allTouchedPlanetIds**: `LocationId`[] + +--- + +### arrivals + +• **arrivals**: `Map`<`VoyageId`, `QueuedArrival`\> + +--- + +### artifactsOnVoyages + +• **artifactsOnVoyages**: `Artifact`[] + +--- + +### balance + +• **balance**: `number` + +--- + +### contractConstants + +• **contractConstants**: [`ContractConstants`](_types_darkforest_api_ContractsAPITypes.ContractConstants.md) + +--- + +### gptCreditPriceEther + +• **gptCreditPriceEther**: `number` + +--- + +### heldArtifacts + +• **heldArtifacts**: `Artifact`[][] + +--- + +### loadedPlanets + +• **loadedPlanets**: `LocationId`[] + +--- + +### myArtifacts + +• **myArtifacts**: `Artifact`[] + +--- + +### myGPTCredits + +• **myGPTCredits**: `number` + +--- + +### pendingMoves + +• **pendingMoves**: `QueuedArrival`[] + +--- + +### planetVoyageIdMap + +• **planetVoyageIdMap**: `Map`<`LocationId`, `VoyageId`[]\> + +--- + +### players + +• **players**: `Map`<`string`, `Player`\> + +--- + +### revealedCoordsMap + +• **revealedCoordsMap**: `Map`<`LocationId`, `RevealedCoords`\> + +--- + +### touchedAndLocatedPlanets + +• **touchedAndLocatedPlanets**: `Map`<`LocationId`, `Planet`\> + +--- + +### worldRadius + +• **worldRadius**: `number` diff --git a/docs/interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md b/docs/interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md new file mode 100644 index 00000000..cd7b2509 --- /dev/null +++ b/docs/interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md @@ -0,0 +1,22 @@ +# Interface: PlanetRenderInfo + +[Backend/GameLogic/ViewportEntities](../modules/Backend_GameLogic_ViewportEntities.md).PlanetRenderInfo + +## Table of contents + +### Properties + +- [planet](Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md#planet) +- [radii](Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md#radii) + +## Properties + +### planet + +• **planet**: `LocatablePlanet` + +--- + +### radii + +• **radii**: [`Radii`](Backend_GameLogic_ViewportEntities.Radii.md) diff --git a/docs/interfaces/Backend_GameLogic_ViewportEntities.Radii.md b/docs/interfaces/Backend_GameLogic_ViewportEntities.Radii.md new file mode 100644 index 00000000..19ddf4bb --- /dev/null +++ b/docs/interfaces/Backend_GameLogic_ViewportEntities.Radii.md @@ -0,0 +1,22 @@ +# Interface: Radii + +[Backend/GameLogic/ViewportEntities](../modules/Backend_GameLogic_ViewportEntities.md).Radii + +## Table of contents + +### Properties + +- [radiusPixels](Backend_GameLogic_ViewportEntities.Radii.md#radiuspixels) +- [radiusWorld](Backend_GameLogic_ViewportEntities.Radii.md#radiusworld) + +## Properties + +### radiusPixels + +• **radiusPixels**: `number` + +--- + +### radiusWorld + +• **radiusWorld**: `number` diff --git a/docs/interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md b/docs/interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md similarity index 55% rename from docs/interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md rename to docs/interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md index ff7ec9d7..d94b37ce 100644 --- a/docs/interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md +++ b/docs/interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md @@ -1,6 +1,6 @@ # Interface: DiagnosticUpdater -[Backend/Interfaces/DiagnosticUpdater](../modules/backend_interfaces_diagnosticupdater.md).DiagnosticUpdater +[Backend/Interfaces/DiagnosticUpdater](../modules/Backend_Interfaces_DiagnosticUpdater.md).DiagnosticUpdater Various parts of our codebase need to be able to self-report diagnostics. To enable them to do so, you must provide them with an object that conforms to this interface. Currently, the only @@ -10,26 +10,24 @@ bugs, etc. ## Table of contents -### Properties +### Methods -- [updateDiagnostics](backend_interfaces_diagnosticupdater.diagnosticupdater.md#updatediagnostics) +- [updateDiagnostics](Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md#updatediagnostics) -## Properties +## Methods ### updateDiagnostics -• **updateDiagnostics**: (`updateFn`: (`d`: [_Diagnostics_](frontend_panes_diagnosticspane.diagnostics.md)) => _void_) => _void_ +▸ **updateDiagnostics**(`updateFn`): `void` Updates the diagnostics using the provided updater function. -#### Type declaration - -▸ (`updateFn`: (`d`: [_Diagnostics_](frontend_panes_diagnosticspane.diagnostics.md)) => _void_): _void_ - #### Parameters | Name | Type | | :--------- | :------------------------------------------------------------------------------ | -| `updateFn` | (`d`: [_Diagnostics_](frontend_panes_diagnosticspane.diagnostics.md)) => _void_ | +| `updateFn` | (`d`: [`Diagnostics`](Frontend_Panes_DiagnosticsPane.Diagnostics.md)) => `void` | + +#### Returns -**Returns:** _void_ +`void` diff --git a/docs/interfaces/Backend_Miner_MiningPatterns.MiningPattern.md b/docs/interfaces/Backend_Miner_MiningPatterns.MiningPattern.md new file mode 100644 index 00000000..71d4a44e --- /dev/null +++ b/docs/interfaces/Backend_Miner_MiningPatterns.MiningPattern.md @@ -0,0 +1,47 @@ +# Interface: MiningPattern + +[Backend/Miner/MiningPatterns](../modules/Backend_Miner_MiningPatterns.md).MiningPattern + +## Implemented by + +- [`SpiralPattern`](../classes/Backend_Miner_MiningPatterns.SpiralPattern.md) +- [`SwissCheesePattern`](../classes/Backend_Miner_MiningPatterns.SwissCheesePattern.md) + +## Table of contents + +### Properties + +- [fromChunk](Backend_Miner_MiningPatterns.MiningPattern.md#fromchunk) +- [type](Backend_Miner_MiningPatterns.MiningPattern.md#type) + +### Methods + +- [nextChunk](Backend_Miner_MiningPatterns.MiningPattern.md#nextchunk) + +## Properties + +### fromChunk + +• **fromChunk**: [`Rectangle`](_types_global_GlobalTypes.Rectangle.md) + +--- + +### type + +• **type**: [`MiningPatternType`](../enums/Backend_Miner_MiningPatterns.MiningPatternType.md) + +## Methods + +### nextChunk + +▸ **nextChunk**(`prevLoc`): [`Rectangle`](_types_global_GlobalTypes.Rectangle.md) + +#### Parameters + +| Name | Type | +| :-------- | :---------------------------------------------------- | +| `prevLoc` | [`Rectangle`](_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +[`Rectangle`](_types_global_GlobalTypes.Rectangle.md) diff --git a/docs/interfaces/Backend_Network_TxExecutor.PendingTransaction.md b/docs/interfaces/Backend_Network_TxExecutor.PendingTransaction.md new file mode 100644 index 00000000..4a7fc8c9 --- /dev/null +++ b/docs/interfaces/Backend_Network_TxExecutor.PendingTransaction.md @@ -0,0 +1,22 @@ +# Interface: PendingTransaction + +[Backend/Network/TxExecutor](../modules/Backend_Network_TxExecutor.md).PendingTransaction + +## Table of contents + +### Properties + +- [confirmed](Backend_Network_TxExecutor.PendingTransaction.md#confirmed) +- [submitted](Backend_Network_TxExecutor.PendingTransaction.md#submitted) + +## Properties + +### confirmed + +• **confirmed**: `Promise`<`TransactionReceipt`\> + +--- + +### submitted + +• **submitted**: `Promise`<`TransactionResponse`\> diff --git a/docs/interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md b/docs/interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md new file mode 100644 index 00000000..dd05027f --- /dev/null +++ b/docs/interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md @@ -0,0 +1,114 @@ +# Interface: QueuedTxRequest + +[Backend/Network/TxExecutor](../modules/Backend_Network_TxExecutor.md).QueuedTxRequest + +## Table of contents + +### Properties + +- [actionId](Backend_Network_TxExecutor.QueuedTxRequest.md#actionid) +- [args](Backend_Network_TxExecutor.QueuedTxRequest.md#args) +- [contract](Backend_Network_TxExecutor.QueuedTxRequest.md#contract) +- [overrides](Backend_Network_TxExecutor.QueuedTxRequest.md#overrides) +- [type](Backend_Network_TxExecutor.QueuedTxRequest.md#type) + +### Methods + +- [onReceiptError](Backend_Network_TxExecutor.QueuedTxRequest.md#onreceipterror) +- [onSubmissionError](Backend_Network_TxExecutor.QueuedTxRequest.md#onsubmissionerror) +- [onTransactionReceipt](Backend_Network_TxExecutor.QueuedTxRequest.md#ontransactionreceipt) +- [onTransactionResponse](Backend_Network_TxExecutor.QueuedTxRequest.md#ontransactionresponse) + +## Properties + +### actionId + +• **actionId**: `string` + +--- + +### args + +• **args**: `unknown`[] + +--- + +### contract + +• **contract**: `Contract` + +--- + +### overrides + +• **overrides**: `TransactionRequest` + +--- + +### type + +• **type**: `EthTxType` + +## Methods + +### onReceiptError + +▸ **onReceiptError**(`e`): `void` + +#### Parameters + +| Name | Type | +| :--- | :------ | +| `e` | `Error` | + +#### Returns + +`void` + +--- + +### onSubmissionError + +▸ **onSubmissionError**(`e`): `void` + +#### Parameters + +| Name | Type | +| :--- | :------ | +| `e` | `Error` | + +#### Returns + +`void` + +--- + +### onTransactionReceipt + +▸ **onTransactionReceipt**(`e`): `void` + +#### Parameters + +| Name | Type | +| :--- | :------------------- | +| `e` | `TransactionReceipt` | + +#### Returns + +`void` + +--- + +### onTransactionResponse + +▸ **onTransactionResponse**(`e`): `void` + +#### Parameters + +| Name | Type | +| :--- | :-------------------- | +| `e` | `TransactionResponse` | + +#### Returns + +`void` diff --git a/docs/interfaces/Backend_Plugins_EmbeddedPluginLoader.EmbeddedPlugin.md b/docs/interfaces/Backend_Plugins_EmbeddedPluginLoader.EmbeddedPlugin.md new file mode 100644 index 00000000..c9ade17c --- /dev/null +++ b/docs/interfaces/Backend_Plugins_EmbeddedPluginLoader.EmbeddedPlugin.md @@ -0,0 +1,31 @@ +# Interface: EmbeddedPlugin + +[Backend/Plugins/EmbeddedPluginLoader](../modules/Backend_Plugins_EmbeddedPluginLoader.md).EmbeddedPlugin + +This interface represents an embedded plugin, which is stored in `embedded_plugins/`. + +## Table of contents + +### Properties + +- [code](Backend_Plugins_EmbeddedPluginLoader.EmbeddedPlugin.md#code) +- [id](Backend_Plugins_EmbeddedPluginLoader.EmbeddedPlugin.md#id) +- [name](Backend_Plugins_EmbeddedPluginLoader.EmbeddedPlugin.md#name) + +## Properties + +### code + +• **code**: `string` + +--- + +### id + +• **id**: [`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid) + +--- + +### name + +• **name**: `string` diff --git a/docs/interfaces/Backend_Plugins_PluginProcess.PluginProcess.md b/docs/interfaces/Backend_Plugins_PluginProcess.PluginProcess.md new file mode 100644 index 00000000..d38b0d84 --- /dev/null +++ b/docs/interfaces/Backend_Plugins_PluginProcess.PluginProcess.md @@ -0,0 +1,76 @@ +# Interface: PluginProcess + +[Backend/Plugins/PluginProcess](../modules/Backend_Plugins_PluginProcess.md).PluginProcess + +All plugins must conform to this interface. Provides facilities for +displaying an interactive UI, as well as references to game state, +which are set externally. + +## Table of contents + +### Constructors + +- [constructor](Backend_Plugins_PluginProcess.PluginProcess.md#constructor) + +### Methods + +- [destroy](Backend_Plugins_PluginProcess.PluginProcess.md#destroy) +- [draw](Backend_Plugins_PluginProcess.PluginProcess.md#draw) +- [render](Backend_Plugins_PluginProcess.PluginProcess.md#render) + +## Constructors + +### constructor + +• **new PluginProcess**() + +## Methods + +### destroy + +▸ `Optional` **destroy**(): `void` + +Called when the plugin is unloaded. Plugins unload whenever the +plugin is edited (modified and saved, or deleted). + +#### Returns + +`void` + +--- + +### draw + +▸ `Optional` **draw**(`ctx`): `void` + +If present, called at the same framerate the the game is running at, +and allows you to draw on top of the game UI. + +#### Parameters + +| Name | Type | +| :---- | :------------------------- | +| `ctx` | `CanvasRenderingContext2D` | + +#### Returns + +`void` + +--- + +### render + +▸ `Optional` **render**(`into`): `void` + +If present, called once when the user clicks 'run' in the plugin +manager modal. + +#### Parameters + +| Name | Type | +| :----- | :--------------- | +| `into` | `HTMLDivElement` | + +#### Returns + +`void` diff --git a/docs/interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md b/docs/interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md new file mode 100644 index 00000000..48e80b31 --- /dev/null +++ b/docs/interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md @@ -0,0 +1,48 @@ +# Interface: SerializedPlugin + +[Backend/Plugins/SerializedPlugin](../modules/Backend_Plugins_SerializedPlugin.md).SerializedPlugin + +Represents a plugin that the user has added to their game. Used +internally for storing plugins. Not used for evaluating plugins! + +## Table of contents + +### Properties + +- [code](Backend_Plugins_SerializedPlugin.SerializedPlugin.md#code) +- [id](Backend_Plugins_SerializedPlugin.SerializedPlugin.md#id) +- [lastEdited](Backend_Plugins_SerializedPlugin.SerializedPlugin.md#lastedited) +- [name](Backend_Plugins_SerializedPlugin.SerializedPlugin.md#name) + +## Properties + +### code + +• **code**: `string` + +This code is a javascript object that complies with the +[PluginProcess](Backend_Plugins_PluginProcess.PluginProcess.md) interface. + +--- + +### id + +• **id**: [`PluginId`](../modules/Backend_Plugins_SerializedPlugin.md#pluginid) + +Unique ID, assigned at the time the plugin is first saved. + +--- + +### lastEdited + +• **lastEdited**: `number` + +{@code new Date.getTime()} at the point that this plugin was saved + +--- + +### name + +• **name**: `string` + +Shown in the list of plugins. diff --git a/docs/interfaces/Backend_Utils_Coordinates.CanvasCoords.md b/docs/interfaces/Backend_Utils_Coordinates.CanvasCoords.md new file mode 100644 index 00000000..bcf0d3c0 --- /dev/null +++ b/docs/interfaces/Backend_Utils_Coordinates.CanvasCoords.md @@ -0,0 +1,22 @@ +# Interface: CanvasCoords + +[Backend/Utils/Coordinates](../modules/Backend_Utils_Coordinates.md).CanvasCoords + +## Table of contents + +### Properties + +- [x](Backend_Utils_Coordinates.CanvasCoords.md#x) +- [y](Backend_Utils_Coordinates.CanvasCoords.md#y) + +## Properties + +### x + +• **x**: `number` + +--- + +### y + +• **y**: `number` diff --git a/docs/interfaces/Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md b/docs/interfaces/Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md new file mode 100644 index 00000000..76ff0aac --- /dev/null +++ b/docs/interfaces/Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md @@ -0,0 +1,155 @@ +# Interface: PlanetCosmeticInfo + +[Backend/Utils/UtilsTypes](../modules/Backend_Utils_UtilsTypes.md).PlanetCosmeticInfo + +## Table of contents + +### Properties + +- [asteroidHsl](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#asteroidhsl) +- [backgroundColor](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#backgroundcolor) +- [baseColor](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#basecolor) +- [baseColor2](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#basecolor2) +- [baseColor3](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#basecolor3) +- [baseHue](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#basehue) +- [baseStr](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#basestr) +- [beachRgb](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#beachrgb) +- [bgStr](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#bgstr) +- [hatType](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#hattype) +- [landRgb](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#landrgb) +- [mtnColor](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#mtncolor) +- [mtnColor2](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#mtncolor2) +- [mtnColor3](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#mtncolor3) +- [oceanRgb](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#oceanrgb) +- [previewColor](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#previewcolor) +- [ruins](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#ruins) +- [seed](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#seed) +- [spacetime1](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#spacetime1) +- [spacetime2](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#spacetime2) +- [spacetime3](Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md#spacetime3) + +## Properties + +### asteroidHsl + +• **asteroidHsl**: [`HSLVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#hslvec) + +--- + +### backgroundColor + +• **backgroundColor**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### baseColor + +• **baseColor**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### baseColor2 + +• **baseColor2**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### baseColor3 + +• **baseColor3**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### baseHue + +• **baseHue**: `number` + +--- + +### baseStr + +• **baseStr**: `string` + +--- + +### beachRgb + +• **beachRgb**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### bgStr + +• **bgStr**: `string` + +--- + +### hatType + +• **hatType**: [`HatType`](../enums/Frontend_Utils_Hats.HatType.md) + +--- + +### landRgb + +• **landRgb**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### mtnColor + +• **mtnColor**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### mtnColor2 + +• **mtnColor2**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### mtnColor3 + +• **mtnColor3**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### oceanRgb + +• **oceanRgb**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### previewColor + +• **previewColor**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### ruins + +• `Optional` **ruins**: [`RuinsInfo`](../modules/Backend_Utils_UtilsTypes.md#ruinsinfo) + +--- + +### seed + +• **seed**: `number` + +--- + +### spacetime1 + +• **spacetime1**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### spacetime2 + +• **spacetime2**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) + +--- + +### spacetime3 + +• **spacetime3**: [`RGBVec`](../modules/Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) diff --git a/docs/interfaces/Frontend_Components_Btn.BtnProps.md b/docs/interfaces/Frontend_Components_Btn.BtnProps.md new file mode 100644 index 00000000..ea7fcd45 --- /dev/null +++ b/docs/interfaces/Frontend_Components_Btn.BtnProps.md @@ -0,0 +1,50 @@ +# Interface: BtnProps + +[Frontend/Components/Btn](../modules/Frontend_Components_Btn.md).BtnProps + +## Table of contents + +### Properties + +- [borderColor](Frontend_Components_Btn.BtnProps.md#bordercolor) +- [color](Frontend_Components_Btn.BtnProps.md#color) +- [disabled](Frontend_Components_Btn.BtnProps.md#disabled) +- [noBorder](Frontend_Components_Btn.BtnProps.md#noborder) +- [textColor](Frontend_Components_Btn.BtnProps.md#textcolor) +- [wide](Frontend_Components_Btn.BtnProps.md#wide) + +## Properties + +### borderColor + +• `Optional` **borderColor**: `string` + +--- + +### color + +• `Optional` **color**: `string` + +--- + +### disabled + +• `Optional` **disabled**: `boolean` + +--- + +### noBorder + +• `Optional` **noBorder**: `boolean` + +--- + +### textColor + +• `Optional` **textColor**: `string` + +--- + +### wide + +• `Optional` **wide**: `boolean` diff --git a/docs/interfaces/Frontend_Components_TextLoadingBar.LoadingBarHandle.md b/docs/interfaces/Frontend_Components_TextLoadingBar.LoadingBarHandle.md new file mode 100644 index 00000000..a13b34a2 --- /dev/null +++ b/docs/interfaces/Frontend_Components_TextLoadingBar.LoadingBarHandle.md @@ -0,0 +1,25 @@ +# Interface: LoadingBarHandle + +[Frontend/Components/TextLoadingBar](../modules/Frontend_Components_TextLoadingBar.md).LoadingBarHandle + +## Table of contents + +### Methods + +- [setFractionCompleted](Frontend_Components_TextLoadingBar.LoadingBarHandle.md#setfractioncompleted) + +## Methods + +### setFractionCompleted + +▸ **setFractionCompleted**(`fractionCompleted`): `void` + +#### Parameters + +| Name | Type | +| :------------------ | :------- | +| `fractionCompleted` | `number` | + +#### Returns + +`void` diff --git a/docs/interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md b/docs/interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md new file mode 100644 index 00000000..70d96341 --- /dev/null +++ b/docs/interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md @@ -0,0 +1,85 @@ +# Interface: Diagnostics + +[Frontend/Panes/DiagnosticsPane](../modules/Frontend_Panes_DiagnosticsPane.md).Diagnostics + +## Table of contents + +### Properties + +- [callsInQueue](Frontend_Panes_DiagnosticsPane.Diagnostics.md#callsinqueue) +- [chunkUpdates](Frontend_Panes_DiagnosticsPane.Diagnostics.md#chunkupdates) +- [fps](Frontend_Panes_DiagnosticsPane.Diagnostics.md#fps) +- [gasPrices](Frontend_Panes_DiagnosticsPane.Diagnostics.md#gasprices) +- [totalCalls](Frontend_Panes_DiagnosticsPane.Diagnostics.md#totalcalls) +- [totalChunks](Frontend_Panes_DiagnosticsPane.Diagnostics.md#totalchunks) +- [totalPlanets](Frontend_Panes_DiagnosticsPane.Diagnostics.md#totalplanets) +- [totalTransactions](Frontend_Panes_DiagnosticsPane.Diagnostics.md#totaltransactions) +- [transactionsInQueue](Frontend_Panes_DiagnosticsPane.Diagnostics.md#transactionsinqueue) +- [visibleChunks](Frontend_Panes_DiagnosticsPane.Diagnostics.md#visiblechunks) +- [visiblePlanets](Frontend_Panes_DiagnosticsPane.Diagnostics.md#visibleplanets) + +## Properties + +### callsInQueue + +• **callsInQueue**: `number` + +--- + +### chunkUpdates + +• **chunkUpdates**: `number` + +--- + +### fps + +• **fps**: `number` + +--- + +### gasPrices + +• `Optional` **gasPrices**: `GasPrices` + +--- + +### totalCalls + +• **totalCalls**: `number` + +--- + +### totalChunks + +• **totalChunks**: `number` + +--- + +### totalPlanets + +• **totalPlanets**: `number` + +--- + +### totalTransactions + +• **totalTransactions**: `number` + +--- + +### transactionsInQueue + +• **transactionsInQueue**: `number` + +--- + +### visibleChunks + +• **visibleChunks**: `number` + +--- + +### visiblePlanets + +• **visiblePlanets**: `number` diff --git a/docs/interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.attributes.md b/docs/interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Attributes.md similarity index 53% rename from docs/interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.attributes.md rename to docs/interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Attributes.md index 627e2c19..1f6ce7a3 100644 --- a/docs/interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.attributes.md +++ b/docs/interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Attributes.md @@ -1,7 +1,7 @@ # Interface: Attributes -[Frontend/Renderers/GameRenderer/WebGL/WebGLLibTypes](../modules/frontend_renderers_gamerenderer_webgl_webgllibtypes.md).Attributes +[Frontend/Renderers/GameRenderer/WebGL/WebGLLibTypes](../modules/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md).Attributes ## Indexable -▪ [k: *string*]: DataType +▪ [k: `string`]: `DataType` diff --git a/docs/interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.uniforms.md b/docs/interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Uniforms.md similarity index 52% rename from docs/interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.uniforms.md rename to docs/interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Uniforms.md index 8f988704..c22e4da9 100644 --- a/docs/interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.uniforms.md +++ b/docs/interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Uniforms.md @@ -1,7 +1,7 @@ # Interface: Uniforms -[Frontend/Renderers/GameRenderer/WebGL/WebGLLibTypes](../modules/frontend_renderers_gamerenderer_webgl_webgllibtypes.md).Uniforms +[Frontend/Renderers/GameRenderer/WebGL/WebGLLibTypes](../modules/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md).Uniforms ## Indexable -▪ [k: *string*]: DataType +▪ [k: `string`]: `DataType` diff --git a/docs/interfaces/Frontend_Utils_EmitterUtils.Diff.md b/docs/interfaces/Frontend_Utils_EmitterUtils.Diff.md new file mode 100644 index 00000000..ab51d4a0 --- /dev/null +++ b/docs/interfaces/Frontend_Utils_EmitterUtils.Diff.md @@ -0,0 +1,32 @@ +# Interface: Diff + +[Frontend/Utils/EmitterUtils](../modules/Frontend_Utils_EmitterUtils.md).Diff + +**`param`** The previously emitted state of an object + +**`param`** The current emitted state of an object + +## Type parameters + +| Name | +| :----- | +| `Type` | + +## Table of contents + +### Properties + +- [current](Frontend_Utils_EmitterUtils.Diff.md#current) +- [previous](Frontend_Utils_EmitterUtils.Diff.md#previous) + +## Properties + +### current + +• **current**: `Type` + +--- + +### previous + +• **previous**: `Type` diff --git a/docs/interfaces/Frontend_Views_Share.ShareProps.md b/docs/interfaces/Frontend_Views_Share.ShareProps.md new file mode 100644 index 00000000..7f836c78 --- /dev/null +++ b/docs/interfaces/Frontend_Views_Share.ShareProps.md @@ -0,0 +1,50 @@ +# Interface: ShareProps + +[Frontend/Views/Share](../modules/Frontend_Views_Share.md).ShareProps + +## Type parameters + +| Name | +| :--- | +| `T` | + +## Table of contents + +### Methods + +- [children](Frontend_Views_Share.ShareProps.md#children) +- [load](Frontend_Views_Share.ShareProps.md#load) + +## Methods + +### children + +▸ **children**(`state`, `loading`, `error`): `ReactNode` + +#### Parameters + +| Name | Type | +| :-------- | :--------------------- | +| `state` | `undefined` \| `T` | +| `loading` | `boolean` | +| `error` | `undefined` \| `Error` | + +#### Returns + +`ReactNode` + +--- + +### load + +▸ **load**(`store`): `Promise`<`T`\> + +#### Parameters + +| Name | Type | +| :------ | :----------------------------------------------------------------- | +| `store` | [`default`](../classes/Backend_Storage_ReaderDataStore.default.md) | + +#### Returns + +`Promise`<`T`\> diff --git a/docs/interfaces/Frontend_Views_Terminal.TerminalHandle.md b/docs/interfaces/Frontend_Views_Terminal.TerminalHandle.md new file mode 100644 index 00000000..fe903640 --- /dev/null +++ b/docs/interfaces/Frontend_Views_Terminal.TerminalHandle.md @@ -0,0 +1,223 @@ +# Interface: TerminalHandle + +[Frontend/Views/Terminal](../modules/Frontend_Views_Terminal.md).TerminalHandle + +## Table of contents + +### Methods + +- [clear](Frontend_Views_Terminal.TerminalHandle.md#clear) +- [focus](Frontend_Views_Terminal.TerminalHandle.md#focus) +- [getInput](Frontend_Views_Terminal.TerminalHandle.md#getinput) +- [newline](Frontend_Views_Terminal.TerminalHandle.md#newline) +- [print](Frontend_Views_Terminal.TerminalHandle.md#print) +- [printElement](Frontend_Views_Terminal.TerminalHandle.md#printelement) +- [printLink](Frontend_Views_Terminal.TerminalHandle.md#printlink) +- [printLoadingBar](Frontend_Views_Terminal.TerminalHandle.md#printloadingbar) +- [printLoadingSpinner](Frontend_Views_Terminal.TerminalHandle.md#printloadingspinner) +- [printShellLn](Frontend_Views_Terminal.TerminalHandle.md#printshellln) +- [println](Frontend_Views_Terminal.TerminalHandle.md#println) +- [removeLast](Frontend_Views_Terminal.TerminalHandle.md#removelast) +- [setInput](Frontend_Views_Terminal.TerminalHandle.md#setinput) +- [setUserInputEnabled](Frontend_Views_Terminal.TerminalHandle.md#setuserinputenabled) + +## Methods + +### clear + +▸ **clear**(): `void` + +#### Returns + +`void` + +--- + +### focus + +▸ **focus**(): `void` + +#### Returns + +`void` + +--- + +### getInput + +▸ **getInput**(): `Promise`<`string`\> + +#### Returns + +`Promise`<`string`\> + +--- + +### newline + +▸ **newline**(): `void` + +#### Returns + +`void` + +--- + +### print + +▸ **print**(`str`, `style?`, `hoverContents?`): `void` + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------------------------------------------------------- | +| `str` | `string` | +| `style?` | [`TerminalTextStyle`](../enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md) | +| `hoverContents?` | () => `Element` | + +#### Returns + +`void` + +--- + +### printElement + +▸ **printElement**(`element`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------------ | +| `element` | `ReactElement`<`any`, `string` \| `JSXElementConstructor`<`any`\>\> | + +#### Returns + +`void` + +--- + +### printLink + +▸ **printLink**(`str`, `onClick`, `style`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------------------------------------------------------------- | +| `str` | `string` | +| `onClick` | () => `void` | +| `style` | [`TerminalTextStyle`](../enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md) | + +#### Returns + +`void` + +--- + +### printLoadingBar + +▸ **printLoadingBar**(`prettyEntityName`, `ref`): `void` + +#### Parameters + +| Name | Type | +| :----------------- | :----------------------------------------------------------------------------------------- | +| `prettyEntityName` | `string` | +| `ref` | `RefObject`<[`LoadingBarHandle`](Frontend_Components_TextLoadingBar.LoadingBarHandle.md)\> | + +#### Returns + +`void` + +--- + +### printLoadingSpinner + +▸ **printLoadingSpinner**(): `void` + +#### Returns + +`void` + +--- + +### printShellLn + +▸ **printShellLn**(`str`): `void` + +#### Parameters + +| Name | Type | +| :---- | :------- | +| `str` | `string` | + +#### Returns + +`void` + +--- + +### println + +▸ **println**(`str`, `style?`, `hoverContents?`): `void` + +#### Parameters + +| Name | Type | +| :--------------- | :-------------------------------------------------------------------------------- | +| `str` | `string` | +| `style?` | [`TerminalTextStyle`](../enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md) | +| `hoverContents?` | () => `Element` | + +#### Returns + +`void` + +--- + +### removeLast + +▸ **removeLast**(`n`): `void` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `n` | `number` | + +#### Returns + +`void` + +--- + +### setInput + +▸ **setInput**(`input`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------- | +| `input` | `string` | + +#### Returns + +`void` + +--- + +### setUserInputEnabled + +▸ **setUserInputEnabled**(`enabled`): `void` + +#### Parameters + +| Name | Type | +| :-------- | :-------- | +| `enabled` | `boolean` | + +#### Returns + +`void` diff --git a/docs/interfaces/Frontend_Views_Terminal.TerminalProps.md b/docs/interfaces/Frontend_Views_Terminal.TerminalProps.md new file mode 100644 index 00000000..4e39a049 --- /dev/null +++ b/docs/interfaces/Frontend_Views_Terminal.TerminalProps.md @@ -0,0 +1,15 @@ +# Interface: TerminalProps + +[Frontend/Views/Terminal](../modules/Frontend_Views_Terminal.md).TerminalProps + +## Table of contents + +### Properties + +- [promptCharacter](Frontend_Views_Terminal.TerminalProps.md#promptcharacter) + +## Properties + +### promptCharacter + +• **promptCharacter**: `string` diff --git a/docs/interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md b/docs/interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md new file mode 100644 index 00000000..e9b74c79 --- /dev/null +++ b/docs/interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md @@ -0,0 +1,33 @@ +# Interface: ChunkStore + +[\_types/darkforest/api/ChunkStoreTypes](../modules/_types_darkforest_api_ChunkStoreTypes.md).ChunkStore + +Abstract interface shared between different types of chunk stores. Currently we have one that +writes to IndexedDB, and one that simply throws away the data. + +## Implemented by + +- [`HomePlanetMinerChunkStore`](../classes/Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md) +- [`default`](../classes/Backend_Storage_PersistentChunkStore.default.md) + +## Table of contents + +### Methods + +- [hasMinedChunk](_types_darkforest_api_ChunkStoreTypes.ChunkStore.md#hasminedchunk) + +## Methods + +### hasMinedChunk + +▸ **hasMinedChunk**(`chunkFootprint`): `boolean` + +#### Parameters + +| Name | Type | +| :--------------- | :---------------------------------------------------- | +| `chunkFootprint` | [`Rectangle`](_types_global_GlobalTypes.Rectangle.md) | + +#### Returns + +`boolean` diff --git a/docs/interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md b/docs/interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md new file mode 100644 index 00000000..00296727 --- /dev/null +++ b/docs/interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md @@ -0,0 +1,47 @@ +# Interface: PersistedChunk + +[\_types/darkforest/api/ChunkStoreTypes](../modules/_types_darkforest_api_ChunkStoreTypes.md).PersistedChunk + +Chunks represent map data in some rectangle. This type represents a chunk when it is at rest in +IndexedDB. The reason for this type's existence is that we want to reduce the amount of data we +store on the user's computer. Shorter names hopefully means less data. + +## Table of contents + +### Properties + +- [l](_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md#l) +- [p](_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md#p) +- [s](_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md#s) +- [x](_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md#x) +- [y](_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md#y) + +## Properties + +### l + +• **l**: [`PersistedLocation`](_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md)[] + +--- + +### p + +• **p**: `number` + +--- + +### s + +• **s**: `number` + +--- + +### x + +• **x**: `number` + +--- + +### y + +• **y**: `number` diff --git a/docs/interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md b/docs/interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md new file mode 100644 index 00000000..b132098b --- /dev/null +++ b/docs/interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md @@ -0,0 +1,46 @@ +# Interface: PersistedLocation + +[\_types/darkforest/api/ChunkStoreTypes](../modules/_types_darkforest_api_ChunkStoreTypes.md).PersistedLocation + +A location is a point sample of the universe. This type represents that point sample at rest when +it is stored in IndexedDB. + +## Table of contents + +### Properties + +- [b](_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md#b) +- [h](_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md#h) +- [p](_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md#p) +- [x](_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md#x) +- [y](_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md#y) + +## Properties + +### b + +• **b**: `number` + +--- + +### h + +• **h**: `LocationId` + +--- + +### p + +• **p**: `number` + +--- + +### x + +• **x**: `number` + +--- + +### y + +• **y**: `number` diff --git a/docs/interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md b/docs/interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md new file mode 100644 index 00000000..2b1e55d5 --- /dev/null +++ b/docs/interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md @@ -0,0 +1,244 @@ +# Interface: ContractConstants + +[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_ContractsAPITypes.md).ContractConstants + +## Table of contents + +### Properties + +- [ARTIFACT_POINT_VALUES](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#artifact_point_values) +- [BIOMEBASE_KEY](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#biomebase_key) +- [BIOME_THRESHOLD_1](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#biome_threshold_1) +- [BIOME_THRESHOLD_2](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#biome_threshold_2) +- [DISABLE_ZK_CHECKS](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#disable_zk_checks) +- [INIT_PERLIN_MAX](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#init_perlin_max) +- [INIT_PERLIN_MIN](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#init_perlin_min) +- [LOCATION_REVEAL_COOLDOWN](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#location_reveal_cooldown) +- [MAX_NATURAL_PLANET_LEVEL](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#max_natural_planet_level) +- [PERLIN_LENGTH_SCALE](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#perlin_length_scale) +- [PERLIN_MIRROR_X](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#perlin_mirror_x) +- [PERLIN_MIRROR_Y](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#perlin_mirror_y) +- [PERLIN_THRESHOLD_1](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#perlin_threshold_1) +- [PERLIN_THRESHOLD_2](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#perlin_threshold_2) +- [PERLIN_THRESHOLD_3](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#perlin_threshold_3) +- [PHOTOID_ACTIVATION_DELAY](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#photoid_activation_delay) +- [PLANETHASH_KEY](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#planethash_key) +- [PLANET_RARITY](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#planet_rarity) +- [PLANET_TYPE_WEIGHTS](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#planet_type_weights) +- [SPACETYPE_KEY](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#spacetype_key) +- [TIME_FACTOR_HUNDREDTHS](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#time_factor_hundredths) +- [TOKEN_MINT_END_SECONDS](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#token_mint_end_seconds) +- [defaultBarbarianPercentage](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#defaultbarbarianpercentage) +- [defaultDefense](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#defaultdefense) +- [defaultPopulationCap](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#defaultpopulationcap) +- [defaultPopulationGrowth](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#defaultpopulationgrowth) +- [defaultRange](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#defaultrange) +- [defaultSilverCap](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#defaultsilvercap) +- [defaultSilverGrowth](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#defaultsilvergrowth) +- [defaultSpeed](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#defaultspeed) +- [planetCumulativeRarities](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#planetcumulativerarities) +- [planetLevelThresholds](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#planetlevelthresholds) +- [upgrades](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#upgrades) + +## Properties + +### ARTIFACT_POINT_VALUES + +• **ARTIFACT_POINT_VALUES**: `ArtifactPointValues` + +--- + +### BIOMEBASE_KEY + +• **BIOMEBASE_KEY**: `number` + +--- + +### BIOME_THRESHOLD_1 + +• **BIOME_THRESHOLD_1**: `number` + +--- + +### BIOME_THRESHOLD_2 + +• **BIOME_THRESHOLD_2**: `number` + +--- + +### DISABLE_ZK_CHECKS + +• **DISABLE_ZK_CHECKS**: `boolean` + +--- + +### INIT_PERLIN_MAX + +• **INIT_PERLIN_MAX**: `number` + +--- + +### INIT_PERLIN_MIN + +• **INIT_PERLIN_MIN**: `number` + +--- + +### LOCATION_REVEAL_COOLDOWN + +• **LOCATION_REVEAL_COOLDOWN**: `number` + +--- + +### MAX_NATURAL_PLANET_LEVEL + +• **MAX_NATURAL_PLANET_LEVEL**: `number` + +--- + +### PERLIN_LENGTH_SCALE + +• **PERLIN_LENGTH_SCALE**: `number` + +--- + +### PERLIN_MIRROR_X + +• **PERLIN_MIRROR_X**: `boolean` + +--- + +### PERLIN_MIRROR_Y + +• **PERLIN_MIRROR_Y**: `boolean` + +--- + +### PERLIN_THRESHOLD_1 + +• **PERLIN_THRESHOLD_1**: `number` + +The perlin value at each coordinate determines the space type. There are four space +types, which means there are four ranges on the number line that correspond to +each space type. This function returns the boundary values between each of these +four ranges: `PERLIN_THRESHOLD_1`, `PERLIN_THRESHOLD_2`, `PERLIN_THRESHOLD_3`. + +--- + +### PERLIN_THRESHOLD_2 + +• **PERLIN_THRESHOLD_2**: `number` + +--- + +### PERLIN_THRESHOLD_3 + +• **PERLIN_THRESHOLD_3**: `number` + +--- + +### PHOTOID_ACTIVATION_DELAY + +• **PHOTOID_ACTIVATION_DELAY**: `number` + +--- + +### PLANETHASH_KEY + +• **PLANETHASH_KEY**: `number` + +--- + +### PLANET_RARITY + +• **PLANET_RARITY**: `number` + +--- + +### PLANET_TYPE_WEIGHTS + +• **PLANET_TYPE_WEIGHTS**: [`PlanetTypeWeightsBySpaceType`](../modules/_types_darkforest_api_ContractsAPITypes.md#planettypeweightsbyspacetype) + +--- + +### SPACETYPE_KEY + +• **SPACETYPE_KEY**: `number` + +--- + +### TIME_FACTOR_HUNDREDTHS + +• **TIME_FACTOR_HUNDREDTHS**: `number` + +--- + +### TOKEN_MINT_END_SECONDS + +• **TOKEN_MINT_END_SECONDS**: `number` + +--- + +### defaultBarbarianPercentage + +• **defaultBarbarianPercentage**: `number`[] + +--- + +### defaultDefense + +• **defaultDefense**: `number`[] + +--- + +### defaultPopulationCap + +• **defaultPopulationCap**: `number`[] + +--- + +### defaultPopulationGrowth + +• **defaultPopulationGrowth**: `number`[] + +--- + +### defaultRange + +• **defaultRange**: `number`[] + +--- + +### defaultSilverCap + +• **defaultSilverCap**: `number`[] + +--- + +### defaultSilverGrowth + +• **defaultSilverGrowth**: `number`[] + +--- + +### defaultSpeed + +• **defaultSpeed**: `number`[] + +--- + +### planetCumulativeRarities + +• **planetCumulativeRarities**: `number`[] + +--- + +### planetLevelThresholds + +• **planetLevelThresholds**: `number`[] + +--- + +### upgrades + +• **upgrades**: `UpgradeBranches` diff --git a/docs/interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md b/docs/interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md deleted file mode 100644 index 09d0c1ff..00000000 --- a/docs/interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md +++ /dev/null @@ -1,35 +0,0 @@ -# Interface: ChunkStore - -[\_types/darkforest/api/ChunkStoreTypes](../modules/_types_darkforest_api_chunkstoretypes.md).ChunkStore - -Abstract interface shared between different types of chunk stores. Currently we have one that -writes to IndexedDB, and one that simply throws away the data. - -## Implemented by - -- [_HomePlanetMinerChunkStore_](../classes/backend_miner_minermanager.homeplanetminerchunkstore.md) -- [_default_](../classes/backend_storage_persistentchunkstore.default.md) - -## Table of contents - -### Properties - -- [hasMinedChunk](_types_darkforest_api_chunkstoretypes.chunkstore.md#hasminedchunk) - -## Properties - -### hasMinedChunk - -• **hasMinedChunk**: (`chunkFootprint`: [_Rectangle_](_types_global_globaltypes.rectangle.md)) => _boolean_ - -#### Type declaration - -▸ (`chunkFootprint`: [_Rectangle_](_types_global_globaltypes.rectangle.md)): _boolean_ - -#### Parameters - -| Name | Type | -| :--------------- | :---------------------------------------------------- | -| `chunkFootprint` | [_Rectangle_](_types_global_globaltypes.rectangle.md) | - -**Returns:** _boolean_ diff --git a/docs/interfaces/_types_darkforest_api_chunkstoretypes.persistedchunk.md b/docs/interfaces/_types_darkforest_api_chunkstoretypes.persistedchunk.md deleted file mode 100644 index aa9e9138..00000000 --- a/docs/interfaces/_types_darkforest_api_chunkstoretypes.persistedchunk.md +++ /dev/null @@ -1,47 +0,0 @@ -# Interface: PersistedChunk - -[\_types/darkforest/api/ChunkStoreTypes](../modules/_types_darkforest_api_chunkstoretypes.md).PersistedChunk - -Chunks represent map data in some rectangle. This type represents a chunk when it is at rest in -IndexedDB. The reason for this type's existence is that we want to reduce the amount of data we -store on the user's computer. Shorter names hopefully means less data. - -## Table of contents - -### Properties - -- [l](_types_darkforest_api_chunkstoretypes.persistedchunk.md#l) -- [p](_types_darkforest_api_chunkstoretypes.persistedchunk.md#p) -- [s](_types_darkforest_api_chunkstoretypes.persistedchunk.md#s) -- [x](_types_darkforest_api_chunkstoretypes.persistedchunk.md#x) -- [y](_types_darkforest_api_chunkstoretypes.persistedchunk.md#y) - -## Properties - -### l - -• **l**: [_PersistedLocation_](_types_darkforest_api_chunkstoretypes.persistedlocation.md)[] - ---- - -### p - -• **p**: _number_ - ---- - -### s - -• **s**: _number_ - ---- - -### x - -• **x**: _number_ - ---- - -### y - -• **y**: _number_ diff --git a/docs/interfaces/_types_darkforest_api_chunkstoretypes.persistedlocation.md b/docs/interfaces/_types_darkforest_api_chunkstoretypes.persistedlocation.md deleted file mode 100644 index 5aca65b4..00000000 --- a/docs/interfaces/_types_darkforest_api_chunkstoretypes.persistedlocation.md +++ /dev/null @@ -1,46 +0,0 @@ -# Interface: PersistedLocation - -[\_types/darkforest/api/ChunkStoreTypes](../modules/_types_darkforest_api_chunkstoretypes.md).PersistedLocation - -A location is a point sample of the universe. This type represents that point sample at rest when -it is stored in IndexedDB. - -## Table of contents - -### Properties - -- [b](_types_darkforest_api_chunkstoretypes.persistedlocation.md#b) -- [h](_types_darkforest_api_chunkstoretypes.persistedlocation.md#h) -- [p](_types_darkforest_api_chunkstoretypes.persistedlocation.md#p) -- [x](_types_darkforest_api_chunkstoretypes.persistedlocation.md#x) -- [y](_types_darkforest_api_chunkstoretypes.persistedlocation.md#y) - -## Properties - -### b - -• **b**: _number_ - ---- - -### h - -• **h**: LocationId - ---- - -### p - -• **p**: _number_ - ---- - -### x - -• **x**: _number_ - ---- - -### y - -• **y**: _number_ diff --git a/docs/interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md b/docs/interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md deleted file mode 100644 index d25483cb..00000000 --- a/docs/interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md +++ /dev/null @@ -1,244 +0,0 @@ -# Interface: ContractConstants - -[\_types/darkforest/api/ContractsAPITypes](../modules/_types_darkforest_api_contractsapitypes.md).ContractConstants - -## Table of contents - -### Properties - -- [ARTIFACT_POINT_VALUES](_types_darkforest_api_contractsapitypes.contractconstants.md#artifact_point_values) -- [BIOMEBASE_KEY](_types_darkforest_api_contractsapitypes.contractconstants.md#biomebase_key) -- [BIOME_THRESHOLD_1](_types_darkforest_api_contractsapitypes.contractconstants.md#biome_threshold_1) -- [BIOME_THRESHOLD_2](_types_darkforest_api_contractsapitypes.contractconstants.md#biome_threshold_2) -- [DISABLE_ZK_CHECKS](_types_darkforest_api_contractsapitypes.contractconstants.md#disable_zk_checks) -- [INIT_PERLIN_MAX](_types_darkforest_api_contractsapitypes.contractconstants.md#init_perlin_max) -- [INIT_PERLIN_MIN](_types_darkforest_api_contractsapitypes.contractconstants.md#init_perlin_min) -- [LOCATION_REVEAL_COOLDOWN](_types_darkforest_api_contractsapitypes.contractconstants.md#location_reveal_cooldown) -- [MAX_NATURAL_PLANET_LEVEL](_types_darkforest_api_contractsapitypes.contractconstants.md#max_natural_planet_level) -- [PERLIN_LENGTH_SCALE](_types_darkforest_api_contractsapitypes.contractconstants.md#perlin_length_scale) -- [PERLIN_MIRROR_X](_types_darkforest_api_contractsapitypes.contractconstants.md#perlin_mirror_x) -- [PERLIN_MIRROR_Y](_types_darkforest_api_contractsapitypes.contractconstants.md#perlin_mirror_y) -- [PERLIN_THRESHOLD_1](_types_darkforest_api_contractsapitypes.contractconstants.md#perlin_threshold_1) -- [PERLIN_THRESHOLD_2](_types_darkforest_api_contractsapitypes.contractconstants.md#perlin_threshold_2) -- [PERLIN_THRESHOLD_3](_types_darkforest_api_contractsapitypes.contractconstants.md#perlin_threshold_3) -- [PHOTOID_ACTIVATION_DELAY](_types_darkforest_api_contractsapitypes.contractconstants.md#photoid_activation_delay) -- [PLANETHASH_KEY](_types_darkforest_api_contractsapitypes.contractconstants.md#planethash_key) -- [PLANET_RARITY](_types_darkforest_api_contractsapitypes.contractconstants.md#planet_rarity) -- [PLANET_TYPE_WEIGHTS](_types_darkforest_api_contractsapitypes.contractconstants.md#planet_type_weights) -- [SPACETYPE_KEY](_types_darkforest_api_contractsapitypes.contractconstants.md#spacetype_key) -- [TIME_FACTOR_HUNDREDTHS](_types_darkforest_api_contractsapitypes.contractconstants.md#time_factor_hundredths) -- [TOKEN_MINT_END_SECONDS](_types_darkforest_api_contractsapitypes.contractconstants.md#token_mint_end_seconds) -- [defaultBarbarianPercentage](_types_darkforest_api_contractsapitypes.contractconstants.md#defaultbarbarianpercentage) -- [defaultDefense](_types_darkforest_api_contractsapitypes.contractconstants.md#defaultdefense) -- [defaultPopulationCap](_types_darkforest_api_contractsapitypes.contractconstants.md#defaultpopulationcap) -- [defaultPopulationGrowth](_types_darkforest_api_contractsapitypes.contractconstants.md#defaultpopulationgrowth) -- [defaultRange](_types_darkforest_api_contractsapitypes.contractconstants.md#defaultrange) -- [defaultSilverCap](_types_darkforest_api_contractsapitypes.contractconstants.md#defaultsilvercap) -- [defaultSilverGrowth](_types_darkforest_api_contractsapitypes.contractconstants.md#defaultsilvergrowth) -- [defaultSpeed](_types_darkforest_api_contractsapitypes.contractconstants.md#defaultspeed) -- [planetCumulativeRarities](_types_darkforest_api_contractsapitypes.contractconstants.md#planetcumulativerarities) -- [planetLevelThresholds](_types_darkforest_api_contractsapitypes.contractconstants.md#planetlevelthresholds) -- [upgrades](_types_darkforest_api_contractsapitypes.contractconstants.md#upgrades) - -## Properties - -### ARTIFACT_POINT_VALUES - -• **ARTIFACT_POINT_VALUES**: ArtifactPointValues - ---- - -### BIOMEBASE_KEY - -• **BIOMEBASE_KEY**: _number_ - ---- - -### BIOME_THRESHOLD_1 - -• **BIOME_THRESHOLD_1**: _number_ - ---- - -### BIOME_THRESHOLD_2 - -• **BIOME_THRESHOLD_2**: _number_ - ---- - -### DISABLE_ZK_CHECKS - -• **DISABLE_ZK_CHECKS**: _boolean_ - ---- - -### INIT_PERLIN_MAX - -• **INIT_PERLIN_MAX**: _number_ - ---- - -### INIT_PERLIN_MIN - -• **INIT_PERLIN_MIN**: _number_ - ---- - -### LOCATION_REVEAL_COOLDOWN - -• **LOCATION_REVEAL_COOLDOWN**: _number_ - ---- - -### MAX_NATURAL_PLANET_LEVEL - -• **MAX_NATURAL_PLANET_LEVEL**: _number_ - ---- - -### PERLIN_LENGTH_SCALE - -• **PERLIN_LENGTH_SCALE**: _number_ - ---- - -### PERLIN_MIRROR_X - -• **PERLIN_MIRROR_X**: _boolean_ - ---- - -### PERLIN_MIRROR_Y - -• **PERLIN_MIRROR_Y**: _boolean_ - ---- - -### PERLIN_THRESHOLD_1 - -• **PERLIN_THRESHOLD_1**: _number_ - -The perlin value at each coordinate determines the space type. There are four space -types, which means there are four ranges on the number line that correspond to -each space type. This function returns the boundary values between each of these -four ranges: `PERLIN_THRESHOLD_1`, `PERLIN_THRESHOLD_2`, `PERLIN_THRESHOLD_3`. - ---- - -### PERLIN_THRESHOLD_2 - -• **PERLIN_THRESHOLD_2**: _number_ - ---- - -### PERLIN_THRESHOLD_3 - -• **PERLIN_THRESHOLD_3**: _number_ - ---- - -### PHOTOID_ACTIVATION_DELAY - -• **PHOTOID_ACTIVATION_DELAY**: _number_ - ---- - -### PLANETHASH_KEY - -• **PLANETHASH_KEY**: _number_ - ---- - -### PLANET_RARITY - -• **PLANET_RARITY**: _number_ - ---- - -### PLANET_TYPE_WEIGHTS - -• **PLANET_TYPE_WEIGHTS**: [_PlanetTypeWeightsBySpaceType_](../modules/_types_darkforest_api_contractsapitypes.md#planettypeweightsbyspacetype) - ---- - -### SPACETYPE_KEY - -• **SPACETYPE_KEY**: _number_ - ---- - -### TIME_FACTOR_HUNDREDTHS - -• **TIME_FACTOR_HUNDREDTHS**: _number_ - ---- - -### TOKEN_MINT_END_SECONDS - -• **TOKEN_MINT_END_SECONDS**: _number_ - ---- - -### defaultBarbarianPercentage - -• **defaultBarbarianPercentage**: _number_[] - ---- - -### defaultDefense - -• **defaultDefense**: _number_[] - ---- - -### defaultPopulationCap - -• **defaultPopulationCap**: _number_[] - ---- - -### defaultPopulationGrowth - -• **defaultPopulationGrowth**: _number_[] - ---- - -### defaultRange - -• **defaultRange**: _number_[] - ---- - -### defaultSilverCap - -• **defaultSilverCap**: _number_[] - ---- - -### defaultSilverGrowth - -• **defaultSilverGrowth**: _number_[] - ---- - -### defaultSpeed - -• **defaultSpeed**: _number_[] - ---- - -### planetCumulativeRarities - -• **planetCumulativeRarities**: _number_[] - ---- - -### planetLevelThresholds - -• **planetLevelThresholds**: _number_[] - ---- - -### upgrades - -• **upgrades**: UpgradeBranches diff --git a/docs/interfaces/_types_global_GlobalTypes.MinerWorkerMessage.md b/docs/interfaces/_types_global_GlobalTypes.MinerWorkerMessage.md new file mode 100644 index 00000000..341b9302 --- /dev/null +++ b/docs/interfaces/_types_global_GlobalTypes.MinerWorkerMessage.md @@ -0,0 +1,92 @@ +# Interface: MinerWorkerMessage + +[\_types/global/GlobalTypes](../modules/_types_global_GlobalTypes.md).MinerWorkerMessage + +## Table of contents + +### Properties + +- [biomebaseKey](_types_global_GlobalTypes.MinerWorkerMessage.md#biomebasekey) +- [chunkFootprint](_types_global_GlobalTypes.MinerWorkerMessage.md#chunkfootprint) +- [jobId](_types_global_GlobalTypes.MinerWorkerMessage.md#jobid) +- [perlinLengthScale](_types_global_GlobalTypes.MinerWorkerMessage.md#perlinlengthscale) +- [perlinMirrorX](_types_global_GlobalTypes.MinerWorkerMessage.md#perlinmirrorx) +- [perlinMirrorY](_types_global_GlobalTypes.MinerWorkerMessage.md#perlinmirrory) +- [planetHashKey](_types_global_GlobalTypes.MinerWorkerMessage.md#planethashkey) +- [planetRarity](_types_global_GlobalTypes.MinerWorkerMessage.md#planetrarity) +- [spaceTypeKey](_types_global_GlobalTypes.MinerWorkerMessage.md#spacetypekey) +- [totalWorkers](_types_global_GlobalTypes.MinerWorkerMessage.md#totalworkers) +- [useMockHash](_types_global_GlobalTypes.MinerWorkerMessage.md#usemockhash) +- [workerIndex](_types_global_GlobalTypes.MinerWorkerMessage.md#workerindex) + +## Properties + +### biomebaseKey + +• **biomebaseKey**: `number` + +--- + +### chunkFootprint + +• **chunkFootprint**: [`Rectangle`](_types_global_GlobalTypes.Rectangle.md) + +--- + +### jobId + +• **jobId**: `number` + +--- + +### perlinLengthScale + +• **perlinLengthScale**: `number` + +--- + +### perlinMirrorX + +• **perlinMirrorX**: `boolean` + +--- + +### perlinMirrorY + +• **perlinMirrorY**: `boolean` + +--- + +### planetHashKey + +• **planetHashKey**: `number` + +--- + +### planetRarity + +• **planetRarity**: `number` + +--- + +### spaceTypeKey + +• **spaceTypeKey**: `number` + +--- + +### totalWorkers + +• **totalWorkers**: `number` + +--- + +### useMockHash + +• **useMockHash**: `boolean` + +--- + +### workerIndex + +• **workerIndex**: `number` diff --git a/docs/interfaces/_types_global_GlobalTypes.Rectangle.md b/docs/interfaces/_types_global_GlobalTypes.Rectangle.md new file mode 100644 index 00000000..fbceb4cc --- /dev/null +++ b/docs/interfaces/_types_global_GlobalTypes.Rectangle.md @@ -0,0 +1,26 @@ +# Interface: Rectangle + +[\_types/global/GlobalTypes](../modules/_types_global_GlobalTypes.md).Rectangle + +Ok, this is gonna sound weird, but all rectangles are squares. Also, we only permit side lengths +that are powers of two, and ALSO!! The side lengths must be between [MIN_CHUNK_SIZE](../modules/Frontend_Utils_constants.md#min_chunk_size) and +[MAX_CHUNK_SIZE](../modules/Frontend_Utils_constants.md#max_chunk_size). + +## Table of contents + +### Properties + +- [bottomLeft](_types_global_GlobalTypes.Rectangle.md#bottomleft) +- [sideLength](_types_global_GlobalTypes.Rectangle.md#sidelength) + +## Properties + +### bottomLeft + +• **bottomLeft**: `WorldCoords` + +--- + +### sideLength + +• **sideLength**: `number` diff --git a/docs/interfaces/_types_global_GlobalTypes.RevealCountdownInfo.md b/docs/interfaces/_types_global_GlobalTypes.RevealCountdownInfo.md new file mode 100644 index 00000000..7716be07 --- /dev/null +++ b/docs/interfaces/_types_global_GlobalTypes.RevealCountdownInfo.md @@ -0,0 +1,29 @@ +# Interface: RevealCountdownInfo + +[\_types/global/GlobalTypes](../modules/_types_global_GlobalTypes.md).RevealCountdownInfo + +## Table of contents + +### Properties + +- [currentlyRevealing](_types_global_GlobalTypes.RevealCountdownInfo.md#currentlyrevealing) +- [myLastRevealTimestamp](_types_global_GlobalTypes.RevealCountdownInfo.md#mylastrevealtimestamp) +- [revealCooldownTime](_types_global_GlobalTypes.RevealCountdownInfo.md#revealcooldowntime) + +## Properties + +### currentlyRevealing + +• **currentlyRevealing**: `boolean` + +--- + +### myLastRevealTimestamp + +• `Optional` **myLastRevealTimestamp**: `number` + +--- + +### revealCooldownTime + +• **revealCooldownTime**: `number` diff --git a/docs/interfaces/_types_global_globaltypes.minerworkermessage.md b/docs/interfaces/_types_global_globaltypes.minerworkermessage.md deleted file mode 100644 index 1f067a09..00000000 --- a/docs/interfaces/_types_global_globaltypes.minerworkermessage.md +++ /dev/null @@ -1,92 +0,0 @@ -# Interface: MinerWorkerMessage - -[\_types/global/GlobalTypes](../modules/_types_global_globaltypes.md).MinerWorkerMessage - -## Table of contents - -### Properties - -- [biomebaseKey](_types_global_globaltypes.minerworkermessage.md#biomebasekey) -- [chunkFootprint](_types_global_globaltypes.minerworkermessage.md#chunkfootprint) -- [jobId](_types_global_globaltypes.minerworkermessage.md#jobid) -- [perlinLengthScale](_types_global_globaltypes.minerworkermessage.md#perlinlengthscale) -- [perlinMirrorX](_types_global_globaltypes.minerworkermessage.md#perlinmirrorx) -- [perlinMirrorY](_types_global_globaltypes.minerworkermessage.md#perlinmirrory) -- [planetHashKey](_types_global_globaltypes.minerworkermessage.md#planethashkey) -- [planetRarity](_types_global_globaltypes.minerworkermessage.md#planetrarity) -- [spaceTypeKey](_types_global_globaltypes.minerworkermessage.md#spacetypekey) -- [totalWorkers](_types_global_globaltypes.minerworkermessage.md#totalworkers) -- [useMockHash](_types_global_globaltypes.minerworkermessage.md#usemockhash) -- [workerIndex](_types_global_globaltypes.minerworkermessage.md#workerindex) - -## Properties - -### biomebaseKey - -• **biomebaseKey**: _number_ - ---- - -### chunkFootprint - -• **chunkFootprint**: [_Rectangle_](_types_global_globaltypes.rectangle.md) - ---- - -### jobId - -• **jobId**: _number_ - ---- - -### perlinLengthScale - -• **perlinLengthScale**: _number_ - ---- - -### perlinMirrorX - -• **perlinMirrorX**: _boolean_ - ---- - -### perlinMirrorY - -• **perlinMirrorY**: _boolean_ - ---- - -### planetHashKey - -• **planetHashKey**: _number_ - ---- - -### planetRarity - -• **planetRarity**: _number_ - ---- - -### spaceTypeKey - -• **spaceTypeKey**: _number_ - ---- - -### totalWorkers - -• **totalWorkers**: _number_ - ---- - -### useMockHash - -• **useMockHash**: _boolean_ - ---- - -### workerIndex - -• **workerIndex**: _number_ diff --git a/docs/interfaces/_types_global_globaltypes.rectangle.md b/docs/interfaces/_types_global_globaltypes.rectangle.md deleted file mode 100644 index 75e883f7..00000000 --- a/docs/interfaces/_types_global_globaltypes.rectangle.md +++ /dev/null @@ -1,26 +0,0 @@ -# Interface: Rectangle - -[\_types/global/GlobalTypes](../modules/_types_global_globaltypes.md).Rectangle - -Ok, this is gonna sound weird, but all rectangles are squares. Also, we only permit side lengths -that are powers of two, and ALSO!! The side lengths must be between [MIN_CHUNK_SIZE](../modules/frontend_utils_constants.md#min_chunk_size) and -[MAX_CHUNK_SIZE](../modules/frontend_utils_constants.md#max_chunk_size). - -## Table of contents - -### Properties - -- [bottomLeft](_types_global_globaltypes.rectangle.md#bottomleft) -- [sideLength](_types_global_globaltypes.rectangle.md#sidelength) - -## Properties - -### bottomLeft - -• **bottomLeft**: WorldCoords - ---- - -### sideLength - -• **sideLength**: _number_ diff --git a/docs/interfaces/_types_global_globaltypes.revealcountdowninfo.md b/docs/interfaces/_types_global_globaltypes.revealcountdowninfo.md deleted file mode 100644 index cdc93821..00000000 --- a/docs/interfaces/_types_global_globaltypes.revealcountdowninfo.md +++ /dev/null @@ -1,29 +0,0 @@ -# Interface: RevealCountdownInfo - -[\_types/global/GlobalTypes](../modules/_types_global_globaltypes.md).RevealCountdownInfo - -## Table of contents - -### Properties - -- [currentlyRevealing](_types_global_globaltypes.revealcountdowninfo.md#currentlyrevealing) -- [myLastRevealTimestamp](_types_global_globaltypes.revealcountdowninfo.md#mylastrevealtimestamp) -- [revealCooldownTime](_types_global_globaltypes.revealcountdowninfo.md#revealcooldowntime) - -## Properties - -### currentlyRevealing - -• **currentlyRevealing**: _boolean_ - ---- - -### myLastRevealTimestamp - -• `Optional` **myLastRevealTimestamp**: _number_ - ---- - -### revealCooldownTime - -• **revealCooldownTime**: _number_ diff --git a/docs/interfaces/backend_gamelogic_artifactutils.renderedartifact.md b/docs/interfaces/backend_gamelogic_artifactutils.renderedartifact.md deleted file mode 100644 index d8c75206..00000000 --- a/docs/interfaces/backend_gamelogic_artifactutils.renderedartifact.md +++ /dev/null @@ -1,203 +0,0 @@ -# Interface: RenderedArtifact - -[Backend/GameLogic/ArtifactUtils](../modules/backend_gamelogic_artifactutils.md).RenderedArtifact - -## Hierarchy - -- _Partial_ - - ↳ **RenderedArtifact** - -## Table of contents - -### Properties - -- [artifactType](backend_gamelogic_artifactutils.renderedartifact.md#artifacttype) -- [currentOwner](backend_gamelogic_artifactutils.renderedartifact.md#currentowner) -- [discoverer](backend_gamelogic_artifactutils.renderedartifact.md#discoverer) -- [id](backend_gamelogic_artifactutils.renderedartifact.md#id) -- [isInititalized](backend_gamelogic_artifactutils.renderedartifact.md#isinititalized) -- [lastActivated](backend_gamelogic_artifactutils.renderedartifact.md#lastactivated) -- [lastDeactivated](backend_gamelogic_artifactutils.renderedartifact.md#lastdeactivated) -- [mintedAtTimestamp](backend_gamelogic_artifactutils.renderedartifact.md#mintedattimestamp) -- [onPlanetId](backend_gamelogic_artifactutils.renderedartifact.md#onplanetid) -- [onVoyageId](backend_gamelogic_artifactutils.renderedartifact.md#onvoyageid) -- [planetBiome](backend_gamelogic_artifactutils.renderedartifact.md#planetbiome) -- [planetDiscoveredOn](backend_gamelogic_artifactutils.renderedartifact.md#planetdiscoveredon) -- [rarity](backend_gamelogic_artifactutils.renderedartifact.md#rarity) -- [timeDelayedUpgrade](backend_gamelogic_artifactutils.renderedartifact.md#timedelayedupgrade) -- [unconfirmedActivateArtifact](backend_gamelogic_artifactutils.renderedartifact.md#unconfirmedactivateartifact) -- [unconfirmedDeactivateArtifact](backend_gamelogic_artifactutils.renderedartifact.md#unconfirmeddeactivateartifact) -- [unconfirmedDepositArtifact](backend_gamelogic_artifactutils.renderedartifact.md#unconfirmeddepositartifact) -- [unconfirmedMove](backend_gamelogic_artifactutils.renderedartifact.md#unconfirmedmove) -- [unconfirmedWithdrawArtifact](backend_gamelogic_artifactutils.renderedartifact.md#unconfirmedwithdrawartifact) -- [upgrade](backend_gamelogic_artifactutils.renderedartifact.md#upgrade) -- [wormholeTo](backend_gamelogic_artifactutils.renderedartifact.md#wormholeto) - -## Properties - -### artifactType - -• **artifactType**: ArtifactType - -Overrides: Partial.artifactType - ---- - -### currentOwner - -• `Optional` **currentOwner**: EthAddress - -Inherited from: Partial.currentOwner - ---- - -### discoverer - -• `Optional` **discoverer**: EthAddress - -Inherited from: Partial.discoverer - ---- - -### id - -• **id**: ArtifactId - -Overrides: Partial.id - ---- - -### isInititalized - -• `Optional` **isInititalized**: _boolean_ - -Inherited from: Partial.isInititalized - ---- - -### lastActivated - -• `Optional` **lastActivated**: _number_ - -Inherited from: Partial.lastActivated - ---- - -### lastDeactivated - -• `Optional` **lastDeactivated**: _number_ - -Inherited from: Partial.lastDeactivated - ---- - -### mintedAtTimestamp - -• `Optional` **mintedAtTimestamp**: _number_ - -Inherited from: Partial.mintedAtTimestamp - ---- - -### onPlanetId - -• `Optional` **onPlanetId**: LocationId - -Inherited from: Partial.onPlanetId - ---- - -### onVoyageId - -• `Optional` **onVoyageId**: VoyageId - -Inherited from: Partial.onVoyageId - ---- - -### planetBiome - -• **planetBiome**: Biome - -Overrides: Partial.planetBiome - ---- - -### planetDiscoveredOn - -• `Optional` **planetDiscoveredOn**: LocationId - -Inherited from: Partial.planetDiscoveredOn - ---- - -### rarity - -• **rarity**: ArtifactRarity - -Overrides: Partial.rarity - ---- - -### timeDelayedUpgrade - -• `Optional` **timeDelayedUpgrade**: Upgrade - -Inherited from: Partial.timeDelayedUpgrade - ---- - -### unconfirmedActivateArtifact - -• `Optional` **unconfirmedActivateArtifact**: UnconfirmedActivateArtifact - -Inherited from: Partial.unconfirmedActivateArtifact - ---- - -### unconfirmedDeactivateArtifact - -• `Optional` **unconfirmedDeactivateArtifact**: UnconfirmedDeactivateArtifact - -Inherited from: Partial.unconfirmedDeactivateArtifact - ---- - -### unconfirmedDepositArtifact - -• `Optional` **unconfirmedDepositArtifact**: UnconfirmedDepositArtifact - -Inherited from: Partial.unconfirmedDepositArtifact - ---- - -### unconfirmedMove - -• `Optional` **unconfirmedMove**: UnconfirmedMove - -Inherited from: Partial.unconfirmedMove - ---- - -### unconfirmedWithdrawArtifact - -• `Optional` **unconfirmedWithdrawArtifact**: UnconfirmedWithdrawArtifact - -Inherited from: Partial.unconfirmedWithdrawArtifact - ---- - -### upgrade - -• `Optional` **upgrade**: Upgrade - -Inherited from: Partial.upgrade - ---- - -### wormholeTo - -• `Optional` **wormholeTo**: LocationId - -Inherited from: Partial.wormholeTo diff --git a/docs/interfaces/backend_gamelogic_initialgamestatedownloader.initialgamestate.md b/docs/interfaces/backend_gamelogic_initialgamestatedownloader.initialgamestate.md deleted file mode 100644 index bf18b20d..00000000 --- a/docs/interfaces/backend_gamelogic_initialgamestatedownloader.initialgamestate.md +++ /dev/null @@ -1,127 +0,0 @@ -# Interface: InitialGameState - -[Backend/GameLogic/InitialGameStateDownloader](../modules/backend_gamelogic_initialgamestatedownloader.md).InitialGameState - -## Table of contents - -### Properties - -- [allRevealedCoords](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#allrevealedcoords) -- [allTouchedPlanetIds](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#alltouchedplanetids) -- [arrivals](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#arrivals) -- [artifactsOnVoyages](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#artifactsonvoyages) -- [balance](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#balance) -- [contractConstants](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#contractconstants) -- [gptCreditPriceEther](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#gptcreditpriceether) -- [heldArtifacts](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#heldartifacts) -- [loadedPlanets](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#loadedplanets) -- [myArtifacts](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#myartifacts) -- [myGPTCredits](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#mygptcredits) -- [pendingMoves](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#pendingmoves) -- [planetVoyageIdMap](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#planetvoyageidmap) -- [players](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#players) -- [revealedCoordsMap](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#revealedcoordsmap) -- [touchedAndLocatedPlanets](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#touchedandlocatedplanets) -- [worldRadius](backend_gamelogic_initialgamestatedownloader.initialgamestate.md#worldradius) - -## Properties - -### allRevealedCoords - -• **allRevealedCoords**: RevealedCoords[] - ---- - -### allTouchedPlanetIds - -• **allTouchedPlanetIds**: LocationId[] - ---- - -### arrivals - -• **arrivals**: _Map_ - ---- - -### artifactsOnVoyages - -• **artifactsOnVoyages**: Artifact[] - ---- - -### balance - -• **balance**: _number_ - ---- - -### contractConstants - -• **contractConstants**: [_ContractConstants_](_types_darkforest_api_contractsapitypes.contractconstants.md) - ---- - -### gptCreditPriceEther - -• **gptCreditPriceEther**: _number_ - ---- - -### heldArtifacts - -• **heldArtifacts**: Artifact[][] - ---- - -### loadedPlanets - -• **loadedPlanets**: LocationId[] - ---- - -### myArtifacts - -• **myArtifacts**: Artifact[] - ---- - -### myGPTCredits - -• **myGPTCredits**: _number_ - ---- - -### pendingMoves - -• **pendingMoves**: QueuedArrival[] - ---- - -### planetVoyageIdMap - -• **planetVoyageIdMap**: _Map_ - ---- - -### players - -• **players**: _Map_ - ---- - -### revealedCoordsMap - -• **revealedCoordsMap**: _Map_ - ---- - -### touchedAndLocatedPlanets - -• **touchedAndLocatedPlanets**: _Map_ - ---- - -### worldRadius - -• **worldRadius**: _number_ diff --git a/docs/interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md b/docs/interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md deleted file mode 100644 index 3ceba6f7..00000000 --- a/docs/interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md +++ /dev/null @@ -1,22 +0,0 @@ -# Interface: PlanetRenderInfo - -[Backend/GameLogic/ViewportEntities](../modules/backend_gamelogic_viewportentities.md).PlanetRenderInfo - -## Table of contents - -### Properties - -- [planet](backend_gamelogic_viewportentities.planetrenderinfo.md#planet) -- [radii](backend_gamelogic_viewportentities.planetrenderinfo.md#radii) - -## Properties - -### planet - -• **planet**: LocatablePlanet - ---- - -### radii - -• **radii**: [_Radii_](backend_gamelogic_viewportentities.radii.md) diff --git a/docs/interfaces/backend_gamelogic_viewportentities.radii.md b/docs/interfaces/backend_gamelogic_viewportentities.radii.md deleted file mode 100644 index 9c7f23e5..00000000 --- a/docs/interfaces/backend_gamelogic_viewportentities.radii.md +++ /dev/null @@ -1,22 +0,0 @@ -# Interface: Radii - -[Backend/GameLogic/ViewportEntities](../modules/backend_gamelogic_viewportentities.md).Radii - -## Table of contents - -### Properties - -- [radiusPixels](backend_gamelogic_viewportentities.radii.md#radiuspixels) -- [radiusWorld](backend_gamelogic_viewportentities.radii.md#radiusworld) - -## Properties - -### radiusPixels - -• **radiusPixels**: _number_ - ---- - -### radiusWorld - -• **radiusWorld**: _number_ diff --git a/docs/interfaces/backend_miner_miningpatterns.miningpattern.md b/docs/interfaces/backend_miner_miningpatterns.miningpattern.md deleted file mode 100644 index 58c0a986..00000000 --- a/docs/interfaces/backend_miner_miningpatterns.miningpattern.md +++ /dev/null @@ -1,46 +0,0 @@ -# Interface: MiningPattern - -[Backend/Miner/MiningPatterns](../modules/backend_miner_miningpatterns.md).MiningPattern - -## Implemented by - -- [_SpiralPattern_](../classes/backend_miner_miningpatterns.spiralpattern.md) -- [_SwissCheesePattern_](../classes/backend_miner_miningpatterns.swisscheesepattern.md) - -## Table of contents - -### Properties - -- [fromChunk](backend_miner_miningpatterns.miningpattern.md#fromchunk) -- [nextChunk](backend_miner_miningpatterns.miningpattern.md#nextchunk) -- [type](backend_miner_miningpatterns.miningpattern.md#type) - -## Properties - -### fromChunk - -• **fromChunk**: [_Rectangle_](_types_global_globaltypes.rectangle.md) - ---- - -### nextChunk - -• **nextChunk**: (`prevLoc`: [_Rectangle_](_types_global_globaltypes.rectangle.md)) => [_Rectangle_](_types_global_globaltypes.rectangle.md) - -#### Type declaration - -▸ (`prevLoc`: [_Rectangle_](_types_global_globaltypes.rectangle.md)): [_Rectangle_](_types_global_globaltypes.rectangle.md) - -#### Parameters - -| Name | Type | -| :-------- | :---------------------------------------------------- | -| `prevLoc` | [_Rectangle_](_types_global_globaltypes.rectangle.md) | - -**Returns:** [_Rectangle_](_types_global_globaltypes.rectangle.md) - ---- - -### type - -• **type**: [_MiningPatternType_](../enums/backend_miner_miningpatterns.miningpatterntype.md) diff --git a/docs/interfaces/backend_network_txexecutor.pendingtransaction.md b/docs/interfaces/backend_network_txexecutor.pendingtransaction.md deleted file mode 100644 index f3e75e2b..00000000 --- a/docs/interfaces/backend_network_txexecutor.pendingtransaction.md +++ /dev/null @@ -1,22 +0,0 @@ -# Interface: PendingTransaction - -[Backend/Network/TxExecutor](../modules/backend_network_txexecutor.md).PendingTransaction - -## Table of contents - -### Properties - -- [confirmed](backend_network_txexecutor.pendingtransaction.md#confirmed) -- [submitted](backend_network_txexecutor.pendingtransaction.md#submitted) - -## Properties - -### confirmed - -• **confirmed**: _Promise_ - ---- - -### submitted - -• **submitted**: _Promise_ diff --git a/docs/interfaces/backend_network_txexecutor.queuedtxrequest.md b/docs/interfaces/backend_network_txexecutor.queuedtxrequest.md deleted file mode 100644 index 7f85dec1..00000000 --- a/docs/interfaces/backend_network_txexecutor.queuedtxrequest.md +++ /dev/null @@ -1,119 +0,0 @@ -# Interface: QueuedTxRequest - -[Backend/Network/TxExecutor](../modules/backend_network_txexecutor.md).QueuedTxRequest - -## Table of contents - -### Properties - -- [actionId](backend_network_txexecutor.queuedtxrequest.md#actionid) -- [args](backend_network_txexecutor.queuedtxrequest.md#args) -- [contract](backend_network_txexecutor.queuedtxrequest.md#contract) -- [onReceiptError](backend_network_txexecutor.queuedtxrequest.md#onreceipterror) -- [onSubmissionError](backend_network_txexecutor.queuedtxrequest.md#onsubmissionerror) -- [onTransactionReceipt](backend_network_txexecutor.queuedtxrequest.md#ontransactionreceipt) -- [onTransactionResponse](backend_network_txexecutor.queuedtxrequest.md#ontransactionresponse) -- [overrides](backend_network_txexecutor.queuedtxrequest.md#overrides) -- [type](backend_network_txexecutor.queuedtxrequest.md#type) - -## Properties - -### actionId - -• **actionId**: _string_ - ---- - -### args - -• **args**: _unknown_[] - ---- - -### contract - -• **contract**: _Contract_ - ---- - -### onReceiptError - -• **onReceiptError**: (`e`: Error) => _void_ - -#### Type declaration - -▸ (`e`: Error): _void_ - -#### Parameters - -| Name | Type | -| :--- | :---- | -| `e` | Error | - -**Returns:** _void_ - ---- - -### onSubmissionError - -• **onSubmissionError**: (`e`: Error) => _void_ - -#### Type declaration - -▸ (`e`: Error): _void_ - -#### Parameters - -| Name | Type | -| :--- | :---- | -| `e` | Error | - -**Returns:** _void_ - ---- - -### onTransactionReceipt - -• **onTransactionReceipt**: (`e`: TransactionReceipt) => _void_ - -#### Type declaration - -▸ (`e`: TransactionReceipt): _void_ - -#### Parameters - -| Name | Type | -| :--- | :----------------- | -| `e` | TransactionReceipt | - -**Returns:** _void_ - ---- - -### onTransactionResponse - -• **onTransactionResponse**: (`e`: TransactionResponse) => _void_ - -#### Type declaration - -▸ (`e`: TransactionResponse): _void_ - -#### Parameters - -| Name | Type | -| :--- | :------------------ | -| `e` | TransactionResponse | - -**Returns:** _void_ - ---- - -### overrides - -• **overrides**: TransactionRequest - ---- - -### type - -• **type**: EthTxType diff --git a/docs/interfaces/backend_plugins_embeddedpluginloader.embeddedplugin.md b/docs/interfaces/backend_plugins_embeddedpluginloader.embeddedplugin.md deleted file mode 100644 index 7664ae5d..00000000 --- a/docs/interfaces/backend_plugins_embeddedpluginloader.embeddedplugin.md +++ /dev/null @@ -1,31 +0,0 @@ -# Interface: EmbeddedPlugin - -[Backend/Plugins/EmbeddedPluginLoader](../modules/backend_plugins_embeddedpluginloader.md).EmbeddedPlugin - -This interface represents an embedded plugin, which is stored in `embedded_plugins/`. - -## Table of contents - -### Properties - -- [code](backend_plugins_embeddedpluginloader.embeddedplugin.md#code) -- [id](backend_plugins_embeddedpluginloader.embeddedplugin.md#id) -- [name](backend_plugins_embeddedpluginloader.embeddedplugin.md#name) - -## Properties - -### code - -• **code**: _string_ - ---- - -### id - -• **id**: [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid) - ---- - -### name - -• **name**: _string_ diff --git a/docs/interfaces/backend_plugins_pluginprocess.pluginprocess.md b/docs/interfaces/backend_plugins_pluginprocess.pluginprocess.md deleted file mode 100644 index 4b7ddd73..00000000 --- a/docs/interfaces/backend_plugins_pluginprocess.pluginprocess.md +++ /dev/null @@ -1,84 +0,0 @@ -# Interface: PluginProcess - -[Backend/Plugins/PluginProcess](../modules/backend_plugins_pluginprocess.md).PluginProcess - -All plugins must conform to this interface. Provides facilities for -displaying an interactive UI, as well as references to game state, -which are set externally. - -## Table of contents - -### Constructors - -- [constructor](backend_plugins_pluginprocess.pluginprocess.md#constructor) - -### Properties - -- [destroy](backend_plugins_pluginprocess.pluginprocess.md#destroy) -- [draw](backend_plugins_pluginprocess.pluginprocess.md#draw) -- [render](backend_plugins_pluginprocess.pluginprocess.md#render) - -## Constructors - -### constructor - -\+ **new PluginProcess**(): [_PluginProcess_](backend_plugins_pluginprocess.pluginprocess.md) - -**Returns:** [_PluginProcess_](backend_plugins_pluginprocess.pluginprocess.md) - -## Properties - -### destroy - -• `Optional` **destroy**: () => _void_ - -Called when the plugin is unloaded. Plugins unload whenever the -plugin is edited (modified and saved, or deleted). - -#### Type declaration - -▸ (): _void_ - -**Returns:** _void_ - ---- - -### draw - -• `Optional` **draw**: (`ctx`: CanvasRenderingContext2D) => _void_ - -If present, called at the same framerate the the game is running at, -and allows you to draw on top of the game UI. - -#### Type declaration - -▸ (`ctx`: CanvasRenderingContext2D): _void_ - -#### Parameters - -| Name | Type | -| :---- | :----------------------- | -| `ctx` | CanvasRenderingContext2D | - -**Returns:** _void_ - ---- - -### render - -• `Optional` **render**: (`into`: HTMLDivElement) => _void_ - -If present, called once when the user clicks 'run' in the plugin -manager modal. - -#### Type declaration - -▸ (`into`: HTMLDivElement): _void_ - -#### Parameters - -| Name | Type | -| :----- | :------------- | -| `into` | HTMLDivElement | - -**Returns:** _void_ diff --git a/docs/interfaces/backend_plugins_serializedplugin.serializedplugin.md b/docs/interfaces/backend_plugins_serializedplugin.serializedplugin.md deleted file mode 100644 index 4b2c2940..00000000 --- a/docs/interfaces/backend_plugins_serializedplugin.serializedplugin.md +++ /dev/null @@ -1,48 +0,0 @@ -# Interface: SerializedPlugin - -[Backend/Plugins/SerializedPlugin](../modules/backend_plugins_serializedplugin.md).SerializedPlugin - -Represents a plugin that the user has added to their game. Used -internally for storing plugins. Not used for evaluating plugins! - -## Table of contents - -### Properties - -- [code](backend_plugins_serializedplugin.serializedplugin.md#code) -- [id](backend_plugins_serializedplugin.serializedplugin.md#id) -- [lastEdited](backend_plugins_serializedplugin.serializedplugin.md#lastedited) -- [name](backend_plugins_serializedplugin.serializedplugin.md#name) - -## Properties - -### code - -• **code**: _string_ - -This code is a javascript object that complies with the -[PluginProcess](backend_plugins_pluginprocess.pluginprocess.md) interface. - ---- - -### id - -• **id**: [_PluginId_](../modules/backend_plugins_serializedplugin.md#pluginid) - -Unique ID, assigned at the time the plugin is first saved. - ---- - -### lastEdited - -• **lastEdited**: _number_ - -{@code new Date.getTime()} at the point that this plugin was saved - ---- - -### name - -• **name**: _string_ - -Shown in the list of plugins. diff --git a/docs/interfaces/backend_utils_coordinates.canvascoords.md b/docs/interfaces/backend_utils_coordinates.canvascoords.md deleted file mode 100644 index bfcd8741..00000000 --- a/docs/interfaces/backend_utils_coordinates.canvascoords.md +++ /dev/null @@ -1,22 +0,0 @@ -# Interface: CanvasCoords - -[Backend/Utils/Coordinates](../modules/backend_utils_coordinates.md).CanvasCoords - -## Table of contents - -### Properties - -- [x](backend_utils_coordinates.canvascoords.md#x) -- [y](backend_utils_coordinates.canvascoords.md#y) - -## Properties - -### x - -• **x**: _number_ - ---- - -### y - -• **y**: _number_ diff --git a/docs/interfaces/backend_utils_utilstypes.planetcosmeticinfo.md b/docs/interfaces/backend_utils_utilstypes.planetcosmeticinfo.md deleted file mode 100644 index 9c9d4791..00000000 --- a/docs/interfaces/backend_utils_utilstypes.planetcosmeticinfo.md +++ /dev/null @@ -1,155 +0,0 @@ -# Interface: PlanetCosmeticInfo - -[Backend/Utils/UtilsTypes](../modules/backend_utils_utilstypes.md).PlanetCosmeticInfo - -## Table of contents - -### Properties - -- [asteroidHsl](backend_utils_utilstypes.planetcosmeticinfo.md#asteroidhsl) -- [backgroundColor](backend_utils_utilstypes.planetcosmeticinfo.md#backgroundcolor) -- [baseColor](backend_utils_utilstypes.planetcosmeticinfo.md#basecolor) -- [baseColor2](backend_utils_utilstypes.planetcosmeticinfo.md#basecolor2) -- [baseColor3](backend_utils_utilstypes.planetcosmeticinfo.md#basecolor3) -- [baseHue](backend_utils_utilstypes.planetcosmeticinfo.md#basehue) -- [baseStr](backend_utils_utilstypes.planetcosmeticinfo.md#basestr) -- [beachRgb](backend_utils_utilstypes.planetcosmeticinfo.md#beachrgb) -- [bgStr](backend_utils_utilstypes.planetcosmeticinfo.md#bgstr) -- [hatType](backend_utils_utilstypes.planetcosmeticinfo.md#hattype) -- [landRgb](backend_utils_utilstypes.planetcosmeticinfo.md#landrgb) -- [mtnColor](backend_utils_utilstypes.planetcosmeticinfo.md#mtncolor) -- [mtnColor2](backend_utils_utilstypes.planetcosmeticinfo.md#mtncolor2) -- [mtnColor3](backend_utils_utilstypes.planetcosmeticinfo.md#mtncolor3) -- [oceanRgb](backend_utils_utilstypes.planetcosmeticinfo.md#oceanrgb) -- [previewColor](backend_utils_utilstypes.planetcosmeticinfo.md#previewcolor) -- [ruins](backend_utils_utilstypes.planetcosmeticinfo.md#ruins) -- [seed](backend_utils_utilstypes.planetcosmeticinfo.md#seed) -- [spacetime1](backend_utils_utilstypes.planetcosmeticinfo.md#spacetime1) -- [spacetime2](backend_utils_utilstypes.planetcosmeticinfo.md#spacetime2) -- [spacetime3](backend_utils_utilstypes.planetcosmeticinfo.md#spacetime3) - -## Properties - -### asteroidHsl - -• **asteroidHsl**: [_HSLVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#hslvec) - ---- - -### backgroundColor - -• **backgroundColor**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### baseColor - -• **baseColor**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### baseColor2 - -• **baseColor2**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### baseColor3 - -• **baseColor3**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### baseHue - -• **baseHue**: _number_ - ---- - -### baseStr - -• **baseStr**: _string_ - ---- - -### beachRgb - -• **beachRgb**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### bgStr - -• **bgStr**: _string_ - ---- - -### hatType - -• **hatType**: [_HatType_](../enums/frontend_utils_hats.hattype.md) - ---- - -### landRgb - -• **landRgb**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### mtnColor - -• **mtnColor**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### mtnColor2 - -• **mtnColor2**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### mtnColor3 - -• **mtnColor3**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### oceanRgb - -• **oceanRgb**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### previewColor - -• **previewColor**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### ruins - -• `Optional` **ruins**: _Record_ - ---- - -### seed - -• **seed**: _number_ - ---- - -### spacetime1 - -• **spacetime1**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### spacetime2 - -• **spacetime2**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) - ---- - -### spacetime3 - -• **spacetime3**: [_RGBVec_](../modules/frontend_renderers_gamerenderer_enginetypes.md#rgbvec) diff --git a/docs/interfaces/frontend_components_btn.btnprops.md b/docs/interfaces/frontend_components_btn.btnprops.md deleted file mode 100644 index b1578cb7..00000000 --- a/docs/interfaces/frontend_components_btn.btnprops.md +++ /dev/null @@ -1,50 +0,0 @@ -# Interface: BtnProps - -[Frontend/Components/Btn](../modules/frontend_components_btn.md).BtnProps - -## Table of contents - -### Properties - -- [borderColor](frontend_components_btn.btnprops.md#bordercolor) -- [color](frontend_components_btn.btnprops.md#color) -- [disabled](frontend_components_btn.btnprops.md#disabled) -- [noBorder](frontend_components_btn.btnprops.md#noborder) -- [textColor](frontend_components_btn.btnprops.md#textcolor) -- [wide](frontend_components_btn.btnprops.md#wide) - -## Properties - -### borderColor - -• `Optional` **borderColor**: _string_ - ---- - -### color - -• `Optional` **color**: _string_ - ---- - -### disabled - -• `Optional` **disabled**: _boolean_ - ---- - -### noBorder - -• `Optional` **noBorder**: _boolean_ - ---- - -### textColor - -• `Optional` **textColor**: _string_ - ---- - -### wide - -• `Optional` **wide**: _boolean_ diff --git a/docs/interfaces/frontend_components_textloadingbar.loadingbarhandle.md b/docs/interfaces/frontend_components_textloadingbar.loadingbarhandle.md deleted file mode 100644 index e1d7b48f..00000000 --- a/docs/interfaces/frontend_components_textloadingbar.loadingbarhandle.md +++ /dev/null @@ -1,27 +0,0 @@ -# Interface: LoadingBarHandle - -[Frontend/Components/TextLoadingBar](../modules/frontend_components_textloadingbar.md).LoadingBarHandle - -## Table of contents - -### Properties - -- [setFractionCompleted](frontend_components_textloadingbar.loadingbarhandle.md#setfractioncompleted) - -## Properties - -### setFractionCompleted - -• **setFractionCompleted**: (`fractionCompleted`: _number_) => _void_ - -#### Type declaration - -▸ (`fractionCompleted`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :------------------ | :------- | -| `fractionCompleted` | _number_ | - -**Returns:** _void_ diff --git a/docs/interfaces/frontend_panes_diagnosticspane.diagnostics.md b/docs/interfaces/frontend_panes_diagnosticspane.diagnostics.md deleted file mode 100644 index db18337d..00000000 --- a/docs/interfaces/frontend_panes_diagnosticspane.diagnostics.md +++ /dev/null @@ -1,85 +0,0 @@ -# Interface: Diagnostics - -[Frontend/Panes/DiagnosticsPane](../modules/frontend_panes_diagnosticspane.md).Diagnostics - -## Table of contents - -### Properties - -- [callsInQueue](frontend_panes_diagnosticspane.diagnostics.md#callsinqueue) -- [chunkUpdates](frontend_panes_diagnosticspane.diagnostics.md#chunkupdates) -- [fps](frontend_panes_diagnosticspane.diagnostics.md#fps) -- [gasPrices](frontend_panes_diagnosticspane.diagnostics.md#gasprices) -- [totalCalls](frontend_panes_diagnosticspane.diagnostics.md#totalcalls) -- [totalChunks](frontend_panes_diagnosticspane.diagnostics.md#totalchunks) -- [totalPlanets](frontend_panes_diagnosticspane.diagnostics.md#totalplanets) -- [totalTransactions](frontend_panes_diagnosticspane.diagnostics.md#totaltransactions) -- [transactionsInQueue](frontend_panes_diagnosticspane.diagnostics.md#transactionsinqueue) -- [visibleChunks](frontend_panes_diagnosticspane.diagnostics.md#visiblechunks) -- [visiblePlanets](frontend_panes_diagnosticspane.diagnostics.md#visibleplanets) - -## Properties - -### callsInQueue - -• **callsInQueue**: _number_ - ---- - -### chunkUpdates - -• **chunkUpdates**: _number_ - ---- - -### fps - -• **fps**: _number_ - ---- - -### gasPrices - -• `Optional` **gasPrices**: GasPrices - ---- - -### totalCalls - -• **totalCalls**: _number_ - ---- - -### totalChunks - -• **totalChunks**: _number_ - ---- - -### totalPlanets - -• **totalPlanets**: _number_ - ---- - -### totalTransactions - -• **totalTransactions**: _number_ - ---- - -### transactionsInQueue - -• **transactionsInQueue**: _number_ - ---- - -### visibleChunks - -• **visibleChunks**: _number_ - ---- - -### visiblePlanets - -• **visiblePlanets**: _number_ diff --git a/docs/interfaces/frontend_views_share.shareprops.md b/docs/interfaces/frontend_views_share.shareprops.md deleted file mode 100644 index 7a315e86..00000000 --- a/docs/interfaces/frontend_views_share.shareprops.md +++ /dev/null @@ -1,54 +0,0 @@ -# Interface: ShareProps - -[Frontend/Views/Share](../modules/frontend_views_share.md).ShareProps - -## Type parameters - -| Name | -| :--- | -| `T` | - -## Table of contents - -### Properties - -- [children](frontend_views_share.shareprops.md#children) -- [load](frontend_views_share.shareprops.md#load) - -## Properties - -### children - -• **children**: (`state`: _undefined_ \| T, `loading`: _boolean_, `error`: _undefined_ \| Error) => ReactNode - -#### Type declaration - -▸ (`state`: _undefined_ \| T, `loading`: _boolean_, `error`: _undefined_ \| Error): ReactNode - -#### Parameters - -| Name | Type | -| :-------- | :------------------- | -| `state` | _undefined_ \| T | -| `loading` | _boolean_ | -| `error` | _undefined_ \| Error | - -**Returns:** ReactNode - ---- - -### load - -• **load**: (`store`: [_default_](../classes/backend_storage_readerdatastore.default.md)) => _Promise_ - -#### Type declaration - -▸ (`store`: [_default_](../classes/backend_storage_readerdatastore.default.md)): _Promise_ - -#### Parameters - -| Name | Type | -| :------ | :----------------------------------------------------------------- | -| `store` | [_default_](../classes/backend_storage_readerdatastore.default.md) | - -**Returns:** _Promise_ diff --git a/docs/interfaces/frontend_views_terminal.terminalhandle.md b/docs/interfaces/frontend_views_terminal.terminalhandle.md deleted file mode 100644 index 61bdc1bd..00000000 --- a/docs/interfaces/frontend_views_terminal.terminalhandle.md +++ /dev/null @@ -1,251 +0,0 @@ -# Interface: TerminalHandle - -[Frontend/Views/Terminal](../modules/frontend_views_terminal.md).TerminalHandle - -## Table of contents - -### Properties - -- [clear](frontend_views_terminal.terminalhandle.md#clear) -- [focus](frontend_views_terminal.terminalhandle.md#focus) -- [getInput](frontend_views_terminal.terminalhandle.md#getinput) -- [newline](frontend_views_terminal.terminalhandle.md#newline) -- [print](frontend_views_terminal.terminalhandle.md#print) -- [printElement](frontend_views_terminal.terminalhandle.md#printelement) -- [printLink](frontend_views_terminal.terminalhandle.md#printlink) -- [printLoadingBar](frontend_views_terminal.terminalhandle.md#printloadingbar) -- [printLoadingSpinner](frontend_views_terminal.terminalhandle.md#printloadingspinner) -- [printShellLn](frontend_views_terminal.terminalhandle.md#printshellln) -- [println](frontend_views_terminal.terminalhandle.md#println) -- [removeLast](frontend_views_terminal.terminalhandle.md#removelast) -- [setInput](frontend_views_terminal.terminalhandle.md#setinput) -- [setUserInputEnabled](frontend_views_terminal.terminalhandle.md#setuserinputenabled) - -## Properties - -### clear - -• **clear**: () => _void_ - -#### Type declaration - -▸ (): _void_ - -**Returns:** _void_ - ---- - -### focus - -• **focus**: () => _void_ - -#### Type declaration - -▸ (): _void_ - -**Returns:** _void_ - ---- - -### getInput - -• **getInput**: () => _Promise_ - -#### Type declaration - -▸ (): _Promise_ - -**Returns:** _Promise_ - ---- - -### newline - -• **newline**: () => _void_ - -#### Type declaration - -▸ (): _void_ - -**Returns:** _void_ - ---- - -### print - -• **print**: (`str`: _string_, `style?`: [_Green_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#green) \| [_Sub_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#sub) \| [_White_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#white) \| [_Red_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#red) \| [_Blue_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#blue) \| [_Invisible_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#invisible) \| [_Default_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#default) \| [_Underline_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#underline) \| [_Hoverable_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#hoverable), `hoverContents?`: () => _Element_) => _void_ - -#### Type declaration - -▸ (`str`: _string_, `style?`: [_Green_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#green) \| [_Sub_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#sub) \| [_White_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#white) \| [_Red_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#red) \| [_Blue_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#blue) \| [_Invisible_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#invisible) \| [_Default_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#default) \| [_Underline_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#underline) \| [_Hoverable_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#hoverable), `hoverContents?`: () => _Element_): _void_ - -#### Parameters - -| Name | Type | -| :--------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `str` | _string_ | -| `style?` | [_Green_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#green) \| [_Sub_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#sub) \| [_White_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#white) \| [_Red_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#red) \| [_Blue_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#blue) \| [_Invisible_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#invisible) \| [_Default_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#default) \| [_Underline_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#underline) \| [_Hoverable_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#hoverable) | -| `hoverContents?` | () => _Element_ | - -**Returns:** _void_ - ---- - -### printElement - -• **printElement**: (`element`: _ReactElement_ `null` \| _ReactElement_ \| (`props`: _any_) => _Component_\>) => _void_ - -#### Type declaration - -▸ (`element`: _ReactElement_ `null` \| _ReactElement_ \| (`props`: _any_) => _Component_\>): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------- | -| `element` | _ReactElement_ `null` \| _ReactElement_ \| (`props`: _any_) => _Component_\> | - -**Returns:** _void_ - ---- - -### printLink - -• **printLink**: (`str`: _string_, `onClick`: () => _void_, `style`: [_TerminalTextStyle_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md)) => _void_ - -#### Type declaration - -▸ (`str`: _string_, `onClick`: () => _void_, `style`: [_TerminalTextStyle_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md)): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :-------------------------------------------------------------------------------- | -| `str` | _string_ | -| `onClick` | () => _void_ | -| `style` | [_TerminalTextStyle_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md) | - -**Returns:** _void_ - ---- - -### printLoadingBar - -• **printLoadingBar**: (`prettyEntityName`: _string_, `ref`: _RefObject_<[_LoadingBarHandle_](frontend_components_textloadingbar.loadingbarhandle.md)\>) => _void_ - -#### Type declaration - -▸ (`prettyEntityName`: _string_, `ref`: _RefObject_<[_LoadingBarHandle_](frontend_components_textloadingbar.loadingbarhandle.md)\>): _void_ - -#### Parameters - -| Name | Type | -| :----------------- | :----------------------------------------------------------------------------------------- | -| `prettyEntityName` | _string_ | -| `ref` | _RefObject_<[_LoadingBarHandle_](frontend_components_textloadingbar.loadingbarhandle.md)\> | - -**Returns:** _void_ - ---- - -### printLoadingSpinner - -• **printLoadingSpinner**: () => _void_ - -#### Type declaration - -▸ (): _void_ - -**Returns:** _void_ - ---- - -### printShellLn - -• **printShellLn**: (`str`: _string_) => _void_ - -#### Type declaration - -▸ (`str`: _string_): _void_ - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `str` | _string_ | - -**Returns:** _void_ - ---- - -### println - -• **println**: (`str`: _string_, `style?`: [_Green_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#green) \| [_Sub_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#sub) \| [_White_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#white) \| [_Red_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#red) \| [_Blue_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#blue) \| [_Invisible_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#invisible) \| [_Default_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#default) \| [_Underline_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#underline) \| [_Hoverable_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#hoverable), `hoverContents?`: () => _Element_) => _void_ - -#### Type declaration - -▸ (`str`: _string_, `style?`: [_Green_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#green) \| [_Sub_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#sub) \| [_White_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#white) \| [_Red_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#red) \| [_Blue_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#blue) \| [_Invisible_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#invisible) \| [_Default_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#default) \| [_Underline_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#underline) \| [_Hoverable_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#hoverable), `hoverContents?`: () => _Element_): _void_ - -#### Parameters - -| Name | Type | -| :--------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `str` | _string_ | -| `style?` | [_Green_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#green) \| [_Sub_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#sub) \| [_White_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#white) \| [_Red_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#red) \| [_Blue_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#blue) \| [_Invisible_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#invisible) \| [_Default_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#default) \| [_Underline_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#underline) \| [_Hoverable_](../enums/frontend_utils_terminaltypes.terminaltextstyle.md#hoverable) | -| `hoverContents?` | () => _Element_ | - -**Returns:** _void_ - ---- - -### removeLast - -• **removeLast**: (`n`: _number_) => _void_ - -#### Type declaration - -▸ (`n`: _number_): _void_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `n` | _number_ | - -**Returns:** _void_ - ---- - -### setInput - -• **setInput**: (`input`: _string_) => _void_ - -#### Type declaration - -▸ (`input`: _string_): _void_ - -#### Parameters - -| Name | Type | -| :------ | :------- | -| `input` | _string_ | - -**Returns:** _void_ - ---- - -### setUserInputEnabled - -• **setUserInputEnabled**: (`enabled`: _boolean_) => _void_ - -#### Type declaration - -▸ (`enabled`: _boolean_): _void_ - -#### Parameters - -| Name | Type | -| :-------- | :-------- | -| `enabled` | _boolean_ | - -**Returns:** _void_ diff --git a/docs/interfaces/frontend_views_terminal.terminalprops.md b/docs/interfaces/frontend_views_terminal.terminalprops.md deleted file mode 100644 index b9a65e91..00000000 --- a/docs/interfaces/frontend_views_terminal.terminalprops.md +++ /dev/null @@ -1,15 +0,0 @@ -# Interface: TerminalProps - -[Frontend/Views/Terminal](../modules/frontend_views_terminal.md).TerminalProps - -## Table of contents - -### Properties - -- [promptCharacter](frontend_views_terminal.terminalprops.md#promptcharacter) - -## Properties - -### promptCharacter - -• **promptCharacter**: _string_ diff --git a/docs/modules/Backend_GameLogic_ArrivalUtils.md b/docs/modules/Backend_GameLogic_ArrivalUtils.md new file mode 100644 index 00000000..bf0bbe95 --- /dev/null +++ b/docs/modules/Backend_GameLogic_ArrivalUtils.md @@ -0,0 +1,178 @@ +# Module: Backend/GameLogic/ArrivalUtils + +## Table of contents + +### Interfaces + +- [PlanetDiff](../interfaces/Backend_GameLogic_ArrivalUtils.PlanetDiff.md) + +### Functions + +- [applyUpgrade](Backend_GameLogic_ArrivalUtils.md#applyupgrade) +- [arrive](Backend_GameLogic_ArrivalUtils.md#arrive) +- [blocksLeftToProspectExpiration](Backend_GameLogic_ArrivalUtils.md#blockslefttoprospectexpiration) +- [enoughEnergyToProspect](Backend_GameLogic_ArrivalUtils.md#enoughenergytoprospect) +- [getEmojiMessage](Backend_GameLogic_ArrivalUtils.md#getemojimessage) +- [isFindable](Backend_GameLogic_ArrivalUtils.md#isfindable) +- [isProspectable](Backend_GameLogic_ArrivalUtils.md#isprospectable) +- [prospectExpired](Backend_GameLogic_ArrivalUtils.md#prospectexpired) +- [updatePlanetToTime](Backend_GameLogic_ArrivalUtils.md#updateplanettotime) + +## Functions + +### applyUpgrade + +▸ `Const` **applyUpgrade**(`planet`, `upgrade`, `unApply?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :-------- | :-------- | :------------ | +| `planet` | `Planet` | `undefined` | +| `upgrade` | `Upgrade` | `undefined` | +| `unApply` | `boolean` | `false` | + +#### Returns + +`void` + +--- + +### arrive + +▸ `Const` **arrive**(`toPlanet`, `artifactsOnPlanet`, `arrival`, `contractConstants`): [`PlanetDiff`](../interfaces/Backend_GameLogic_ArrivalUtils.PlanetDiff.md) + +#### Parameters + +| Name | Type | +| :------------------ | :------------------------------------------------------------------------------------------------ | +| `toPlanet` | `Planet` | +| `artifactsOnPlanet` | `Artifact`[] | +| `arrival` | `QueuedArrival` | +| `contractConstants` | [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) | + +#### Returns + +[`PlanetDiff`](../interfaces/Backend_GameLogic_ArrivalUtils.PlanetDiff.md) + +--- + +### blocksLeftToProspectExpiration + +▸ `Const` **blocksLeftToProspectExpiration**(`currentBlockNumber`, `prospectedBlockNumber?`): `number` + +#### Parameters + +| Name | Type | +| :----------------------- | :------- | +| `currentBlockNumber` | `number` | +| `prospectedBlockNumber?` | `number` | + +#### Returns + +`number` + +--- + +### enoughEnergyToProspect + +▸ `Const` **enoughEnergyToProspect**(`p`): `boolean` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `p` | `Planet` | + +#### Returns + +`boolean` + +--- + +### getEmojiMessage + +▸ **getEmojiMessage**(`planet`): `PlanetMessage`<`EmojiFlagBody`\> \| `undefined` + +**`todo`** ArrivalUtils has become a dumping ground for functions that should just live inside of a +`Planet` class. + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `Planet` \| `undefined` | + +#### Returns + +`PlanetMessage`<`EmojiFlagBody`\> \| `undefined` + +--- + +### isFindable + +▸ `Const` **isFindable**(`planet`, `currentBlockNumber?`): `boolean` + +#### Parameters + +| Name | Type | +| :-------------------- | :------- | +| `planet` | `Planet` | +| `currentBlockNumber?` | `number` | + +#### Returns + +`boolean` + +--- + +### isProspectable + +▸ `Const` **isProspectable**(`planet`): `boolean` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`boolean` + +--- + +### prospectExpired + +▸ `Const` **prospectExpired**(`currentBlockNumber`, `prospectedBlockNumber`): `boolean` + +#### Parameters + +| Name | Type | +| :---------------------- | :------- | +| `currentBlockNumber` | `number` | +| `prospectedBlockNumber` | `number` | + +#### Returns + +`boolean` + +--- + +### updatePlanetToTime + +▸ `Const` **updatePlanetToTime**(`planet`, `planetArtifacts`, `atTimeMillis`, `contractConstants`, `setPlanet?`): `void` + +#### Parameters + +| Name | Type | +| :------------------ | :------------------------------------------------------------------------------------------------ | +| `planet` | `Planet` | +| `planetArtifacts` | `Artifact`[] | +| `atTimeMillis` | `number` | +| `contractConstants` | [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) | +| `setPlanet` | (`p`: `Planet`) => `void` | + +#### Returns + +`void` diff --git a/docs/modules/Backend_GameLogic_ArtifactUtils.md b/docs/modules/Backend_GameLogic_ArtifactUtils.md new file mode 100644 index 00000000..5b1236aa --- /dev/null +++ b/docs/modules/Backend_GameLogic_ArtifactUtils.md @@ -0,0 +1,321 @@ +# Module: Backend/GameLogic/ArtifactUtils + +## Table of contents + +### Enumerations + +- [ArtifactFileColor](../enums/Backend_GameLogic_ArtifactUtils.ArtifactFileColor.md) + +### Interfaces + +- [RenderedArtifact](../interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md) + +### Variables + +- [RelicsList](Backend_GameLogic_ArtifactUtils.md#relicslist) + +### Functions + +- [artifactAvailableTimestamp](Backend_GameLogic_ArtifactUtils.md#artifactavailabletimestamp) +- [artifactBiomeName](Backend_GameLogic_ArtifactUtils.md#artifactbiomename) +- [artifactFileName](Backend_GameLogic_ArtifactUtils.md#artifactfilename) +- [artifactRoll](Backend_GameLogic_ArtifactUtils.md#artifactroll) +- [biomeName](Backend_GameLogic_ArtifactUtils.md#biomename) +- [getActivatedArtifact](Backend_GameLogic_ArtifactUtils.md#getactivatedartifact) +- [getActiveBlackDomain](Backend_GameLogic_ArtifactUtils.md#getactiveblackdomain) +- [getArtifactDebugName](Backend_GameLogic_ArtifactUtils.md#getartifactdebugname) +- [hasUnconfirmedArtifactTx](Backend_GameLogic_ArtifactUtils.md#hasunconfirmedartifacttx) +- [isActivated](Backend_GameLogic_ArtifactUtils.md#isactivated) +- [isAncient](Backend_GameLogic_ArtifactUtils.md#isancient) +- [isBasic](Backend_GameLogic_ArtifactUtils.md#isbasic) +- [isRelic](Backend_GameLogic_ArtifactUtils.md#isrelic) +- [levelFromRarity](Backend_GameLogic_ArtifactUtils.md#levelfromrarity) +- [rarityName](Backend_GameLogic_ArtifactUtils.md#rarityname) +- [rarityNameFromArtifact](Backend_GameLogic_ArtifactUtils.md#raritynamefromartifact) +- [setForceAncient](Backend_GameLogic_ArtifactUtils.md#setforceancient) + +## Variables + +### RelicsList + +• `Const` **RelicsList**: `ArtifactType`[] + +## Functions + +### artifactAvailableTimestamp + +▸ **artifactAvailableTimestamp**(`artifact`): `number` + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `artifact` | `Artifact` | + +#### Returns + +`number` + +--- + +### artifactBiomeName + +▸ **artifactBiomeName**(`artifact`): `string` + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `artifact` | `Artifact` | + +#### Returns + +`string` + +--- + +### artifactFileName + +▸ **artifactFileName**(`videoMode`, `thumb`, `artifact`, `color`, `debugProps?`): `string` + +#### Parameters + +| Name | Type | +| :----------- | :-------------------------------------------------------------------------------------- | +| `videoMode` | `boolean` | +| `thumb` | `boolean` | +| `artifact` | [`RenderedArtifact`](../interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md) | +| `color` | [`ArtifactFileColor`](../enums/Backend_GameLogic_ArtifactUtils.ArtifactFileColor.md) | +| `debugProps` | { `forceAncient`: `boolean` ; `skipCaching`: `boolean` } \| `undefined` | + +#### Returns + +`string` + +--- + +### artifactRoll + +▸ **artifactRoll**(`id`): `number` + +Convert an `artifactId` to an int in [0, 255] + +#### Parameters + +| Name | Type | +| :--- | :----------- | +| `id` | `ArtifactId` | + +#### Returns + +`number` + +--- + +### biomeName + +▸ `Const` **biomeName**(`biome`): `string` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `biome` | `Biome` | + +#### Returns + +`string` + +--- + +### getActivatedArtifact + +▸ **getActivatedArtifact**(`artifacts`): `Artifact` \| `undefined` + +#### Parameters + +| Name | Type | +| :---------- | :----------- | +| `artifacts` | `Artifact`[] | + +#### Returns + +`Artifact` \| `undefined` + +--- + +### getActiveBlackDomain + +▸ **getActiveBlackDomain**(`artifacts`): `Artifact` \| `undefined` + +#### Parameters + +| Name | Type | +| :---------- | :----------- | +| `artifacts` | `Artifact`[] | + +#### Returns + +`Artifact` \| `undefined` + +--- + +### getArtifactDebugName + +▸ **getArtifactDebugName**(`a?`): `string` + +#### Parameters + +| Name | Type | +| :--- | :--------- | +| `a?` | `Artifact` | + +#### Returns + +`string` + +--- + +### hasUnconfirmedArtifactTx + +▸ `Const` **hasUnconfirmedArtifactTx**(`p`): `boolean` + +#### Parameters + +| Name | Type | +| :--- | :---------------------- | +| `p` | `undefined` \| `Planet` | + +#### Returns + +`boolean` + +--- + +### isActivated + +▸ **isActivated**(`artifact`): `boolean` + +#### Parameters + +| Name | Type | +| :--------- | :------------------------ | +| `artifact` | `Artifact` \| `undefined` | + +#### Returns + +`boolean` + +--- + +### isAncient + +▸ **isAncient**(`artifact`): `boolean` + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------------------------------------------------------------------- | +| `artifact` | [`RenderedArtifact`](../interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md) | + +#### Returns + +`boolean` + +--- + +### isBasic + +▸ **isBasic**(`type`): `boolean` + +#### Parameters + +| Name | Type | +| :----- | :------------- | +| `type` | `ArtifactType` | + +#### Returns + +`boolean` + +--- + +### isRelic + +▸ **isRelic**(`type`): `boolean` + +#### Parameters + +| Name | Type | +| :----- | :------------- | +| `type` | `ArtifactType` | + +#### Returns + +`boolean` + +--- + +### levelFromRarity + +▸ `Const` **levelFromRarity**(`rarity`): `PlanetLevel` + +#### Parameters + +| Name | Type | +| :------- | :--------------- | +| `rarity` | `ArtifactRarity` | + +#### Returns + +`PlanetLevel` + +--- + +### rarityName + +▸ `Const` **rarityName**(`rarity`): `string` + +#### Parameters + +| Name | Type | +| :------- | :--------------- | +| `rarity` | `ArtifactRarity` | + +#### Returns + +`string` + +--- + +### rarityNameFromArtifact + +▸ `Const` **rarityNameFromArtifact**(`a`): `string` + +#### Parameters + +| Name | Type | +| :--- | :--------- | +| `a` | `Artifact` | + +#### Returns + +`string` + +--- + +### setForceAncient + +▸ **setForceAncient**(`force`): `void` + +Really, really shitty workaround to add a `return true` or `return false` to the above `isAncient`. Used in `GifRenderer.ts` + +#### Parameters + +| Name | Type | +| :------ | :-------- | +| `force` | `boolean` | + +#### Returns + +`void` diff --git a/docs/modules/Backend_GameLogic_ContractCaller.md b/docs/modules/Backend_GameLogic_ContractCaller.md new file mode 100644 index 00000000..92addc03 --- /dev/null +++ b/docs/modules/Backend_GameLogic_ContractCaller.md @@ -0,0 +1,7 @@ +# Module: Backend/GameLogic/ContractCaller + +## Table of contents + +### Classes + +- [ContractCaller](../classes/Backend_GameLogic_ContractCaller.ContractCaller.md) diff --git a/docs/modules/backend_gamelogic_contractsapi.md b/docs/modules/Backend_GameLogic_ContractsAPI.md similarity index 55% rename from docs/modules/backend_gamelogic_contractsapi.md rename to docs/modules/Backend_GameLogic_ContractsAPI.md index 3c025ae6..cd593f20 100644 --- a/docs/modules/backend_gamelogic_contractsapi.md +++ b/docs/modules/Backend_GameLogic_ContractsAPI.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/backend_gamelogic_contractsapi.default.md) +- [default](../classes/Backend_GameLogic_ContractsAPI.default.md) diff --git a/docs/modules/Backend_GameLogic_ConversationManager.md b/docs/modules/Backend_GameLogic_ConversationManager.md new file mode 100644 index 00000000..f5d1ba42 --- /dev/null +++ b/docs/modules/Backend_GameLogic_ConversationManager.md @@ -0,0 +1,7 @@ +# Module: Backend/GameLogic/ConversationManager + +## Table of contents + +### Classes + +- [ConversationManager](../classes/Backend_GameLogic_ConversationManager.ConversationManager.md) diff --git a/docs/modules/Backend_GameLogic_GameManager.md b/docs/modules/Backend_GameLogic_GameManager.md new file mode 100644 index 00000000..222fec57 --- /dev/null +++ b/docs/modules/Backend_GameLogic_GameManager.md @@ -0,0 +1,11 @@ +# Module: Backend/GameLogic/GameManager + +## Table of contents + +### Enumerations + +- [GameManagerEvent](../enums/Backend_GameLogic_GameManager.GameManagerEvent.md) + +### Classes + +- [default](../classes/Backend_GameLogic_GameManager.default.md) diff --git a/docs/modules/backend_gamelogic_gameobjects.md b/docs/modules/Backend_GameLogic_GameObjects.md similarity index 57% rename from docs/modules/backend_gamelogic_gameobjects.md rename to docs/modules/Backend_GameLogic_GameObjects.md index fb9a8285..c1540269 100644 --- a/docs/modules/backend_gamelogic_gameobjects.md +++ b/docs/modules/Backend_GameLogic_GameObjects.md @@ -4,4 +4,4 @@ ### Classes -- [GameObjects](../classes/backend_gamelogic_gameobjects.gameobjects.md) +- [GameObjects](../classes/Backend_GameLogic_GameObjects.GameObjects.md) diff --git a/docs/modules/Backend_GameLogic_GameUIManager.md b/docs/modules/Backend_GameLogic_GameUIManager.md new file mode 100644 index 00000000..c1c2984e --- /dev/null +++ b/docs/modules/Backend_GameLogic_GameUIManager.md @@ -0,0 +1,11 @@ +# Module: Backend/GameLogic/GameUIManager + +## Table of contents + +### Enumerations + +- [GameUIManagerEvent](../enums/Backend_GameLogic_GameUIManager.GameUIManagerEvent.md) + +### Classes + +- [default](../classes/Backend_GameLogic_GameUIManager.default.md) diff --git a/docs/modules/Backend_GameLogic_InitialGameStateDownloader.md b/docs/modules/Backend_GameLogic_InitialGameStateDownloader.md new file mode 100644 index 00000000..99b99fe7 --- /dev/null +++ b/docs/modules/Backend_GameLogic_InitialGameStateDownloader.md @@ -0,0 +1,11 @@ +# Module: Backend/GameLogic/InitialGameStateDownloader + +## Table of contents + +### Classes + +- [InitialGameStateDownloader](../classes/Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md) + +### Interfaces + +- [InitialGameState](../interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md) diff --git a/docs/modules/backend_gamelogic_layeredmap.md b/docs/modules/Backend_GameLogic_LayeredMap.md similarity index 55% rename from docs/modules/backend_gamelogic_layeredmap.md rename to docs/modules/Backend_GameLogic_LayeredMap.md index 7ef09d4e..bb135646 100644 --- a/docs/modules/backend_gamelogic_layeredmap.md +++ b/docs/modules/Backend_GameLogic_LayeredMap.md @@ -4,4 +4,4 @@ ### Classes -- [LayeredMap](../classes/backend_gamelogic_layeredmap.layeredmap.md) +- [LayeredMap](../classes/Backend_GameLogic_LayeredMap.LayeredMap.md) diff --git a/docs/modules/Backend_GameLogic_PaidConversationManager.md b/docs/modules/Backend_GameLogic_PaidConversationManager.md new file mode 100644 index 00000000..e9922eca --- /dev/null +++ b/docs/modules/Backend_GameLogic_PaidConversationManager.md @@ -0,0 +1,7 @@ +# Module: Backend/GameLogic/PaidConversationManager + +## Table of contents + +### Classes + +- [PaidConversationManager](../classes/Backend_GameLogic_PaidConversationManager.PaidConversationManager.md) diff --git a/docs/modules/Backend_GameLogic_PluginManager.md b/docs/modules/Backend_GameLogic_PluginManager.md new file mode 100644 index 00000000..aef9fa25 --- /dev/null +++ b/docs/modules/Backend_GameLogic_PluginManager.md @@ -0,0 +1,8 @@ +# Module: Backend/GameLogic/PluginManager + +## Table of contents + +### Classes + +- [PluginManager](../classes/Backend_GameLogic_PluginManager.PluginManager.md) +- [ProcessInfo](../classes/Backend_GameLogic_PluginManager.ProcessInfo.md) diff --git a/docs/modules/Backend_GameLogic_TutorialManager.md b/docs/modules/Backend_GameLogic_TutorialManager.md new file mode 100644 index 00000000..7079d079 --- /dev/null +++ b/docs/modules/Backend_GameLogic_TutorialManager.md @@ -0,0 +1,12 @@ +# Module: Backend/GameLogic/TutorialManager + +## Table of contents + +### Enumerations + +- [TutorialManagerEvent](../enums/Backend_GameLogic_TutorialManager.TutorialManagerEvent.md) +- [TutorialState](../enums/Backend_GameLogic_TutorialManager.TutorialState.md) + +### Classes + +- [default](../classes/Backend_GameLogic_TutorialManager.default.md) diff --git a/docs/modules/Backend_GameLogic_ViewportEntities.md b/docs/modules/Backend_GameLogic_ViewportEntities.md new file mode 100644 index 00000000..0a8e9300 --- /dev/null +++ b/docs/modules/Backend_GameLogic_ViewportEntities.md @@ -0,0 +1,12 @@ +# Module: Backend/GameLogic/ViewportEntities + +## Table of contents + +### Classes + +- [ViewportEntities](../classes/Backend_GameLogic_ViewportEntities.ViewportEntities.md) + +### Interfaces + +- [PlanetRenderInfo](../interfaces/Backend_GameLogic_ViewportEntities.PlanetRenderInfo.md) +- [Radii](../interfaces/Backend_GameLogic_ViewportEntities.Radii.md) diff --git a/docs/modules/Backend_Interfaces_DiagnosticUpdater.md b/docs/modules/Backend_Interfaces_DiagnosticUpdater.md new file mode 100644 index 00000000..0d474b73 --- /dev/null +++ b/docs/modules/Backend_Interfaces_DiagnosticUpdater.md @@ -0,0 +1,7 @@ +# Module: Backend/Interfaces/DiagnosticUpdater + +## Table of contents + +### Interfaces + +- [DiagnosticUpdater](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) diff --git a/docs/modules/backend_miner_chunkutils.md b/docs/modules/Backend_Miner_ChunkUtils.md similarity index 54% rename from docs/modules/backend_miner_chunkutils.md rename to docs/modules/Backend_Miner_ChunkUtils.md index 87e94ec4..6966ebab 100644 --- a/docs/modules/backend_miner_chunkutils.md +++ b/docs/modules/Backend_Miner_ChunkUtils.md @@ -4,19 +4,19 @@ ### Functions -- [addToChunkMap](backend_miner_chunkutils.md#addtochunkmap) -- [getBucket](backend_miner_chunkutils.md#getbucket) -- [getChunkKey](backend_miner_chunkutils.md#getchunkkey) -- [getChunkOfSideLengthContainingPoint](backend_miner_chunkutils.md#getchunkofsidelengthcontainingpoint) -- [getSiblingLocations](backend_miner_chunkutils.md#getsiblinglocations) -- [toExploredChunk](backend_miner_chunkutils.md#toexploredchunk) -- [toPersistedChunk](backend_miner_chunkutils.md#topersistedchunk) +- [addToChunkMap](Backend_Miner_ChunkUtils.md#addtochunkmap) +- [getBucket](Backend_Miner_ChunkUtils.md#getbucket) +- [getChunkKey](Backend_Miner_ChunkUtils.md#getchunkkey) +- [getChunkOfSideLengthContainingPoint](Backend_Miner_ChunkUtils.md#getchunkofsidelengthcontainingpoint) +- [getSiblingLocations](Backend_Miner_ChunkUtils.md#getsiblinglocations) +- [toExploredChunk](Backend_Miner_ChunkUtils.md#toexploredchunk) +- [toPersistedChunk](Backend_Miner_ChunkUtils.md#topersistedchunk) ## Functions ### addToChunkMap -▸ **addToChunkMap**(`existingChunks`: _Map_<[_ChunkId_](_types_darkforest_api_chunkstoretypes.md#chunkid), [_Chunk_](../classes/_types_global_globaltypes.chunk.md)\>, `newChunk`: [_Chunk_](../classes/_types_global_globaltypes.chunk.md), `onAdd?`: (`arg`: [_Chunk_](../classes/_types_global_globaltypes.chunk.md)) => _void_, `onRemove?`: (`arg`: [_Chunk_](../classes/_types_global_globaltypes.chunk.md)) => _void_, `maxChunkSize?`: _number_): _void_ +▸ **addToChunkMap**(`existingChunks`, `newChunk`, `onAdd?`, `onRemove?`, `maxChunkSize?`): `void` At a high level, call this function to update an efficient quadtree-like store containing all of the chunks that a player has either mined or imported in their client. @@ -40,19 +40,21 @@ for sibling chunks that existed prior to this function being called. | Name | Type | | :--------------- | :------------------------------------------------------------------------------------------------------------------------------ | -| `existingChunks` | _Map_<[_ChunkId_](_types_darkforest_api_chunkstoretypes.md#chunkid), [_Chunk_](../classes/_types_global_globaltypes.chunk.md)\> | -| `newChunk` | [_Chunk_](../classes/_types_global_globaltypes.chunk.md) | -| `onAdd?` | (`arg`: [_Chunk_](../classes/_types_global_globaltypes.chunk.md)) => _void_ | -| `onRemove?` | (`arg`: [_Chunk_](../classes/_types_global_globaltypes.chunk.md)) => _void_ | -| `maxChunkSize?` | _number_ | +| `existingChunks` | `Map`<[`ChunkId`](_types_darkforest_api_ChunkStoreTypes.md#chunkid), [`Chunk`](../classes/_types_global_GlobalTypes.Chunk.md)\> | +| `newChunk` | [`Chunk`](../classes/_types_global_GlobalTypes.Chunk.md) | +| `onAdd?` | (`arg`: [`Chunk`](../classes/_types_global_GlobalTypes.Chunk.md)) => `void` | +| `onRemove?` | (`arg`: [`Chunk`](../classes/_types_global_GlobalTypes.Chunk.md)) => `void` | +| `maxChunkSize?` | `number` | -**Returns:** _void_ +#### Returns + +`void` --- ### getBucket -▸ **getBucket**(`chunk`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): [_BucketId_](_types_darkforest_api_chunkstoretypes.md#bucketid) +▸ **getBucket**(`chunk`): [`BucketId`](_types_darkforest_api_ChunkStoreTypes.md#bucketid) Deterministically assigns a bucket ID to a rectangle, based on its position and size in the universe. This is kind of like a shitty hash function. Its purpose is to distribute chunks @@ -62,15 +64,17 @@ roughly evenly between the buckets. | Name | Type | | :------ | :------------------------------------------------------------------ | -| `chunk` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | +| `chunk` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | + +#### Returns -**Returns:** [_BucketId_](_types_darkforest_api_chunkstoretypes.md#bucketid) +[`BucketId`](_types_darkforest_api_ChunkStoreTypes.md#bucketid) --- ### getChunkKey -▸ **getChunkKey**(`chunkLoc`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): [_ChunkId_](_types_darkforest_api_chunkstoretypes.md#chunkid) +▸ **getChunkKey**(`chunkLoc`): [`ChunkId`](_types_darkforest_api_ChunkStoreTypes.md#chunkid) A unique ID generated for each chunk based on its rectangle, as well as its bucket. It's the primary key by which chunks are identified. @@ -79,15 +83,17 @@ primary key by which chunks are identified. | Name | Type | | :--------- | :------------------------------------------------------------------ | -| `chunkLoc` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | +| `chunkLoc` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | -**Returns:** [_ChunkId_](_types_darkforest_api_chunkstoretypes.md#chunkid) +#### Returns + +[`ChunkId`](_types_darkforest_api_ChunkStoreTypes.md#chunkid) --- ### getChunkOfSideLengthContainingPoint -▸ **getChunkOfSideLengthContainingPoint**(`coords`: WorldCoords, `sideLength`: _number_): [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) +▸ **getChunkOfSideLengthContainingPoint**(`coords`, `sideLength`): [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) Returns the unique aligned chunk (for definition of "aligned" see comment on `getSiblingLocations`) with the given side length that contains the given point. A chunk contains @@ -96,21 +102,23 @@ it does not contain points which are on its right or top edges. #### Parameters -| Name | Type | -| :----------- | :---------- | -| `coords` | WorldCoords | -| `sideLength` | _number_ | +| Name | Type | +| :----------- | :------------ | +| `coords` | `WorldCoords` | +| `sideLength` | `number` | + +#### Returns -**Returns:** [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) +[`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) --- ### getSiblingLocations -▸ `Const` **getSiblingLocations**(`chunkLoc`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)): [[_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)] +▸ `Const` **getSiblingLocations**(`chunkLoc`): [[`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md), [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md), [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md)] An aligned chunk is one whose corner's coordinates are multiples of its side length, and its side -length is a power of two between [MIN_CHUNK_SIZE](frontend_utils_constants.md#min_chunk_size) and [MAX_CHUNK_SIZE](frontend_utils_constants.md#max_chunk_size) inclusive. +length is a power of two between [MIN_CHUNK_SIZE](Frontend_Utils_constants.md#min_chunk_size) and [MAX_CHUNK_SIZE](Frontend_Utils_constants.md#max_chunk_size) inclusive. "Aligned" chunks is that they can be merged into other aligned chunks. Non-aligned chunks cannot always be merged into squares. The reason we care about merging is that merging chunks allows us @@ -128,15 +136,17 @@ the given chunk. | Name | Type | | :--------- | :------------------------------------------------------------------ | -| `chunkLoc` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | +| `chunkLoc` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | -**Returns:** [[_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)] +#### Returns + +[[`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md), [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md), [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md)] --- ### toExploredChunk -▸ `Const` **toExploredChunk**(`chunk`: [_PersistedChunk_](../interfaces/_types_darkforest_api_chunkstoretypes.persistedchunk.md)): [_Chunk_](../classes/_types_global_globaltypes.chunk.md) +▸ `Const` **toExploredChunk**(`chunk`): [`Chunk`](../classes/_types_global_GlobalTypes.Chunk.md) Converts from the persisted representation of a chunk to the in-game representation of a chunk. @@ -144,15 +154,17 @@ Converts from the persisted representation of a chunk to the in-game representat | Name | Type | | :------ | :---------------------------------------------------------------------------------------- | -| `chunk` | [_PersistedChunk_](../interfaces/_types_darkforest_api_chunkstoretypes.persistedchunk.md) | +| `chunk` | [`PersistedChunk`](../interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md) | + +#### Returns -**Returns:** [_Chunk_](../classes/_types_global_globaltypes.chunk.md) +[`Chunk`](../classes/_types_global_GlobalTypes.Chunk.md) --- ### toPersistedChunk -▸ **toPersistedChunk**(`chunk`: [_Chunk_](../classes/_types_global_globaltypes.chunk.md)): [_PersistedChunk_](../interfaces/_types_darkforest_api_chunkstoretypes.persistedchunk.md) +▸ **toPersistedChunk**(`chunk`): [`PersistedChunk`](../interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md) Converts from the in-game representation of a chunk to its persisted representation. @@ -160,6 +172,8 @@ Converts from the in-game representation of a chunk to its persisted representat | Name | Type | | :------ | :------------------------------------------------------- | -| `chunk` | [_Chunk_](../classes/_types_global_globaltypes.chunk.md) | +| `chunk` | [`Chunk`](../classes/_types_global_GlobalTypes.Chunk.md) | + +#### Returns -**Returns:** [_PersistedChunk_](../interfaces/_types_darkforest_api_chunkstoretypes.persistedchunk.md) +[`PersistedChunk`](../interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md) diff --git a/docs/modules/Backend_Miner_MinerManager.md b/docs/modules/Backend_Miner_MinerManager.md new file mode 100644 index 00000000..c866cfbe --- /dev/null +++ b/docs/modules/Backend_Miner_MinerManager.md @@ -0,0 +1,12 @@ +# Module: Backend/Miner/MinerManager + +## Table of contents + +### Enumerations + +- [MinerManagerEvent](../enums/Backend_Miner_MinerManager.MinerManagerEvent.md) + +### Classes + +- [HomePlanetMinerChunkStore](../classes/Backend_Miner_MinerManager.HomePlanetMinerChunkStore.md) +- [default](../classes/Backend_Miner_MinerManager.default.md) diff --git a/docs/modules/Backend_Miner_MiningPatterns.md b/docs/modules/Backend_Miner_MiningPatterns.md new file mode 100644 index 00000000..d4e27fb4 --- /dev/null +++ b/docs/modules/Backend_Miner_MiningPatterns.md @@ -0,0 +1,16 @@ +# Module: Backend/Miner/MiningPatterns + +## Table of contents + +### Enumerations + +- [MiningPatternType](../enums/Backend_Miner_MiningPatterns.MiningPatternType.md) + +### Classes + +- [SpiralPattern](../classes/Backend_Miner_MiningPatterns.SpiralPattern.md) +- [SwissCheesePattern](../classes/Backend_Miner_MiningPatterns.SwissCheesePattern.md) + +### Interfaces + +- [MiningPattern](../interfaces/Backend_Miner_MiningPatterns.MiningPattern.md) diff --git a/docs/modules/Backend_Miner_permutation.md b/docs/modules/Backend_Miner_permutation.md new file mode 100644 index 00000000..3373e6c9 --- /dev/null +++ b/docs/modules/Backend_Miner_permutation.md @@ -0,0 +1,40 @@ +# Module: Backend/Miner/permutation + +## Table of contents + +### Functions + +- [getPlanetLocations](Backend_Miner_permutation.md#getplanetlocations) + +## Functions + +### getPlanetLocations + +▸ `Const` **getPlanetLocations**(`spaceTypeKey`, `biomebaseKey`, `perlinLengthScale`, `perlinMirrorX`, `perlinMirrorY`): (`chunkFootprint`: [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md), `planetRarity`: `number`) => `WorldLocation`[] + +#### Parameters + +| Name | Type | +| :------------------ | :-------- | +| `spaceTypeKey` | `number` | +| `biomebaseKey` | `number` | +| `perlinLengthScale` | `number` | +| `perlinMirrorX` | `boolean` | +| `perlinMirrorY` | `boolean` | + +#### Returns + +`fn` + +▸ (`chunkFootprint`, `planetRarity`): `WorldLocation`[] + +##### Parameters + +| Name | Type | +| :--------------- | :------------------------------------------------------------------ | +| `chunkFootprint` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | +| `planetRarity` | `number` | + +##### Returns + +`WorldLocation`[] diff --git a/docs/modules/backend_network_chainapi.md b/docs/modules/Backend_Network_ChainAPI.md similarity index 55% rename from docs/modules/backend_network_chainapi.md rename to docs/modules/Backend_Network_ChainAPI.md index f079aa6a..2457910a 100644 --- a/docs/modules/backend_network_chainapi.md +++ b/docs/modules/Backend_Network_ChainAPI.md @@ -4,18 +4,18 @@ ### Variables -- [DEFAULT_GAS_PRICES](backend_network_chainapi.md#default_gas_prices) -- [MAX_AUTO_GAS_PRICE_GWEI](backend_network_chainapi.md#max_auto_gas_price_gwei) +- [DEFAULT_GAS_PRICES](Backend_Network_ChainAPI.md#default_gas_prices) +- [MAX_AUTO_GAS_PRICE_GWEI](Backend_Network_ChainAPI.md#max_auto_gas_price_gwei) ### Functions -- [getAutoGasPrices](backend_network_chainapi.md#getautogasprices) +- [getAutoGasPrices](Backend_Network_ChainAPI.md#getautogasprices) ## Variables ### DEFAULT_GAS_PRICES -• `Const` **DEFAULT_GAS_PRICES**: _Readonly_ +• `Const` **DEFAULT_GAS_PRICES**: `Readonly`<`GasPrices`\> In case of errors, these are the default gas prices. @@ -23,7 +23,7 @@ In case of errors, these are the default gas prices. ### MAX_AUTO_GAS_PRICE_GWEI -• `Const` **MAX_AUTO_GAS_PRICE_GWEI**: `15`= 15 +• `Const` **MAX_AUTO_GAS_PRICE_GWEI**: `15` In case xDai's auto-price is something ridiculous, we don't want our players to insta run out of money. @@ -32,9 +32,11 @@ money. ### getAutoGasPrices -▸ **getAutoGasPrices**(): _Promise_ +▸ **getAutoGasPrices**(): `Promise`<`GasPrices`\> Gets the current gas prices from xDai's price oracle. If the oracle is broken, return some sane defaults. -**Returns:** _Promise_ +#### Returns + +`Promise`<`GasPrices`\> diff --git a/docs/modules/Backend_Network_ConversationAPI.md b/docs/modules/Backend_Network_ConversationAPI.md new file mode 100644 index 00000000..65ce0c21 --- /dev/null +++ b/docs/modules/Backend_Network_ConversationAPI.md @@ -0,0 +1,103 @@ +# Module: Backend/Network/ConversationAPI + +## Table of contents + +### Functions + +- [getConversation](Backend_Network_ConversationAPI.md#getconversation) +- [startConversation](Backend_Network_ConversationAPI.md#startconversation) +- [startConversationOpenAI](Backend_Network_ConversationAPI.md#startconversationopenai) +- [stepConversation](Backend_Network_ConversationAPI.md#stepconversation) +- [stepConversationOpenAI](Backend_Network_ConversationAPI.md#stepconversationopenai) + +## Functions + +### getConversation + +▸ **getConversation**(`artifactId`): `Promise`<`Conversation` \| `undefined`\> + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `artifactId` | `ArtifactId` | + +#### Returns + +`Promise`<`Conversation` \| `undefined`\> + +--- + +### startConversation + +▸ **startConversation**(`timestamp`, `player`, `signature`, `artifactId`): `Promise`<`Conversation`\> + +IN-GAME ROUTES + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `timestamp` | `number` | +| `player` | `EthAddress` | +| `signature` | `string` | +| `artifactId` | `ArtifactId` | + +#### Returns + +`Promise`<`Conversation`\> + +--- + +### startConversationOpenAI + +▸ **startConversationOpenAI**(`artifact`, `artifactId`, `username`): `Promise`<`Conversation`\> + +#### Parameters + +| Name | Type | +| :----------- | :--------------------- | +| `artifact` | `ConversationArtifact` | +| `artifactId` | `string` | +| `username` | `string` | + +#### Returns + +`Promise`<`Conversation`\> + +--- + +### stepConversation + +▸ **stepConversation**(`timestamp`, `player`, `signature`, `artifactId`, `message`): `Promise`<`Conversation`\> + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `timestamp` | `number` | +| `player` | `EthAddress` | +| `signature` | `string` | +| `artifactId` | `ArtifactId` | +| `message` | `string` | + +#### Returns + +`Promise`<`Conversation`\> + +--- + +### stepConversationOpenAI + +▸ **stepConversationOpenAI**(`artifactId`, `message`): `Promise`<`Conversation`\> + +#### Parameters + +| Name | Type | +| :----------- | :------- | +| `artifactId` | `string` | +| `message` | `string` | + +#### Returns + +`Promise`<`Conversation`\> diff --git a/docs/modules/backend_network_ethconnection.md b/docs/modules/Backend_Network_EthConnection.md similarity index 54% rename from docs/modules/backend_network_ethconnection.md rename to docs/modules/Backend_Network_EthConnection.md index c2d916b2..45b60973 100644 --- a/docs/modules/backend_network_ethconnection.md +++ b/docs/modules/Backend_Network_EthConnection.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/backend_network_ethconnection.default.md) +- [default](../classes/Backend_Network_EthConnection.default.md) diff --git a/docs/modules/backend_network_eventlogger.md b/docs/modules/Backend_Network_EventLogger.md similarity index 55% rename from docs/modules/backend_network_eventlogger.md rename to docs/modules/Backend_Network_EventLogger.md index e9e2c515..e7543f77 100644 --- a/docs/modules/backend_network_eventlogger.md +++ b/docs/modules/Backend_Network_EventLogger.md @@ -4,4 +4,4 @@ ### Classes -- [EventLogger](../classes/backend_network_eventlogger.eventlogger.md) +- [EventLogger](../classes/Backend_Network_EventLogger.EventLogger.md) diff --git a/docs/modules/Backend_Network_LeaderboardApi.md b/docs/modules/Backend_Network_LeaderboardApi.md new file mode 100644 index 00000000..f82fdcd1 --- /dev/null +++ b/docs/modules/Backend_Network_LeaderboardApi.md @@ -0,0 +1,17 @@ +# Module: Backend/Network/LeaderboardApi + +## Table of contents + +### Functions + +- [loadLeaderboard](Backend_Network_LeaderboardApi.md#loadleaderboard) + +## Functions + +### loadLeaderboard + +▸ **loadLeaderboard**(): `Promise`<`Leaderboard`\> + +#### Returns + +`Promise`<`Leaderboard`\> diff --git a/docs/modules/Backend_Network_MessageAPI.md b/docs/modules/Backend_Network_MessageAPI.md new file mode 100644 index 00000000..fd6a7c94 --- /dev/null +++ b/docs/modules/Backend_Network_MessageAPI.md @@ -0,0 +1,57 @@ +# Module: Backend/Network/MessageAPI + +## Table of contents + +### Functions + +- [addMessage](Backend_Network_MessageAPI.md#addmessage) +- [deleteMessages](Backend_Network_MessageAPI.md#deletemessages) +- [getMessagesOnPlanets](Backend_Network_MessageAPI.md#getmessagesonplanets) + +## Functions + +### addMessage + +▸ **addMessage**(`request`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------- | +| `request` | `SignedMessage`<`PostMessageRequest`<`unknown`\>\> | + +#### Returns + +`Promise`<`void`\> + +--- + +### deleteMessages + +▸ **deleteMessages**(`request`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :-------- | :---------------------------------------- | +| `request` | `SignedMessage`<`DeleteMessagesRequest`\> | + +#### Returns + +`Promise`<`void`\> + +--- + +### getMessagesOnPlanets + +▸ **getMessagesOnPlanets**(`request`): `Promise`<`PlanetMessageResponse`\> + +#### Parameters + +| Name | Type | +| :-------- | :--------------------- | +| `request` | `PlanetMessageRequest` | + +#### Returns + +`Promise`<`PlanetMessageResponse`\> diff --git a/docs/modules/Backend_Network_ThrottledConcurrentQueue.md b/docs/modules/Backend_Network_ThrottledConcurrentQueue.md new file mode 100644 index 00000000..2a22602b --- /dev/null +++ b/docs/modules/Backend_Network_ThrottledConcurrentQueue.md @@ -0,0 +1,7 @@ +# Module: Backend/Network/ThrottledConcurrentQueue + +## Table of contents + +### Classes + +- [ThrottledConcurrentQueue](../classes/Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md) diff --git a/docs/modules/Backend_Network_TxExecutor.md b/docs/modules/Backend_Network_TxExecutor.md new file mode 100644 index 00000000..5b42fa5a --- /dev/null +++ b/docs/modules/Backend_Network_TxExecutor.md @@ -0,0 +1,12 @@ +# Module: Backend/Network/TxExecutor + +## Table of contents + +### Classes + +- [TxExecutor](../classes/Backend_Network_TxExecutor.TxExecutor.md) + +### Interfaces + +- [PendingTransaction](../interfaces/Backend_Network_TxExecutor.PendingTransaction.md) +- [QueuedTxRequest](../interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md) diff --git a/docs/modules/Backend_Network_UtilityServerAPI.md b/docs/modules/Backend_Network_UtilityServerAPI.md new file mode 100644 index 00000000..4bffb19d --- /dev/null +++ b/docs/modules/Backend_Network_UtilityServerAPI.md @@ -0,0 +1,136 @@ +# Module: Backend/Network/UtilityServerAPI + +## Table of contents + +### Enumerations + +- [EmailResponse](../enums/Backend_Network_UtilityServerAPI.EmailResponse.md) + +### Variables + +- [WEBSERVER_URL](Backend_Network_UtilityServerAPI.md#webserver_url) + +### Functions + +- [getAllTwitters](Backend_Network_UtilityServerAPI.md#getalltwitters) +- [requestDevFaucet](Backend_Network_UtilityServerAPI.md#requestdevfaucet) +- [submitInterestedEmail](Backend_Network_UtilityServerAPI.md#submitinterestedemail) +- [submitPlayerEmail](Backend_Network_UtilityServerAPI.md#submitplayeremail) +- [submitUnsubscribeEmail](Backend_Network_UtilityServerAPI.md#submitunsubscribeemail) +- [submitWhitelistKey](Backend_Network_UtilityServerAPI.md#submitwhitelistkey) +- [verifyTwitterHandle](Backend_Network_UtilityServerAPI.md#verifytwitterhandle) + +## Variables + +### WEBSERVER_URL + +• `Const` **WEBSERVER_URL**: `string` + +## Functions + +### getAllTwitters + +▸ `Const` **getAllTwitters**(): `Promise`<[`AddressTwitterMap`](_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap)\> + +#### Returns + +`Promise`<[`AddressTwitterMap`](_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap)\> + +--- + +### requestDevFaucet + +▸ `Const` **requestDevFaucet**(`address`): `Promise`<`boolean`\> + +#### Parameters + +| Name | Type | +| :-------- | :----------- | +| `address` | `EthAddress` | + +#### Returns + +`Promise`<`boolean`\> + +--- + +### submitInterestedEmail + +▸ `Const` **submitInterestedEmail**(`email`): `Promise`<[`EmailResponse`](../enums/Backend_Network_UtilityServerAPI.EmailResponse.md)\> + +#### Parameters + +| Name | Type | +| :------ | :------- | +| `email` | `string` | + +#### Returns + +`Promise`<[`EmailResponse`](../enums/Backend_Network_UtilityServerAPI.EmailResponse.md)\> + +--- + +### submitPlayerEmail + +▸ `Const` **submitPlayerEmail**(`email`, `ethAddress`): `Promise`<[`EmailResponse`](../enums/Backend_Network_UtilityServerAPI.EmailResponse.md)\> + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `email` | `string` | +| `ethAddress` | `EthAddress` | + +#### Returns + +`Promise`<[`EmailResponse`](../enums/Backend_Network_UtilityServerAPI.EmailResponse.md)\> + +--- + +### submitUnsubscribeEmail + +▸ `Const` **submitUnsubscribeEmail**(`email`): `Promise`<[`EmailResponse`](../enums/Backend_Network_UtilityServerAPI.EmailResponse.md)\> + +#### Parameters + +| Name | Type | +| :------ | :------- | +| `email` | `string` | + +#### Returns + +`Promise`<[`EmailResponse`](../enums/Backend_Network_UtilityServerAPI.EmailResponse.md)\> + +--- + +### submitWhitelistKey + +▸ `Const` **submitWhitelistKey**(`key`, `address`): `Promise`<`null` \| `string`\> + +#### Parameters + +| Name | Type | +| :-------- | :----------- | +| `key` | `string` | +| `address` | `EthAddress` | + +#### Returns + +`Promise`<`null` \| `string`\> + +--- + +### verifyTwitterHandle + +▸ `Const` **verifyTwitterHandle**(`twitter`, `address`): `Promise`<`boolean`\> + +#### Parameters + +| Name | Type | +| :-------- | :----------- | +| `twitter` | `string` | +| `address` | `EthAddress` | + +#### Returns + +`Promise`<`boolean`\> diff --git a/docs/modules/Backend_Plugins_EmbeddedPluginLoader.md b/docs/modules/Backend_Plugins_EmbeddedPluginLoader.md new file mode 100644 index 00000000..637aaa48 --- /dev/null +++ b/docs/modules/Backend_Plugins_EmbeddedPluginLoader.md @@ -0,0 +1,21 @@ +# Module: Backend/Plugins/EmbeddedPluginLoader + +## Table of contents + +### Interfaces + +- [EmbeddedPlugin](../interfaces/Backend_Plugins_EmbeddedPluginLoader.EmbeddedPlugin.md) + +### Functions + +- [getEmbeddedPlugins](Backend_Plugins_EmbeddedPluginLoader.md#getembeddedplugins) + +## Functions + +### getEmbeddedPlugins + +▸ **getEmbeddedPlugins**(): { `code`: `string` ; `id`: [`PluginId`](Backend_Plugins_SerializedPlugin.md#pluginid) ; `name`: `string` }[] + +#### Returns + +{ `code`: `string` ; `id`: [`PluginId`](Backend_Plugins_SerializedPlugin.md#pluginid) ; `name`: `string` }[] diff --git a/docs/modules/Backend_Plugins_PluginProcess.md b/docs/modules/Backend_Plugins_PluginProcess.md new file mode 100644 index 00000000..7ea3b368 --- /dev/null +++ b/docs/modules/Backend_Plugins_PluginProcess.md @@ -0,0 +1,7 @@ +# Module: Backend/Plugins/PluginProcess + +## Table of contents + +### Interfaces + +- [PluginProcess](../interfaces/Backend_Plugins_PluginProcess.PluginProcess.md) diff --git a/docs/modules/backend_plugins_plugintemplate.md b/docs/modules/Backend_Plugins_PluginTemplate.md similarity index 53% rename from docs/modules/backend_plugins_plugintemplate.md rename to docs/modules/Backend_Plugins_PluginTemplate.md index 175f126a..f5d66224 100644 --- a/docs/modules/backend_plugins_plugintemplate.md +++ b/docs/modules/Backend_Plugins_PluginTemplate.md @@ -4,10 +4,10 @@ ### Variables -- [PLUGIN_TEMPLATE](backend_plugins_plugintemplate.md#plugin_template) +- [PLUGIN_TEMPLATE](Backend_Plugins_PluginTemplate.md#plugin_template) ## Variables ### PLUGIN_TEMPLATE -• `Const` **PLUGIN_TEMPLATE**: _string_ +• `Const` **PLUGIN_TEMPLATE**: `string` diff --git a/docs/modules/Backend_Plugins_SerializedPlugin.md b/docs/modules/Backend_Plugins_SerializedPlugin.md new file mode 100644 index 00000000..b3354c25 --- /dev/null +++ b/docs/modules/Backend_Plugins_SerializedPlugin.md @@ -0,0 +1,17 @@ +# Module: Backend/Plugins/SerializedPlugin + +## Table of contents + +### Interfaces + +- [SerializedPlugin](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md) + +### Type aliases + +- [PluginId](Backend_Plugins_SerializedPlugin.md#pluginid) + +## Type aliases + +### PluginId + +Ƭ **PluginId**: `string` & { `__nothing__`: `never` } diff --git a/docs/modules/Backend_Procedural_ArtifactProcgen.md b/docs/modules/Backend_Procedural_ArtifactProcgen.md new file mode 100644 index 00000000..1ae1cf66 --- /dev/null +++ b/docs/modules/Backend_Procedural_ArtifactProcgen.md @@ -0,0 +1,126 @@ +# Module: Backend/Procedural/ArtifactProcgen + +## Table of contents + +### Variables + +- [mockCommon](Backend_Procedural_ArtifactProcgen.md#mockcommon) +- [mockEpic](Backend_Procedural_ArtifactProcgen.md#mockepic) +- [mockLegendary](Backend_Procedural_ArtifactProcgen.md#mocklegendary) +- [mockRare](Backend_Procedural_ArtifactProcgen.md#mockrare) + +### Functions + +- [artifactBiomeAndName](Backend_Procedural_ArtifactProcgen.md#artifactbiomeandname) +- [artifactName](Backend_Procedural_ArtifactProcgen.md#artifactname) +- [dateMintedAt](Backend_Procedural_ArtifactProcgen.md#datemintedat) +- [mockArtifact](Backend_Procedural_ArtifactProcgen.md#mockartifact) +- [mockArtifactWithRarity](Backend_Procedural_ArtifactProcgen.md#mockartifactwithrarity) + +## Variables + +### mockCommon + +• `Const` **mockCommon**: `Artifact` + +--- + +### mockEpic + +• `Const` **mockEpic**: `Artifact` + +--- + +### mockLegendary + +• `Const` **mockLegendary**: `Artifact` + +--- + +### mockRare + +• `Const` **mockRare**: `Artifact` + +## Functions + +### artifactBiomeAndName + +▸ `Const` **artifactBiomeAndName**(`artifact`): `string` + +#### Parameters + +| Name | Type | +| :--------- | :------------------------ | +| `artifact` | `undefined` \| `Artifact` | + +#### Returns + +`string` + +--- + +### artifactName + +▸ `Const` **artifactName**(`artifact`): `string` + +#### Parameters + +| Name | Type | +| :--------- | :------------------------ | +| `artifact` | `undefined` \| `Artifact` | + +#### Returns + +`string` + +--- + +### dateMintedAt + +▸ `Const` **dateMintedAt**(`artifact`): `string` + +#### Parameters + +| Name | Type | +| :--------- | :------------------------ | +| `artifact` | `undefined` \| `Artifact` | + +#### Returns + +`string` + +--- + +### mockArtifact + +▸ `Const` **mockArtifact**(`rarity`, `artifactType?`, `planetBiome?`): `Artifact` + +#### Parameters + +| Name | Type | +| :------------- | :--------------- | +| `rarity` | `ArtifactRarity` | +| `artifactType` | `ArtifactType` | +| `planetBiome` | `Biome` | + +#### Returns + +`Artifact` + +--- + +### mockArtifactWithRarity + +▸ `Const` **mockArtifactWithRarity**(`rarity`, `artifactType?`, `planetBiome?`): `Artifact` + +#### Parameters + +| Name | Type | +| :------------- | :--------------- | +| `rarity` | `ArtifactRarity` | +| `artifactType` | `ArtifactType` | +| `planetBiome` | `Biome` | + +#### Returns + +`Artifact` diff --git a/docs/modules/backend_procedural_noise.md b/docs/modules/Backend_Procedural_Noise.md similarity index 54% rename from docs/modules/backend_procedural_noise.md rename to docs/modules/Backend_Procedural_Noise.md index e7cbb84d..5ee8308b 100644 --- a/docs/modules/backend_procedural_noise.md +++ b/docs/modules/Backend_Procedural_Noise.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/backend_procedural_noise.default.md) +- [default](../classes/Backend_Procedural_Noise.default.md) diff --git a/docs/modules/Backend_Procedural_ProcgenConsts.md b/docs/modules/Backend_Procedural_ProcgenConsts.md new file mode 100644 index 00000000..ed66cda9 --- /dev/null +++ b/docs/modules/Backend_Procedural_ProcgenConsts.md @@ -0,0 +1,99 @@ +# Module: Backend/Procedural/ProcgenConsts + +## Table of contents + +### Variables + +- [blurb2grammar](Backend_Procedural_ProcgenConsts.md#blurb2grammar) +- [blurbGrammar](Backend_Procedural_ProcgenConsts.md#blurbgrammar) +- [planetNameWords](Backend_Procedural_ProcgenConsts.md#planetnamewords) +- [planetTagAdj](Backend_Procedural_ProcgenConsts.md#planettagadj) +- [planetTagNoun](Backend_Procedural_ProcgenConsts.md#planettagnoun) + +## Variables + +### blurb2grammar + +• `Const` **blurb2grammar**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :--------- | +| `alongtheway` | `string`[] | +| `bads` | `string`[] | +| `box` | `string`[] | +| `chocolate` | `string`[] | +| `chocolates` | `string`[] | +| `flock` | `string`[] | +| `friend` | `string`[] | +| `friends` | `string`[] | +| `get` | `string`[] | +| `know` | `string`[] | +| `learned` | `string`[] | +| `lesson` | `string`[] | +| `life` | `string`[] | +| `live` | `string`[] | +| `made` | `string`[] | +| `removed` | `string`[] | +| `sends` | `string`[] | +| `sometimes` | `string`[] | +| `sun` | `string`[] | +| `theres` | `string`[] | +| `throwing` | `string`[] | +| `treasure` | `string`[] | +| `warbears` | `string`[] | +| `way` | `string`[] | +| `when` | `string`[] | +| `will` | `string`[] | +| `willway` | `string`[] | +| `years` | `string`[] | + +--- + +### blurbGrammar + +• `Const` **blurbGrammar**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :--------- | +| `adj` | `string`[] | +| `air` | `string`[] | +| `bloom` | `string`[] | +| `colors` | `string`[] | +| `descair` | `any`[] | +| `eyecansee` | `any`[] | +| `flora` | `string`[] | +| `fruit` | `string`[] | +| `funfact` | `string`[] | +| `geography` | `any`[] | +| `gravity` | `string`[] | +| `habitat` | `string`[] | +| `landscape` | `string`[] | +| `many` | `string`[] | +| `noun` | `string`[] | +| `populate` | `string`[] | +| `populates` | `string`[] | +| `species` | `string`[] | +| `stretch` | `string`[] | +| `verb` | `string`[] | + +--- + +### planetNameWords + +• `Const` **planetNameWords**: `string`[] + +--- + +### planetTagAdj + +• `Const` **planetTagAdj**: `string`[] + +--- + +### planetTagNoun + +• `Const` **planetTagNoun**: `string`[] diff --git a/docs/modules/Backend_Procedural_ProcgenUtils.md b/docs/modules/Backend_Procedural_ProcgenUtils.md new file mode 100644 index 00000000..79c931a1 --- /dev/null +++ b/docs/modules/Backend_Procedural_ProcgenUtils.md @@ -0,0 +1,38 @@ +# Module: Backend/Procedural/ProcgenUtils + +## Table of contents + +### Classes + +- [ProcgenUtils](../classes/Backend_Procedural_ProcgenUtils.ProcgenUtils.md) + +### Type aliases + +- [PixelCoords](Backend_Procedural_ProcgenUtils.md#pixelcoords) +- [QuoteData](Backend_Procedural_ProcgenUtils.md#quotedata) + +## Type aliases + +### PixelCoords + +Ƭ **PixelCoords**: `Object` + +#### Type declaration + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | + +--- + +### QuoteData + +Ƭ **QuoteData**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------- | +| `author` | `string` | +| `quote` | `string` | diff --git a/docs/modules/backend_procedural_tracery.md b/docs/modules/Backend_Procedural_tracery.md similarity index 57% rename from docs/modules/backend_procedural_tracery.md rename to docs/modules/Backend_Procedural_tracery.md index 68b8a6c8..e4626cb2 100644 --- a/docs/modules/backend_procedural_tracery.md +++ b/docs/modules/Backend_Procedural_tracery.md @@ -4,10 +4,10 @@ ### Variables -- [export=](backend_procedural_tracery.md#export=) +- [export=](Backend_Procedural_tracery.md#export=) ## Variables ### export= -• **export=**: _any_ +• **export=**: `any` diff --git a/docs/modules/Backend_Procedural_tracery_modifiers.md b/docs/modules/Backend_Procedural_tracery_modifiers.md new file mode 100644 index 00000000..f246a2aa --- /dev/null +++ b/docs/modules/Backend_Procedural_tracery_modifiers.md @@ -0,0 +1,25 @@ +# Module: Backend/Procedural/tracery-modifiers + +## Table of contents + +### Variables + +- [baseEngModifiers](Backend_Procedural_tracery_modifiers.md#baseengmodifiers) + +## Variables + +### baseEngModifiers + +• **baseEngModifiers**: `Object` + +#### Type declaration + +| Name | Type | +| :-------------- | :------------------------------------- | +| `a` | (`s`: `any`) => `string` | +| `capitalize` | (`s`: `any`) => `any` | +| `capitalizeAll` | (`s`: `any`) => `string` | +| `ed` | (`s`: `any`) => `string` | +| `firstS` | (`s`: `any`) => `string` | +| `replace` | (`s`: `any`, `params`: `any`) => `any` | +| `s` | (`s`: `any`) => `string` | diff --git a/docs/modules/backend_storage_persistentchunkstore.md b/docs/modules/Backend_Storage_PersistentChunkStore.md similarity index 58% rename from docs/modules/backend_storage_persistentchunkstore.md rename to docs/modules/Backend_Storage_PersistentChunkStore.md index 2b6a6f3a..24158f45 100644 --- a/docs/modules/backend_storage_persistentchunkstore.md +++ b/docs/modules/Backend_Storage_PersistentChunkStore.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/backend_storage_persistentchunkstore.default.md) +- [default](../classes/Backend_Storage_PersistentChunkStore.default.md) diff --git a/docs/modules/Backend_Storage_ReaderDataStore.md b/docs/modules/Backend_Storage_ReaderDataStore.md new file mode 100644 index 00000000..437512b9 --- /dev/null +++ b/docs/modules/Backend_Storage_ReaderDataStore.md @@ -0,0 +1,11 @@ +# Module: Backend/Storage/ReaderDataStore + +## Table of contents + +### Enumerations + +- [SinglePlanetDataStoreEvent](../enums/Backend_Storage_ReaderDataStore.SinglePlanetDataStoreEvent.md) + +### Classes + +- [default](../classes/Backend_Storage_ReaderDataStore.default.md) diff --git a/docs/modules/Backend_Utils_Animation.md b/docs/modules/Backend_Utils_Animation.md new file mode 100644 index 00000000..d0c526bf --- /dev/null +++ b/docs/modules/Backend_Utils_Animation.md @@ -0,0 +1,93 @@ +# Module: Backend/Utils/Animation + +## Table of contents + +### Functions + +- [constantAnimation](Backend_Utils_Animation.md#constantanimation) +- [easeInAnimation](Backend_Utils_Animation.md#easeinanimation) +- [emojiEaseOutAnimation](Backend_Utils_Animation.md#emojieaseoutanimation) +- [planetLevelToAnimationSpeed](Backend_Utils_Animation.md#planetleveltoanimationspeed) +- [sinusoidalAnimation](Backend_Utils_Animation.md#sinusoidalanimation) + +## Functions + +### constantAnimation + +▸ **constantAnimation**(`constant`): `DFAnimation` + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `constant` | `number` | + +#### Returns + +`DFAnimation` + +--- + +### easeInAnimation + +▸ **easeInAnimation**(`durationMs`, `delayMs?`): `DFAnimation` + +#### Parameters + +| Name | Type | +| :----------- | :------- | +| `durationMs` | `number` | +| `delayMs?` | `number` | + +#### Returns + +`DFAnimation` + +--- + +### emojiEaseOutAnimation + +▸ **emojiEaseOutAnimation**(`durationMs`, `emoji`): `DFStatefulAnimation`<`string`\> + +#### Parameters + +| Name | Type | +| :----------- | :------- | +| `durationMs` | `number` | +| `emoji` | `string` | + +#### Returns + +`DFStatefulAnimation`<`string`\> + +--- + +### planetLevelToAnimationSpeed + +▸ **planetLevelToAnimationSpeed**(`level`): `number` + +#### Parameters + +| Name | Type | +| :------ | :------------ | +| `level` | `PlanetLevel` | + +#### Returns + +`number` + +--- + +### sinusoidalAnimation + +▸ **sinusoidalAnimation**(`rps`): `DFAnimation` + +#### Parameters + +| Name | Type | +| :---- | :------- | +| `rps` | `number` | + +#### Returns + +`DFAnimation` diff --git a/docs/modules/backend_utils_blockwaiter.md b/docs/modules/Backend_Utils_BlockWaiter.md similarity index 54% rename from docs/modules/backend_utils_blockwaiter.md rename to docs/modules/Backend_Utils_BlockWaiter.md index cffd6294..4afce9a5 100644 --- a/docs/modules/backend_utils_blockwaiter.md +++ b/docs/modules/Backend_Utils_BlockWaiter.md @@ -4,4 +4,4 @@ ### Classes -- [BlockWaiter](../classes/backend_utils_blockwaiter.blockwaiter.md) +- [BlockWaiter](../classes/Backend_Utils_BlockWaiter.BlockWaiter.md) diff --git a/docs/modules/Backend_Utils_Coordinates.md b/docs/modules/Backend_Utils_Coordinates.md new file mode 100644 index 00000000..9dac2af9 --- /dev/null +++ b/docs/modules/Backend_Utils_Coordinates.md @@ -0,0 +1,103 @@ +# Module: Backend/Utils/Coordinates + +## Table of contents + +### Interfaces + +- [CanvasCoords](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) + +### Functions + +- [coordsEqual](Backend_Utils_Coordinates.md#coordsequal) +- [distL2](Backend_Utils_Coordinates.md#distl2) +- [normalizeVector](Backend_Utils_Coordinates.md#normalizevector) +- [scaleVector](Backend_Utils_Coordinates.md#scalevector) +- [vectorLength](Backend_Utils_Coordinates.md#vectorlength) + +## Functions + +### coordsEqual + +▸ `Const` **coordsEqual**(`a`, `b`): `boolean` + +#### Parameters + +| Name | Type | +| :--- | :------------ | +| `a` | `WorldCoords` | +| `b` | `WorldCoords` | + +#### Returns + +`boolean` + +--- + +### distL2 + +▸ `Const` **distL2**(`a`, `b`): `number` + +#### Parameters + +| Name | Type | +| :--- | :----------------------------------------------------------------------------------------- | +| `a` | `WorldCoords` \| [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | +| `b` | `WorldCoords` \| [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | + +#### Returns + +`number` + +--- + +### normalizeVector + +▸ `Const` **normalizeVector**(`a`): `WorldCoords` + +#### Parameters + +| Name | Type | +| :--- | :------------ | +| `a` | `WorldCoords` | + +#### Returns + +`WorldCoords` + +--- + +### scaleVector + +▸ `Const` **scaleVector**(`a`, `k`): `Object` + +#### Parameters + +| Name | Type | +| :--- | :------------ | +| `a` | `WorldCoords` | +| `k` | `number` | + +#### Returns + +`Object` + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | + +--- + +### vectorLength + +▸ `Const` **vectorLength**(`a`): `number` + +#### Parameters + +| Name | Type | +| :--- | :----------------------------------------------------------------------------------------- | +| `a` | `WorldCoords` \| [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) | + +#### Returns + +`number` diff --git a/docs/modules/backend_utils_snarkargshelper.md b/docs/modules/Backend_Utils_SnarkArgsHelper.md similarity index 54% rename from docs/modules/backend_utils_snarkargshelper.md rename to docs/modules/Backend_Utils_SnarkArgsHelper.md index d1332d9d..6a5b8411 100644 --- a/docs/modules/backend_utils_snarkargshelper.md +++ b/docs/modules/Backend_Utils_SnarkArgsHelper.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/backend_utils_snarkargshelper.default.md) +- [default](../classes/Backend_Utils_SnarkArgsHelper.default.md) diff --git a/docs/modules/Backend_Utils_TypeAssertions.md b/docs/modules/Backend_Utils_TypeAssertions.md new file mode 100644 index 00000000..629a8c40 --- /dev/null +++ b/docs/modules/Backend_Utils_TypeAssertions.md @@ -0,0 +1,244 @@ +# Module: Backend/Utils/TypeAssertions + +## Table of contents + +### Functions + +- [isUnconfirmedActivateArtifact](Backend_Utils_TypeAssertions.md#isunconfirmedactivateartifact) +- [isUnconfirmedBuyGPTCredits](Backend_Utils_TypeAssertions.md#isunconfirmedbuygptcredits) +- [isUnconfirmedBuyHat](Backend_Utils_TypeAssertions.md#isunconfirmedbuyhat) +- [isUnconfirmedDeactivateArtifact](Backend_Utils_TypeAssertions.md#isunconfirmeddeactivateartifact) +- [isUnconfirmedDepositArtifact](Backend_Utils_TypeAssertions.md#isunconfirmeddepositartifact) +- [isUnconfirmedFindArtifact](Backend_Utils_TypeAssertions.md#isunconfirmedfindartifact) +- [isUnconfirmedInit](Backend_Utils_TypeAssertions.md#isunconfirmedinit) +- [isUnconfirmedMove](Backend_Utils_TypeAssertions.md#isunconfirmedmove) +- [isUnconfirmedProspectPlanet](Backend_Utils_TypeAssertions.md#isunconfirmedprospectplanet) +- [isUnconfirmedReveal](Backend_Utils_TypeAssertions.md#isunconfirmedreveal) +- [isUnconfirmedTransfer](Backend_Utils_TypeAssertions.md#isunconfirmedtransfer) +- [isUnconfirmedUpgrade](Backend_Utils_TypeAssertions.md#isunconfirmedupgrade) +- [isUnconfirmedWithdrawArtifact](Backend_Utils_TypeAssertions.md#isunconfirmedwithdrawartifact) +- [isUnconfirmedWithdrawSilver](Backend_Utils_TypeAssertions.md#isunconfirmedwithdrawsilver) + +## Functions + +### isUnconfirmedActivateArtifact + +▸ **isUnconfirmedActivateArtifact**(`txIntent`): txIntent is UnconfirmedActivateArtifact + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedActivateArtifact + +--- + +### isUnconfirmedBuyGPTCredits + +▸ **isUnconfirmedBuyGPTCredits**(`txIntent`): txIntent is UnconfirmedBuyGPTCredits + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedBuyGPTCredits + +--- + +### isUnconfirmedBuyHat + +▸ **isUnconfirmedBuyHat**(`txIntent`): txIntent is UnconfirmedBuyHat + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedBuyHat + +--- + +### isUnconfirmedDeactivateArtifact + +▸ **isUnconfirmedDeactivateArtifact**(`txIntent`): txIntent is UnconfirmedDeactivateArtifact + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedDeactivateArtifact + +--- + +### isUnconfirmedDepositArtifact + +▸ **isUnconfirmedDepositArtifact**(`txIntent`): txIntent is UnconfirmedDepositArtifact + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedDepositArtifact + +--- + +### isUnconfirmedFindArtifact + +▸ **isUnconfirmedFindArtifact**(`txIntent`): txIntent is UnconfirmedFindArtifact + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedFindArtifact + +--- + +### isUnconfirmedInit + +▸ **isUnconfirmedInit**(`txIntent`): txIntent is UnconfirmedInit + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedInit + +--- + +### isUnconfirmedMove + +▸ **isUnconfirmedMove**(`txIntent`): txIntent is UnconfirmedMove + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedMove + +--- + +### isUnconfirmedProspectPlanet + +▸ **isUnconfirmedProspectPlanet**(`txIntent`): txIntent is UnconfirmedProspectPlanet + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedProspectPlanet + +--- + +### isUnconfirmedReveal + +▸ **isUnconfirmedReveal**(`txIntent`): txIntent is UnconfirmedReveal + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedReveal + +--- + +### isUnconfirmedTransfer + +▸ **isUnconfirmedTransfer**(`txIntent`): txIntent is UnconfirmedPlanetTransfer + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedPlanetTransfer + +--- + +### isUnconfirmedUpgrade + +▸ **isUnconfirmedUpgrade**(`txIntent`): txIntent is UnconfirmedUpgrade + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedUpgrade + +--- + +### isUnconfirmedWithdrawArtifact + +▸ **isUnconfirmedWithdrawArtifact**(`txIntent`): txIntent is UnconfirmedWithdrawArtifact + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedWithdrawArtifact + +--- + +### isUnconfirmedWithdrawSilver + +▸ **isUnconfirmedWithdrawSilver**(`txIntent`): txIntent is UnconfirmedWithdrawSilver + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedWithdrawSilver diff --git a/docs/modules/Backend_Utils_Utils.md b/docs/modules/Backend_Utils_Utils.md new file mode 100644 index 00000000..6eb4530b --- /dev/null +++ b/docs/modules/Backend_Utils_Utils.md @@ -0,0 +1,485 @@ +# Module: Backend/Utils/Utils + +## Table of contents + +### Type aliases + +- [RetryErrorHandler](Backend_Utils_Utils.md#retryerrorhandler) + +### Variables + +- [ONE_DAY](Backend_Utils_Utils.md#one_day) + +### Functions + +- [aggregateBulkGetter](Backend_Utils_Utils.md#aggregatebulkgetter) +- [callWithRetry](Backend_Utils_Utils.md#callwithretry) +- [deferred](Backend_Utils_Utils.md#deferred) +- [formatNumber](Backend_Utils_Utils.md#formatnumber) +- [getFormatProp](Backend_Utils_Utils.md#getformatprop) +- [getGasSettingGwei](Backend_Utils_Utils.md#getgassettinggwei) +- [getOwnerColor](Backend_Utils_Utils.md#getownercolor) +- [getPlanetMaxRank](Backend_Utils_Utils.md#getplanetmaxrank) +- [getPlanetRank](Backend_Utils_Utils.md#getplanetrank) +- [getPlanetShortHash](Backend_Utils_Utils.md#getplanetshorthash) +- [getPlayerColor](Backend_Utils_Utils.md#getplayercolor) +- [getPlayerShortHash](Backend_Utils_Utils.md#getplayershorthash) +- [getRandomActionId](Backend_Utils_Utils.md#getrandomactionid) +- [getUpgradeStat](Backend_Utils_Utils.md#getupgradestat) +- [hasOwner](Backend_Utils_Utils.md#hasowner) +- [hexifyBigIntNestedArray](Backend_Utils_Utils.md#hexifybigintnestedarray) +- [hslStr](Backend_Utils_Utils.md#hslstr) +- [isFullRank](Backend_Utils_Utils.md#isfullrank) +- [neverResolves](Backend_Utils_Utils.md#neverresolves) +- [rejectAfter](Backend_Utils_Utils.md#rejectafter) +- [sleep](Backend_Utils_Utils.md#sleep) +- [timeoutAfter](Backend_Utils_Utils.md#timeoutafter) +- [titleCase](Backend_Utils_Utils.md#titlecase) +- [upgradeName](Backend_Utils_Utils.md#upgradename) + +## Type aliases + +### RetryErrorHandler + +Ƭ **RetryErrorHandler**: (`i`: `number`, `e`: `Error`) => `void` + +#### Type declaration + +▸ (`i`, `e`): `void` + +##### Parameters + +| Name | Type | +| :--- | :------- | +| `i` | `number` | +| `e` | `Error` | + +##### Returns + +`void` + +## Variables + +### ONE_DAY + +• `Const` **ONE_DAY**: `number` + +## Functions + +### aggregateBulkGetter + +▸ `Const` **aggregateBulkGetter**<`T`\>(`logTag`, `total`, `querySize`, `getterFn`, `onProgress?`): `Promise`<`T`[]\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | +| :------------ | :-------------------------------------------------------------- | +| `logTag` | `string` | +| `total` | `number` | +| `querySize` | `number` | +| `getterFn` | (`startIdx`: `number`, `endIdx`: `number`) => `Promise`<`T`[]\> | +| `onProgress?` | (`fractionCompleted`: `number`) => `void` | + +#### Returns + +`Promise`<`T`[]\> + +--- + +### callWithRetry + +▸ `Const` **callWithRetry**<`T`\>(`fn`, `args?`, `onError?`, `maxRetries?`, `retryInterval?`): `Promise`<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | Default value | +| :-------------- | :-------------------------------------------------------------- | :------------ | +| `fn` | (...`args`: `unknown`[]) => `Promise`<`T`\> | `undefined` | +| `args` | `unknown`[] | `[]` | +| `onError?` | [`RetryErrorHandler`](Backend_Utils_Utils.md#retryerrorhandler) | `undefined` | +| `maxRetries` | `number` | `10` | +| `retryInterval` | `number` | `1000` | + +#### Returns + +`Promise`<`T`\> + +--- + +### deferred + +▸ **deferred**<`T`\>(): [(`t`: `T`) => `void`, (`t`: `Error`) => `void`, `Promise`<`T`\>] + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Returns + +[(`t`: `T`) => `void`, (`t`: `Error`) => `void`, `Promise`<`T`\>] + +--- + +### formatNumber + +▸ `Const` **formatNumber**(`num`, `smallDec?`): `string` + +#### Parameters + +| Name | Type | Default value | +| :--------- | :------- | :------------ | +| `num` | `number` | `undefined` | +| `smallDec` | `number` | `0` | + +#### Returns + +`string` + +--- + +### getFormatProp + +▸ `Const` **getFormatProp**(`planet`, `prop`): `string` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | +| `prop` | `string` | + +#### Returns + +`string` + +--- + +### getGasSettingGwei + +▸ **getGasSettingGwei**(`setting`, `gasPrices`): `number` \| `undefined` + +#### Parameters + +| Name | Type | +| :---------- | :-------------------------------------------------------------------------- | +| `setting` | [`AutoGasSetting`](../enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md) | +| `gasPrices` | `GasPrices` | + +#### Returns + +`number` \| `undefined` + +--- + +### getOwnerColor + +▸ `Const` **getOwnerColor**(`planet`): `string` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`string` + +--- + +### getPlanetMaxRank + +▸ `Const` **getPlanetMaxRank**(`planet`): `number` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`number` + +--- + +### getPlanetRank + +▸ `Const` **getPlanetRank**(`planet`): `number` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`number` + +--- + +### getPlanetShortHash + +▸ `Const` **getPlanetShortHash**(`planet`): `string` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`string` + +--- + +### getPlayerColor + +▸ `Const` **getPlayerColor**(`player`): `string` + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `player` | `EthAddress` | + +#### Returns + +`string` + +--- + +### getPlayerShortHash + +▸ `Const` **getPlayerShortHash**(`address`): `string` + +#### Parameters + +| Name | Type | +| :-------- | :----------- | +| `address` | `EthAddress` | + +#### Returns + +`string` + +--- + +### getRandomActionId + +▸ `Const` **getRandomActionId**(): `string` + +#### Returns + +`string` + +--- + +### getUpgradeStat + +▸ `Const` **getUpgradeStat**(`upgrade`, `stat`): `number` + +#### Parameters + +| Name | Type | +| :-------- | :--------------------------------------------------------- | +| `upgrade` | `Upgrade` | +| `stat` | [`StatIdx`](../enums/_types_global_GlobalTypes.StatIdx.md) | + +#### Returns + +`number` + +--- + +### hasOwner + +▸ `Const` **hasOwner**(`planet`): `boolean` + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +`boolean` + +--- + +### hexifyBigIntNestedArray + +▸ `Const` **hexifyBigIntNestedArray**(`arr`): `NestedStringArray` + +#### Parameters + +| Name | Type | +| :---- | :------------------ | +| `arr` | `NestedBigIntArray` | + +#### Returns + +`NestedStringArray` + +--- + +### hslStr + +▸ `Const` **hslStr**(`h`, `s`, `l`): `string` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `h` | `number` | +| `s` | `number` | +| `l` | `number` | + +#### Returns + +`string` + +--- + +### isFullRank + +▸ `Const` **isFullRank**(`planet`): `boolean` + +#### Parameters + +| Name | Type | +| :------- | :---------------------- | +| `planet` | `undefined` \| `Planet` | + +#### Returns + +`boolean` + +--- + +### neverResolves + +▸ **neverResolves**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +--- + +### rejectAfter + +▸ **rejectAfter**<`T`\>(`ms`, `msg`): `Promise`<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | +| :---- | :------- | +| `ms` | `number` | +| `msg` | `string` | + +#### Returns + +`Promise`<`T`\> + +--- + +### sleep + +▸ **sleep**<`T`\>(`timeout`, `returns?`): `Promise`<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `timeout` | `number` | +| `returns?` | `T` | + +#### Returns + +`Promise`<`T`\> + +--- + +### timeoutAfter + +▸ `Const` **timeoutAfter**<`T`\>(`promise`, `ms`, `timeoutMsg`): `Promise`<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | +| :----------- | :-------------- | +| `promise` | `Promise`<`T`\> | +| `ms` | `number` | +| `timeoutMsg` | `string` | + +#### Returns + +`Promise`<`T`\> + +--- + +### titleCase + +▸ `Const` **titleCase**(`title`): `string` + +#### Parameters + +| Name | Type | +| :------ | :------- | +| `title` | `string` | + +#### Returns + +`string` + +--- + +### upgradeName + +▸ `Const` **upgradeName**(`branchName`): `string` + +#### Parameters + +| Name | Type | +| :----------- | :------------------ | +| `branchName` | `UpgradeBranchName` | + +#### Returns + +`string` diff --git a/docs/modules/Backend_Utils_UtilsTypes.md b/docs/modules/Backend_Utils_UtilsTypes.md new file mode 100644 index 00000000..f2483d0e --- /dev/null +++ b/docs/modules/Backend_Utils_UtilsTypes.md @@ -0,0 +1,21 @@ +# Module: Backend/Utils/UtilsTypes + +## Table of contents + +### Interfaces + +- [PlanetCosmeticInfo](../interfaces/Backend_Utils_UtilsTypes.PlanetCosmeticInfo.md) + +### Type aliases + +- [RuinsInfo](Backend_Utils_UtilsTypes.md#ruinsinfo) + +## Type aliases + +### RuinsInfo + +Ƭ **RuinsInfo**: `Object` + +#### Index signature + +▪ [PlanetLevel: `number`]: { `props`: [`number`, `number`, `number`, `number`] ; `weights`: [`number`, `number`, `number`, `number`] } diff --git a/docs/modules/backend_utils_wrapper.md b/docs/modules/Backend_Utils_Wrapper.md similarity index 54% rename from docs/modules/backend_utils_wrapper.md rename to docs/modules/Backend_Utils_Wrapper.md index 38cc67d6..21585565 100644 --- a/docs/modules/backend_utils_wrapper.md +++ b/docs/modules/Backend_Utils_Wrapper.md @@ -4,4 +4,4 @@ ### Classes -- [Wrapper](../classes/backend_utils_wrapper.wrapper.md) +- [Wrapper](../classes/Backend_Utils_Wrapper.Wrapper.md) diff --git a/docs/modules/Frontend_Components_AncientLabel.md b/docs/modules/Frontend_Components_AncientLabel.md new file mode 100644 index 00000000..53b4d2c6 --- /dev/null +++ b/docs/modules/Frontend_Components_AncientLabel.md @@ -0,0 +1,38 @@ +# Module: Frontend/Components/AncientLabel + +## Table of contents + +### Variables + +- [ancientAnim](Frontend_Components_AncientLabel.md#ancientanim) + +### Functions + +- [AncientLabel](Frontend_Components_AncientLabel.md#ancientlabel) +- [AncientLabelAnim](Frontend_Components_AncientLabel.md#ancientlabelanim) + +## Variables + +### ancientAnim + +• `Const` **ancientAnim**: `FlattenSimpleInterpolation` + +## Functions + +### AncientLabel + +▸ `Const` **AncientLabel**(): `Element` + +#### Returns + +`Element` + +--- + +### AncientLabelAnim + +▸ `Const` **AncientLabelAnim**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_ArtifactImage.md b/docs/modules/Frontend_Components_ArtifactImage.md new file mode 100644 index 00000000..021e7b77 --- /dev/null +++ b/docs/modules/Frontend_Components_ArtifactImage.md @@ -0,0 +1,37 @@ +# Module: Frontend/Components/ArtifactImage + +## Table of contents + +### Variables + +- [ARTIFACT_URL](Frontend_Components_ArtifactImage.md#artifact_url) + +### Functions + +- [ArtifactImage](Frontend_Components_ArtifactImage.md#artifactimage) + +## Variables + +### ARTIFACT_URL + +• `Const` **ARTIFACT_URL**: `"https://d2wspbczt15cqu.cloudfront.net/v0.6.0-artifacts/"` + +## Functions + +### ArtifactImage + +▸ **ArtifactImage**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | +| `__namedParameters.bgColor?` | [`ArtifactFileColor`](../enums/Backend_GameLogic_ArtifactUtils.ArtifactFileColor.md) | +| `__namedParameters.size` | `number` | +| `__namedParameters.thumb?` | `boolean` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_BiomeAnims.md b/docs/modules/Frontend_Components_BiomeAnims.md new file mode 100644 index 00000000..6b6374a3 --- /dev/null +++ b/docs/modules/Frontend_Components_BiomeAnims.md @@ -0,0 +1,34 @@ +# Module: Frontend/Components/BiomeAnims + +## Table of contents + +### Variables + +- [burnAnim](Frontend_Components_BiomeAnims.md#burnanim) +- [icyAnim](Frontend_Components_BiomeAnims.md#icyanim) +- [shakeAnim](Frontend_Components_BiomeAnims.md#shakeanim) +- [wiggle](Frontend_Components_BiomeAnims.md#wiggle) + +## Variables + +### burnAnim + +• `Const` **burnAnim**: `FlattenSimpleInterpolation` + +--- + +### icyAnim + +• `Const` **icyAnim**: `FlattenSimpleInterpolation` + +--- + +### shakeAnim + +• `Const` **shakeAnim**: `FlattenSimpleInterpolation` + +--- + +### wiggle + +• `Const` **wiggle**: `Keyframes` diff --git a/docs/modules/Frontend_Components_Btn.md b/docs/modules/Frontend_Components_Btn.md new file mode 100644 index 00000000..8b88c12f --- /dev/null +++ b/docs/modules/Frontend_Components_Btn.md @@ -0,0 +1,27 @@ +# Module: Frontend/Components/Btn + +## Table of contents + +### Interfaces + +- [BtnProps](../interfaces/Frontend_Components_Btn.BtnProps.md) + +### Functions + +- [Btn](Frontend_Components_Btn.md#btn) + +## Functions + +### Btn + +▸ **Btn**(`props`): `Element` + +#### Parameters + +| Name | Type | +| :------ | :----------------------------------------------------------------------------------------------------------- | +| `props` | [`BtnProps`](../interfaces/Frontend_Components_Btn.BtnProps.md) & `React.HTMLAttributes`<`HTMLSpanElement`\> | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_Button.md b/docs/modules/Frontend_Components_Button.md new file mode 100644 index 00000000..9d8eaf44 --- /dev/null +++ b/docs/modules/Frontend_Components_Button.md @@ -0,0 +1,23 @@ +# Module: Frontend/Components/Button + +## Table of contents + +### Functions + +- [default](Frontend_Components_Button.md#default) + +## Functions + +### default + +▸ **default**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :------------ | +| `__namedParameters` | `ButtonProps` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_CoreUI.md b/docs/modules/Frontend_Components_CoreUI.md new file mode 100644 index 00000000..8cb9329e --- /dev/null +++ b/docs/modules/Frontend_Components_CoreUI.md @@ -0,0 +1,114 @@ +# Module: Frontend/Components/CoreUI + +## Table of contents + +### Variables + +- [CenterBackgroundSubtext](Frontend_Components_CoreUI.md#centerbackgroundsubtext) +- [CenterRow](Frontend_Components_CoreUI.md#centerrow) +- [Hidden](Frontend_Components_CoreUI.md#hidden) +- [HoverableTooltip](Frontend_Components_CoreUI.md#hoverabletooltip) +- [MaxWidth](Frontend_Components_CoreUI.md#maxwidth) +- [PluginElements](Frontend_Components_CoreUI.md#pluginelements) +- [Select](Frontend_Components_CoreUI.md#select) +- [Spacer](Frontend_Components_CoreUI.md#spacer) +- [Truncate](Frontend_Components_CoreUI.md#truncate) +- [Underline](Frontend_Components_CoreUI.md#underline) + +### Functions + +- [SelectFrom](Frontend_Components_CoreUI.md#selectfrom) + +## Variables + +### CenterBackgroundSubtext + +• `Const` **CenterBackgroundSubtext**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +A box which centers some darkened text. Useful for displaying +_somthing_ instead of empty space, if there isn't something to +be displayed. Think of it as a placeholder. + +--- + +### CenterRow + +• `Const` **CenterRow**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### Hidden + +• `Const` **Hidden**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### HoverableTooltip + +• `Const` **HoverableTooltip**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### MaxWidth + +• `Const` **MaxWidth**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### PluginElements + +• `Const` **PluginElements**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +The container element into which a plugin renders its html elements. +Contains styles for child elements so that plugins can use UI +that is consistent with the rest of Dark Forest's UI. Keeping this up +to date will be an ongoing challange, but there's probably some better +way to do this. + +--- + +### Select + +• `Const` **Select**: `StyledComponent`<`"select"`, `any`, `Object`, `never`\> + +--- + +### Spacer + +• `Const` **Spacer**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### Truncate + +• `Const` **Truncate**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### Underline + +• `Const` **Underline**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +## Functions + +### SelectFrom + +▸ **SelectFrom**(`__namedParameters`): `Element` + +Controllable input that allows the user to select from one of the +given string values. + +#### Parameters + +| Name | Type | +| :--------------------------- | :-------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.labels` | `string`[] | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.value` | `string` | +| `__namedParameters.values` | `string`[] | +| `__namedParameters.setValue` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_Corner.md b/docs/modules/Frontend_Components_Corner.md new file mode 100644 index 00000000..cfd9398b --- /dev/null +++ b/docs/modules/Frontend_Components_Corner.md @@ -0,0 +1,23 @@ +# Module: Frontend/Components/Corner + +## Table of contents + +### Functions + +- [Corner](Frontend_Components_Corner.md#corner) + +## Functions + +### Corner + +▸ **Corner**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :------------ | +| `__namedParameters` | `CornerProps` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_DisplayGasPrices.md b/docs/modules/Frontend_Components_DisplayGasPrices.md new file mode 100644 index 00000000..4cc86618 --- /dev/null +++ b/docs/modules/Frontend_Components_DisplayGasPrices.md @@ -0,0 +1,24 @@ +# Module: Frontend/Components/DisplayGasPrices + +## Table of contents + +### Functions + +- [DisplayGasPrices](Frontend_Components_DisplayGasPrices.md#displaygasprices) + +## Functions + +### DisplayGasPrices + +▸ **DisplayGasPrices**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------------- | :---------- | +| `__namedParameters` | `Object` | +| `__namedParameters.gasPrices?` | `GasPrices` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_Email.md b/docs/modules/Frontend_Components_Email.md new file mode 100644 index 00000000..1a66e95e --- /dev/null +++ b/docs/modules/Frontend_Components_Email.md @@ -0,0 +1,28 @@ +# Module: Frontend/Components/Email + +## Table of contents + +### Enumerations + +- [EmailCTAMode](../enums/Frontend_Components_Email.EmailCTAMode.md) + +### Functions + +- [EmailCTA](Frontend_Components_Email.md#emailcta) + +## Functions + +### EmailCTA + +▸ `Const` **EmailCTA**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.mode` | [`EmailCTAMode`](../enums/Frontend_Components_Email.EmailCTAMode.md) | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_FlexRows.md b/docs/modules/Frontend_Components_FlexRows.md new file mode 100644 index 00000000..bc80bead --- /dev/null +++ b/docs/modules/Frontend_Components_FlexRows.md @@ -0,0 +1,13 @@ +# Module: Frontend/Components/FlexRows + +## Table of contents + +### Variables + +- [SpacedFlexRow](Frontend_Components_FlexRows.md#spacedflexrow) + +## Variables + +### SpacedFlexRow + +• `Const` **SpacedFlexRow**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> diff --git a/docs/modules/Frontend_Components_GameLandingPageComponents.md b/docs/modules/Frontend_Components_GameLandingPageComponents.md new file mode 100644 index 00000000..aa6d6fa9 --- /dev/null +++ b/docs/modules/Frontend_Components_GameLandingPageComponents.md @@ -0,0 +1,86 @@ +# Module: Frontend/Components/GameLandingPageComponents + +## Table of contents + +### Variables + +- [Hidden](Frontend_Components_GameLandingPageComponents.md#hidden) + +### Functions + +- [GameWindowWrapper](Frontend_Components_GameLandingPageComponents.md#gamewindowwrapper) +- [TerminalToggler](Frontend_Components_GameLandingPageComponents.md#terminaltoggler) +- [TerminalWrapper](Frontend_Components_GameLandingPageComponents.md#terminalwrapper) +- [Wrapper](Frontend_Components_GameLandingPageComponents.md#wrapper) + +## Variables + +### Hidden + +• `Const` **Hidden**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +## Functions + +### GameWindowWrapper + +▸ **GameWindowWrapper**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :-------------------- | +| `__namedParameters` | `LandingWrapperProps` | + +#### Returns + +`Element` + +--- + +### TerminalToggler + +▸ **TerminalToggler**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------------- | :---------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.setTerminalEnabled` | `Dispatch`<`SetStateAction`<`boolean`\>\> | +| `__namedParameters.terminalEnabled` | `boolean` | + +#### Returns + +`Element` + +--- + +### TerminalWrapper + +▸ **TerminalWrapper**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :-------------------- | +| `__namedParameters` | `LandingWrapperProps` | + +#### Returns + +`Element` + +--- + +### Wrapper + +▸ **Wrapper**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :-------------------- | +| `__namedParameters` | `LandingWrapperProps` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_GameWindowComponents.md b/docs/modules/Frontend_Components_GameWindowComponents.md new file mode 100644 index 00000000..ee6eab32 --- /dev/null +++ b/docs/modules/Frontend_Components_GameWindowComponents.md @@ -0,0 +1,66 @@ +# Module: Frontend/Components/GameWindowComponents + +## Table of contents + +### Type aliases + +- [PaneProps](Frontend_Components_GameWindowComponents.md#paneprops) + +### Variables + +- [CanvasContainer](Frontend_Components_GameWindowComponents.md#canvascontainer) +- [CanvasWrapper](Frontend_Components_GameWindowComponents.md#canvaswrapper) +- [MainWindow](Frontend_Components_GameWindowComponents.md#mainwindow) +- [StyledPane](Frontend_Components_GameWindowComponents.md#styledpane) +- [UpperLeft](Frontend_Components_GameWindowComponents.md#upperleft) +- [WindowWrapper](Frontend_Components_GameWindowComponents.md#windowwrapper) + +## Type aliases + +### PaneProps + +Ƭ **PaneProps**: `Object` + +#### Type declaration + +| Name | Type | +| :------------- | :---------------- | +| `children` | `React.ReactNode` | +| `headerItems?` | `React.ReactNode` | +| `title` | `string` | + +## Variables + +### CanvasContainer + +• `Const` **CanvasContainer**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### CanvasWrapper + +• `Const` **CanvasWrapper**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### MainWindow + +• `Const` **MainWindow**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### StyledPane + +• `Const` **StyledPane**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### UpperLeft + +• `Const` **UpperLeft**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### WindowWrapper + +• `Const` **WindowWrapper**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> diff --git a/docs/modules/Frontend_Components_Hoverable.md b/docs/modules/Frontend_Components_Hoverable.md new file mode 100644 index 00000000..e39e69ab --- /dev/null +++ b/docs/modules/Frontend_Components_Hoverable.md @@ -0,0 +1,37 @@ +# Module: Frontend/Components/Hoverable + +## Table of contents + +### Variables + +- [TOOLTIP_SLOW](Frontend_Components_Hoverable.md#tooltip_slow) + +### Functions + +- [Hoverable](Frontend_Components_Hoverable.md#hoverable) + +## Variables + +### TOOLTIP_SLOW + +• `Const` **TOOLTIP_SLOW**: `1000` + +## Functions + +### Hoverable + +▸ **Hoverable**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------------- | :------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `JSX.Element` \| `JSX.Element`[] | +| `__namedParameters.hoverDelay?` | `number` | +| `__namedParameters.quick?` | `boolean` | +| `__namedParameters.hoverContents` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_IconButton.md b/docs/modules/Frontend_Components_IconButton.md new file mode 100644 index 00000000..650e454f --- /dev/null +++ b/docs/modules/Frontend_Components_IconButton.md @@ -0,0 +1,13 @@ +# Module: Frontend/Components/IconButton + +## Table of contents + +### Variables + +- [IconButton](Frontend_Components_IconButton.md#iconbutton) + +## Variables + +### IconButton + +• `Const` **IconButton**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> diff --git a/docs/modules/Frontend_Components_Icons.md b/docs/modules/Frontend_Components_Icons.md new file mode 100644 index 00000000..a7838ff8 --- /dev/null +++ b/docs/modules/Frontend_Components_Icons.md @@ -0,0 +1,1112 @@ +# Module: Frontend/Components/Icons + +## Table of contents + +### Functions + +- [ActivateIcon](Frontend_Components_Icons.md#activateicon) +- [ArtifactFound](Frontend_Components_Icons.md#artifactfound) +- [ArtifactIcon](Frontend_Components_Icons.md#artifacticon) +- [ArtifactProspected](Frontend_Components_Icons.md#artifactprospected) +- [BranchIcon](Frontend_Components_Icons.md#branchicon) +- [BroadcastIcon](Frontend_Components_Icons.md#broadcasticon) +- [CloseCircleIcon](Frontend_Components_Icons.md#closecircleicon) +- [DeactivateIcon](Frontend_Components_Icons.md#deactivateicon) +- [DefenseIcon](Frontend_Components_Icons.md#defenseicon) +- [DepositIcon](Frontend_Components_Icons.md#depositicon) +- [EnergyGrowthIcon](Frontend_Components_Icons.md#energygrowthicon) +- [EnergyIcon](Frontend_Components_Icons.md#energyicon) +- [EthIcon](Frontend_Components_Icons.md#ethicon) +- [FoundComet](Frontend_Components_Icons.md#foundcomet) +- [FoundCorrupted](Frontend_Components_Icons.md#foundcorrupted) +- [FoundDeadSpace](Frontend_Components_Icons.md#founddeadspace) +- [FoundDeepSpace](Frontend_Components_Icons.md#founddeepspace) +- [FoundDesert](Frontend_Components_Icons.md#founddesert) +- [FoundForest](Frontend_Components_Icons.md#foundforest) +- [FoundGrassland](Frontend_Components_Icons.md#foundgrassland) +- [FoundIce](Frontend_Components_Icons.md#foundice) +- [FoundLava](Frontend_Components_Icons.md#foundlava) +- [FoundOcean](Frontend_Components_Icons.md#foundocean) +- [FoundPirates](Frontend_Components_Icons.md#foundpirates) +- [FoundRuins](Frontend_Components_Icons.md#foundruins) +- [FoundSilver](Frontend_Components_Icons.md#foundsilver) +- [FoundSpace](Frontend_Components_Icons.md#foundspace) +- [FoundSpacetimeRip](Frontend_Components_Icons.md#foundspacetimerip) +- [FoundSwamp](Frontend_Components_Icons.md#foundswamp) +- [FoundTradingPost](Frontend_Components_Icons.md#foundtradingpost) +- [FoundTundra](Frontend_Components_Icons.md#foundtundra) +- [FoundWasteland](Frontend_Components_Icons.md#foundwasteland) +- [FullRankIcon](Frontend_Components_Icons.md#fullrankicon) +- [HatIcon](Frontend_Components_Icons.md#haticon) +- [HelpIcon](Frontend_Components_Icons.md#helpicon) +- [LeaderboardIcon](Frontend_Components_Icons.md#leaderboardicon) +- [LockIcon](Frontend_Components_Icons.md#lockicon) +- [MaxLevelIcon](Frontend_Components_Icons.md#maxlevelicon) +- [MaximizeCircleIcon](Frontend_Components_Icons.md#maximizecircleicon) +- [MetPlayer](Frontend_Components_Icons.md#metplayer) +- [MinimizeCircleIcon](Frontend_Components_Icons.md#minimizecircleicon) +- [PauseIcon](Frontend_Components_Icons.md#pauseicon) +- [PiratesIcon](Frontend_Components_Icons.md#piratesicon) +- [PlanetAttacked](Frontend_Components_Icons.md#planetattacked) +- [PlanetConquered](Frontend_Components_Icons.md#planetconquered) +- [PlanetIcon](Frontend_Components_Icons.md#planeticon) +- [PlanetLost](Frontend_Components_Icons.md#planetlost) +- [PlanetdexIcon](Frontend_Components_Icons.md#planetdexicon) +- [PlayIcon](Frontend_Components_Icons.md#playicon) +- [PluginIcon](Frontend_Components_Icons.md#pluginicon) +- [Quasar](Frontend_Components_Icons.md#quasar) +- [QuestionCircleIcon](Frontend_Components_Icons.md#questioncircleicon) +- [RangeIcon](Frontend_Components_Icons.md#rangeicon) +- [Rank1Icon](Frontend_Components_Icons.md#rank1icon) +- [Rank2Icon](Frontend_Components_Icons.md#rank2icon) +- [Rank3Icon](Frontend_Components_Icons.md#rank3icon) +- [Rank4Icon](Frontend_Components_Icons.md#rank4icon) +- [RankIcon](Frontend_Components_Icons.md#rankicon) +- [RightarrowIcon](Frontend_Components_Icons.md#rightarrowicon) +- [SettingsIcon](Frontend_Components_Icons.md#settingsicon) +- [ShareIcon](Frontend_Components_Icons.md#shareicon) +- [SilverGrowthIcon](Frontend_Components_Icons.md#silvergrowthicon) +- [SilverIcon](Frontend_Components_Icons.md#silvericon) +- [SilverProdIcon](Frontend_Components_Icons.md#silverprodicon) +- [SpeedIcon](Frontend_Components_Icons.md#speedicon) +- [StatIcon](Frontend_Components_Icons.md#staticon) +- [TargetIcon](Frontend_Components_Icons.md#targeticon) +- [TwitterIcon](Frontend_Components_Icons.md#twittericon) +- [TxAccepted](Frontend_Components_Icons.md#txaccepted) +- [TxConfirmed](Frontend_Components_Icons.md#txconfirmed) +- [TxDeclined](Frontend_Components_Icons.md#txdeclined) +- [TxInitialized](Frontend_Components_Icons.md#txinitialized) +- [UpgradeIcon](Frontend_Components_Icons.md#upgradeicon) +- [WithdrawIcon](Frontend_Components_Icons.md#withdrawicon) + +## Functions + +### ActivateIcon + +▸ `Const` **ActivateIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### ArtifactFound + +▸ `Const` **ArtifactFound**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### ArtifactIcon + +▸ `Const` **ArtifactIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### ArtifactProspected + +▸ `Const` **ArtifactProspected**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### BranchIcon + +▸ `Const` **BranchIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.branch` | `number` | + +#### Returns + +`Element` + +--- + +### BroadcastIcon + +▸ `Const` **BroadcastIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### CloseCircleIcon + +▸ `Const` **CloseCircleIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### DeactivateIcon + +▸ `Const` **DeactivateIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### DefenseIcon + +▸ `Const` **DefenseIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### DepositIcon + +▸ `Const` **DepositIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### EnergyGrowthIcon + +▸ `Const` **EnergyGrowthIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### EnergyIcon + +▸ `Const` **EnergyIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### EthIcon + +▸ `Const` **EthIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### FoundComet + +▸ `Const` **FoundComet**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundCorrupted + +▸ `Const` **FoundCorrupted**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundDeadSpace + +▸ `Const` **FoundDeadSpace**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundDeepSpace + +▸ `Const` **FoundDeepSpace**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundDesert + +▸ `Const` **FoundDesert**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundForest + +▸ `Const` **FoundForest**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundGrassland + +▸ `Const` **FoundGrassland**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundIce + +▸ `Const` **FoundIce**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundLava + +▸ `Const` **FoundLava**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundOcean + +▸ `Const` **FoundOcean**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundPirates + +▸ `Const` **FoundPirates**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundRuins + +▸ `Const` **FoundRuins**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundSilver + +▸ `Const` **FoundSilver**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundSpace + +▸ `Const` **FoundSpace**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundSpacetimeRip + +▸ `Const` **FoundSpacetimeRip**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundSwamp + +▸ `Const` **FoundSwamp**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundTradingPost + +▸ `Const` **FoundTradingPost**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundTundra + +▸ `Const` **FoundTundra**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FoundWasteland + +▸ `Const` **FoundWasteland**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### FullRankIcon + +▸ `Const` **FullRankIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### HatIcon + +▸ `Const` **HatIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### HelpIcon + +▸ `Const` **HelpIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### LeaderboardIcon + +▸ `Const` **LeaderboardIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### LockIcon + +▸ `Const` **LockIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### MaxLevelIcon + +▸ `Const` **MaxLevelIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### MaximizeCircleIcon + +▸ `Const` **MaximizeCircleIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### MetPlayer + +▸ `Const` **MetPlayer**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### MinimizeCircleIcon + +▸ `Const` **MinimizeCircleIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### PauseIcon + +▸ `Const` **PauseIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### PiratesIcon + +▸ `Const` **PiratesIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### PlanetAttacked + +▸ `Const` **PlanetAttacked**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### PlanetConquered + +▸ `Const` **PlanetConquered**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### PlanetIcon + +▸ `Const` **PlanetIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### PlanetLost + +▸ `Const` **PlanetLost**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### PlanetdexIcon + +▸ `Const` **PlanetdexIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### PlayIcon + +▸ `Const` **PlayIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### PluginIcon + +▸ `Const` **PluginIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### Quasar + +▸ `Const` **Quasar**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### QuestionCircleIcon + +▸ `Const` **QuestionCircleIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### RangeIcon + +▸ `Const` **RangeIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### Rank1Icon + +▸ `Const` **Rank1Icon**(): `Element` + +#### Returns + +`Element` + +--- + +### Rank2Icon + +▸ `Const` **Rank2Icon**(): `Element` + +#### Returns + +`Element` + +--- + +### Rank3Icon + +▸ `Const` **Rank3Icon**(): `Element` + +#### Returns + +`Element` + +--- + +### Rank4Icon + +▸ `Const` **Rank4Icon**(): `Element` + +#### Returns + +`Element` + +--- + +### RankIcon + +▸ `Const` **RankIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### RightarrowIcon + +▸ `Const` **RightarrowIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### SettingsIcon + +▸ `Const` **SettingsIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### ShareIcon + +▸ `Const` **ShareIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### SilverGrowthIcon + +▸ `Const` **SilverGrowthIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### SilverIcon + +▸ `Const` **SilverIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### SilverProdIcon + +▸ `Const` **SilverProdIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### SpeedIcon + +▸ `Const` **SpeedIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` + +--- + +### StatIcon + +▸ `Const` **StatIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.stat` | [`StatIdx`](../enums/_types_global_GlobalTypes.StatIdx.md) | + +#### Returns + +`Element` + +--- + +### TargetIcon + +▸ `Const` **TargetIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### TwitterIcon + +▸ `Const` **TwitterIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### TxAccepted + +▸ `Const` **TxAccepted**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### TxConfirmed + +▸ `Const` **TxConfirmed**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### TxDeclined + +▸ `Const` **TxDeclined**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### TxInitialized + +▸ `Const` **TxInitialized**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `AlertIcon` | + +#### Returns + +`Element` + +--- + +### UpgradeIcon + +▸ `Const` **UpgradeIcon**(): `Element` + +#### Returns + +`Element` + +--- + +### WithdrawIcon + +▸ `Const` **WithdrawIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_Input.md b/docs/modules/Frontend_Components_Input.md new file mode 100644 index 00000000..8d485bac --- /dev/null +++ b/docs/modules/Frontend_Components_Input.md @@ -0,0 +1,20 @@ +# Module: Frontend/Components/Input + +## Table of contents + +### Variables + +- [DFInput](Frontend_Components_Input.md#dfinput) +- [Input](Frontend_Components_Input.md#input) + +## Variables + +### DFInput + +• `Const` **DFInput**: `StyledComponent`<`"input"`, `any`, `Object`, `never`\> + +--- + +### Input + +• `Const` **Input**: `ForwardRefExoticComponent`<`Pick`<`ClassAttributes`<`HTMLInputElement`\> & `InputHTMLAttributes`<`HTMLInputElement`\> & `InputProps`, `"key"` \| `"wide"` \| keyof `InputHTMLAttributes`<`HTMLInputElement`\>\> & `RefAttributes`<`HTMLInputElement`\>\> diff --git a/docs/modules/Frontend_Components_Labels_ArtifactLabels.md b/docs/modules/Frontend_Components_Labels_ArtifactLabels.md new file mode 100644 index 00000000..a88f0138 --- /dev/null +++ b/docs/modules/Frontend_Components_Labels_ArtifactLabels.md @@ -0,0 +1,124 @@ +# Module: Frontend/Components/Labels/ArtifactLabels + +## Table of contents + +### Variables + +- [StyledArtifactRarityLabel](Frontend_Components_Labels_ArtifactLabels.md#styledartifactraritylabel) + +### Functions + +- [ArtifactBiomeText](Frontend_Components_Labels_ArtifactLabels.md#artifactbiometext) +- [ArtifactRarityBiomeTypeText](Frontend_Components_Labels_ArtifactLabels.md#artifactraritybiometypetext) +- [ArtifactRarityLabel](Frontend_Components_Labels_ArtifactLabels.md#artifactraritylabel) +- [ArtifactRarityLabelAnim](Frontend_Components_Labels_ArtifactLabels.md#artifactraritylabelanim) +- [ArtifactRarityText](Frontend_Components_Labels_ArtifactLabels.md#artifactraritytext) +- [ArtifactTypeText](Frontend_Components_Labels_ArtifactLabels.md#artifacttypetext) + +## Variables + +### StyledArtifactRarityLabel + +• `Const` **StyledArtifactRarityLabel**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +## Functions + +### ArtifactBiomeText + +▸ `Const` **ArtifactBiomeText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | + +#### Returns + +`Element` + +--- + +### ArtifactRarityBiomeTypeText + +▸ `Const` **ArtifactRarityBiomeTypeText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | + +#### Returns + +`Element` + +--- + +### ArtifactRarityLabel + +▸ `Const` **ArtifactRarityLabel**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | + +#### Returns + +`Element` + +--- + +### ArtifactRarityLabelAnim + +▸ `Const` **ArtifactRarityLabelAnim**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | + +#### Returns + +`Element` + +--- + +### ArtifactRarityText + +▸ `Const` **ArtifactRarityText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | + +#### Returns + +`Element` + +--- + +### ArtifactTypeText + +▸ `Const` **ArtifactTypeText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_Labels_BiomeLabels.md b/docs/modules/Frontend_Components_Labels_BiomeLabels.md new file mode 100644 index 00000000..89f6cb55 --- /dev/null +++ b/docs/modules/Frontend_Components_Labels_BiomeLabels.md @@ -0,0 +1,110 @@ +# Module: Frontend/Components/Labels/BiomeLabels + +## Table of contents + +### Variables + +- [BiomeLabel](Frontend_Components_Labels_BiomeLabels.md#biomelabel) + +### Functions + +- [ArtifactBiomeLabel](Frontend_Components_Labels_BiomeLabels.md#artifactbiomelabel) +- [ArtifactBiomeLabelAnim](Frontend_Components_Labels_BiomeLabels.md#artifactbiomelabelanim) +- [BiomeLabelAnim](Frontend_Components_Labels_BiomeLabels.md#biomelabelanim) +- [OptionalPlanetBiomeLabelAnim](Frontend_Components_Labels_BiomeLabels.md#optionalplanetbiomelabelanim) +- [PlanetBiomeLabelAnim](Frontend_Components_Labels_BiomeLabels.md#planetbiomelabelanim) + +## Variables + +### BiomeLabel + +• `Const` **BiomeLabel**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +Renders colored text corresponding to a biome + +## Functions + +### ArtifactBiomeLabel + +▸ `Const` **ArtifactBiomeLabel**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | + +#### Returns + +`Element` + +--- + +### ArtifactBiomeLabelAnim + +▸ `Const` **ArtifactBiomeLabelAnim**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | + +#### Returns + +`Element` + +--- + +### BiomeLabelAnim + +▸ `Const` **BiomeLabelAnim**(`__namedParameters`): `Element` + +Renders animated colored text corresponding to a biome + +#### Parameters + +| Name | Type | +| :------------------------ | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.biome` | `Biome` | + +#### Returns + +`Element` + +--- + +### OptionalPlanetBiomeLabelAnim + +▸ `Const` **OptionalPlanetBiomeLabelAnim**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### PlanetBiomeLabelAnim + +▸ `Const` **PlanetBiomeLabelAnim**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `LocatablePlanet` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_Labels_KeywordLabels.md b/docs/modules/Frontend_Components_Labels_KeywordLabels.md new file mode 100644 index 00000000..ecc317e9 --- /dev/null +++ b/docs/modules/Frontend_Components_Labels_KeywordLabels.md @@ -0,0 +1,50 @@ +# Module: Frontend/Components/Labels/KeywordLabels + +## Table of contents + +### Functions + +- [ScoreLabel](Frontend_Components_Labels_KeywordLabels.md#scorelabel) +- [ScoreLabelTip](Frontend_Components_Labels_KeywordLabels.md#scorelabeltip) +- [SilverLabel](Frontend_Components_Labels_KeywordLabels.md#silverlabel) +- [SilverLabelTip](Frontend_Components_Labels_KeywordLabels.md#silverlabeltip) + +## Functions + +### ScoreLabel + +▸ `Const` **ScoreLabel**(): `Element` + +#### Returns + +`Element` + +--- + +### ScoreLabelTip + +▸ `Const` **ScoreLabelTip**(): `Element` + +#### Returns + +`Element` + +--- + +### SilverLabel + +▸ `Const` **SilverLabel**(): `Element` + +#### Returns + +`Element` + +--- + +### SilverLabelTip + +▸ `Const` **SilverLabelTip**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_Labels_Labels.md b/docs/modules/Frontend_Components_Labels_Labels.md new file mode 100644 index 00000000..957d322c --- /dev/null +++ b/docs/modules/Frontend_Components_Labels_Labels.md @@ -0,0 +1,24 @@ +# Module: Frontend/Components/Labels/Labels + +## Table of contents + +### Functions + +- [AccountLabel](Frontend_Components_Labels_Labels.md#accountlabel) + +## Functions + +### AccountLabel + +▸ **AccountLabel**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------- | :-------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.account` | `EthAddress` \| `undefined` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_Labels_LavaLabel.md b/docs/modules/Frontend_Components_Labels_LavaLabel.md new file mode 100644 index 00000000..0f71d8fb --- /dev/null +++ b/docs/modules/Frontend_Components_Labels_LavaLabel.md @@ -0,0 +1,27 @@ +# Module: Frontend/Components/Labels/LavaLabel + +## Table of contents + +### Variables + +- [LavaLabel](Frontend_Components_Labels_LavaLabel.md#lavalabel) + +### Functions + +- [LavaLabelRaw](Frontend_Components_Labels_LavaLabel.md#lavalabelraw) + +## Variables + +### LavaLabel + +• `Const` **LavaLabel**: `MemoExoticComponent`<`fn`\> + +## Functions + +### LavaLabelRaw + +▸ **LavaLabelRaw**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/frontend_components_labels_legendarylabel.md b/docs/modules/Frontend_Components_Labels_LegendaryLabel.md similarity index 50% rename from docs/modules/frontend_components_labels_legendarylabel.md rename to docs/modules/Frontend_Components_Labels_LegendaryLabel.md index e791d909..aba717bb 100644 --- a/docs/modules/frontend_components_labels_legendarylabel.md +++ b/docs/modules/Frontend_Components_Labels_LegendaryLabel.md @@ -4,10 +4,10 @@ ### Variables -- [LegendaryLabel](frontend_components_labels_legendarylabel.md#legendarylabel) +- [LegendaryLabel](Frontend_Components_Labels_LegendaryLabel.md#legendarylabel) ## Variables ### LegendaryLabel -• `Const` **LegendaryLabel**: _MemoExoticComponent_<() => _Element_\> +• `Const` **LegendaryLabel**: `MemoExoticComponent`<`fn`\> diff --git a/docs/modules/Frontend_Components_Labels_MythicLabel.md b/docs/modules/Frontend_Components_Labels_MythicLabel.md new file mode 100644 index 00000000..723fd7b0 --- /dev/null +++ b/docs/modules/Frontend_Components_Labels_MythicLabel.md @@ -0,0 +1,13 @@ +# Module: Frontend/Components/Labels/MythicLabel + +## Table of contents + +### Variables + +- [MythicLabel](Frontend_Components_Labels_MythicLabel.md#mythiclabel) + +## Variables + +### MythicLabel + +• `Const` **MythicLabel**: `MemoExoticComponent`<`fn`\> diff --git a/docs/modules/Frontend_Components_Labels_PlanetLabels.md b/docs/modules/Frontend_Components_Labels_PlanetLabels.md new file mode 100644 index 00000000..bdd2211d --- /dev/null +++ b/docs/modules/Frontend_Components_Labels_PlanetLabels.md @@ -0,0 +1,353 @@ +# Module: Frontend/Components/Labels/PlanetLabels + +## Table of contents + +### Functions + +- [DefenseText](Frontend_Components_Labels_PlanetLabels.md#defensetext) +- [EnergyCapText](Frontend_Components_Labels_PlanetLabels.md#energycaptext) +- [EnergyGrowthText](Frontend_Components_Labels_PlanetLabels.md#energygrowthtext) +- [EnergyText](Frontend_Components_Labels_PlanetLabels.md#energytext) +- [LevelRankText](Frontend_Components_Labels_PlanetLabels.md#levelranktext) +- [LevelRankTextEm](Frontend_Components_Labels_PlanetLabels.md#levelranktextem) +- [PlanetBiomeTypeLabelAnim](Frontend_Components_Labels_PlanetLabels.md#planetbiometypelabelanim) +- [PlanetEnergyLabel](Frontend_Components_Labels_PlanetLabels.md#planetenergylabel) +- [PlanetLevelText](Frontend_Components_Labels_PlanetLabels.md#planetleveltext) +- [PlanetOwnerLabel](Frontend_Components_Labels_PlanetLabels.md#planetownerlabel) +- [PlanetRankText](Frontend_Components_Labels_PlanetLabels.md#planetranktext) +- [PlanetSilverLabel](Frontend_Components_Labels_PlanetLabels.md#planetsilverlabel) +- [PlanetTypeLabelAnim](Frontend_Components_Labels_PlanetLabels.md#planettypelabelanim) +- [RangeText](Frontend_Components_Labels_PlanetLabels.md#rangetext) +- [SilverCapText](Frontend_Components_Labels_PlanetLabels.md#silvercaptext) +- [SilverGrowthText](Frontend_Components_Labels_PlanetLabels.md#silvergrowthtext) +- [SilverText](Frontend_Components_Labels_PlanetLabels.md#silvertext) +- [SpeedText](Frontend_Components_Labels_PlanetLabels.md#speedtext) +- [StatText](Frontend_Components_Labels_PlanetLabels.md#stattext) + +## Functions + +### DefenseText + +▸ `Const` **DefenseText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### EnergyCapText + +▸ `Const` **EnergyCapText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### EnergyGrowthText + +▸ `Const` **EnergyGrowthText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### EnergyText + +▸ `Const` **EnergyText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### LevelRankText + +▸ `Const` **LevelRankText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.delim?` | `string` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### LevelRankTextEm + +▸ `Const` **LevelRankTextEm**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.delim?` | `string` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### PlanetBiomeTypeLabelAnim + +▸ `Const` **PlanetBiomeTypeLabelAnim**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### PlanetEnergyLabel + +▸ **PlanetEnergyLabel**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `Planet` \| `undefined` | + +#### Returns + +`Element` + +--- + +### PlanetLevelText + +▸ `Const` **PlanetLevelText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### PlanetOwnerLabel + +▸ **PlanetOwnerLabel**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `boolean` | +| `__namedParameters.planet` | `Planet` \| `undefined` | +| `__namedParameters.showYours?` | `boolean` | + +#### Returns + +`Element` + +--- + +### PlanetRankText + +▸ `Const` **PlanetRankText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### PlanetSilverLabel + +▸ **PlanetSilverLabel**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `Planet` \| `undefined` | + +#### Returns + +`Element` + +--- + +### PlanetTypeLabelAnim + +▸ `Const` **PlanetTypeLabelAnim**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### RangeText + +▸ `Const` **RangeText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### SilverCapText + +▸ `Const` **SilverCapText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### SilverGrowthText + +▸ `Const` **SilverGrowthText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### SilverText + +▸ `Const` **SilverText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### SpeedText + +▸ `Const` **SpeedText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + +### StatText + +▸ **StatText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `Planet` \| `undefined` | +| `__namedParameters.getStat` | | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_components_labels_spacetimeriplabel.md b/docs/modules/Frontend_Components_Labels_SpacetimeRipLabel.md similarity index 52% rename from docs/modules/frontend_components_labels_spacetimeriplabel.md rename to docs/modules/Frontend_Components_Labels_SpacetimeRipLabel.md index 90f0b785..fed39a8a 100644 --- a/docs/modules/frontend_components_labels_spacetimeriplabel.md +++ b/docs/modules/Frontend_Components_Labels_SpacetimeRipLabel.md @@ -4,10 +4,10 @@ ### Variables -- [SpacetimeRipLabel](frontend_components_labels_spacetimeriplabel.md#spacetimeriplabel) +- [SpacetimeRipLabel](Frontend_Components_Labels_SpacetimeRipLabel.md#spacetimeriplabel) ## Variables ### SpacetimeRipLabel -• `Const` **SpacetimeRipLabel**: _MemoExoticComponent_<() => _Element_\> +• `Const` **SpacetimeRipLabel**: `MemoExoticComponent`<`fn`\> diff --git a/docs/modules/Frontend_Components_Labels_WastelandLabel.md b/docs/modules/Frontend_Components_Labels_WastelandLabel.md new file mode 100644 index 00000000..0aa72875 --- /dev/null +++ b/docs/modules/Frontend_Components_Labels_WastelandLabel.md @@ -0,0 +1,27 @@ +# Module: Frontend/Components/Labels/WastelandLabel + +## Table of contents + +### Variables + +- [WastelandLabel](Frontend_Components_Labels_WastelandLabel.md#wastelandlabel) + +### Functions + +- [WastelandLabelRaw](Frontend_Components_Labels_WastelandLabel.md#wastelandlabelraw) + +## Variables + +### WastelandLabel + +• `Const` **WastelandLabel**: `MemoExoticComponent`<`fn`\> + +## Functions + +### WastelandLabelRaw + +▸ **WastelandLabelRaw**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_LoadingSpinner.md b/docs/modules/Frontend_Components_LoadingSpinner.md new file mode 100644 index 00000000..4a0ae6a5 --- /dev/null +++ b/docs/modules/Frontend_Components_LoadingSpinner.md @@ -0,0 +1,25 @@ +# Module: Frontend/Components/LoadingSpinner + +## Table of contents + +### Functions + +- [LoadingSpinner](Frontend_Components_LoadingSpinner.md#loadingspinner) + +## Functions + +### LoadingSpinner + +▸ **LoadingSpinner**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.initialText?` | `string` | +| `__namedParameters.rate?` | `number` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_PlanetPreview.md b/docs/modules/Frontend_Components_PlanetPreview.md new file mode 100644 index 00000000..a67fe439 --- /dev/null +++ b/docs/modules/Frontend_Components_PlanetPreview.md @@ -0,0 +1,45 @@ +# Module: Frontend/Components/PlanetPreview + +## Table of contents + +### Functions + +- [PlanetPreview](Frontend_Components_PlanetPreview.md#planetpreview) +- [PlanetPreviewImage](Frontend_Components_PlanetPreview.md#planetpreviewimage) + +## Functions + +### PlanetPreview + +▸ **PlanetPreview**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `Planet` \| `undefined` | +| `__namedParameters.res` | `number` | +| `__namedParameters.size` | `string` | + +#### Returns + +`Element` + +--- + +### PlanetPreviewImage + +▸ **PlanetPreviewImage**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `Planet` \| `undefined` | +| `__namedParameters.res` | `number` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_ReadMore.md b/docs/modules/Frontend_Components_ReadMore.md new file mode 100644 index 00000000..63d8f4be --- /dev/null +++ b/docs/modules/Frontend_Components_ReadMore.md @@ -0,0 +1,25 @@ +# Module: Frontend/Components/ReadMore + +## Table of contents + +### Functions + +- [ReadMore](Frontend_Components_ReadMore.md#readmore) + +## Functions + +### ReadMore + +▸ **ReadMore**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :----------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactChild`[] \| `React.ReactChild` | +| `__namedParameters.height?` | `string` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_RemoteModal.md b/docs/modules/Frontend_Components_RemoteModal.md new file mode 100644 index 00000000..fc4473e2 --- /dev/null +++ b/docs/modules/Frontend_Components_RemoteModal.md @@ -0,0 +1,31 @@ +# Module: Frontend/Components/RemoteModal + +## Table of contents + +### Functions + +- [RemoteModal](Frontend_Components_RemoteModal.md#remotemodal) + +## Functions + +### RemoteModal + +▸ **RemoteModal**(`__namedParameters`): `ReactPortal` + +Allows you to instantiate a modal, and render it into the desired element. +Useful for loading temporary modals from ANYWHERE in the UI, not just +[GameWindowLayout](Frontend_Views_GameWindowLayout.md#gamewindowlayout) + +#### Parameters + +| Name | Type | +| :---------------------------- | :---------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactElement` | +| `__namedParameters.container` | `Element` | +| `__namedParameters.hook` | [`boolean`, (`set`: `boolean`) => `void`] | +| `__namedParameters.title` | `string` | + +#### Returns + +`ReactPortal` diff --git a/docs/modules/Frontend_Components_Text.md b/docs/modules/Frontend_Components_Text.md new file mode 100644 index 00000000..cb5d00db --- /dev/null +++ b/docs/modules/Frontend_Components_Text.md @@ -0,0 +1,382 @@ +# Module: Frontend/Components/Text + +## Table of contents + +### Variables + +- [BasicLink](Frontend_Components_Text.md#basiclink) +- [Blue](Frontend_Components_Text.md#blue) +- [Colored](Frontend_Components_Text.md#colored) +- [Gold](Frontend_Components_Text.md#gold) +- [Green](Frontend_Components_Text.md#green) +- [HideSmall](Frontend_Components_Text.md#hidesmall) +- [Invisible](Frontend_Components_Text.md#invisible) +- [Item](Frontend_Components_Text.md#item) +- [List](Frontend_Components_Text.md#list) +- [Paragraph](Frontend_Components_Text.md#paragraph) +- [Red](Frontend_Components_Text.md#red) +- [Smaller](Frontend_Components_Text.md#smaller) +- [StyledLink](Frontend_Components_Text.md#styledlink) +- [Sub](Frontend_Components_Text.md#sub) +- [Subber](Frontend_Components_Text.md#subber) +- [White](Frontend_Components_Text.md#white) + +### Functions + +- [ArtifactNameLink](Frontend_Components_Text.md#artifactnamelink) +- [BlinkCursor](Frontend_Components_Text.md#blinkcursor) +- [CenterChunkLink](Frontend_Components_Text.md#centerchunklink) +- [CenterPlanetLink](Frontend_Components_Text.md#centerplanetlink) +- [Coords](Frontend_Components_Text.md#coords) +- [FAQ04Link](Frontend_Components_Text.md#faq04link) +- [FakeLine](Frontend_Components_Text.md#fakeline) +- [Header](Frontend_Components_Text.md#header) +- [Link](Frontend_Components_Text.md#link) +- [LongDash](Frontend_Components_Text.md#longdash) +- [PlanetNameLink](Frontend_Components_Text.md#planetnamelink) +- [Space](Frontend_Components_Text.md#space) +- [Tab](Frontend_Components_Text.md#tab) +- [Text](Frontend_Components_Text.md#text) +- [Title](Frontend_Components_Text.md#title) +- [TxLink](Frontend_Components_Text.md#txlink) + +## Variables + +### BasicLink + +• `Const` **BasicLink**: `StyledComponent`<`"u"`, `any`, `Object`, `never`\> + +--- + +### Blue + +• `Const` **Blue**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### Colored + +• `Const` **Colored**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### Gold + +• `Const` **Gold**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### Green + +• `Const` **Green**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### HideSmall + +• `Const` **HideSmall**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### Invisible + +• `Const` **Invisible**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### Item + +• `Const` **Item**: `StyledComponent`<`"li"`, `any`, `Object`, `never`\> + +--- + +### List + +• `Const` **List**: `StyledComponent`<`"ul"`, `any`, `Object`, `never`\> + +--- + +### Paragraph + +• `Const` **Paragraph**: `StyledComponent`<`"p"`, `any`, `Object`, `never`\> + +--- + +### Red + +• `Const` **Red**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### Smaller + +• `Const` **Smaller**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### StyledLink + +• `Const` **StyledLink**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### Sub + +• `Const` **Sub**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### Subber + +• `Const` **Subber**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### White + +• `Const` **White**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +## Functions + +### ArtifactNameLink + +▸ **ArtifactNameLink**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------- | :----------- | +| `__namedParameters` | `Object` | +| `__namedParameters.id` | `ArtifactId` | + +#### Returns + +`Element` + +--- + +### BlinkCursor + +▸ **BlinkCursor**(): `Element` + +#### Returns + +`Element` + +--- + +### CenterChunkLink + +▸ **CenterChunkLink**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | +| `__namedParameters.chunk` | [`Chunk`](../classes/_types_global_GlobalTypes.Chunk.md) | + +#### Returns + +`Element` + +--- + +### CenterPlanetLink + +▸ **CenterPlanetLink**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :---------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | +| `__namedParameters.planet` | `Planet` | + +#### Returns + +`Element` + +--- + +### Coords + +▸ `Const` **Coords**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------------ | +| `__namedParameters` | `Object` | +| `__namedParameters.coords` | `WorldCoords` | + +#### Returns + +`Element` + +--- + +### FAQ04Link + +▸ **FAQ04Link**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :---------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | + +#### Returns + +`Element` + +--- + +### FakeLine + +▸ `Const` **FakeLine**(): `Element` + +#### Returns + +`Element` + +--- + +### Header + +▸ **Header**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :-------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | +| `__namedParameters.style?` | `React.CSSProperties` | + +#### Returns + +`Element` + +--- + +### Link + +▸ **Link**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `LinkProps` | + +#### Returns + +`Element` + +--- + +### LongDash + +▸ `Const` **LongDash**(): `Element` + +#### Returns + +`Element` + +--- + +### PlanetNameLink + +▸ **PlanetNameLink**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `Planet` | + +#### Returns + +`Element` + +--- + +### Space + +▸ **Space**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.length` | `number` | + +#### Returns + +`Element` + +--- + +### Tab + +▸ `Const` **Tab**(): `Element` + +#### Returns + +`Element` + +--- + +### Text + +▸ **Text**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :---------- | +| `__namedParameters` | `TextProps` | + +#### Returns + +`Element` + +--- + +### Title + +▸ **Title**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :---------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | + +#### Returns + +`Element` + +--- + +### TxLink + +▸ **TxLink**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------- | :------------ | +| `__namedParameters` | `Object` | +| `__namedParameters.tx` | `SubmittedTx` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_TextLoadingBar.md b/docs/modules/Frontend_Components_TextLoadingBar.md new file mode 100644 index 00000000..2752d2fb --- /dev/null +++ b/docs/modules/Frontend_Components_TextLoadingBar.md @@ -0,0 +1,38 @@ +# Module: Frontend/Components/TextLoadingBar + +## Table of contents + +### Interfaces + +- [LoadingBarHandle](../interfaces/Frontend_Components_TextLoadingBar.LoadingBarHandle.md) + +### Variables + +- [TextLoadingBar](Frontend_Components_TextLoadingBar.md#textloadingbar) + +### Functions + +- [TextLoadingBarImpl](Frontend_Components_TextLoadingBar.md#textloadingbarimpl) + +## Variables + +### TextLoadingBar + +• `Const` **TextLoadingBar**: `ForwardRefExoticComponent`<`LoadingBarProps` & `RefAttributes`<`undefined` \| [`LoadingBarHandle`](../interfaces/Frontend_Components_TextLoadingBar.LoadingBarHandle.md)\>\> + +## Functions + +### TextLoadingBarImpl + +▸ **TextLoadingBarImpl**(`__namedParameters`, `ref`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :------------------------------------------------------------------------------------------------------- | +| `__namedParameters` | `LoadingBarProps` | +| `ref` | `React.Ref`<[`LoadingBarHandle`](../interfaces/Frontend_Components_TextLoadingBar.LoadingBarHandle.md)\> | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_TextPreview.md b/docs/modules/Frontend_Components_TextPreview.md new file mode 100644 index 00000000..9d6fd177 --- /dev/null +++ b/docs/modules/Frontend_Components_TextPreview.md @@ -0,0 +1,27 @@ +# Module: Frontend/Components/TextPreview + +## Table of contents + +### Functions + +- [TextPreview](Frontend_Components_TextPreview.md#textpreview) + +## Functions + +### TextPreview + +▸ **TextPreview**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------------ | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.focusedWidthPx?` | `number` | +| `__namedParameters.maxLength?` | `number` | +| `__namedParameters.text` | `string` | +| `__namedParameters.unFocusedWidthPx?` | `number` | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_components_timeuntil.md b/docs/modules/Frontend_Components_TimeUntil.md similarity index 54% rename from docs/modules/frontend_components_timeuntil.md rename to docs/modules/Frontend_Components_TimeUntil.md index 903685a6..2dc6e9e9 100644 --- a/docs/modules/frontend_components_timeuntil.md +++ b/docs/modules/Frontend_Components_TimeUntil.md @@ -4,13 +4,13 @@ ### Functions -- [TimeUntil](frontend_components_timeuntil.md#timeuntil) +- [TimeUntil](Frontend_Components_TimeUntil.md#timeuntil) ## Functions ### TimeUntil -▸ **TimeUntil**(`__namedParameters`: { `ifPassed`: _string_ ; `timestamp`: _number_ }): _Element_ +▸ **TimeUntil**(`__namedParameters`): `Element` Given a timestamp, displays the amount of time until the timestamp from now in hh:mm:ss format. If the timestamp is in the past, displays the given hardcoded value. @@ -19,8 +19,10 @@ If the timestamp is in the past, displays the given hardcoded value. | Name | Type | | :---------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.ifPassed` | _string_ | -| `__namedParameters.timestamp` | _number_ | +| `__namedParameters` | `Object` | +| `__namedParameters.ifPassed` | `string` | +| `__namedParameters.timestamp` | `number` | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/frontend_copy_helpcontent.md b/docs/modules/Frontend_Copy_HelpContent.md similarity index 51% rename from docs/modules/frontend_copy_helpcontent.md rename to docs/modules/Frontend_Copy_HelpContent.md index 9ebfd9aa..55e5cecc 100644 --- a/docs/modules/frontend_copy_helpcontent.md +++ b/docs/modules/Frontend_Copy_HelpContent.md @@ -4,12 +4,14 @@ ### Functions -- [SelectedPlanetHelpContent](frontend_copy_helpcontent.md#selectedplanethelpcontent) +- [SelectedPlanetHelpContent](Frontend_Copy_HelpContent.md#selectedplanethelpcontent) ## Functions ### SelectedPlanetHelpContent -▸ **SelectedPlanetHelpContent**(): _Element_ +▸ **SelectedPlanetHelpContent**(): `Element` -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/frontend_game_controllablecanvas.md b/docs/modules/Frontend_Game_ControllableCanvas.md similarity index 50% rename from docs/modules/frontend_game_controllablecanvas.md rename to docs/modules/Frontend_Game_ControllableCanvas.md index 582c15c4..5a17772d 100644 --- a/docs/modules/frontend_game_controllablecanvas.md +++ b/docs/modules/Frontend_Game_ControllableCanvas.md @@ -4,12 +4,14 @@ ### Functions -- [default](frontend_game_controllablecanvas.md#default) +- [default](Frontend_Game_ControllableCanvas.md#default) ## Functions ### default -▸ **default**(): _Element_ +▸ **default**(): `Element` -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Game_NotificationManager.md b/docs/modules/Frontend_Game_NotificationManager.md new file mode 100644 index 00000000..1ebbef41 --- /dev/null +++ b/docs/modules/Frontend_Game_NotificationManager.md @@ -0,0 +1,34 @@ +# Module: Frontend/Game/NotificationManager + +## Table of contents + +### Enumerations + +- [NotificationManagerEvent](../enums/Frontend_Game_NotificationManager.NotificationManagerEvent.md) +- [NotificationType](../enums/Frontend_Game_NotificationManager.NotificationType.md) + +### Classes + +- [default](../classes/Frontend_Game_NotificationManager.default.md) + +### Type aliases + +- [NotificationInfo](Frontend_Game_NotificationManager.md#notificationinfo) + +## Type aliases + +### NotificationInfo + +Ƭ **NotificationInfo**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :----------------------------------------------------------------------------------- | +| `color?` | `string` | +| `icon` | `React.ReactNode` | +| `id` | `string` | +| `message` | `React.ReactNode` | +| `txData?` | `TxIntent` | +| `txStatus?` | `EthTxStatus` | +| `type` | [`NotificationType`](../enums/Frontend_Game_NotificationManager.NotificationType.md) | diff --git a/docs/modules/Frontend_Game_Popups.md b/docs/modules/Frontend_Game_Popups.md new file mode 100644 index 00000000..d9bb30e8 --- /dev/null +++ b/docs/modules/Frontend_Game_Popups.md @@ -0,0 +1,26 @@ +# Module: Frontend/Game/Popups + +## Table of contents + +### Functions + +- [openConfirmationWindowForTransaction](Frontend_Game_Popups.md#openconfirmationwindowfortransaction) + +## Functions + +### openConfirmationWindowForTransaction + +▸ **openConfirmationWindowForTransaction**(`ethConnection`, `txRequest`, `from`, `gasFeeGwei`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :-------------- | :------------------------------------------------------------------------------- | +| `ethConnection` | [`default`](../classes/Backend_Network_EthConnection.default.md) | +| `txRequest` | [`QueuedTxRequest`](../interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md) | +| `from` | `EthAddress` | +| `gasFeeGwei` | `number` | + +#### Returns + +`Promise`<`void`\> diff --git a/docs/modules/Frontend_Game_Viewport.md b/docs/modules/Frontend_Game_Viewport.md new file mode 100644 index 00000000..173212cd --- /dev/null +++ b/docs/modules/Frontend_Game_Viewport.md @@ -0,0 +1,21 @@ +# Module: Frontend/Game/Viewport + +## Table of contents + +### Classes + +- [default](../classes/Frontend_Game_Viewport.default.md) + +### Functions + +- [getDefaultScroll](Frontend_Game_Viewport.md#getdefaultscroll) + +## Functions + +### getDefaultScroll + +▸ `Const` **getDefaultScroll**(): `number` + +#### Returns + +`number` diff --git a/docs/modules/Frontend_Game_ViewportAnimation.md b/docs/modules/Frontend_Game_ViewportAnimation.md new file mode 100644 index 00000000..39c9aa94 --- /dev/null +++ b/docs/modules/Frontend_Game_ViewportAnimation.md @@ -0,0 +1,8 @@ +# Module: Frontend/Game/ViewportAnimation + +## Table of contents + +### Classes + +- [AnimationManager](../classes/Frontend_Game_ViewportAnimation.AnimationManager.md) +- [ViewportAnimation](../classes/Frontend_Game_ViewportAnimation.ViewportAnimation.md) diff --git a/docs/modules/Frontend_Game_WindowManager.md b/docs/modules/Frontend_Game_WindowManager.md new file mode 100644 index 00000000..670f29c4 --- /dev/null +++ b/docs/modules/Frontend_Game_WindowManager.md @@ -0,0 +1,30 @@ +# Module: Frontend/Game/WindowManager + +## Table of contents + +### Enumerations + +- [CursorState](../enums/Frontend_Game_WindowManager.CursorState.md) +- [TooltipName](../enums/Frontend_Game_WindowManager.TooltipName.md) +- [WindowManagerEvent](../enums/Frontend_Game_WindowManager.WindowManagerEvent.md) + +### Classes + +- [default](../classes/Frontend_Game_WindowManager.default.md) + +### Type aliases + +- [MousePos](Frontend_Game_WindowManager.md#mousepos) + +## Type aliases + +### MousePos + +Ƭ **MousePos**: `Object` + +#### Type declaration + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | diff --git a/docs/modules/frontend_pages_app.md b/docs/modules/Frontend_Pages_App.md similarity index 50% rename from docs/modules/frontend_pages_app.md rename to docs/modules/Frontend_Pages_App.md index dbee6a58..96325e7d 100644 --- a/docs/modules/frontend_pages_app.md +++ b/docs/modules/Frontend_Pages_App.md @@ -4,16 +4,18 @@ ### Properties -- [default](frontend_pages_app.md#default) +- [default](Frontend_Pages_App.md#default) ## Properties ### default -• **default**: () => _Element_ +• **default**: () => `Element` #### Type declaration -▸ (): _Element_ +▸ (): `Element` -**Returns:** _Element_ +##### Returns + +`Element` diff --git a/docs/modules/frontend_pages_conversationtest.md b/docs/modules/Frontend_Pages_ConversationTest.md similarity index 50% rename from docs/modules/frontend_pages_conversationtest.md rename to docs/modules/Frontend_Pages_ConversationTest.md index 795a3618..f30faf14 100644 --- a/docs/modules/frontend_pages_conversationtest.md +++ b/docs/modules/Frontend_Pages_ConversationTest.md @@ -4,12 +4,14 @@ ### Functions -- [ConversationTest](frontend_pages_conversationtest.md#conversationtest) +- [ConversationTest](Frontend_Pages_ConversationTest.md#conversationtest) ## Functions ### ConversationTest -▸ **ConversationTest**(): _Element_ +▸ **ConversationTest**(): `Element` -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Pages_GameLandingPage.md b/docs/modules/Frontend_Pages_GameLandingPage.md new file mode 100644 index 00000000..81e80132 --- /dev/null +++ b/docs/modules/Frontend_Pages_GameLandingPage.md @@ -0,0 +1,21 @@ +# Module: Frontend/Pages/GameLandingPage + +## Table of contents + +### Enumerations + +- [InitRenderState](../enums/Frontend_Pages_GameLandingPage.InitRenderState.md) + +### Functions + +- [default](Frontend_Pages_GameLandingPage.md#default) + +## Functions + +### default + +▸ **default**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/frontend_pages_gifmaker.md b/docs/modules/Frontend_Pages_GifMaker.md similarity index 60% rename from docs/modules/frontend_pages_gifmaker.md rename to docs/modules/Frontend_Pages_GifMaker.md index 7d5d90a8..f5e791f5 100644 --- a/docs/modules/frontend_pages_gifmaker.md +++ b/docs/modules/Frontend_Pages_GifMaker.md @@ -4,26 +4,28 @@ ### Variables -- [GIF_ARTIFACT_COLOR](frontend_pages_gifmaker.md#gif_artifact_color) +- [GIF_ARTIFACT_COLOR](Frontend_Pages_GifMaker.md#gif_artifact_color) ### Functions -- [GifMaker](frontend_pages_gifmaker.md#gifmaker) +- [GifMaker](Frontend_Pages_GifMaker.md#gifmaker) ## Variables ### GIF_ARTIFACT_COLOR -• `Const` **GIF_ARTIFACT_COLOR**: [_APP_BACKGROUND_](../enums/backend_gamelogic_artifactutils.artifactfilecolor.md#app_background) +• `Const` **GIF_ARTIFACT_COLOR**: [`APP_BACKGROUND`](../enums/Backend_GameLogic_ArtifactUtils.ArtifactFileColor.md#app_background) ## Functions ### GifMaker -▸ **GifMaker**(): _Element_ +▸ **GifMaker**(): `Element` Entrypoint for gif and sprite generation, accessed via `yarn run gifs`. Wait a second or so for the textures to get loaded, then click the buttons to download files as a zip. gifs are saved as 60fps webm, and can take a while - open the console to see progress (logged verbosely) -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Pages_LandingPage.md b/docs/modules/Frontend_Pages_LandingPage.md new file mode 100644 index 00000000..906f3f09 --- /dev/null +++ b/docs/modules/Frontend_Pages_LandingPage.md @@ -0,0 +1,21 @@ +# Module: Frontend/Pages/LandingPage + +## Table of contents + +### Enumerations + +- [LandingPageZIndex](../enums/Frontend_Pages_LandingPage.LandingPageZIndex.md) + +### Functions + +- [default](Frontend_Pages_LandingPage.md#default) + +## Functions + +### default + +▸ **default**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/frontend_pages_loadingpage.md b/docs/modules/Frontend_Pages_LoadingPage.md similarity index 50% rename from docs/modules/frontend_pages_loadingpage.md rename to docs/modules/Frontend_Pages_LoadingPage.md index 4aa54235..b540388e 100644 --- a/docs/modules/frontend_pages_loadingpage.md +++ b/docs/modules/Frontend_Pages_LoadingPage.md @@ -4,12 +4,14 @@ ### Functions -- [default](frontend_pages_loadingpage.md#default) +- [default](Frontend_Pages_LoadingPage.md#default) ## Functions ### default -▸ **default**(): _Element_ +▸ **default**(): `Element` -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Pages_PreviewPage.md b/docs/modules/Frontend_Pages_PreviewPage.md new file mode 100644 index 00000000..9f8cc6a3 --- /dev/null +++ b/docs/modules/Frontend_Pages_PreviewPage.md @@ -0,0 +1,17 @@ +# Module: Frontend/Pages/PreviewPage + +## Table of contents + +### Functions + +- [PreviewPage](Frontend_Pages_PreviewPage.md#previewpage) + +## Functions + +### PreviewPage + +▸ **PreviewPage**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Pages_ShareArtifact.md b/docs/modules/Frontend_Pages_ShareArtifact.md new file mode 100644 index 00000000..87209abf --- /dev/null +++ b/docs/modules/Frontend_Pages_ShareArtifact.md @@ -0,0 +1,23 @@ +# Module: Frontend/Pages/ShareArtifact + +## Table of contents + +### Functions + +- [ShareArtifact](Frontend_Pages_ShareArtifact.md#shareartifact) + +## Functions + +### ShareArtifact + +▸ **ShareArtifact**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :------------------------------- | +| `__namedParameters` | `RouteComponentProps`<`Object`\> | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Pages_SharePlanet.md b/docs/modules/Frontend_Pages_SharePlanet.md new file mode 100644 index 00000000..11e11665 --- /dev/null +++ b/docs/modules/Frontend_Pages_SharePlanet.md @@ -0,0 +1,23 @@ +# Module: Frontend/Pages/SharePlanet + +## Table of contents + +### Functions + +- [SharePlanet](Frontend_Pages_SharePlanet.md#shareplanet) + +## Functions + +### SharePlanet + +▸ **SharePlanet**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :------------------------------- | +| `__namedParameters` | `RouteComponentProps`<`Object`\> | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_pages_testartifactimages.md b/docs/modules/Frontend_Pages_TestArtifactImages.md similarity index 51% rename from docs/modules/frontend_pages_testartifactimages.md rename to docs/modules/Frontend_Pages_TestArtifactImages.md index 217ac7d4..4ac34427 100644 --- a/docs/modules/frontend_pages_testartifactimages.md +++ b/docs/modules/Frontend_Pages_TestArtifactImages.md @@ -4,12 +4,14 @@ ### Functions -- [TestArtifactImages](frontend_pages_testartifactimages.md#testartifactimages) +- [TestArtifactImages](Frontend_Pages_TestArtifactImages.md#testartifactimages) ## Functions ### TestArtifactImages -▸ **TestArtifactImages**(): _Element_ +▸ **TestArtifactImages**(): `Element` -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Pages_TxConfirmPopup.md b/docs/modules/Frontend_Pages_TxConfirmPopup.md new file mode 100644 index 00000000..1d2eeaf9 --- /dev/null +++ b/docs/modules/Frontend_Pages_TxConfirmPopup.md @@ -0,0 +1,23 @@ +# Module: Frontend/Pages/TxConfirmPopup + +## Table of contents + +### Functions + +- [TxConfirmPopup](Frontend_Pages_TxConfirmPopup.md#txconfirmpopup) + +## Functions + +### TxConfirmPopup + +▸ **TxConfirmPopup**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :-------------------- | +| `__namedParameters` | `RouteComponentProps` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Pages_UnsubscribePage.md b/docs/modules/Frontend_Pages_UnsubscribePage.md new file mode 100644 index 00000000..bd4970a1 --- /dev/null +++ b/docs/modules/Frontend_Pages_UnsubscribePage.md @@ -0,0 +1,21 @@ +# Module: Frontend/Pages/UnsubscribePage + +## Table of contents + +### Enumerations + +- [LandingPageZIndex](../enums/Frontend_Pages_UnsubscribePage.LandingPageZIndex.md) + +### Functions + +- [default](Frontend_Pages_UnsubscribePage.md#default) + +## Functions + +### default + +▸ **default**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Pages_ValhallaPage.md b/docs/modules/Frontend_Pages_ValhallaPage.md new file mode 100644 index 00000000..2327537b --- /dev/null +++ b/docs/modules/Frontend_Pages_ValhallaPage.md @@ -0,0 +1,17 @@ +# Module: Frontend/Pages/ValhallaPage + +## Table of contents + +### Functions + +- [ValhallaPage](Frontend_Pages_ValhallaPage.md#valhallapage) + +## Functions + +### ValhallaPage + +▸ **ValhallaPage**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ArtifactConversation_ArtifactConversationPane.md b/docs/modules/Frontend_Panes_ArtifactConversation_ArtifactConversationPane.md new file mode 100644 index 00000000..1bc8df22 --- /dev/null +++ b/docs/modules/Frontend_Panes_ArtifactConversation_ArtifactConversationPane.md @@ -0,0 +1,25 @@ +# Module: Frontend/Panes/ArtifactConversation/ArtifactConversationPane + +## Table of contents + +### Functions + +- [ArtifactConversationPane](Frontend_Panes_ArtifactConversation_ArtifactConversationPane.md#artifactconversationpane) + +## Functions + +### ArtifactConversationPane + +▸ **ArtifactConversationPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` \| `undefined` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ArtifactConversation_ConversationSuggestions.md b/docs/modules/Frontend_Panes_ArtifactConversation_ConversationSuggestions.md new file mode 100644 index 00000000..308d4420 --- /dev/null +++ b/docs/modules/Frontend_Panes_ArtifactConversation_ConversationSuggestions.md @@ -0,0 +1,26 @@ +# Module: Frontend/Panes/ArtifactConversation/ConversationSuggestions + +## Table of contents + +### Functions + +- [ConversationSuggestions](Frontend_Panes_ArtifactConversation_ConversationSuggestions.md#conversationsuggestions) + +## Functions + +### ConversationSuggestions + +▸ **ConversationSuggestions**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------------ | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.disabled` | `boolean` | +| `__namedParameters.exampleQuestions?` | `string`[] | +| `__namedParameters.selectQuestion` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ArtifactDetailsPane.md b/docs/modules/Frontend_Panes_ArtifactDetailsPane.md new file mode 100644 index 00000000..091f3c9c --- /dev/null +++ b/docs/modules/Frontend_Panes_ArtifactDetailsPane.md @@ -0,0 +1,64 @@ +# Module: Frontend/Panes/ArtifactDetailsPane + +## Table of contents + +### Functions + +- [ArtifactDetailsBody](Frontend_Panes_ArtifactDetailsPane.md#artifactdetailsbody) +- [ArtifactDetailsPane](Frontend_Panes_ArtifactDetailsPane.md#artifactdetailspane) +- [UpgradeStatInfo](Frontend_Panes_ArtifactDetailsPane.md#upgradestatinfo) + +## Functions + +### ArtifactDetailsBody + +▸ **ArtifactDetailsBody**(`__namedParameters`): `null` \| `Element` + +#### Parameters + +| Name | Type | +| :---------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| `__namedParameters` | `Object` | +| `__namedParameters.artifactWrapper` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Artifact` \| `undefined`\> | +| `__namedParameters.contractConstants` | [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) | +| `__namedParameters.openConversationForArtifact` | | + +#### Returns + +`null` \| `Element` + +--- + +### ArtifactDetailsPane + +▸ **ArtifactDetailsPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :---------------------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.openConversationForArtifact` | | + +#### Returns + +`Element` + +--- + +### UpgradeStatInfo + +▸ **UpgradeStatInfo**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.stat` | [`StatIdx`](../enums/_types_global_GlobalTypes.StatIdx.md) | +| `__namedParameters.upgrades` | (`Upgrade` \| `undefined`)[] | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_panes_broadcastpane.md b/docs/modules/Frontend_Panes_BroadcastPane.md similarity index 50% rename from docs/modules/frontend_panes_broadcastpane.md rename to docs/modules/Frontend_Panes_BroadcastPane.md index 046e6acc..3c0afc05 100644 --- a/docs/modules/frontend_panes_broadcastpane.md +++ b/docs/modules/Frontend_Panes_BroadcastPane.md @@ -4,19 +4,21 @@ ### Functions -- [BroadcastPane](frontend_panes_broadcastpane.md#broadcastpane) +- [BroadcastPane](Frontend_Panes_BroadcastPane.md#broadcastpane) ## Functions ### BroadcastPane -▸ **BroadcastPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ +▸ **BroadcastPane**(`__namedParameters`): `Element` #### Parameters | Name | Type | | :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_CoordsPane.md b/docs/modules/Frontend_Panes_CoordsPane.md new file mode 100644 index 00000000..54d1094c --- /dev/null +++ b/docs/modules/Frontend_Panes_CoordsPane.md @@ -0,0 +1,17 @@ +# Module: Frontend/Panes/CoordsPane + +## Table of contents + +### Functions + +- [CoordsPane](Frontend_Panes_CoordsPane.md#coordspane) + +## Functions + +### CoordsPane + +▸ **CoordsPane**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_DiagnosticsPane.md b/docs/modules/Frontend_Panes_DiagnosticsPane.md new file mode 100644 index 00000000..5ca8c8a5 --- /dev/null +++ b/docs/modules/Frontend_Panes_DiagnosticsPane.md @@ -0,0 +1,28 @@ +# Module: Frontend/Panes/DiagnosticsPane + +## Table of contents + +### Interfaces + +- [Diagnostics](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) + +### Functions + +- [DiagnosticsPane](Frontend_Panes_DiagnosticsPane.md#diagnosticspane) + +## Functions + +### DiagnosticsPane + +▸ **DiagnosticsPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ExplorePane.md b/docs/modules/Frontend_Panes_ExplorePane.md new file mode 100644 index 00000000..07d40a73 --- /dev/null +++ b/docs/modules/Frontend_Panes_ExplorePane.md @@ -0,0 +1,17 @@ +# Module: Frontend/Panes/ExplorePane + +## Table of contents + +### Functions + +- [ExplorePane](Frontend_Panes_ExplorePane.md#explorepane) + +## Functions + +### ExplorePane + +▸ **ExplorePane**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/frontend_panes_hatpane.md b/docs/modules/Frontend_Panes_HatPane.md similarity index 51% rename from docs/modules/frontend_panes_hatpane.md rename to docs/modules/Frontend_Panes_HatPane.md index f44e40eb..79d1bbbf 100644 --- a/docs/modules/frontend_panes_hatpane.md +++ b/docs/modules/Frontend_Panes_HatPane.md @@ -4,19 +4,21 @@ ### Functions -- [HatPane](frontend_panes_hatpane.md#hatpane) +- [HatPane](Frontend_Panes_HatPane.md#hatpane) ## Functions ### HatPane -▸ **HatPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ +▸ **HatPane**(`__namedParameters`): `Element` #### Parameters | Name | Type | | :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/frontend_panes_helppane.md b/docs/modules/Frontend_Panes_HelpPane.md similarity index 50% rename from docs/modules/frontend_panes_helppane.md rename to docs/modules/Frontend_Panes_HelpPane.md index 9d32c34d..af6f6b11 100644 --- a/docs/modules/frontend_panes_helppane.md +++ b/docs/modules/Frontend_Panes_HelpPane.md @@ -4,19 +4,21 @@ ### Functions -- [HelpPane](frontend_panes_helppane.md#helppane) +- [HelpPane](Frontend_Panes_HelpPane.md#helppane) ## Functions ### HelpPane -▸ **HelpPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ +▸ **HelpPane**(`__namedParameters`): `Element` #### Parameters | Name | Type | | :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_HoverPlanetPane.md b/docs/modules/Frontend_Panes_HoverPlanetPane.md new file mode 100644 index 00000000..6c0391dc --- /dev/null +++ b/docs/modules/Frontend_Panes_HoverPlanetPane.md @@ -0,0 +1,17 @@ +# Module: Frontend/Panes/HoverPlanetPane + +## Table of contents + +### Functions + +- [HoverPlanetPane](Frontend_Panes_HoverPlanetPane.md#hoverplanetpane) + +## Functions + +### HoverPlanetPane + +▸ **HoverPlanetPane**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_LeaderboardPane.md b/docs/modules/Frontend_Panes_LeaderboardPane.md new file mode 100644 index 00000000..83cab916 --- /dev/null +++ b/docs/modules/Frontend_Panes_LeaderboardPane.md @@ -0,0 +1,42 @@ +# Module: Frontend/Panes/LeaderboardPane + +## Table of contents + +### Functions + +- [LeaderboardPane](Frontend_Panes_LeaderboardPane.md#leaderboardpane) +- [calculateRankAndScore](Frontend_Panes_LeaderboardPane.md#calculaterankandscore) + +## Functions + +### LeaderboardPane + +▸ **LeaderboardPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### calculateRankAndScore + +▸ **calculateRankAndScore**(`scoreboard`, `account`): [`number`, `number`] + +#### Parameters + +| Name | Type | +| :----------- | :------------------ | +| `scoreboard` | `ScoreboardEntry`[] | +| `account` | `EthAddress` | + +#### Returns + +[`number`, `number`] diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactActions.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactActions.md new file mode 100644 index 00000000..e36f5f67 --- /dev/null +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactActions.md @@ -0,0 +1,33 @@ +# Module: Frontend/Panes/ManagePlanetArtifacts/ArtifactActions + +## Table of contents + +### Functions + +- [ArtifactActions](Frontend_Panes_ManagePlanetArtifacts_ArtifactActions.md#artifactactions) + +## Functions + +### ArtifactActions + +▸ **ArtifactActions**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------------------- | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.anyArtifactActive` | `boolean` | +| `__namedParameters.artifact` | `Artifact` | +| `__namedParameters.planetIsTradingPost` | `boolean` | +| `__namedParameters.planetLevel` | `number` | +| `__namedParameters.planetOwnedByPlayer` | `boolean` | +| `__namedParameters.viewingDepositList` | `boolean` | +| `__namedParameters.activate` | | +| `__namedParameters.deactivate` | | +| `__namedParameters.deposit` | | +| `__namedParameters.withdraw` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactListItem.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactListItem.md new file mode 100644 index 00000000..41ca72e7 --- /dev/null +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactListItem.md @@ -0,0 +1,26 @@ +# Module: Frontend/Panes/ManagePlanetArtifacts/ArtifactListItem + +## Table of contents + +### Functions + +- [ArtifactListItem](Frontend_Panes_ManagePlanetArtifacts_ArtifactListItem.md#artifactlistitem) + +## Functions + +### ArtifactListItem + +▸ **ArtifactListItem**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------------------- | :------------------------ | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` \| `undefined` | +| `__namedParameters.actions` | | +| `__namedParameters.openArtifactDetails` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactsList.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactsList.md new file mode 100644 index 00000000..7a06541b --- /dev/null +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactsList.md @@ -0,0 +1,27 @@ +# Module: Frontend/Panes/ManagePlanetArtifacts/ArtifactsList + +## Table of contents + +### Functions + +- [ArtifactsList](Frontend_Panes_ManagePlanetArtifacts_ArtifactsList.md#artifactslist) + +## Functions + +### ArtifactsList + +▸ **ArtifactsList**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------------------- | :----------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifacts` | (`Artifact` \| `undefined`)[] | +| `__namedParameters.sortBy` | keyof `Upgrade` \| `undefined` | +| `__namedParameters.actions` | | +| `__namedParameters.openArtifactDetails` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_Find.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_Find.md new file mode 100644 index 00000000..40af4ed6 --- /dev/null +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_Find.md @@ -0,0 +1,28 @@ +# Module: Frontend/Panes/ManagePlanetArtifacts/Find + +## Table of contents + +### Functions + +- [Find](Frontend_Panes_ManagePlanetArtifacts_Find.md#find) + +## Functions + +### Find + +▸ **Find**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.currentBlockNumber` | `number` \| `undefined` | +| `__namedParameters.isFinding` | `boolean` | +| `__namedParameters.planet` | `Planet` | +| `__namedParameters.roundOver` | `boolean` | +| `__namedParameters.find` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManageArtifacts.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManageArtifacts.md new file mode 100644 index 00000000..4fc5b397 --- /dev/null +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManageArtifacts.md @@ -0,0 +1,36 @@ +# Module: Frontend/Panes/ManagePlanetArtifacts/ManageArtifacts + +## Table of contents + +### Functions + +- [ManageArtifactsPane](Frontend_Panes_ManagePlanetArtifacts_ManageArtifacts.md#manageartifactspane) + +## Functions + +### ManageArtifactsPane + +▸ **ManageArtifactsPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------------------- | :---------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifactsInInventory` | `Artifact`[] | +| `__namedParameters.artifactsOnPlanet` | (`Artifact` \| `undefined`)[] | +| `__namedParameters.currentBlockNumber` | `number` \| `undefined` | +| `__namedParameters.planet` | `LocatablePlanet` | +| `__namedParameters.playerAddress` | `string` | +| `__namedParameters.roundOver` | `boolean` | +| `__namedParameters.activate` | | +| `__namedParameters.deactivate` | | +| `__namedParameters.deposit` | | +| `__namedParameters.find` | | +| `__namedParameters.openArtifactDetails` | | +| `__namedParameters.prospect` | | +| `__namedParameters.withdraw` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md new file mode 100644 index 00000000..848cfa47 --- /dev/null +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md @@ -0,0 +1,29 @@ +# Module: Frontend/Panes/ManagePlanetArtifacts/ManagePlanetArtifactsPane + +## Table of contents + +### Functions + +- [ManagePlanetArtifactsPane](Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md#manageplanetartifactspane) + +## Functions + +### ManagePlanetArtifactsPane + +▸ **ManagePlanetArtifactsPane**(`__namedParameters`): `Element` + +This is the place where a user can manage all of their artifacts on a +particular planet. This includes prospecting, withdrawing, depositing, +activating, and deactivating artifacts. + +#### Parameters + +| Name | Type | +| :----------------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.setArtifactDetailsOpen` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_Prospect.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_Prospect.md new file mode 100644 index 00000000..1b3f8300 --- /dev/null +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_Prospect.md @@ -0,0 +1,27 @@ +# Module: Frontend/Panes/ManagePlanetArtifacts/Prospect + +## Table of contents + +### Functions + +- [Prospect](Frontend_Panes_ManagePlanetArtifacts_Prospect.md#prospect) + +## Functions + +### Prospect + +▸ **Prospect**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------------- | :-------- | +| `__namedParameters` | `Object` | +| `__namedParameters.isProspecting` | `boolean` | +| `__namedParameters.planet` | `Planet` | +| `__namedParameters.roundOver` | `boolean` | +| `__namedParameters.prospect` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_SortBy.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_SortBy.md new file mode 100644 index 00000000..1a2210ee --- /dev/null +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_SortBy.md @@ -0,0 +1,25 @@ +# Module: Frontend/Panes/ManagePlanetArtifacts/SortBy + +## Table of contents + +### Functions + +- [SortBy](Frontend_Panes_ManagePlanetArtifacts_SortBy.md#sortby) + +## Functions + +### SortBy + +▸ **SortBy**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :---------------------------- | :----------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.sortBy` | keyof `Upgrade` \| `undefined` | +| `__namedParameters.setSortBy` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_UpgradeStatsView.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_UpgradeStatsView.md new file mode 100644 index 00000000..5f2ff44b --- /dev/null +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_UpgradeStatsView.md @@ -0,0 +1,26 @@ +# Module: Frontend/Panes/ManagePlanetArtifacts/UpgradeStatsView + +## Table of contents + +### Functions + +- [UpgradeStatsView](Frontend_Panes_ManagePlanetArtifacts_UpgradeStatsView.md#upgradestatsview) + +## Functions + +### UpgradeStatsView + +▸ **UpgradeStatsView**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------- | :------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifactType` | `ArtifactType` | +| `__namedParameters.isActive` | `boolean` | +| `__namedParameters.upgrade` | `Upgrade` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_OnboardingPane.md b/docs/modules/Frontend_Panes_OnboardingPane.md new file mode 100644 index 00000000..349bc06a --- /dev/null +++ b/docs/modules/Frontend_Panes_OnboardingPane.md @@ -0,0 +1,24 @@ +# Module: Frontend/Panes/OnboardingPane + +## Table of contents + +### Functions + +- [default](Frontend_Panes_OnboardingPane.md#default) + +## Functions + +### default + +▸ **default**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------------- | :------------------------------------------------------ | +| `__namedParameters` | `Object` | +| `__namedParameters.newPlayerHook` | [`Hook`](_types_global_GlobalTypes.md#hook)<`boolean`\> | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_PaidArtifactConversation_ConversationInfo.md b/docs/modules/Frontend_Panes_PaidArtifactConversation_ConversationInfo.md new file mode 100644 index 00000000..499d8791 --- /dev/null +++ b/docs/modules/Frontend_Panes_PaidArtifactConversation_ConversationInfo.md @@ -0,0 +1,24 @@ +# Module: Frontend/Panes/PaidArtifactConversation/ConversationInfo + +## Table of contents + +### Functions + +- [ConversationInfo](Frontend_Panes_PaidArtifactConversation_ConversationInfo.md#conversationinfo) + +## Functions + +### ConversationInfo + +▸ **ConversationInfo**(`_`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------- | :------- | +| `_` | `Object` | +| `_.questionsRemaining` | `number` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_PaidArtifactConversation_CurrencyView.md b/docs/modules/Frontend_Panes_PaidArtifactConversation_CurrencyView.md new file mode 100644 index 00000000..232c548c --- /dev/null +++ b/docs/modules/Frontend_Panes_PaidArtifactConversation_CurrencyView.md @@ -0,0 +1,17 @@ +# Module: Frontend/Panes/PaidArtifactConversation/CurrencyView + +## Table of contents + +### Functions + +- [CurrencyView](Frontend_Panes_PaidArtifactConversation_CurrencyView.md#currencyview) + +## Functions + +### CurrencyView + +▸ **CurrencyView**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_PaidArtifactConversation_PaidArtifactConversationPane.md b/docs/modules/Frontend_Panes_PaidArtifactConversation_PaidArtifactConversationPane.md new file mode 100644 index 00000000..6f98be63 --- /dev/null +++ b/docs/modules/Frontend_Panes_PaidArtifactConversation_PaidArtifactConversationPane.md @@ -0,0 +1,25 @@ +# Module: Frontend/Panes/PaidArtifactConversation/PaidArtifactConversationPane + +## Table of contents + +### Functions + +- [PaidArtifactConversationPane](Frontend_Panes_PaidArtifactConversation_PaidArtifactConversationPane.md#paidartifactconversationpane) + +## Functions + +### PaidArtifactConversationPane + +▸ **PaidArtifactConversationPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` \| `undefined` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_panes_planetcontextpane.md b/docs/modules/Frontend_Panes_PlanetContextPane.md similarity index 51% rename from docs/modules/frontend_panes_planetcontextpane.md rename to docs/modules/Frontend_Panes_PlanetContextPane.md index 58af7f35..f471ddde 100644 --- a/docs/modules/frontend_panes_planetcontextpane.md +++ b/docs/modules/Frontend_Panes_PlanetContextPane.md @@ -4,18 +4,20 @@ ### Functions -- [PlanetContextPane](frontend_panes_planetcontextpane.md#planetcontextpane) +- [PlanetContextPane](Frontend_Panes_PlanetContextPane.md#planetcontextpane) ## Functions ### PlanetContextPane -▸ **PlanetContextPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) } & [_PlanetNotifHooks_](frontend_views_planetnotifications.md#planetnotifhooks)): _Element_ +▸ **PlanetContextPane**(`__namedParameters`): `Element` #### Parameters | Name | Type | | :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------- | -| `__namedParameters` | { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) } & [_PlanetNotifHooks_](frontend_views_planetnotifications.md#planetnotifhooks) | +| `__namedParameters` | { `hook`: [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) } & [`PlanetNotifHooks`](Frontend_Views_PlanetNotifications.md#planetnotifhooks) | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_PlanetDetailsPane.md b/docs/modules/Frontend_Panes_PlanetDetailsPane.md new file mode 100644 index 00000000..7bda6a0f --- /dev/null +++ b/docs/modules/Frontend_Panes_PlanetDetailsPane.md @@ -0,0 +1,25 @@ +# Module: Frontend/Panes/PlanetDetailsPane + +## Table of contents + +### Functions + +- [PlanetDetailsPane](Frontend_Panes_PlanetDetailsPane.md#planetdetailspane) + +## Functions + +### PlanetDetailsPane + +▸ **PlanetDetailsPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hatHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_PlanetDexPane.md b/docs/modules/Frontend_Panes_PlanetDexPane.md new file mode 100644 index 00000000..1a6520b3 --- /dev/null +++ b/docs/modules/Frontend_Panes_PlanetDexPane.md @@ -0,0 +1,42 @@ +# Module: Frontend/Panes/PlanetDexPane + +## Table of contents + +### Functions + +- [PlanetDexPane](Frontend_Panes_PlanetDexPane.md#planetdexpane) +- [PlanetThumb](Frontend_Panes_PlanetDexPane.md#planetthumb) + +## Functions + +### PlanetDexPane + +▸ **PlanetDexPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### PlanetThumb + +▸ **PlanetThumb**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `Planet` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_PlayerArtifactsPane.md b/docs/modules/Frontend_Panes_PlayerArtifactsPane.md new file mode 100644 index 00000000..4d5ed30e --- /dev/null +++ b/docs/modules/Frontend_Panes_PlayerArtifactsPane.md @@ -0,0 +1,25 @@ +# Module: Frontend/Panes/PlayerArtifactsPane + +## Table of contents + +### Functions + +- [PlayerArtifactsPane](Frontend_Panes_PlayerArtifactsPane.md#playerartifactspane) + +## Functions + +### PlayerArtifactsPane + +▸ **PlayerArtifactsPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifactDetailsHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_panes_playerinfopane.md b/docs/modules/Frontend_Panes_PlayerInfoPane.md similarity index 50% rename from docs/modules/frontend_panes_playerinfopane.md rename to docs/modules/Frontend_Panes_PlayerInfoPane.md index 8a8afb74..48b9391c 100644 --- a/docs/modules/frontend_panes_playerinfopane.md +++ b/docs/modules/Frontend_Panes_PlayerInfoPane.md @@ -4,19 +4,21 @@ ### Functions -- [PlayerInfoPane](frontend_panes_playerinfopane.md#playerinfopane) +- [PlayerInfoPane](Frontend_Panes_PlayerInfoPane.md#playerinfopane) ## Functions ### PlayerInfoPane -▸ **PlayerInfoPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ +▸ **PlayerInfoPane**(`__namedParameters`): `Element` #### Parameters | Name | Type | | :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_PluginEditorPane.md b/docs/modules/Frontend_Panes_PluginEditorPane.md new file mode 100644 index 00000000..4c8e3e2d --- /dev/null +++ b/docs/modules/Frontend_Panes_PluginEditorPane.md @@ -0,0 +1,32 @@ +# Module: Frontend/Panes/PluginEditorPane + +## Table of contents + +### Functions + +- [PluginEditorPane](Frontend_Panes_PluginEditorPane.md#plugineditorpane) + +## Functions + +### PluginEditorPane + +▸ **PluginEditorPane**(`__namedParameters`): `Element` + +Component for editing plugins. Saving causes its containing modal +to be closed, and the `overwrite` to be called, indicating that the +given plugin's source should be overwritten and reloaded. If no +plugin id is provided, assumes we're editing a new plugin. + +#### Parameters + +| Name | Type | +| :------------------------------ | :--------------------------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.pluginHost?` | [`PluginManager`](../classes/Backend_GameLogic_PluginManager.PluginManager.md) \| `null` | +| `__namedParameters.pluginId?` | [`PluginId`](Backend_Plugins_SerializedPlugin.md#pluginid) | +| `__namedParameters.overwrite` | | +| `__namedParameters.setIsOpen` | | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_panes_pluginlibrarypane.md b/docs/modules/Frontend_Panes_PluginLibraryPane.md similarity index 52% rename from docs/modules/frontend_panes_pluginlibrarypane.md rename to docs/modules/Frontend_Panes_PluginLibraryPane.md index 349976cd..91a47538 100644 --- a/docs/modules/frontend_panes_pluginlibrarypane.md +++ b/docs/modules/Frontend_Panes_PluginLibraryPane.md @@ -4,13 +4,13 @@ ### Functions -- [PluginLibraryPane](frontend_panes_pluginlibrarypane.md#pluginlibrarypane) +- [PluginLibraryPane](Frontend_Panes_PluginLibraryPane.md#pluginlibrarypane) ## Functions ### PluginLibraryPane -▸ **PluginLibraryPane**(`__namedParameters`: { `gameUIManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md) ; `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) ; `modalsContainer`: Element }): `null` \| _Element_ +▸ **PluginLibraryPane**(`__namedParameters`): `null` \| `Element` This modal presents an overview of all of the player's plugins. Has a button to add a new plugin, and lists out all the existing plugins, allowing the @@ -23,9 +23,11 @@ Dark forest. | Name | Type | | :---------------------------------- | :----------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.gameUIManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | -| `__namedParameters.modalsContainer` | Element | +| `__namedParameters` | `Object` | +| `__namedParameters.gameUIManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.modalsContainer` | `Element` | -**Returns:** `null` \| _Element_ +#### Returns + +`null` \| `Element` diff --git a/docs/modules/frontend_panes_privatepane.md b/docs/modules/Frontend_Panes_PrivatePane.md similarity index 50% rename from docs/modules/frontend_panes_privatepane.md rename to docs/modules/Frontend_Panes_PrivatePane.md index 66e0cc13..e2a99fe5 100644 --- a/docs/modules/frontend_panes_privatepane.md +++ b/docs/modules/Frontend_Panes_PrivatePane.md @@ -4,19 +4,21 @@ ### Functions -- [PrivatePane](frontend_panes_privatepane.md#privatepane) +- [PrivatePane](Frontend_Panes_PrivatePane.md#privatepane) ## Functions ### PrivatePane -▸ **PrivatePane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ +▸ **PrivatePane**(`__namedParameters`): `Element` #### Parameters | Name | Type | | :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_SettingsPane.md b/docs/modules/Frontend_Panes_SettingsPane.md new file mode 100644 index 00000000..1cb8ffb6 --- /dev/null +++ b/docs/modules/Frontend_Panes_SettingsPane.md @@ -0,0 +1,26 @@ +# Module: Frontend/Panes/SettingsPane + +## Table of contents + +### Functions + +- [SettingsPane](Frontend_Panes_SettingsPane.md#settingspane) + +## Functions + +### SettingsPane + +▸ **SettingsPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------------- | :--------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.ethConnection` | [`default`](../classes/Backend_Network_EthConnection.default.md) | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.privateHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_Tooltip.md b/docs/modules/Frontend_Panes_Tooltip.md new file mode 100644 index 00000000..d51cb7c8 --- /dev/null +++ b/docs/modules/Frontend_Panes_Tooltip.md @@ -0,0 +1,34 @@ +# Module: Frontend/Panes/Tooltip + +## Table of contents + +### Functions + +- [Tooltip](Frontend_Panes_Tooltip.md#tooltip) +- [TooltipTrigger](Frontend_Panes_Tooltip.md#tooltiptrigger) + +## Functions + +### Tooltip + +▸ **Tooltip**(): `Element` + +#### Returns + +`Element` + +--- + +### TooltipTrigger + +▸ **TooltipTrigger**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :------------- | +| `__namedParameters` | `TooltipProps` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_TooltipPanes.md b/docs/modules/Frontend_Panes_TooltipPanes.md new file mode 100644 index 00000000..721e99d6 --- /dev/null +++ b/docs/modules/Frontend_Panes_TooltipPanes.md @@ -0,0 +1,420 @@ +# Module: Frontend/Panes/TooltipPanes + +## Table of contents + +### Functions + +- [BonusDefenseTooltipPane](Frontend_Panes_TooltipPanes.md#bonusdefensetooltippane) +- [BonusEnergyCapTooltipPane](Frontend_Panes_TooltipPanes.md#bonusenergycaptooltippane) +- [BonusEnergyGroTooltipPane](Frontend_Panes_TooltipPanes.md#bonusenergygrotooltippane) +- [BonusRangeTooltipPane](Frontend_Panes_TooltipPanes.md#bonusrangetooltippane) +- [BonusSpeedTooltipPane](Frontend_Panes_TooltipPanes.md#bonusspeedtooltippane) +- [BonusTooltipPane](Frontend_Panes_TooltipPanes.md#bonustooltippane) +- [ClowntownTooltipPane](Frontend_Panes_TooltipPanes.md#clowntowntooltippane) +- [CurrentMiningTooltipPane](Frontend_Panes_TooltipPanes.md#currentminingtooltippane) +- [EnergyGrowthTooltipPane](Frontend_Panes_TooltipPanes.md#energygrowthtooltippane) +- [EnergyTooltipPane](Frontend_Panes_TooltipPanes.md#energytooltippane) +- [MaxLevelTooltipPane](Frontend_Panes_TooltipPanes.md#maxleveltooltippane) +- [MinEnergyTooltipPane](Frontend_Panes_TooltipPanes.md#minenergytooltippane) +- [MiningPauseTooltipPane](Frontend_Panes_TooltipPanes.md#miningpausetooltippane) +- [MiningTargetTooltipPane](Frontend_Panes_TooltipPanes.md#miningtargettooltippane) +- [ModalBroadcastTooltipPane](Frontend_Panes_TooltipPanes.md#modalbroadcasttooltippane) +- [ModalHelpTooltipPane](Frontend_Panes_TooltipPanes.md#modalhelptooltippane) +- [ModalLeaderboardTooltipPane](Frontend_Panes_TooltipPanes.md#modalleaderboardtooltippane) +- [ModalPlanetDetailsTooltipPane](Frontend_Panes_TooltipPanes.md#modalplanetdetailstooltippane) +- [ModalPlanetDexTooltipPane](Frontend_Panes_TooltipPanes.md#modalplanetdextooltippane) +- [ModalTwitterVerificationTooltipPane](Frontend_Panes_TooltipPanes.md#modaltwitterverificationtooltippane) +- [ModalUpgradeDetailsTooltipPane](Frontend_Panes_TooltipPanes.md#modalupgradedetailstooltippane) +- [PiratesTooltipPane](Frontend_Panes_TooltipPanes.md#piratestooltippane) +- [PlanetRankTooltipPane](Frontend_Panes_TooltipPanes.md#planetranktooltippane) +- [RangeTooltipPane](Frontend_Panes_TooltipPanes.md#rangetooltippane) +- [RankTooltipPane](Frontend_Panes_TooltipPanes.md#ranktooltippane) +- [ScoreTooltipPane](Frontend_Panes_TooltipPanes.md#scoretooltippane) +- [SelectedEnergyTooltipPane](Frontend_Panes_TooltipPanes.md#selectedenergytooltippane) +- [SelectedSilverTooltipPane](Frontend_Panes_TooltipPanes.md#selectedsilvertooltippane) +- [SilverCapTooltipPane](Frontend_Panes_TooltipPanes.md#silvercaptooltippane) +- [SilverGrowthTooltipPane](Frontend_Panes_TooltipPanes.md#silvergrowthtooltippane) +- [SilverProdTooltipPane](Frontend_Panes_TooltipPanes.md#silverprodtooltippane) +- [SilverTooltipPane](Frontend_Panes_TooltipPanes.md#silvertooltippane) +- [Time50TooltipPane](Frontend_Panes_TooltipPanes.md#time50tooltippane) +- [Time90TooltipPane](Frontend_Panes_TooltipPanes.md#time90tooltippane) +- [TooltipContent](Frontend_Panes_TooltipPanes.md#tooltipcontent) +- [TwitterHandleTooltipPane](Frontend_Panes_TooltipPanes.md#twitterhandletooltippane) +- [UpgradesTooltipPane](Frontend_Panes_TooltipPanes.md#upgradestooltippane) + +## Functions + +### BonusDefenseTooltipPane + +▸ **BonusDefenseTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### BonusEnergyCapTooltipPane + +▸ **BonusEnergyCapTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### BonusEnergyGroTooltipPane + +▸ **BonusEnergyGroTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### BonusRangeTooltipPane + +▸ **BonusRangeTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### BonusSpeedTooltipPane + +▸ **BonusSpeedTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### BonusTooltipPane + +▸ **BonusTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### ClowntownTooltipPane + +▸ **ClowntownTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### CurrentMiningTooltipPane + +▸ **CurrentMiningTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### EnergyGrowthTooltipPane + +▸ **EnergyGrowthTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### EnergyTooltipPane + +▸ **EnergyTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### MaxLevelTooltipPane + +▸ **MaxLevelTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### MinEnergyTooltipPane + +▸ **MinEnergyTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### MiningPauseTooltipPane + +▸ **MiningPauseTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### MiningTargetTooltipPane + +▸ **MiningTargetTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### ModalBroadcastTooltipPane + +▸ **ModalBroadcastTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### ModalHelpTooltipPane + +▸ **ModalHelpTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### ModalLeaderboardTooltipPane + +▸ **ModalLeaderboardTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### ModalPlanetDetailsTooltipPane + +▸ **ModalPlanetDetailsTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### ModalPlanetDexTooltipPane + +▸ **ModalPlanetDexTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### ModalTwitterVerificationTooltipPane + +▸ **ModalTwitterVerificationTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### ModalUpgradeDetailsTooltipPane + +▸ **ModalUpgradeDetailsTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### PiratesTooltipPane + +▸ **PiratesTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### PlanetRankTooltipPane + +▸ **PlanetRankTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### RangeTooltipPane + +▸ **RangeTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### RankTooltipPane + +▸ **RankTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### ScoreTooltipPane + +▸ **ScoreTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### SelectedEnergyTooltipPane + +▸ **SelectedEnergyTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### SelectedSilverTooltipPane + +▸ **SelectedSilverTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### SilverCapTooltipPane + +▸ **SilverCapTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### SilverGrowthTooltipPane + +▸ **SilverGrowthTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### SilverProdTooltipPane + +▸ **SilverProdTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### SilverTooltipPane + +▸ **SilverTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### Time50TooltipPane + +▸ **Time50TooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### Time90TooltipPane + +▸ **Time90TooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### TooltipContent + +▸ **TooltipContent**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.name` | [`TooltipName`](../enums/Frontend_Game_WindowManager.TooltipName.md) | + +#### Returns + +`Element` + +--- + +### TwitterHandleTooltipPane + +▸ **TwitterHandleTooltipPane**(): `Element` + +#### Returns + +`Element` + +--- + +### UpgradesTooltipPane + +▸ **UpgradesTooltipPane**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_TutorialPane.md b/docs/modules/Frontend_Panes_TutorialPane.md new file mode 100644 index 00000000..9f9e98f7 --- /dev/null +++ b/docs/modules/Frontend_Panes_TutorialPane.md @@ -0,0 +1,24 @@ +# Module: Frontend/Panes/TutorialPane + +## Table of contents + +### Functions + +- [TutorialPane](Frontend_Panes_TutorialPane.md#tutorialpane) + +## Functions + +### TutorialPane + +▸ **TutorialPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------- | :------------------------------------------------------ | +| `__namedParameters` | `Object` | +| `__namedParameters.tutorialHook` | [`Hook`](_types_global_GlobalTypes.md#hook)<`boolean`\> | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_panes_twitterverifypane.md b/docs/modules/Frontend_Panes_TwitterVerifyPane.md similarity index 51% rename from docs/modules/frontend_panes_twitterverifypane.md rename to docs/modules/Frontend_Panes_TwitterVerifyPane.md index f9a33243..83c3487c 100644 --- a/docs/modules/frontend_panes_twitterverifypane.md +++ b/docs/modules/Frontend_Panes_TwitterVerifyPane.md @@ -4,19 +4,21 @@ ### Functions -- [TwitterVerifyPane](frontend_panes_twitterverifypane.md#twitterverifypane) +- [TwitterVerifyPane](Frontend_Panes_TwitterVerifyPane.md#twitterverifypane) ## Functions ### TwitterVerifyPane -▸ **TwitterVerifyPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ +▸ **TwitterVerifyPane**(`__namedParameters`): `Element` #### Parameters | Name | Type | | :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/frontend_panes_upgradedetailspane.md b/docs/modules/Frontend_Panes_UpgradeDetailsPane.md similarity index 51% rename from docs/modules/frontend_panes_upgradedetailspane.md rename to docs/modules/Frontend_Panes_UpgradeDetailsPane.md index a55389b5..10fc1acb 100644 --- a/docs/modules/frontend_panes_upgradedetailspane.md +++ b/docs/modules/Frontend_Panes_UpgradeDetailsPane.md @@ -4,19 +4,21 @@ ### Functions -- [UpgradeDetailsPane](frontend_panes_upgradedetailspane.md#upgradedetailspane) +- [UpgradeDetailsPane](Frontend_Panes_UpgradeDetailsPane.md#upgradedetailspane) ## Functions ### UpgradeDetailsPane -▸ **UpgradeDetailsPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ +▸ **UpgradeDetailsPane**(`__namedParameters`): `Element` #### Parameters | Name | Type | | :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_WikiPane.md b/docs/modules/Frontend_Panes_WikiPane.md new file mode 100644 index 00000000..ec34eb81 --- /dev/null +++ b/docs/modules/Frontend_Panes_WikiPane.md @@ -0,0 +1,24 @@ +# Module: Frontend/Panes/WikiPane + +## Table of contents + +### Functions + +- [WikiPane](Frontend_Panes_WikiPane.md#wikipane) + +## Functions + +### WikiPane + +▸ **WikiPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :---------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_panes_withdrawsilverpane.md b/docs/modules/Frontend_Panes_WithdrawSilverPane.md similarity index 51% rename from docs/modules/frontend_panes_withdrawsilverpane.md rename to docs/modules/Frontend_Panes_WithdrawSilverPane.md index 4f528078..01446795 100644 --- a/docs/modules/frontend_panes_withdrawsilverpane.md +++ b/docs/modules/Frontend_Panes_WithdrawSilverPane.md @@ -4,19 +4,21 @@ ### Functions -- [WithdrawSilverPane](frontend_panes_withdrawsilverpane.md#withdrawsilverpane) +- [WithdrawSilverPane](Frontend_Panes_WithdrawSilverPane.md#withdrawsilverpane) ## Functions ### WithdrawSilverPane -▸ **WithdrawSilverPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ +▸ **WithdrawSilverPane**(`__namedParameters`): `Element` #### Parameters | Name | Type | | :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Panes_ZoomPane.md b/docs/modules/Frontend_Panes_ZoomPane.md new file mode 100644 index 00000000..c1b3169d --- /dev/null +++ b/docs/modules/Frontend_Panes_ZoomPane.md @@ -0,0 +1,17 @@ +# Module: Frontend/Panes/ZoomPane + +## Table of contents + +### Functions + +- [ZoomPane](Frontend_Panes_ZoomPane.md#zoompane) + +## Functions + +### ZoomPane + +▸ **ZoomPane**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Renderers_Artifacts_ArtifactRenderer.md b/docs/modules/Frontend_Renderers_Artifacts_ArtifactRenderer.md new file mode 100644 index 00000000..2661ebe8 --- /dev/null +++ b/docs/modules/Frontend_Renderers_Artifacts_ArtifactRenderer.md @@ -0,0 +1,52 @@ +# Module: Frontend/Renderers/Artifacts/ArtifactRenderer + +## Table of contents + +### Classes + +- [ArtifactRenderer](../classes/Frontend_Renderers_Artifacts_ArtifactRenderer.ArtifactRenderer.md) + +### Variables + +- [aDexCanvasH](Frontend_Renderers_Artifacts_ArtifactRenderer.md#adexcanvash) +- [aDexCanvasW](Frontend_Renderers_Artifacts_ArtifactRenderer.md#adexcanvasw) +- [aListCanvasH](Frontend_Renderers_Artifacts_ArtifactRenderer.md#alistcanvash) +- [aListCanvasW](Frontend_Renderers_Artifacts_ArtifactRenderer.md#alistcanvasw) +- [artifactColM](Frontend_Renderers_Artifacts_ArtifactRenderer.md#artifactcolm) +- [artifactColW](Frontend_Renderers_Artifacts_ArtifactRenderer.md#artifactcolw) + +## Variables + +### aDexCanvasH + +• `Const` **aDexCanvasH**: `number` + +--- + +### aDexCanvasW + +• `Const` **aDexCanvasW**: `number` + +--- + +### aListCanvasH + +• `Const` **aListCanvasH**: `400` + +--- + +### aListCanvasW + +• `Const` **aListCanvasW**: `48` + +--- + +### artifactColM + +• `Const` **artifactColM**: `32` + +--- + +### artifactColW + +• `Const` **artifactColW**: `number` diff --git a/docs/modules/Frontend_Renderers_GameRenderer_EngineConsts.md b/docs/modules/Frontend_Renderers_GameRenderer_EngineConsts.md new file mode 100644 index 00000000..5f24ade2 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_EngineConsts.md @@ -0,0 +1,60 @@ +# Module: Frontend/Renderers/GameRenderer/EngineConsts + +## Table of contents + +### Variables + +- [engineConsts](Frontend_Renderers_GameRenderer_EngineConsts.md#engineconsts) + +## Variables + +### engineConsts + +• `Const` **engineConsts**: `Object` + +#### Type declaration + +| Name | Type | +| :----------------------- | :------------------------------------------------------------------ | +| `colors` | `Object` | +| `colors.artifacts` | `Object` | +| `colors.artifacts.shine` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.artifacts.trim` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.barbs` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.barbsA` | [`RGBAVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | +| `colors.belt` | `Object` | +| `colors.belt.defense` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.belt.range` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.belt.silver` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.belt.speed` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.bonus` | `Object` | +| `colors.bonus.defense` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.bonus.energyCap` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.bonus.energyGro` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.bonus.range` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.bonus.speed` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.gold` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.purple` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.purpleA` | [`RGBAVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | +| `colors.range` | `Object` | +| `colors.range.dash` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.range.energy` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.red` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.redA` | [`RGBAVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | +| `colors.voyage` | `Object` | +| `colors.voyage.enemy` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.voyage.enemyA` | [`RGBAVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | +| `colors.voyage.mine` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.voyage.mineA` | [`RGBAVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | +| `colors.white` | [`RGBVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) | +| `colors.whiteA` | [`RGBAVec`](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) | +| `dashLength` | `number` | +| `fontStyle` | `string` | +| `glyphs` | `Object` | +| `glyphs.canvasDim` | `number` | +| `glyphs.glyphH` | `number` | +| `glyphs.glyphW` | `number` | +| `glyphs.rowL` | `number` | +| `glyphs.scale` | `number` | +| `planet` | `Object` | +| `planet.maxRadius` | `number` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_EngineTypes.md b/docs/modules/Frontend_Renderers_GameRenderer_EngineTypes.md new file mode 100644 index 00000000..3e0c1b14 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_EngineTypes.md @@ -0,0 +1,108 @@ +# Module: Frontend/Renderers/GameRenderer/EngineTypes + +## Table of contents + +### Enumerations + +- [AttribType](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) +- [DrawMode](../enums/Frontend_Renderers_GameRenderer_EngineTypes.DrawMode.md) +- [RenderZIndex](../enums/Frontend_Renderers_GameRenderer_EngineTypes.RenderZIndex.md) +- [TextAlign](../enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAlign.md) +- [TextAnchor](../enums/Frontend_Renderers_GameRenderer_EngineTypes.TextAnchor.md) +- [UniformType](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) + +### Type aliases + +- [AttribProps](Frontend_Renderers_GameRenderer_EngineTypes.md#attribprops) +- [HSLVec](Frontend_Renderers_GameRenderer_EngineTypes.md#hslvec) +- [RGBAVec](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbavec) +- [RGBVec](Frontend_Renderers_GameRenderer_EngineTypes.md#rgbvec) +- [Scaling](Frontend_Renderers_GameRenderer_EngineTypes.md#scaling) +- [Translation](Frontend_Renderers_GameRenderer_EngineTypes.md#translation) +- [UniformJSType](Frontend_Renderers_GameRenderer_EngineTypes.md#uniformjstype) +- [UniformProps](Frontend_Renderers_GameRenderer_EngineTypes.md#uniformprops) +- [Vec3](Frontend_Renderers_GameRenderer_EngineTypes.md#vec3) + +## Type aliases + +### AttribProps + +Ƭ **AttribProps**: `Object` + +#### Type declaration + +| Name | Type | +| :---------- | :--------------------------------------------------------------------------------- | +| `dim` | `number` | +| `name` | `string` | +| `normalize` | `boolean` | +| `type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | + +--- + +### HSLVec + +Ƭ **HSLVec**: readonly [`number`, `number`, `number`] + +--- + +### RGBAVec + +Ƭ **RGBAVec**: [`number`, `number`, `number`, `number`] + +--- + +### RGBVec + +Ƭ **RGBVec**: [`number`, `number`, `number`] + +--- + +### Scaling + +Ƭ **Scaling**: `Object` + +#### Type declaration + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | + +--- + +### Translation + +Ƭ **Translation**: `Object` + +#### Type declaration + +| Name | Type | +| :--- | :------- | +| `x` | `number` | +| `y` | `number` | + +--- + +### UniformJSType + +Ƭ **UniformJSType**: `mat4` \| `mat3` \| `number` \| [`Vec3`](Frontend_Renderers_GameRenderer_EngineTypes.md#vec3) + +--- + +### UniformProps + +Ƭ **UniformProps**: `Object` + +#### Type declaration + +| Name | Type | +| :----- | :----------------------------------------------------------------------------------- | +| `name` | `string` | +| `type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | + +--- + +### Vec3 + +Ƭ **Vec3**: [`number`, `number`, `number`] diff --git a/docs/modules/Frontend_Renderers_GameRenderer_EngineUtils.md b/docs/modules/Frontend_Renderers_GameRenderer_EngineUtils.md new file mode 100644 index 00000000..46e78508 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_EngineUtils.md @@ -0,0 +1,28 @@ +# Module: Frontend/Renderers/GameRenderer/EngineUtils + +## Table of contents + +### Classes + +- [default](../classes/Frontend_Renderers_GameRenderer_EngineUtils.default.md) + +### Functions + +- [glsl](Frontend_Renderers_GameRenderer_EngineUtils.md#glsl) + +## Functions + +### glsl + +▸ `Const` **glsl**(`arr`, ...`args`): `string` + +#### Parameters + +| Name | Type | +| :-------- | :--------------------- | +| `arr` | `TemplateStringsArray` | +| `...args` | `any`[] | + +#### Returns + +`string` diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_asteroidrenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_asteroidrenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.md index 89ea0a46..f7b12716 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_asteroidrenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_asteroidrenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_AsteroidRenderer.default.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_backgroundrenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_backgroundrenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.md index 5e77e750..36e0d2fc 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_backgroundrenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_backgroundrenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_BackgroundRenderer.default.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_beltrenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_BeltRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_beltrenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_BeltRenderer.md index 345054e2..f5a93c1e 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_beltrenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_BeltRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_beltrenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_BeltRenderer.default.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_blackdomainrenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_blackdomainrenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.md index 7fbb2c47..6ebdf1d4 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_blackdomainrenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_blackdomainrenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_BlackDomainRenderer.default.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_circlerenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_CircleRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_circlerenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_CircleRenderer.md index f4a25478..6d52f66f 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_circlerenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_CircleRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_circlerenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_CircleRenderer.default.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_linerenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_LineRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_linerenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_LineRenderer.md index 445bb081..2c092c9a 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_linerenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_LineRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_linerenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_LineRenderer.default.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_maskrenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_MaskRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_maskrenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_MaskRenderer.md index 31f74db0..dcb16186 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_maskrenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_MaskRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_maskrenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_MaskRenderer.default.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.md new file mode 100644 index 00000000..b738e96a --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/Entities/MineBodyRenderer + +## Table of contents + +### Classes + +- [MineBodyRenderer](../classes/Frontend_Renderers_GameRenderer_Entities_MineBodyRenderer.MineBodyRenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_minerenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_MineRenderer.md similarity index 50% rename from docs/modules/frontend_renderers_gamerenderer_entities_minerenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_MineRenderer.md index 1b30187e..19698944 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_minerenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_MineRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [MineRenderer](../classes/frontend_renderers_gamerenderer_entities_minerenderer.minerenderer.md) +- [MineRenderer](../classes/Frontend_Renderers_GameRenderer_Entities_MineRenderer.MineRenderer.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.md new file mode 100644 index 00000000..50a6af09 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/Entities/PerlinRenderer + +## Table of contents + +### Classes + +- [PerlinRenderer](../classes/Frontend_Renderers_GameRenderer_Entities_PerlinRenderer.PerlinRenderer.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md new file mode 100644 index 00000000..151fb9a8 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md @@ -0,0 +1,153 @@ +# Module: Frontend/Renderers/GameRenderer/Entities/PerlinUtils + +## Table of contents + +### Enumerations + +- [PerlinOctave](../enums/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.PerlinOctave.md) + +### Type aliases + +- [GridPoint](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#gridpoint) +- [PerlinRand](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#perlinrand) + +### Functions + +- [getCachedGradient](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#getcachedgradient) +- [getGridPoint](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#getgridpoint) +- [getPerlinChunks](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#getperlinchunks) +- [isGridPoint](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#isgridpoint) +- [right](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#right) +- [up](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#up) +- [valueOf](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#valueof) + +## Type aliases + +### GridPoint + +Ƭ **GridPoint**: `WorldCoords` & { `__value`: `never` } + +--- + +### PerlinRand + +Ƭ **PerlinRand**: `ReturnType` + +## Functions + +### getCachedGradient + +▸ **getCachedGradient**(`coords`, `config`, `pow`): `Vector` + +#### Parameters + +| Name | Type | +| :------- | :---------------------------------------------------------------------------------------------- | +| `coords` | [`GridPoint`](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#gridpoint) | +| `config` | `PerlinConfig` | +| `pow` | [`PerlinOctave`](../enums/Frontend_Renderers_GameRenderer_Entities_PerlinUtils.PerlinOctave.md) | + +#### Returns + +`Vector` + +--- + +### getGridPoint + +▸ **getGridPoint**(`bottomLeft`, `scale`): [`GridPoint`](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#gridpoint) + +#### Parameters + +| Name | Type | +| :----------- | :------------ | +| `bottomLeft` | `WorldCoords` | +| `scale` | `number` | + +#### Returns + +[`GridPoint`](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#gridpoint) + +--- + +### getPerlinChunks + +▸ **getPerlinChunks**(`footprint`, `lengthScale`): `Iterable`<[`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md)\> + +#### Parameters + +| Name | Type | +| :------------ | :------------------------------------------------------------------ | +| `footprint` | [`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md) | +| `lengthScale` | `number` | + +#### Returns + +`Iterable`<[`Rectangle`](../interfaces/_types_global_GlobalTypes.Rectangle.md)\> + +--- + +### isGridPoint + +▸ **isGridPoint**(`coords`, `scale`): coords is GridPoint + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | +| `scale` | `number` | + +#### Returns + +coords is GridPoint + +--- + +### right + +▸ **right**(`topLeft`, `scale`): [`GridPoint`](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#gridpoint) + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------------------------- | +| `topLeft` | [`GridPoint`](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#gridpoint) | +| `scale` | `number` | + +#### Returns + +[`GridPoint`](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#gridpoint) + +--- + +### up + +▸ **up**(`topLeft`, `scale`): [`GridPoint`](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#gridpoint) + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------------------------- | +| `topLeft` | [`GridPoint`](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#gridpoint) | +| `scale` | `number` | + +#### Returns + +[`GridPoint`](Frontend_Renderers_GameRenderer_Entities_PerlinUtils.md#gridpoint) + +--- + +### valueOf + +▸ `Const` **valueOf**(`v`): [`number`, `number`] + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `v` | `Vector` | + +#### Returns + +[`number`, `number`] diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_planetrendermanager.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_planetrendermanager.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.md index 6f900e84..4fad2df7 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_planetrendermanager.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_planetrendermanager.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_planetrenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_planetrenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.md index 6dd03720..8d340a51 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_planetrenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_planetrenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderer.default.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.md new file mode 100644 index 00000000..015f489a --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/Entities/QuasarBodyRenderer + +## Table of contents + +### Classes + +- [QuasarBodyRenderer](../classes/Frontend_Renderers_GameRenderer_Entities_QuasarBodyRenderer.QuasarBodyRenderer.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.md new file mode 100644 index 00000000..f57f2416 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/Entities/QuasarRayRenderer + +## Table of contents + +### Classes + +- [QuasarRayRenderer](../classes/Frontend_Renderers_GameRenderer_Entities_QuasarRayRenderer.QuasarRayRenderer.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.md new file mode 100644 index 00000000..0b3068ce --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/Entities/QuasarRenderer + +## Table of contents + +### Classes + +- [QuasarRenderer](../classes/Frontend_Renderers_GameRenderer_Entities_QuasarRenderer.QuasarRenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_rectrenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_RectRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_rectrenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_RectRenderer.md index c6c7cd7a..88c75dee 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_rectrenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_RectRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_rectrenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_RectRenderer.default.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_ringrenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_RingRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_ringrenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_RingRenderer.md index 6d2777a8..bac85c69 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_ringrenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_RingRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_ringrenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_RingRenderer.default.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.md new file mode 100644 index 00000000..d03c7670 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/Entities/RuinsRenderer + +## Table of contents + +### Classes + +- [RuinsRenderer](../classes/Frontend_Renderers_GameRenderer_Entities_RuinsRenderer.RuinsRenderer.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.md new file mode 100644 index 00000000..84430b98 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer + +## Table of contents + +### Classes + +- [SpacetimeRipRenderer](../classes/Frontend_Renderers_GameRenderer_Entities_SpacetimeRipRenderer.SpacetimeRipRenderer.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.md new file mode 100644 index 00000000..641afcb9 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/Entities/SpriteRenderer + +## Table of contents + +### Classes + +- [SpriteRenderer](../classes/Frontend_Renderers_GameRenderer_Entities_SpriteRenderer.SpriteRenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_textrenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_TextRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_textrenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_TextRenderer.md index 069d177c..0be09320 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_textrenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_TextRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_textrenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_TextRenderer.default.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_voyagerenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_entities_voyagerenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.md index 0acdb4c8..70a7ec22 100644 --- a/docs/modules/frontend_renderers_gamerenderer_entities_voyagerenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_entities_voyagerenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.md new file mode 100644 index 00000000..2e6de150 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/Entities/WormholeRenderer + +## Table of contents + +### Classes + +- [WormholeRenderer](../classes/Frontend_Renderers_GameRenderer_Entities_WormholeRenderer.WormholeRenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_overlay2drenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Overlay2DRenderer.md similarity index 53% rename from docs/modules/frontend_renderers_gamerenderer_overlay2drenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Overlay2DRenderer.md index 055eb042..5cc12d4d 100644 --- a/docs/modules/frontend_renderers_gamerenderer_overlay2drenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Overlay2DRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_overlay2drenderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_AsteroidProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_AsteroidProgram.md new file mode 100644 index 00000000..55bd742a --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_AsteroidProgram.md @@ -0,0 +1,53 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/AsteroidProgram + +## Table of contents + +### Variables + +- [ASTEROID_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_AsteroidProgram.md#asteroid_program_definition) + +## Variables + +### ASTEROID_PROGRAM_DEFINITION + +• `Const` **ASTEROID_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.radius` | `Object` | +| `attribs.radius.dim` | `number` | +| `attribs.radius.name` | `string` | +| `attribs.radius.normalize` | `boolean` | +| `attribs.radius.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.seed` | `Object` | +| `attribs.seed.dim` | `number` | +| `attribs.seed.name` | `string` | +| `attribs.seed.normalize` | `boolean` | +| `attribs.seed.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.theta` | `Object` | +| `attribs.theta.dim` | `number` | +| `attribs.theta.name` | `string` | +| `attribs.theta.normalize` | `boolean` | +| `attribs.theta.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.now` | `Object` | +| `uniforms.now.name` | `string` | +| `uniforms.now.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_BeltProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_BeltProgram.md new file mode 100644 index 00000000..ae8dc12d --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_BeltProgram.md @@ -0,0 +1,78 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/BeltProgram + +## Table of contents + +### Type aliases + +- [BeltProps](Frontend_Renderers_GameRenderer_Programs_BeltProgram.md#beltprops) + +### Variables + +- [BELT_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_BeltProgram.md#belt_program_definition) + +### Functions + +- [propsFromIdx](Frontend_Renderers_GameRenderer_Programs_BeltProgram.md#propsfromidx) + +## Type aliases + +### BeltProps + +Ƭ **BeltProps**: [`number`, `number`, `number`, `number`] + +## Variables + +### BELT_PROGRAM_DEFINITION + +• `Const` **BELT_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.props` | `Object` | +| `attribs.props.dim` | `number` | +| `attribs.props.name` | `string` | +| `attribs.props.normalize` | `boolean` | +| `attribs.props.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.rectPos` | `Object` | +| `attribs.rectPos.dim` | `number` | +| `attribs.rectPos.name` | `string` | +| `attribs.rectPos.normalize` | `boolean` | +| `attribs.rectPos.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.now` | `Object` | +| `uniforms.now.name` | `string` | +| `uniforms.now.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | + +## Functions + +### propsFromIdx + +▸ `Const` **propsFromIdx**(`idx`): [`BeltProps`](Frontend_Renderers_GameRenderer_Programs_BeltProgram.md#beltprops) + +#### Parameters + +| Name | Type | +| :---- | :------- | +| `idx` | `number` | + +#### Returns + +[`BeltProps`](Frontend_Renderers_GameRenderer_Programs_BeltProgram.md#beltprops) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_BlackDomainProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_BlackDomainProgram.md new file mode 100644 index 00000000..c04fb18a --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_BlackDomainProgram.md @@ -0,0 +1,38 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/BlackDomainProgram + +## Table of contents + +### Variables + +- [BLACKDOMAIN_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_BlackDomainProgram.md#blackdomain_program_definition) + +## Variables + +### BLACKDOMAIN_PROGRAM_DEFINITION + +• `Const` **BLACKDOMAIN_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.rectPos` | `Object` | +| `attribs.rectPos.dim` | `number` | +| `attribs.rectPos.name` | `string` | +| `attribs.rectPos.normalize` | `boolean` | +| `attribs.rectPos.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.now` | `Object` | +| `uniforms.now.name` | `string` | +| `uniforms.now.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_CircleProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_CircleProgram.md new file mode 100644 index 00000000..952e4efd --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_CircleProgram.md @@ -0,0 +1,45 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/CircleProgram + +## Table of contents + +### Variables + +- [CIRCLE_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_CircleProgram.md#circle_program_definition) + +## Variables + +### CIRCLE_PROGRAM_DEFINITION + +• `Const` **CIRCLE_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.eps` | `Object` | +| `attribs.eps.dim` | `number` | +| `attribs.eps.name` | `string` | +| `attribs.eps.normalize` | `boolean` | +| `attribs.eps.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.props` | `Object` | +| `attribs.props.dim` | `number` | +| `attribs.props.name` | `string` | +| `attribs.props.normalize` | `boolean` | +| `attribs.props.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_GlassProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_GlassProgram.md new file mode 100644 index 00000000..c1c7afaf --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_GlassProgram.md @@ -0,0 +1,71 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/GlassProgram + +## Table of contents + +### Type aliases + +- [GlassProgramWithUniforms](Frontend_Renderers_GameRenderer_Programs_GlassProgram.md#glassprogramwithuniforms) +- [GlassUniforms](Frontend_Renderers_GameRenderer_Programs_GlassProgram.md#glassuniforms) + +### Variables + +- [glassPosProps](Frontend_Renderers_GameRenderer_Programs_GlassProgram.md#glassposprops) +- [glassTexProps](Frontend_Renderers_GameRenderer_Programs_GlassProgram.md#glasstexprops) + +### Functions + +- [getGlassProgramAndUniforms](Frontend_Renderers_GameRenderer_Programs_GlassProgram.md#getglassprogramanduniforms) + +## Type aliases + +### GlassProgramWithUniforms + +Ƭ **GlassProgramWithUniforms**: `Object` + +#### Type declaration + +| Name | Type | +| :--------- | :---------------------------------------------------------------------------------------- | +| `program` | `WebGLProgram` | +| `uniforms` | [`GlassUniforms`](Frontend_Renderers_GameRenderer_Programs_GlassProgram.md#glassuniforms) | + +--- + +### GlassUniforms + +Ƭ **GlassUniforms**: `Object` + +#### Type declaration + +| Name | Type | +| :-------- | :------------------------------- | +| `matrix` | `WebGLUniformLocation` \| `null` | +| `texture` | `WebGLUniformLocation` \| `null` | + +## Variables + +### glassPosProps + +• `Const` **glassPosProps**: [`AttribProps`](Frontend_Renderers_GameRenderer_EngineTypes.md#attribprops) + +--- + +### glassTexProps + +• `Const` **glassTexProps**: [`AttribProps`](Frontend_Renderers_GameRenderer_EngineTypes.md#attribprops) + +## Functions + +### getGlassProgramAndUniforms + +▸ `Const` **getGlassProgramAndUniforms**(`gl`): [`GlassProgramWithUniforms`](Frontend_Renderers_GameRenderer_Programs_GlassProgram.md#glassprogramwithuniforms) + +#### Parameters + +| Name | Type | +| :--- | :----------------------- | +| `gl` | `WebGL2RenderingContext` | + +#### Returns + +[`GlassProgramWithUniforms`](Frontend_Renderers_GameRenderer_Programs_GlassProgram.md#glassprogramwithuniforms) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_LineProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_LineProgram.md new file mode 100644 index 00000000..567b7118 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_LineProgram.md @@ -0,0 +1,40 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/LineProgram + +## Table of contents + +### Variables + +- [LINE_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_LineProgram.md#line_program_definition) + +## Variables + +### LINE_PROGRAM_DEFINITION + +• `Const` **LINE_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.dist` | `Object` | +| `attribs.dist.dim` | `number` | +| `attribs.dist.name` | `string` | +| `attribs.dist.normalize` | `boolean` | +| `attribs.dist.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_MaskProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_MaskProgram.md new file mode 100644 index 00000000..026ed7bd --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_MaskProgram.md @@ -0,0 +1,30 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/MaskProgram + +## Table of contents + +### Variables + +- [MASK_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_MaskProgram.md#mask_program_definition) + +## Variables + +### MASK_PROGRAM_DEFINITION + +• `Const` **MASK_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_MineProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_MineProgram.md new file mode 100644 index 00000000..69d176b5 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_MineProgram.md @@ -0,0 +1,53 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/MineProgram + +## Table of contents + +### Variables + +- [MINE_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_MineProgram.md#mine_program_definition) + +## Variables + +### MINE_PROGRAM_DEFINITION + +• `Const` **MINE_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.offset` | `Object` | +| `attribs.offset.dim` | `number` | +| `attribs.offset.name` | `string` | +| `attribs.offset.normalize` | `boolean` | +| `attribs.offset.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.radius` | `Object` | +| `attribs.radius.dim` | `number` | +| `attribs.radius.name` | `string` | +| `attribs.radius.normalize` | `boolean` | +| `attribs.radius.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.seed` | `Object` | +| `attribs.seed.dim` | `number` | +| `attribs.seed.name` | `string` | +| `attribs.seed.normalize` | `boolean` | +| `attribs.seed.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.now` | `Object` | +| `uniforms.now.name` | `string` | +| `uniforms.now.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_PerlinProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_PerlinProgram.md new file mode 100644 index 00000000..687725f5 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_PerlinProgram.md @@ -0,0 +1,71 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/PerlinProgram + +## Table of contents + +### Variables + +- [PERLIN_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_PerlinProgram.md#perlin_program_definition) + +## Variables + +### PERLIN_PROGRAM_DEFINITION + +• `Const` **PERLIN_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :------------------------------ | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.p0botGrad` | `Object` | +| `attribs.p0botGrad.dim` | `number` | +| `attribs.p0botGrad.name` | `string` | +| `attribs.p0botGrad.normalize` | `boolean` | +| `attribs.p0botGrad.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.p0topGrad` | `Object` | +| `attribs.p0topGrad.dim` | `number` | +| `attribs.p0topGrad.name` | `string` | +| `attribs.p0topGrad.normalize` | `boolean` | +| `attribs.p0topGrad.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.p1botGrad` | `Object` | +| `attribs.p1botGrad.dim` | `number` | +| `attribs.p1botGrad.name` | `string` | +| `attribs.p1botGrad.normalize` | `boolean` | +| `attribs.p1botGrad.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.p1topGrad` | `Object` | +| `attribs.p1topGrad.dim` | `number` | +| `attribs.p1topGrad.name` | `string` | +| `attribs.p1topGrad.normalize` | `boolean` | +| `attribs.p1topGrad.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.p2botGrad` | `Object` | +| `attribs.p2botGrad.dim` | `number` | +| `attribs.p2botGrad.name` | `string` | +| `attribs.p2botGrad.normalize` | `boolean` | +| `attribs.p2botGrad.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.p2topGrad` | `Object` | +| `attribs.p2topGrad.dim` | `number` | +| `attribs.p2topGrad.name` | `string` | +| `attribs.p2topGrad.normalize` | `boolean` | +| `attribs.p2topGrad.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.worldCoords` | `Object` | +| `attribs.worldCoords.dim` | `number` | +| `attribs.worldCoords.name` | `string` | +| `attribs.worldCoords.normalize` | `boolean` | +| `attribs.worldCoords.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.lengthScale` | `Object` | +| `uniforms.lengthScale.name` | `string` | +| `uniforms.lengthScale.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.thresholds` | `Object` | +| `uniforms.thresholds.name` | `string` | +| `uniforms.thresholds.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md new file mode 100644 index 00000000..f1335574 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md @@ -0,0 +1,171 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/PlanetProgram + +## Table of contents + +### Variables + +- [PLANET_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md#planet_program_definition) + +### Functions + +- [beachFromPlanet](Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md#beachfromplanet) +- [cloudsFromPlanet](Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md#cloudsfromplanet) +- [distortFromPlanet](Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md#distortfromplanet) +- [morphFromPlanet](Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md#morphfromplanet) +- [octavesFromPlanet](Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md#octavesfromplanet) +- [propsFromPlanet](Frontend_Renderers_GameRenderer_Programs_PlanetProgram.md#propsfromplanet) + +## Variables + +### PLANET_PROGRAM_DEFINITION + +• `Const` **PLANET_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.color2` | `Object` | +| `attribs.color2.dim` | `number` | +| `attribs.color2.name` | `string` | +| `attribs.color2.normalize` | `boolean` | +| `attribs.color2.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.color3` | `Object` | +| `attribs.color3.dim` | `number` | +| `attribs.color3.name` | `string` | +| `attribs.color3.normalize` | `boolean` | +| `attribs.color3.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.props` | `Object` | +| `attribs.props.dim` | `number` | +| `attribs.props.name` | `string` | +| `attribs.props.normalize` | `boolean` | +| `attribs.props.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.props2` | `Object` | +| `attribs.props2.dim` | `number` | +| `attribs.props2.name` | `string` | +| `attribs.props2.normalize` | `boolean` | +| `attribs.props2.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.rectPos` | `Object` | +| `attribs.rectPos.dim` | `number` | +| `attribs.rectPos.name` | `string` | +| `attribs.rectPos.normalize` | `boolean` | +| `attribs.rectPos.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.time` | `Object` | +| `uniforms.time.name` | `string` | +| `uniforms.time.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.timeMatrix` | `Object` | +| `uniforms.timeMatrix.name` | `string` | +| `uniforms.timeMatrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | + +## Functions + +### beachFromPlanet + +▸ `Const` **beachFromPlanet**(`p`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `p` | `Planet` | + +#### Returns + +`number` + +--- + +### cloudsFromPlanet + +▸ `Const` **cloudsFromPlanet**(`p`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `p` | `Planet` | + +#### Returns + +`number` + +--- + +### distortFromPlanet + +▸ **distortFromPlanet**(`p`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `p` | `Planet` | + +#### Returns + +`number` + +--- + +### morphFromPlanet + +▸ `Const` **morphFromPlanet**(`p`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `p` | `Planet` | + +#### Returns + +`number` + +--- + +### octavesFromPlanet + +▸ `Const` **octavesFromPlanet**(`p`): `number` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `p` | `Planet` | + +#### Returns + +`number` + +--- + +### propsFromPlanet + +▸ `Const` **propsFromPlanet**(`p`): [`number`, `number`, `number`, `number`] + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `p` | `Planet` | + +#### Returns + +[`number`, `number`, `number`, `number`] diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_QuasarBodyProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_QuasarBodyProgram.md new file mode 100644 index 00000000..0cdc811f --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_QuasarBodyProgram.md @@ -0,0 +1,43 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/QuasarBodyProgram + +## Table of contents + +### Variables + +- [QUASARBODY_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_QuasarBodyProgram.md#quasarbody_program_definition) + +## Variables + +### QUASARBODY_PROGRAM_DEFINITION + +• `Const` **QUASARBODY_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.rectPos` | `Object` | +| `attribs.rectPos.dim` | `number` | +| `attribs.rectPos.name` | `string` | +| `attribs.rectPos.normalize` | `boolean` | +| `attribs.rectPos.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.time` | `Object` | +| `uniforms.time.name` | `string` | +| `uniforms.time.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_QuasarRayProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_QuasarRayProgram.md new file mode 100644 index 00000000..15b3ab64 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_QuasarRayProgram.md @@ -0,0 +1,43 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/QuasarRayProgram + +## Table of contents + +### Variables + +- [QUASARRAY_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_QuasarRayProgram.md#quasarray_program_definition) + +## Variables + +### QUASARRAY_PROGRAM_DEFINITION + +• `Const` **QUASARRAY_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.rectPos` | `Object` | +| `attribs.rectPos.dim` | `number` | +| `attribs.rectPos.name` | `string` | +| `attribs.rectPos.normalize` | `boolean` | +| `attribs.rectPos.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.time` | `Object` | +| `uniforms.time.name` | `string` | +| `uniforms.time.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_RectProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_RectProgram.md new file mode 100644 index 00000000..99226e14 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_RectProgram.md @@ -0,0 +1,50 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/RectProgram + +## Table of contents + +### Variables + +- [RECT_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_RectProgram.md#rect_program_definition) + +## Variables + +### RECT_PROGRAM_DEFINITION + +• `Const` **RECT_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.rectPos` | `Object` | +| `attribs.rectPos.dim` | `number` | +| `attribs.rectPos.name` | `string` | +| `attribs.rectPos.normalize` | `boolean` | +| `attribs.rectPos.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.strokeX` | `Object` | +| `attribs.strokeX.dim` | `number` | +| `attribs.strokeX.name` | `string` | +| `attribs.strokeX.normalize` | `boolean` | +| `attribs.strokeX.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.strokeY` | `Object` | +| `attribs.strokeY.dim` | `number` | +| `attribs.strokeY.name` | `string` | +| `attribs.strokeY.normalize` | `boolean` | +| `attribs.strokeY.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_RingProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_RingProgram.md new file mode 100644 index 00000000..b098ba35 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_RingProgram.md @@ -0,0 +1,78 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/RingProgram + +## Table of contents + +### Type aliases + +- [RingProps](Frontend_Renderers_GameRenderer_Programs_RingProgram.md#ringprops) + +### Variables + +- [RING_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_RingProgram.md#ring_program_definition) + +### Functions + +- [propsFromIdx](Frontend_Renderers_GameRenderer_Programs_RingProgram.md#propsfromidx) + +## Type aliases + +### RingProps + +Ƭ **RingProps**: [`number`, `number`, `number`] + +## Variables + +### RING_PROGRAM_DEFINITION + +• `Const` **RING_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.props` | `Object` | +| `attribs.props.dim` | `number` | +| `attribs.props.name` | `string` | +| `attribs.props.normalize` | `boolean` | +| `attribs.props.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.rectPos` | `Object` | +| `attribs.rectPos.dim` | `number` | +| `attribs.rectPos.name` | `string` | +| `attribs.rectPos.normalize` | `boolean` | +| `attribs.rectPos.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.now` | `Object` | +| `uniforms.now.name` | `string` | +| `uniforms.now.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | + +## Functions + +### propsFromIdx + +▸ `Const` **propsFromIdx**(`idx`): [`RingProps`](Frontend_Renderers_GameRenderer_Programs_RingProgram.md#ringprops) + +#### Parameters + +| Name | Type | +| :---- | :------- | +| `idx` | `number` | + +#### Returns + +[`RingProps`](Frontend_Renderers_GameRenderer_Programs_RingProgram.md#ringprops) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_RuinsProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_RuinsProgram.md new file mode 100644 index 00000000..7f4141cd --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_RuinsProgram.md @@ -0,0 +1,53 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/RuinsProgram + +## Table of contents + +### Variables + +- [RUINS_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_RuinsProgram.md#ruins_program_definition) + +## Variables + +### RUINS_PROGRAM_DEFINITION + +• `Const` **RUINS_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.props` | `Object` | +| `attribs.props.dim` | `number` | +| `attribs.props.name` | `string` | +| `attribs.props.normalize` | `boolean` | +| `attribs.props.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.rectPos` | `Object` | +| `attribs.rectPos.dim` | `number` | +| `attribs.rectPos.name` | `string` | +| `attribs.rectPos.normalize` | `boolean` | +| `attribs.rectPos.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.weights` | `Object` | +| `attribs.weights.dim` | `number` | +| `attribs.weights.name` | `string` | +| `attribs.weights.normalize` | `boolean` | +| `attribs.weights.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.time` | `Object` | +| `uniforms.time.name` | `string` | +| `uniforms.time.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_SpacetimeRipProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_SpacetimeRipProgram.md new file mode 100644 index 00000000..321f1b7b --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_SpacetimeRipProgram.md @@ -0,0 +1,58 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/SpacetimeRipProgram + +## Table of contents + +### Variables + +- [SPACETIMERIP_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_SpacetimeRipProgram.md#spacetimerip_program_definition) + +## Variables + +### SPACETIMERIP_PROGRAM_DEFINITION + +• `Const` **SPACETIMERIP_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.inColor1` | `Object` | +| `attribs.inColor1.dim` | `number` | +| `attribs.inColor1.name` | `string` | +| `attribs.inColor1.normalize` | `boolean` | +| `attribs.inColor1.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.inColor2` | `Object` | +| `attribs.inColor2.dim` | `number` | +| `attribs.inColor2.name` | `string` | +| `attribs.inColor2.normalize` | `boolean` | +| `attribs.inColor2.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.inColor3` | `Object` | +| `attribs.inColor3.dim` | `number` | +| `attribs.inColor3.name` | `string` | +| `attribs.inColor3.normalize` | `boolean` | +| `attribs.inColor3.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.rectPos` | `Object` | +| `attribs.rectPos.dim` | `number` | +| `attribs.rectPos.name` | `string` | +| `attribs.rectPos.normalize` | `boolean` | +| `attribs.rectPos.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.time` | `Object` | +| `uniforms.time.name` | `string` | +| `uniforms.time.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_SpriteProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_SpriteProgram.md new file mode 100644 index 00000000..b8eeb933 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_SpriteProgram.md @@ -0,0 +1,63 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/SpriteProgram + +## Table of contents + +### Variables + +- [SPRITE_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_SpriteProgram.md#sprite_program_definition) + +## Variables + +### SPRITE_PROGRAM_DEFINITION + +• `Const` **SPRITE_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.invert` | `Object` | +| `attribs.invert.dim` | `number` | +| `attribs.invert.name` | `string` | +| `attribs.invert.normalize` | `boolean` | +| `attribs.invert.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.mythic` | `Object` | +| `attribs.mythic.dim` | `number` | +| `attribs.mythic.name` | `string` | +| `attribs.mythic.normalize` | `boolean` | +| `attribs.mythic.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.rectPos` | `Object` | +| `attribs.rectPos.dim` | `number` | +| `attribs.rectPos.name` | `string` | +| `attribs.rectPos.normalize` | `boolean` | +| `attribs.rectPos.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.shine` | `Object` | +| `attribs.shine.dim` | `number` | +| `attribs.shine.name` | `string` | +| `attribs.shine.normalize` | `boolean` | +| `attribs.shine.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.texcoord` | `Object` | +| `attribs.texcoord.dim` | `number` | +| `attribs.texcoord.name` | `string` | +| `attribs.texcoord.normalize` | `boolean` | +| `attribs.texcoord.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.texture` | `Object` | +| `uniforms.texture.name` | `string` | +| `uniforms.texture.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/Frontend_Renderers_GameRenderer_Programs_TextProgram.md b/docs/modules/Frontend_Renderers_GameRenderer_Programs_TextProgram.md new file mode 100644 index 00000000..8149ce02 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_Programs_TextProgram.md @@ -0,0 +1,43 @@ +# Module: Frontend/Renderers/GameRenderer/Programs/TextProgram + +## Table of contents + +### Variables + +- [TEXT_PROGRAM_DEFINITION](Frontend_Renderers_GameRenderer_Programs_TextProgram.md#text_program_definition) + +## Variables + +### TEXT_PROGRAM_DEFINITION + +• `Const` **TEXT_PROGRAM_DEFINITION**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------------------- | :----------------------------------------------------------------------------------- | +| `attribs` | `Object` | +| `attribs.color` | `Object` | +| `attribs.color.dim` | `number` | +| `attribs.color.name` | `string` | +| `attribs.color.normalize` | `boolean` | +| `attribs.color.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.position` | `Object` | +| `attribs.position.dim` | `number` | +| `attribs.position.name` | `string` | +| `attribs.position.normalize` | `boolean` | +| `attribs.position.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `attribs.texcoord` | `Object` | +| `attribs.texcoord.dim` | `number` | +| `attribs.texcoord.name` | `string` | +| `attribs.texcoord.normalize` | `boolean` | +| `attribs.texcoord.type` | [`AttribType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.AttribType.md) | +| `fragmentShader` | `string` | +| `uniforms` | `Object` | +| `uniforms.matrix` | `Object` | +| `uniforms.matrix.name` | `string` | +| `uniforms.matrix.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `uniforms.texture` | `Object` | +| `uniforms.texture.name` | `string` | +| `uniforms.texture.type` | [`UniformType`](../enums/Frontend_Renderers_GameRenderer_EngineTypes.UniformType.md) | +| `vertexShader` | `string` | diff --git a/docs/modules/frontend_renderers_gamerenderer_renderer.md b/docs/modules/Frontend_Renderers_GameRenderer_Renderer.md similarity index 60% rename from docs/modules/frontend_renderers_gamerenderer_renderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_Renderer.md index 7f6a0b58..94aed116 100644 --- a/docs/modules/frontend_renderers_gamerenderer_renderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_Renderer.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_renderer.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_Renderer.default.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_TextureManager.md b/docs/modules/Frontend_Renderers_GameRenderer_TextureManager.md new file mode 100644 index 00000000..5933af58 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_TextureManager.md @@ -0,0 +1,166 @@ +# Module: Frontend/Renderers/GameRenderer/TextureManager + +## Table of contents + +### Type aliases + +- [SpriteRectangle](Frontend_Renderers_GameRenderer_TextureManager.md#spriterectangle) + +### Variables + +- [ARTIFACTS_THUMBS_URL](Frontend_Renderers_GameRenderer_TextureManager.md#artifacts_thumbs_url) +- [ARTIFACTS_URL](Frontend_Renderers_GameRenderer_TextureManager.md#artifacts_url) +- [EMPTY_SET](Frontend_Renderers_GameRenderer_TextureManager.md#empty_set) +- [EMPTY_SPRITE](Frontend_Renderers_GameRenderer_TextureManager.md#empty_sprite) +- [GLASS_URL](Frontend_Renderers_GameRenderer_TextureManager.md#glass_url) +- [SPRITESHEET_HEIGHT_PX](Frontend_Renderers_GameRenderer_TextureManager.md#spritesheet_height_px) +- [SPRITESHEET_WIDTH_PX](Frontend_Renderers_GameRenderer_TextureManager.md#spritesheet_width_px) +- [SPRITES_HORIZONTALLY](Frontend_Renderers_GameRenderer_TextureManager.md#sprites_horizontally) +- [SPRITES_VERTICALLY](Frontend_Renderers_GameRenderer_TextureManager.md#sprites_vertically) + +### Functions + +- [isShiny](Frontend_Renderers_GameRenderer_TextureManager.md#isshiny) +- [loadArtifactAtlas](Frontend_Renderers_GameRenderer_TextureManager.md#loadartifactatlas) +- [loadArtifactThumbAtlas](Frontend_Renderers_GameRenderer_TextureManager.md#loadartifactthumbatlas) +- [loadSprite](Frontend_Renderers_GameRenderer_TextureManager.md#loadsprite) +- [spriteFromArtifact](Frontend_Renderers_GameRenderer_TextureManager.md#spritefromartifact) + +## Type aliases + +### SpriteRectangle + +Ƭ **SpriteRectangle**: `Object` + +#### Type declaration + +| Name | Type | +| :--- | :------- | +| `x1` | `number` | +| `x2` | `number` | +| `y1` | `number` | +| `y2` | `number` | + +## Variables + +### ARTIFACTS_THUMBS_URL + +• `Const` **ARTIFACTS_THUMBS_URL**: `"public/sprites/artifactthumbs.png"` + +--- + +### ARTIFACTS_URL + +• `Const` **ARTIFACTS_URL**: `"public/sprites/artifacts.png"` + +--- + +### EMPTY_SET + +• `Const` **EMPTY_SET**: `SpriteSet` + +--- + +### EMPTY_SPRITE + +• `Const` **EMPTY_SPRITE**: [`SpriteRectangle`](Frontend_Renderers_GameRenderer_TextureManager.md#spriterectangle) + +Represents a sprite that doesn't exist. + +--- + +### GLASS_URL + +• `Const` **GLASS_URL**: `"public/sprites/glass.png"` + +--- + +### SPRITESHEET_HEIGHT_PX + +• `Const` **SPRITESHEET_HEIGHT_PX**: `number` + +--- + +### SPRITESHEET_WIDTH_PX + +• `Const` **SPRITESHEET_WIDTH_PX**: `number` + +--- + +### SPRITES_HORIZONTALLY + +• `Const` **SPRITES_HORIZONTALLY**: `16` + +--- + +### SPRITES_VERTICALLY + +• `Const` **SPRITES_VERTICALLY**: `16` + +## Functions + +### isShiny + +▸ **isShiny**(`rarity`): `boolean` + +#### Parameters + +| Name | Type | +| :------- | :--------------- | +| `rarity` | `ArtifactRarity` | + +#### Returns + +`boolean` + +--- + +### loadArtifactAtlas + +▸ **loadArtifactAtlas**(): `Promise`<`HTMLImageElement`\> + +#### Returns + +`Promise`<`HTMLImageElement`\> + +--- + +### loadArtifactThumbAtlas + +▸ **loadArtifactThumbAtlas**(): `Promise`<`HTMLImageElement`\> + +#### Returns + +`Promise`<`HTMLImageElement`\> + +--- + +### loadSprite + +▸ **loadSprite**(`imageUrl`): `Promise`<`HTMLImageElement`\> + +#### Parameters + +| Name | Type | +| :--------- | :------- | +| `imageUrl` | `string` | + +#### Returns + +`Promise`<`HTMLImageElement`\> + +--- + +### spriteFromArtifact + +▸ **spriteFromArtifact**(`artifact`): [`SpriteRectangle`](Frontend_Renderers_GameRenderer_TextureManager.md#spriterectangle) + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------------------------------------------------------------------- | +| `artifact` | [`RenderedArtifact`](../interfaces/Backend_GameLogic_ArtifactUtils.RenderedArtifact.md) | + +#### Returns + +[`SpriteRectangle`](Frontend_Renderers_GameRenderer_TextureManager.md#spriterectangle) diff --git a/docs/modules/frontend_renderers_gamerenderer_uirenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_UIRenderer.md similarity index 51% rename from docs/modules/frontend_renderers_gamerenderer_uirenderer.md rename to docs/modules/Frontend_Renderers_GameRenderer_UIRenderer.md index 126973ef..d0da2f5c 100644 --- a/docs/modules/frontend_renderers_gamerenderer_uirenderer.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_UIRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [UIRenderer](../classes/frontend_renderers_gamerenderer_uirenderer.uirenderer.md) +- [UIRenderer](../classes/Frontend_Renderers_GameRenderer_UIRenderer.UIRenderer.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_WebGL_AttribArray.md b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_AttribArray.md new file mode 100644 index 00000000..e9bd75b4 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_AttribArray.md @@ -0,0 +1,17 @@ +# Module: Frontend/Renderers/GameRenderer/WebGL/AttribArray + +## Table of contents + +### Classes + +- [AttribArray](../classes/Frontend_Renderers_GameRenderer_WebGL_AttribArray.AttribArray.md) + +### Type aliases + +- [GLArray](Frontend_Renderers_GameRenderer_WebGL_AttribArray.md#glarray) + +## Type aliases + +### GLArray + +Ƭ **GLArray**: `Float32Array` \| `Uint8Array` diff --git a/docs/modules/frontend_renderers_gamerenderer_webgl_attribmanager.md b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_AttribManager.md similarity index 52% rename from docs/modules/frontend_renderers_gamerenderer_webgl_attribmanager.md rename to docs/modules/Frontend_Renderers_GameRenderer_WebGL_AttribManager.md index 94238d9b..b7d40f6e 100644 --- a/docs/modules/frontend_renderers_gamerenderer_webgl_attribmanager.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_AttribManager.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_webgl_attribmanager.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_WebGL_AttribManager.default.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.md b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.md new file mode 100644 index 00000000..e512b688 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/WebGL/GameGLManager + +## Table of contents + +### Classes + +- [GameGLManager](../classes/Frontend_Renderers_GameRenderer_WebGL_GameGLManager.GameGLManager.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.md b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.md new file mode 100644 index 00000000..a80f46cf --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/GameRenderer/WebGL/GenericRenderer + +## Table of contents + +### Classes + +- [GenericRenderer](../classes/Frontend_Renderers_GameRenderer_WebGL_GenericRenderer.GenericRenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_webgl_programutils.md b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.md similarity index 53% rename from docs/modules/frontend_renderers_gamerenderer_webgl_programutils.md rename to docs/modules/Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.md index 74d3ef25..cb811a0f 100644 --- a/docs/modules/frontend_renderers_gamerenderer_webgl_programutils.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/frontend_renderers_gamerenderer_webgl_programutils.default.md) +- [default](../classes/Frontend_Renderers_GameRenderer_WebGL_ProgramUtils.default.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_webgl_shadermixins.md b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.md similarity index 50% rename from docs/modules/frontend_renderers_gamerenderer_webgl_shadermixins.md rename to docs/modules/Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.md index f04dbf87..8ef3b38b 100644 --- a/docs/modules/frontend_renderers_gamerenderer_webgl_shadermixins.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.md @@ -4,4 +4,4 @@ ### Classes -- [ShaderMixins](../classes/frontend_renderers_gamerenderer_webgl_shadermixins.shadermixins.md) +- [ShaderMixins](../classes/Frontend_Renderers_GameRenderer_WebGL_ShaderMixins.ShaderMixins.md) diff --git a/docs/modules/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md new file mode 100644 index 00000000..40104621 --- /dev/null +++ b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md @@ -0,0 +1,72 @@ +# Module: Frontend/Renderers/GameRenderer/WebGL/WebGLLibTypes + +## Table of contents + +### Interfaces + +- [Attributes](../interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Attributes.md) +- [Uniforms](../interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Uniforms.md) + +### Type aliases + +- [AttributeSetters](Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md#attributesetters) +- [CompiledProgram](Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md#compiledprogram) +- [ProgramInfo](Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md#programinfo) +- [UniformSetters](Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md#uniformsetters) + +## Type aliases + +### AttributeSetters + +Ƭ **AttributeSetters**<`U`\>: { [key in keyof U]: function} + +#### Type parameters + +| Name | Type | +| :--- | :------------------------------------------------------------------------------------------------------ | +| `U` | extends [`Attributes`](../interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Attributes.md) | + +--- + +### CompiledProgram + +Ƭ **CompiledProgram**<`U`\>: `Object` + +#### Type parameters + +| Name | Type | +| :--- | :-------------------------------------------------------------------------------------------------- | +| `U` | extends [`Uniforms`](../interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Uniforms.md) | + +#### Type declaration + +| Name | Type | +| :----------- | :---------------------------------------------------------------------------------------------- | +| `program` | `WebGLProgram` | +| `setUniform` | [`UniformSetters`](Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.md#uniformsetters)<`U`\> | + +--- + +### ProgramInfo + +Ƭ **ProgramInfo**: `Object` + +#### Type declaration + +| Name | Type | +| :------------- | :------------------------------------------------------------------------------------------ | +| `fragShader` | `string` | +| `uniforms` | [`Uniforms`](../interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Uniforms.md) | +| `vertexShader` | `string` | + +--- + +### UniformSetters + +Ƭ **UniformSetters**<`U`\>: { [key in keyof U]: function} + +#### Type parameters + +| Name | Type | +| :--- | :-------------------------------------------------------------------------------------------------- | +| `U` | extends [`Uniforms`](../interfaces/Frontend_Renderers_GameRenderer_WebGL_WebGLLibTypes.Uniforms.md) | diff --git a/docs/modules/frontend_renderers_gamerenderer_webgl_webglmanager.md b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_WebGLManager.md similarity index 50% rename from docs/modules/frontend_renderers_gamerenderer_webgl_webglmanager.md rename to docs/modules/Frontend_Renderers_GameRenderer_WebGL_WebGLManager.md index 0459eb60..2ea409bd 100644 --- a/docs/modules/frontend_renderers_gamerenderer_webgl_webglmanager.md +++ b/docs/modules/Frontend_Renderers_GameRenderer_WebGL_WebGLManager.md @@ -4,4 +4,4 @@ ### Classes -- [WebGLManager](../classes/frontend_renderers_gamerenderer_webgl_webglmanager.webglmanager.md) +- [WebGLManager](../classes/Frontend_Renderers_GameRenderer_WebGL_WebGLManager.WebGLManager.md) diff --git a/docs/modules/frontend_renderers_gifrenderer.md b/docs/modules/Frontend_Renderers_GifRenderer.md similarity index 57% rename from docs/modules/frontend_renderers_gifrenderer.md rename to docs/modules/Frontend_Renderers_GifRenderer.md index 51b3b1c2..79704b5a 100644 --- a/docs/modules/frontend_renderers_gifrenderer.md +++ b/docs/modules/Frontend_Renderers_GifRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [GifRenderer](../classes/frontend_renderers_gifrenderer.gifrenderer.md) +- [GifRenderer](../classes/Frontend_Renderers_GifRenderer.GifRenderer.md) diff --git a/docs/modules/Frontend_Renderers_LandingPageCanvas.md b/docs/modules/Frontend_Renderers_LandingPageCanvas.md new file mode 100644 index 00000000..fa62b992 --- /dev/null +++ b/docs/modules/Frontend_Renderers_LandingPageCanvas.md @@ -0,0 +1,28 @@ +# Module: Frontend/Renderers/LandingPageCanvas + +## Table of contents + +### Functions + +- [LandingPageBackground](Frontend_Renderers_LandingPageCanvas.md#landingpagebackground) +- [default](Frontend_Renderers_LandingPageCanvas.md#default) + +## Functions + +### LandingPageBackground + +▸ **LandingPageBackground**(): `Element` + +#### Returns + +`Element` + +--- + +### default + +▸ **default**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PathProgram.md b/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PathProgram.md new file mode 100644 index 00000000..4eb25c81 --- /dev/null +++ b/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PathProgram.md @@ -0,0 +1,70 @@ +# Module: Frontend/Renderers/PlanetscapeRenderer/PathProgram + +## Table of contents + +### Type aliases + +- [PathProgramWithUniforms](Frontend_Renderers_PlanetscapeRenderer_PathProgram.md#pathprogramwithuniforms) +- [ScapeUniforms](Frontend_Renderers_PlanetscapeRenderer_PathProgram.md#scapeuniforms) + +### Variables + +- [scapeColorProps](Frontend_Renderers_PlanetscapeRenderer_PathProgram.md#scapecolorprops) +- [scapePosProps](Frontend_Renderers_PlanetscapeRenderer_PathProgram.md#scapeposprops) + +### Functions + +- [getPathProgramAndUniforms](Frontend_Renderers_PlanetscapeRenderer_PathProgram.md#getpathprogramanduniforms) + +## Type aliases + +### PathProgramWithUniforms + +Ƭ **PathProgramWithUniforms**: `Object` + +#### Type declaration + +| Name | Type | +| :--------- | :------------------------------------------------------------------------------------- | +| `program` | `WebGLProgram` | +| `uniforms` | [`ScapeUniforms`](Frontend_Renderers_PlanetscapeRenderer_PathProgram.md#scapeuniforms) | + +--- + +### ScapeUniforms + +Ƭ **ScapeUniforms**: `Object` + +#### Type declaration + +| Name | Type | +| :------- | :------------------------------- | +| `matrix` | `WebGLUniformLocation` \| `null` | + +## Variables + +### scapeColorProps + +• `Const` **scapeColorProps**: [`AttribProps`](Frontend_Renderers_GameRenderer_EngineTypes.md#attribprops) + +--- + +### scapePosProps + +• `Const` **scapePosProps**: [`AttribProps`](Frontend_Renderers_GameRenderer_EngineTypes.md#attribprops) + +## Functions + +### getPathProgramAndUniforms + +▸ `Const` **getPathProgramAndUniforms**(`gl`): [`PathProgramWithUniforms`](Frontend_Renderers_PlanetscapeRenderer_PathProgram.md#pathprogramwithuniforms) + +#### Parameters + +| Name | Type | +| :--- | :----------------------- | +| `gl` | `WebGL2RenderingContext` | + +#### Returns + +[`PathProgramWithUniforms`](Frontend_Renderers_PlanetscapeRenderer_PathProgram.md#pathprogramwithuniforms) diff --git a/docs/modules/frontend_renderers_planetscaperenderer_pathrenderer.md b/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PathRenderer.md similarity index 50% rename from docs/modules/frontend_renderers_planetscaperenderer_pathrenderer.md rename to docs/modules/Frontend_Renderers_PlanetscapeRenderer_PathRenderer.md index 38a40823..8522871b 100644 --- a/docs/modules/frontend_renderers_planetscaperenderer_pathrenderer.md +++ b/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PathRenderer.md @@ -4,4 +4,4 @@ ### Classes -- [PathRenderer](../classes/frontend_renderers_planetscaperenderer_pathrenderer.pathrenderer.md) +- [PathRenderer](../classes/Frontend_Renderers_PlanetscapeRenderer_PathRenderer.PathRenderer.md) diff --git a/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetIcons.md b/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetIcons.md new file mode 100644 index 00000000..4c3ce475 --- /dev/null +++ b/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetIcons.md @@ -0,0 +1,24 @@ +# Module: Frontend/Renderers/PlanetscapeRenderer/PlanetIcons + +## Table of contents + +### Functions + +- [PlanetIcons](Frontend_Renderers_PlanetscapeRenderer_PlanetIcons.md#planeticons) + +## Functions + +### PlanetIcons + +▸ **PlanetIcons**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `Planet` \| `undefined` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScape.md b/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScape.md new file mode 100644 index 00000000..a74bf7b0 --- /dev/null +++ b/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScape.md @@ -0,0 +1,41 @@ +# Module: Frontend/Renderers/PlanetscapeRenderer/PlanetScape + +## Table of contents + +### Variables + +- [SCAPE_HEIGHT](Frontend_Renderers_PlanetscapeRenderer_PlanetScape.md#scape_height) +- [SCAPE_WIDTH](Frontend_Renderers_PlanetscapeRenderer_PlanetScape.md#scape_width) + +### Functions + +- [PlanetScape](Frontend_Renderers_PlanetscapeRenderer_PlanetScape.md#planetscape) + +## Variables + +### SCAPE_HEIGHT + +• `Const` **SCAPE_HEIGHT**: `150` + +--- + +### SCAPE_WIDTH + +• `Const` **SCAPE_WIDTH**: `450` + +## Functions + +### PlanetScape + +▸ **PlanetScape**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------- | :--------------------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.wrapper` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.md b/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.md new file mode 100644 index 00000000..50bc6c9c --- /dev/null +++ b/docs/modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.md @@ -0,0 +1,7 @@ +# Module: Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer + +## Table of contents + +### Classes + +- [PlanetscapeRenderer](../classes/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.PlanetscapeRenderer.md) diff --git a/docs/modules/Frontend_Styles_Colors.md b/docs/modules/Frontend_Styles_Colors.md new file mode 100644 index 00000000..b29ece27 --- /dev/null +++ b/docs/modules/Frontend_Styles_Colors.md @@ -0,0 +1,41 @@ +# Module: Frontend/Styles/Colors + +## Table of contents + +### Variables + +- [ANCIENT_BLUE](Frontend_Styles_Colors.md#ancient_blue) +- [ANCIENT_PURPLE](Frontend_Styles_Colors.md#ancient_purple) +- [BiomeBackgroundColors](Frontend_Styles_Colors.md#biomebackgroundcolors) +- [BiomeTextColors](Frontend_Styles_Colors.md#biometextcolors) +- [RarityColors](Frontend_Styles_Colors.md#raritycolors) + +## Variables + +### ANCIENT_BLUE + +• `Const` **ANCIENT_BLUE**: `"#b2fffc"` + +--- + +### ANCIENT_PURPLE + +• `Const` **ANCIENT_PURPLE**: `"#d23191"` + +--- + +### BiomeBackgroundColors + +• `Const` **BiomeBackgroundColors**: `Object` + +--- + +### BiomeTextColors + +• `Const` **BiomeTextColors**: `Object` + +--- + +### RarityColors + +• `Const` **RarityColors**: `Object` diff --git a/docs/modules/Frontend_Styles_Mixins.md b/docs/modules/Frontend_Styles_Mixins.md new file mode 100644 index 00000000..f9e779d4 --- /dev/null +++ b/docs/modules/Frontend_Styles_Mixins.md @@ -0,0 +1,24 @@ +# Module: Frontend/Styles/Mixins + +## Table of contents + +### Functions + +- [planetBackground](Frontend_Styles_Mixins.md#planetbackground) + +## Functions + +### planetBackground + +▸ **planetBackground**(`__namedParameters`): `""` \| `FlattenSimpleInterpolation` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `Planet` \| `undefined` | + +#### Returns + +`""` \| `FlattenSimpleInterpolation` diff --git a/docs/modules/Frontend_Styles_colors.md b/docs/modules/Frontend_Styles_colors.md new file mode 100644 index 00000000..41d90199 --- /dev/null +++ b/docs/modules/Frontend_Styles_colors.md @@ -0,0 +1,29 @@ +# Module: Frontend/Styles/colors + +## Table of contents + +### Properties + +- [default](Frontend_Styles_colors.md#default) + +## Properties + +### default + +• **default**: `Object` + +#### Type declaration + +| Name | Type | +| :--------- | :------- | +| `black` | `string` | +| `gray-100` | `string` | +| `gray-200` | `string` | +| `gray-300` | `string` | +| `gray-400` | `string` | +| `gray-500` | `string` | +| `gray-600` | `string` | +| `gray-700` | `string` | +| `gray-800` | `string` | +| `gray-900` | `string` | +| `white` | `string` | diff --git a/docs/modules/Frontend_Styles_dfstyles.md b/docs/modules/Frontend_Styles_dfstyles.md new file mode 100644 index 00000000..5cb1190a --- /dev/null +++ b/docs/modules/Frontend_Styles_dfstyles.md @@ -0,0 +1,88 @@ +# Module: Frontend/Styles/dfstyles + +## Table of contents + +### Variables + +- [ARTIFACT_ROW_H](Frontend_Styles_dfstyles.md#artifact_row_h) +- [SPACE_TYPE_COLORS](Frontend_Styles_dfstyles.md#space_type_colors) +- [default](Frontend_Styles_dfstyles.md#default) + +## Variables + +### ARTIFACT_ROW_H + +• `Const` **ARTIFACT_ROW_H**: `48` + +--- + +### SPACE_TYPE_COLORS + +• `Const` **SPACE_TYPE_COLORS**: `Object` + +--- + +### default + +• `Const` **default**: `Object` + +#### Type declaration + +| Name | Type | +| :----------------------------- | :--------------------------- | +| `borderRadius` | `string` | +| `colors` | `Object` | +| `colors.artifactBackground` | `string` | +| `colors.background` | `string` | +| `colors.backgrounddark` | `string` | +| `colors.backgroundlight` | `string` | +| `colors.backgroundlighter` | `string` | +| `colors.blueBackground` | `string` | +| `colors.dfblue` | `string` | +| `colors.dfgreen` | `string` | +| `colors.dfgreendark` | `string` | +| `colors.dfgreenlight` | `string` | +| `colors.dfred` | `string` | +| `colors.dfyellow` | `string` | +| `colors.icons` | `Object` | +| `colors.icons.blog` | `string` | +| `colors.icons.discord` | `string` | +| `colors.icons.email` | `string` | +| `colors.icons.github` | `string` | +| `colors.icons.twitter` | `string` | +| `colors.subbertext` | `string` | +| `colors.subbesttext` | `string` | +| `colors.subtext` | `string` | +| `colors.text` | `string` | +| `fontH1` | `string` | +| `fontH1S` | `string` | +| `fontH2` | `string` | +| `fontSize` | `string` | +| `fontSizeS` | `string` | +| `fontSizeXS` | `string` | +| `game` | `Object` | +| `game.bonuscolors` | `Object` | +| `game.bonuscolors.def` | `string` | +| `game.bonuscolors.energyCap` | `string` | +| `game.bonuscolors.energyGro` | `string` | +| `game.bonuscolors.range` | `string` | +| `game.bonuscolors.speed` | `string` | +| `game.canvasbg` | `string` | +| `game.fontSize` | `string` | +| `game.rangecolors` | `Object` | +| `game.rangecolors.color100` | `string` | +| `game.rangecolors.color25` | `string` | +| `game.rangecolors.color50` | `string` | +| `game.rangecolors.colorenergy` | `string` | +| `game.rangecolors.dash` | `string` | +| `game.rangecolors.dashenergy` | `string` | +| `game.styles` | `Object` | +| `game.styles.active` | `string` | +| `game.styles.animProps` | `string` | +| `game.terminalFontSize` | `string` | +| `game.terminalWidth` | `string` | +| `game.toolbarHeight` | `string` | +| `prefabs` | `Object` | +| `prefabs.noselect` | `FlattenSimpleInterpolation` | +| `screenSizeS` | `string` | +| `titleFont` | `string` | diff --git a/docs/modules/Frontend_Styles_tailwind_config.export_.md b/docs/modules/Frontend_Styles_tailwind_config.export_.md new file mode 100644 index 00000000..488eb20f --- /dev/null +++ b/docs/modules/Frontend_Styles_tailwind_config.export_.md @@ -0,0 +1,3 @@ +# Namespace: export= + +[Frontend/Styles/tailwind.config](Frontend_Styles_tailwind_config.md).export= diff --git a/docs/modules/Frontend_Styles_tailwind_config.md b/docs/modules/Frontend_Styles_tailwind_config.md new file mode 100644 index 00000000..adaa4a5f --- /dev/null +++ b/docs/modules/Frontend_Styles_tailwind_config.md @@ -0,0 +1,25 @@ +# Module: Frontend/Styles/tailwind.config + +## Table of contents + +### Namespaces + +- [export=](Frontend_Styles_tailwind_config.export_.md) + +### Properties + +- [export=](Frontend_Styles_tailwind_config.md#export=) + +## Properties + +### export= + +• **export=**: `Object` + +#### Type declaration + +| Name | Type | +| :--------- | :-------- | +| `plugins` | `never`[] | +| `theme` | `Object` | +| `variants` | `Object` | diff --git a/docs/modules/Frontend_Utils_AppHooks.md b/docs/modules/Frontend_Utils_AppHooks.md new file mode 100644 index 00000000..8d178ced --- /dev/null +++ b/docs/modules/Frontend_Utils_AppHooks.md @@ -0,0 +1,247 @@ +# Module: Frontend/Utils/AppHooks + +## Table of contents + +### Variables + +- [TopLevelDivProvider](Frontend_Utils_AppHooks.md#topleveldivprovider) +- [UIManagerProvider](Frontend_Utils_AppHooks.md#uimanagerprovider) + +### Functions + +- [useAccount](Frontend_Utils_AppHooks.md#useaccount) +- [useActiveArtifact](Frontend_Utils_AppHooks.md#useactiveartifact) +- [useControlDown](Frontend_Utils_AppHooks.md#usecontroldown) +- [useHoverPlanet](Frontend_Utils_AppHooks.md#usehoverplanet) +- [useLeaderboard](Frontend_Utils_AppHooks.md#useleaderboard) +- [useMyArtifacts](Frontend_Utils_AppHooks.md#usemyartifacts) +- [usePlanetArtifacts](Frontend_Utils_AppHooks.md#useplanetartifacts) +- [usePlanetInactiveArtifacts](Frontend_Utils_AppHooks.md#useplanetinactiveartifacts) +- [useSelectedArtifact](Frontend_Utils_AppHooks.md#useselectedartifact) +- [useSelectedPlanet](Frontend_Utils_AppHooks.md#useselectedplanet) +- [useTopLevelDiv](Frontend_Utils_AppHooks.md#usetopleveldiv) +- [useTwitter](Frontend_Utils_AppHooks.md#usetwitter) +- [useUIManager](Frontend_Utils_AppHooks.md#useuimanager) + +## Variables + +### TopLevelDivProvider + +• **TopLevelDivProvider**: `Provider`<`HTMLDivElement`\> + +--- + +### UIManagerProvider + +• **UIManagerProvider**: `Provider`<[`default`](../classes/Backend_GameLogic_GameUIManager.default.md)\> + +## Functions + +### useAccount + +▸ **useAccount**(`uiManager`): `EthAddress` \| `undefined` + +Get the currently used account on the client. + +#### Parameters + +| Name | Type | Description | +| :---------- | :----------------------------------------------------------------- | :------------------------ | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | instance of GameUIManager | + +#### Returns + +`EthAddress` \| `undefined` + +--- + +### useActiveArtifact + +▸ **useActiveArtifact**(`planet`, `uiManager`): `Artifact` \| `undefined` + +#### Parameters + +| Name | Type | +| :---------- | :--------------------------------------------------------------------------------- | +| `planet` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | + +#### Returns + +`Artifact` \| `undefined` + +--- + +### useControlDown + +▸ **useControlDown**(): `boolean` + +Return a bool that indicates if the control key is pressed. + +#### Returns + +`boolean` + +--- + +### useHoverPlanet + +▸ **useHoverPlanet**(`uiManager`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> + +Create a subscription to the currently hovering planet. + +#### Parameters + +| Name | Type | Description | +| :---------- | :----------------------------------------------------------------- | :------------------------ | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | instance of GameUIManager | + +#### Returns + +[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> + +--- + +### useLeaderboard + +▸ **useLeaderboard**(`poll?`): `Object` + +Loads the leaderboard + +#### Parameters + +| Name | Type | +| :----- | :---------------------- | +| `poll` | `number` \| `undefined` | + +#### Returns + +`Object` + +| Name | Type | +| :------------ | :--------------------------- | +| `error` | `Error` \| `undefined` | +| `leaderboard` | `Leaderboard` \| `undefined` | + +--- + +### useMyArtifacts + +▸ **useMyArtifacts**(`uiManager`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Map`<`ArtifactId`, `Artifact`\> \| `undefined`\> + +#### Parameters + +| Name | Type | +| :---------- | :----------------------------------------------------------------- | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | + +#### Returns + +[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Map`<`ArtifactId`, `Artifact`\> \| `undefined`\> + +--- + +### usePlanetArtifacts + +▸ **usePlanetArtifacts**(`planet`, `uiManager`): `Artifact`[] + +#### Parameters + +| Name | Type | +| :---------- | :--------------------------------------------------------------------------------- | +| `planet` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | + +#### Returns + +`Artifact`[] + +--- + +### usePlanetInactiveArtifacts + +▸ **usePlanetInactiveArtifacts**(`planet`, `uiManager`): `Artifact`[] + +#### Parameters + +| Name | Type | +| :---------- | :--------------------------------------------------------------------------------- | +| `planet` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | + +#### Returns + +`Artifact`[] + +--- + +### useSelectedArtifact + +▸ **useSelectedArtifact**(`uiManager`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Artifact` \| `undefined`\> + +Create a subscription to the currently selected artifact. + +#### Parameters + +| Name | Type | Description | +| :---------- | :----------------------------------------------------------------- | :------------------------ | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | instance of GameUIManager | + +#### Returns + +[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Artifact` \| `undefined`\> + +--- + +### useSelectedPlanet + +▸ **useSelectedPlanet**(`uiManager`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> + +Create a subscription to the currently selected planet. + +#### Parameters + +| Name | Type | Description | +| :---------- | :----------------------------------------------------------------- | :------------------------ | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | instance of GameUIManager | + +#### Returns + +[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> + +--- + +### useTopLevelDiv + +▸ **useTopLevelDiv**(): `HTMLDivElement` + +#### Returns + +`HTMLDivElement` + +--- + +### useTwitter + +▸ **useTwitter**(`account`, `uiManager`): `string` \| `undefined` + +#### Parameters + +| Name | Type | +| :---------- | :----------------------------------------------------------------- | +| `account` | `EthAddress` \| `undefined` | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | + +#### Returns + +`string` \| `undefined` + +--- + +### useUIManager + +▸ **useUIManager**(): [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) + +#### Returns + +[`default`](../classes/Backend_GameLogic_GameUIManager.default.md) diff --git a/docs/modules/Frontend_Utils_BrowserChecks.md b/docs/modules/Frontend_Utils_BrowserChecks.md new file mode 100644 index 00000000..c48dcd78 --- /dev/null +++ b/docs/modules/Frontend_Utils_BrowserChecks.md @@ -0,0 +1,76 @@ +# Module: Frontend/Utils/BrowserChecks + +## Table of contents + +### Enumerations + +- [Incompatibility](../enums/Frontend_Utils_BrowserChecks.Incompatibility.md) + +### Functions + +- [hasTouchscreen](Frontend_Utils_BrowserChecks.md#hastouchscreen) +- [isBrave](Frontend_Utils_BrowserChecks.md#isbrave) +- [isChrome](Frontend_Utils_BrowserChecks.md#ischrome) +- [isFirefox](Frontend_Utils_BrowserChecks.md#isfirefox) +- [isMobileOrTablet](Frontend_Utils_BrowserChecks.md#ismobileortablet) +- [unsupportedFeatures](Frontend_Utils_BrowserChecks.md#unsupportedfeatures) + +## Functions + +### hasTouchscreen + +▸ `Const` **hasTouchscreen**(): `boolean` + +#### Returns + +`boolean` + +--- + +### isBrave + +▸ `Const` **isBrave**(): `Promise`<`boolean`\> + +#### Returns + +`Promise`<`boolean`\> + +--- + +### isChrome + +▸ `Const` **isChrome**(): `boolean` + +#### Returns + +`boolean` + +--- + +### isFirefox + +▸ `Const` **isFirefox**(): `boolean` + +#### Returns + +`boolean` + +--- + +### isMobileOrTablet + +▸ `Const` **isMobileOrTablet**(): `boolean` + +#### Returns + +`boolean` + +--- + +### unsupportedFeatures + +▸ `Const` **unsupportedFeatures**(): `Promise`<[`Incompatibility`](../enums/Frontend_Utils_BrowserChecks.Incompatibility.md)[]\> + +#### Returns + +`Promise`<[`Incompatibility`](../enums/Frontend_Utils_BrowserChecks.Incompatibility.md)[]\> diff --git a/docs/modules/Frontend_Utils_EmitterHooks.md b/docs/modules/Frontend_Utils_EmitterHooks.md new file mode 100644 index 00000000..6704fb34 --- /dev/null +++ b/docs/modules/Frontend_Utils_EmitterHooks.md @@ -0,0 +1,104 @@ +# Module: Frontend/Utils/EmitterHooks + +## Table of contents + +### Functions + +- [useEmitterSubscribe](Frontend_Utils_EmitterHooks.md#useemittersubscribe) +- [useEmitterValue](Frontend_Utils_EmitterHooks.md#useemittervalue) +- [useKeyPressed](Frontend_Utils_EmitterHooks.md#usekeypressed) +- [useWrappedEmitter](Frontend_Utils_EmitterHooks.md#usewrappedemitter) + +## Functions + +### useEmitterSubscribe + +▸ **useEmitterSubscribe**<`T`\>(`emitter`, `callback`): `void` + +Execute something on emitter callback + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------------------------------ | :--------------------------- | +| `emitter` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`T`\> | `Monomitter` to subscribe to | +| `callback` | [`Callback`](Frontend_Utils_Monomitter.md#callback)<`T`\> | callback to subscribe | + +#### Returns + +`void` + +--- + +### useEmitterValue + +▸ **useEmitterValue**<`T`\>(`emitter`, `initialVal`): `T` + +Use returned value from an emitter + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | Description | +| :----------- | :------------------------------------------------------------ | :--------------------------- | +| `emitter` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`T`\> | `Monomitter` to subscribe to | +| `initialVal` | `T` | initial state value | + +#### Returns + +`T` + +--- + +### useKeyPressed + +▸ **useKeyPressed**(`keydown$`, `keyup$`): `boolean` + +Return a bool indicating if a key is pressed + +#### Parameters + +| Name | Type | Description | +| :--------- | :------------------------------------------------------------------------ | :----------------- | +| `keydown$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`KeyboardEvent`\> | keydown monomitter | +| `keyup$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`KeyboardEvent`\> | keyup monomitter | + +#### Returns + +`boolean` + +--- + +### useWrappedEmitter + +▸ **useWrappedEmitter**<`T`\>(`emitter`, `initialVal`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`T` \| `undefined`\> + +Use returned value from an emitter, and clone the reference - used to force an update to the UI + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | Description | +| :----------- | :--------------------------------------------------------------------------- | :--------------------------- | +| `emitter` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`T` \| `undefined`\> | `Monomitter` to subscribe to | +| `initialVal` | `T` \| `undefined` | initial state value | + +#### Returns + +[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`T` \| `undefined`\> diff --git a/docs/modules/Frontend_Utils_EmitterUtils.md b/docs/modules/Frontend_Utils_EmitterUtils.md new file mode 100644 index 00000000..5c756422 --- /dev/null +++ b/docs/modules/Frontend_Utils_EmitterUtils.md @@ -0,0 +1,194 @@ +# Module: Frontend/Utils/EmitterUtils + +## Table of contents + +### Interfaces + +- [Diff](../interfaces/Frontend_Utils_EmitterUtils.Diff.md) + +### Functions + +- [generateDiffEmitter](Frontend_Utils_EmitterUtils.md#generatediffemitter) +- [getArtifactId](Frontend_Utils_EmitterUtils.md#getartifactid) +- [getArtifactOwner](Frontend_Utils_EmitterUtils.md#getartifactowner) +- [getDisposableEmitter](Frontend_Utils_EmitterUtils.md#getdisposableemitter) +- [getObjectWithIdFromMap](Frontend_Utils_EmitterUtils.md#getobjectwithidfrommap) +- [getPlanetId](Frontend_Utils_EmitterUtils.md#getplanetid) +- [getPlanetOwner](Frontend_Utils_EmitterUtils.md#getplanetowner) +- [setObjectSyncState](Frontend_Utils_EmitterUtils.md#setobjectsyncstate) + +## Functions + +### generateDiffEmitter + +▸ **generateDiffEmitter**<`Obj`\>(`emitter`): [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<[`Diff`](../interfaces/Frontend_Utils_EmitterUtils.Diff.md)<`Obj`\> \| `undefined`\> + +Wraps an existing emitter and emits an event with the current and previous values + +#### Type parameters + +| Name | +| :---- | +| `Obj` | + +#### Parameters + +| Name | Type | Description | +| :-------- | :----------------------------------------------------------------------------- | :--------------------------------- | +| `emitter` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Obj` \| `undefined`\> | an emitter announcing game objects | + +#### Returns + +[`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<[`Diff`](../interfaces/Frontend_Utils_EmitterUtils.Diff.md)<`Obj`\> \| `undefined`\> + +--- + +### getArtifactId + +▸ `Const` **getArtifactId**(`a`): `ArtifactId` + +#### Parameters + +| Name | Type | +| :--- | :--------- | +| `a` | `Artifact` | + +#### Returns + +`ArtifactId` + +--- + +### getArtifactOwner + +▸ `Const` **getArtifactOwner**(`a`): `EthAddress` + +#### Parameters + +| Name | Type | +| :--- | :--------- | +| `a` | `Artifact` | + +#### Returns + +`EthAddress` + +--- + +### getDisposableEmitter + +▸ **getDisposableEmitter**<`Obj`, `Id`\>(`objMap`, `objId`, `objUpdated$`): [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Obj` \| `undefined`\> + +Create a monomitter to emit objects with a given id from a cached map of ids to objects. Not intended for re-use + +#### Type parameters + +| Name | +| :---- | +| `Obj` | +| `Id` | + +#### Parameters + +| Name | Type | Description | +| :------------ | :------------------------------------------------------------- | :------------------------------------------------------ | +| `objMap` | `Map`<`Id`, `Obj`\> | the cached map of `` | +| `objId` | `Id` | the object id to select | +| `objUpdated$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Id`\> | emitter which indicates when an object has been updated | + +#### Returns + +[`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Obj` \| `undefined`\> + +--- + +### getObjectWithIdFromMap + +▸ **getObjectWithIdFromMap**<`Obj`, `Id`\>(`objMap`, `objId$`, `objUpdated$`): [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Obj` \| `undefined`\> + +Create a monomitter to emit objects with a given id from a cached map of ids to objects. + +#### Type parameters + +| Name | +| :---- | +| `Obj` | +| `Id` | + +#### Parameters + +| Name | Type | Description | +| :------------ | :---------------------------------------------------------------------------- | :------------------------------------------------------ | +| `objMap` | `Map`<`Id`, `Obj`\> | the cached map of `` | +| `objId$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Id` \| `undefined`\> | the object id to select | +| `objUpdated$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Id`\> | emitter which indicates when an object has been updated | + +#### Returns + +[`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Obj` \| `undefined`\> + +--- + +### getPlanetId + +▸ `Const` **getPlanetId**(`p`): `LocationId` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `p` | `Planet` | + +#### Returns + +`LocationId` + +--- + +### getPlanetOwner + +▸ `Const` **getPlanetOwner**(`p`): `EthAddress` + +#### Parameters + +| Name | Type | +| :--- | :------- | +| `p` | `Planet` | + +#### Returns + +`EthAddress` + +--- + +### setObjectSyncState + +▸ **setObjectSyncState**<`Obj`, `Id`\>(`objectMap`, `myObjectMap`, `address`, `objUpdated$`, `myObjListUpdated$`, `getId`, `getOwner`, `obj`): `void` + +Utility function for setting a game entity into our internal data stores in a way +that is friendly to our application. Caches the object into a map, syncs it to a map +of our owned objects, and also emits a message that the object was updated. + +#### Type parameters + +| Name | +| :---- | +| `Obj` | +| `Id` | + +#### Parameters + +| Name | Type | Description | +| :------------------ | :---------------------------------------------------------------------------- | :---------------------------------------------- | +| `objectMap` | `Map`<`Id`, `Obj`\> | map that caches known objects | +| `myObjectMap` | `Map`<`Id`, `Obj`\> | map that caches known objects owned by the user | +| `address` | `EthAddress` \| `undefined` | the user's account address | +| `objUpdated$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Id`\> | emitter for announcing object updates | +| `myObjListUpdated$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Map`<`Id`, `Obj`\>\> | - | +| `getId` | (`o`: `Obj`) => `Id` | - | +| `getOwner` | (`o`: `Obj`) => `EthAddress` | - | +| `obj` | `Obj` | the object we want to cache | + +#### Returns + +`void` diff --git a/docs/modules/Frontend_Utils_Hats.md b/docs/modules/Frontend_Utils_Hats.md new file mode 100644 index 00000000..31bc7bdf --- /dev/null +++ b/docs/modules/Frontend_Utils_Hats.md @@ -0,0 +1,71 @@ +# Module: Frontend/Utils/Hats + +## Table of contents + +### Enumerations + +- [HatType](../enums/Frontend_Utils_Hats.HatType.md) + +### Type aliases + +- [Hat](Frontend_Utils_Hats.md#hat) + +### Variables + +- [hats](Frontend_Utils_Hats.md#hats) + +### Functions + +- [hatFromType](Frontend_Utils_Hats.md#hatfromtype) +- [hatTypeFromHash](Frontend_Utils_Hats.md#hattypefromhash) + +## Type aliases + +### Hat + +Ƭ **Hat**: `Object` + +#### Type declaration + +| Name | Type | +| :------------ | :--------- | +| `bottomLayer` | `string`[] | +| `topLayer` | `string`[] | + +## Variables + +### hats + +• `Const` **hats**: `Record`<[`HatType`](../enums/Frontend_Utils_Hats.HatType.md), [`Hat`](Frontend_Utils_Hats.md#hat)\> + +## Functions + +### hatFromType + +▸ `Const` **hatFromType**(`type`): [`Hat`](Frontend_Utils_Hats.md#hat) + +#### Parameters + +| Name | Type | +| :----- | :--------------------------------------------------- | +| `type` | [`HatType`](../enums/Frontend_Utils_Hats.HatType.md) | + +#### Returns + +[`Hat`](Frontend_Utils_Hats.md#hat) + +--- + +### hatTypeFromHash + +▸ `Const` **hatTypeFromHash**(`hash`): [`HatType`](../enums/Frontend_Utils_Hats.HatType.md) + +#### Parameters + +| Name | Type | +| :----- | :----------- | +| `hash` | `LocationId` | + +#### Returns + +[`HatType`](../enums/Frontend_Utils_Hats.HatType.md) diff --git a/docs/modules/frontend_utils_hooks.md b/docs/modules/Frontend_Utils_Hooks.md similarity index 54% rename from docs/modules/frontend_utils_hooks.md rename to docs/modules/Frontend_Utils_Hooks.md index 22a6b250..ca9aa071 100644 --- a/docs/modules/frontend_utils_hooks.md +++ b/docs/modules/Frontend_Utils_Hooks.md @@ -4,13 +4,13 @@ ### Functions -- [usePoll](frontend_utils_hooks.md#usepoll) +- [usePoll](Frontend_Utils_Hooks.md#usepoll) ## Functions ### usePoll -▸ **usePoll**(`cb`: () => _void_, `poll?`: _number_ \| _undefined_, `execFirst?`: _boolean_ \| _undefined_): _void_ +▸ **usePoll**(`cb`, `poll?`, `execFirst?`): `void` Executes the callback `cb` every `poll` ms @@ -18,8 +18,10 @@ Executes the callback `cb` every `poll` ms | Name | Type | Description | | :---------- | :----------------------- | :------------------------------------------------- | -| `cb` | () => _void_ | callback to execute | -| `poll` | _number_ \| _undefined_ | ms to poll | -| `execFirst` | _boolean_ \| _undefined_ | if we want to execute the callback on first render | +| `cb` | () => `void` | callback to execute | +| `poll` | `number` \| `undefined` | ms to poll | +| `execFirst` | `boolean` \| `undefined` | if we want to execute the callback on first render | -**Returns:** _void_ +#### Returns + +`void` diff --git a/docs/modules/Frontend_Utils_KeyEmitters.md b/docs/modules/Frontend_Utils_KeyEmitters.md new file mode 100644 index 00000000..88152312 --- /dev/null +++ b/docs/modules/Frontend_Utils_KeyEmitters.md @@ -0,0 +1,34 @@ +# Module: Frontend/Utils/KeyEmitters + +## Table of contents + +### Variables + +- [ctrlDown$](Frontend_Utils_KeyEmitters.md#ctrldown$) +- [ctrlUp$](Frontend_Utils_KeyEmitters.md#ctrlup$) +- [escapeDown$](Frontend_Utils_KeyEmitters.md#escapedown$) +- [keyUp$](Frontend_Utils_KeyEmitters.md#keyup$) + +## Variables + +### ctrlDown$ + +• `Const` **ctrlDown$**: [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`KeyboardEvent`\> + +--- + +### ctrlUp$ + +• `Const` **ctrlUp$**: [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`KeyboardEvent`\> + +--- + +### escapeDown$ + +• `Const` **escapeDown$**: [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`KeyboardEvent`\> + +--- + +### keyUp$ + +• `Const` **keyUp$**: [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`string`\>\> diff --git a/docs/modules/frontend_utils_monomitter.md b/docs/modules/Frontend_Utils_Monomitter.md similarity index 59% rename from docs/modules/frontend_utils_monomitter.md rename to docs/modules/Frontend_Utils_Monomitter.md index edfe8c17..6515f466 100644 --- a/docs/modules/frontend_utils_monomitter.md +++ b/docs/modules/Frontend_Utils_Monomitter.md @@ -4,22 +4,19 @@ ### Type aliases -- [Callback](frontend_utils_monomitter.md#callback) -- [Monomitter](frontend_utils_monomitter.md#monomitter) -- [Subscription](frontend_utils_monomitter.md#subscription) +- [Callback](Frontend_Utils_Monomitter.md#callback) +- [Monomitter](Frontend_Utils_Monomitter.md#monomitter) +- [Subscription](Frontend_Utils_Monomitter.md#subscription) ### Functions -- [monomitter](frontend_utils_monomitter.md#monomitter) +- [monomitter](Frontend_Utils_Monomitter.md#monomitter) ## Type aliases ### Callback -Ƭ **Callback**: (`o`: T) => _void_ - -Typed single pub / sub pattern, inspired by: -https://github.com/loilo/monomitter/blob/master/monomitter.mjs +Ƭ **Callback**<`T`\>: (`o`: `T`) => `void` #### Type parameters @@ -29,21 +26,26 @@ https://github.com/loilo/monomitter/blob/master/monomitter.mjs #### Type declaration -▸ (`o`: T): _void_ +▸ (`o`): `void` -#### Parameters +Typed single pub / sub pattern, inspired by: +https://github.com/loilo/monomitter/blob/master/monomitter.mjs + +##### Parameters | Name | Type | | :--- | :--- | -| `o` | T | +| `o` | `T` | -**Returns:** _void_ +##### Returns + +`void` --- ### Monomitter -Ƭ **Monomitter**: _object_ +Ƭ **Monomitter**<`T`\>: `Object` #### Type parameters @@ -53,29 +55,29 @@ https://github.com/loilo/monomitter/blob/master/monomitter.mjs #### Type declaration -| Name | Type | -| :---------- | :----------------------------------------------------------------------------------------------------------------------------- | -| `clear` | () => _void_ | -| `publish` | (`o`: T) => _void_ | -| `subscribe` | (`cb`: [_Callback_](frontend_utils_monomitter.md#callback)) => [_Subscription_](frontend_utils_monomitter.md#subscription) | +| Name | Type | +| :---------- | :------------------------------------------------------------------------------------------------------------------------------- | +| `clear` | () => `void` | +| `publish` | (`o`: `T`) => `void` | +| `subscribe` | (`cb`: [`Callback`](Frontend_Utils_Monomitter.md#callback)<`T`\>) => [`Subscription`](Frontend_Utils_Monomitter.md#subscription) | --- ### Subscription -Ƭ **Subscription**: _object_ +Ƭ **Subscription**: `Object` #### Type declaration | Name | Type | | :------------ | :----------- | -| `unsubscribe` | () => _void_ | +| `unsubscribe` | () => `void` | ## Functions ### monomitter -▸ **monomitter**(`emitLatestOnSubscribe?`: _boolean_): [_Monomitter_](frontend_utils_monomitter.md#monomitter) +▸ **monomitter**<`T`\>(`emitLatestOnSubscribe?`): [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`T`\> Constructs a new event emitter, whose purpose is to emit values of the given type. @@ -89,6 +91,8 @@ Constructs a new event emitter, whose purpose is to emit values of the given typ | Name | Type | Default value | Description | | :---------------------- | :-------- | :------------ | :----------------------------------------------------------------------------------------------- | -| `emitLatestOnSubscribe` | _boolean_ | false | if this is true, upon subscription immediately emit the most recently set value, if there is one | +| `emitLatestOnSubscribe` | `boolean` | `false` | if this is true, upon subscription immediately emit the most recently set value, if there is one | + +#### Returns -**Returns:** [_Monomitter_](frontend_utils_monomitter.md#monomitter) +[`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`T`\> diff --git a/docs/modules/Frontend_Utils_SettingsHooks.md b/docs/modules/Frontend_Utils_SettingsHooks.md new file mode 100644 index 00000000..b2b99f09 --- /dev/null +++ b/docs/modules/Frontend_Utils_SettingsHooks.md @@ -0,0 +1,287 @@ +# Module: Frontend/Utils/SettingsHooks + +## Table of contents + +### Enumerations + +- [AutoGasSetting](../enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md) +- [Setting](../enums/Frontend_Utils_SettingsHooks.Setting.md) + +### Variables + +- [ALL_AUTO_GAS_SETTINGS](Frontend_Utils_SettingsHooks.md#all_auto_gas_settings) +- [settingChanged$](Frontend_Utils_SettingsHooks.md#settingchanged$) + +### Functions + +- [BooleanSetting](Frontend_Utils_SettingsHooks.md#booleansetting) +- [MultiSelectSetting](Frontend_Utils_SettingsHooks.md#multiselectsetting) +- [getBooleanSetting](Frontend_Utils_SettingsHooks.md#getbooleansetting) +- [getLocalStorageSettingKey](Frontend_Utils_SettingsHooks.md#getlocalstoragesettingkey) +- [getNumberSetting](Frontend_Utils_SettingsHooks.md#getnumbersetting) +- [getSetting](Frontend_Utils_SettingsHooks.md#getsetting) +- [pollSetting](Frontend_Utils_SettingsHooks.md#pollsetting) +- [setBooleanSetting](Frontend_Utils_SettingsHooks.md#setbooleansetting) +- [setNumberSetting](Frontend_Utils_SettingsHooks.md#setnumbersetting) +- [setSetting](Frontend_Utils_SettingsHooks.md#setsetting) +- [useBooleanSetting](Frontend_Utils_SettingsHooks.md#usebooleansetting) +- [useSetting](Frontend_Utils_SettingsHooks.md#usesetting) + +## Variables + +### ALL_AUTO_GAS_SETTINGS + +• `Const` **ALL_AUTO_GAS_SETTINGS**: [`AutoGasSetting`](../enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md)[] + +--- + +### settingChanged$ + +• `Const` **settingChanged$**: [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<[`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md)\> + +Whenever a setting changes, we publish the setting's name to this event emitter. + +## Functions + +### BooleanSetting + +▸ **BooleanSetting**(`__namedParameters`): `Element` + +React component that renders a checkbox representing the current value of this particular +setting, interpreting its value as a boolean. Allows the player to click on the checkbox to +toggle the setting. Toggling the setting both notifies the rest of the game that the given +setting was changed, and also saves it to local storage. + +#### Parameters + +| Name | Type | +| :-------------------------------------- | :----------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | +| `__namedParameters.settingDescription?` | `string` | +| `__namedParameters.uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | + +#### Returns + +`Element` + +--- + +### MultiSelectSetting + +▸ **MultiSelectSetting**(`__namedParameters`): `Element` + +UI that is kept in-sync with a particular setting which allows you to set that setting to one of +several options. + +#### Parameters + +| Name | Type | +| :---------------------------- | :----------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.labels` | `string`[] | +| `__namedParameters.setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | +| `__namedParameters.values` | `string`[] | + +#### Returns + +`Element` + +--- + +### getBooleanSetting + +▸ **getBooleanSetting**(`account`, `setting`): `boolean` + +Loads from local storage, and interprets as a boolean the setting with the given name. + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------ | +| `account` | `EthAddress` \| `undefined` | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | + +#### Returns + +`boolean` + +--- + +### getLocalStorageSettingKey + +▸ **getLocalStorageSettingKey**(`account`, `setting`): `string` + +Each setting is stored in local storage. Each account has their own setting. + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------ | +| `account` | `EthAddress` \| `undefined` | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | + +#### Returns + +`string` + +--- + +### getNumberSetting + +▸ **getNumberSetting**(`account`, `setting`): `number` + +Loads from local storage, and interprets as a boolean the setting with the given name. + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------ | +| `account` | `EthAddress` \| `undefined` | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | + +#### Returns + +`number` + +--- + +### getSetting + +▸ **getSetting**(`account`, `setting`): `string` + +Read the local storage setting from local storage. + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------ | +| `account` | `EthAddress` \| `undefined` | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | + +#### Returns + +`string` + +--- + +### pollSetting + +▸ **pollSetting**(`account`, `setting`): `ReturnType` + +Some settings can be set from another window. In particular, the 'auto accept transaction' +setting is set from multiple windows. As a result, the local storage setting can get out of sync +with the in memory setting. To fix this, we can poll the given setting from local storage, and +notify the rest of the game that it changed if it changed. + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------ | +| `account` | `EthAddress` \| `undefined` | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | + +#### Returns + +`ReturnType` + +--- + +### setBooleanSetting + +▸ **setBooleanSetting**(`account`, `setting`, `value`): `void` + +Save the given setting to local storage. Publish an event to [settingChanged$](Frontend_Utils_SettingsHooks.md#settingchanged$). + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------ | +| `account` | `EthAddress` \| `undefined` | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | +| `value` | `boolean` | + +#### Returns + +`void` + +--- + +### setNumberSetting + +▸ **setNumberSetting**(`account`, `setting`, `value`): `void` + +Save the given setting to local storage. Publish an event to [settingChanged$](Frontend_Utils_SettingsHooks.md#settingchanged$). + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------ | +| `account` | `EthAddress` \| `undefined` | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | +| `value` | `number` | + +#### Returns + +`void` + +--- + +### setSetting + +▸ **setSetting**(`account`, `setting`, `value`): `void` + +Save the given setting to local storage. Publish an event to [settingChanged$](Frontend_Utils_SettingsHooks.md#settingchanged$). + +#### Parameters + +| Name | Type | +| :-------- | :------------------------------------------------------------ | +| `account` | `EthAddress` \| `undefined` | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | +| `value` | `string` | + +#### Returns + +`void` + +--- + +### useBooleanSetting + +▸ **useBooleanSetting**(`uiManager`, `setting`): [`boolean`, (`newValue`: `boolean`) => `void`] + +Allows a react component to subscribe to changes to the given setting, interpreting its value as +a boolean. + +#### Parameters + +| Name | Type | +| :---------- | :-------------------------------------------------------------------------------- | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) \| `undefined` | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | + +#### Returns + +[`boolean`, (`newValue`: `boolean`) => `void`] + +--- + +### useSetting + +▸ **useSetting**(`uiManager`, `setting`): [`string`, (`newValue`: `string` \| `undefined`) => `void`] + +Allows a react component to subscribe to changes to the give setting. + +#### Parameters + +| Name | Type | +| :---------- | :-------------------------------------------------------------------------------- | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) \| `undefined` | +| `setting` | [`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md) | + +#### Returns + +[`string`, (`newValue`: `string` \| `undefined`) => `void`] diff --git a/docs/modules/Frontend_Utils_ShortcutConstants.md b/docs/modules/Frontend_Utils_ShortcutConstants.md new file mode 100644 index 00000000..2f746760 --- /dev/null +++ b/docs/modules/Frontend_Utils_ShortcutConstants.md @@ -0,0 +1,62 @@ +# Module: Frontend/Utils/ShortcutConstants + +## Table of contents + +### Variables + +- [TOGGLE_ARTIFACTS_DEX_PANE](Frontend_Utils_ShortcutConstants.md#toggle_artifacts_dex_pane) +- [TOGGLE_BROADCAST_PANE](Frontend_Utils_ShortcutConstants.md#toggle_broadcast_pane) +- [TOGGLE_DIAGNOSTICS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_diagnostics_pane) +- [TOGGLE_HAT_PANE](Frontend_Utils_ShortcutConstants.md#toggle_hat_pane) +- [TOGGLE_PLANET_ARTIFACTS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_planet_artifacts_pane) +- [TOGGLE_PLANET_DETAILS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_planet_details_pane) +- [TOGGLE_PLANET_DEX_PANE](Frontend_Utils_ShortcutConstants.md#toggle_planet_dex_pane) +- [TOGGLE_UPGRADES_PANE](Frontend_Utils_ShortcutConstants.md#toggle_upgrades_pane) + +## Variables + +### TOGGLE_ARTIFACTS_DEX_PANE + +• `Const` **TOGGLE_ARTIFACTS_DEX_PANE**: `"e"` + +--- + +### TOGGLE_BROADCAST_PANE + +• `Const` **TOGGLE_BROADCAST_PANE**: `"b"` + +--- + +### TOGGLE_DIAGNOSTICS_PANE + +• `Const` **TOGGLE_DIAGNOSTICS_PANE**: `"p"` + +--- + +### TOGGLE_HAT_PANE + +• `Const` **TOGGLE_HAT_PANE**: `"h"` + +--- + +### TOGGLE_PLANET_ARTIFACTS_PANE + +• `Const` **TOGGLE_PLANET_ARTIFACTS_PANE**: `"a"` + +--- + +### TOGGLE_PLANET_DETAILS_PANE + +• `Const` **TOGGLE_PLANET_DETAILS_PANE**: `"d"` + +--- + +### TOGGLE_PLANET_DEX_PANE + +• `Const` **TOGGLE_PLANET_DEX_PANE**: `"q"` + +--- + +### TOGGLE_UPGRADES_PANE + +• `Const` **TOGGLE_UPGRADES_PANE**: `"u"` diff --git a/docs/modules/Frontend_Utils_TerminalTypes.md b/docs/modules/Frontend_Utils_TerminalTypes.md new file mode 100644 index 00000000..2be452db --- /dev/null +++ b/docs/modules/Frontend_Utils_TerminalTypes.md @@ -0,0 +1,7 @@ +# Module: Frontend/Utils/TerminalTypes + +## Table of contents + +### Enumerations + +- [TerminalTextStyle](../enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md) diff --git a/docs/modules/frontend_utils_timeutils.md b/docs/modules/Frontend_Utils_TimeUtils.md similarity index 51% rename from docs/modules/frontend_utils_timeutils.md rename to docs/modules/Frontend_Utils_TimeUtils.md index 907e0f8a..36ef7974 100644 --- a/docs/modules/frontend_utils_timeutils.md +++ b/docs/modules/Frontend_Utils_TimeUtils.md @@ -4,18 +4,20 @@ ### Functions -- [formatDuration](frontend_utils_timeutils.md#formatduration) +- [formatDuration](Frontend_Utils_TimeUtils.md#formatduration) ## Functions ### formatDuration -▸ **formatDuration**(`durationMs`: _number_): _string_ +▸ **formatDuration**(`durationMs`): `string` #### Parameters | Name | Type | | :----------- | :------- | -| `durationMs` | _number_ | +| `durationMs` | `number` | -**Returns:** _string_ +#### Returns + +`string` diff --git a/docs/modules/Frontend_Utils_UIEmitter.md b/docs/modules/Frontend_Utils_UIEmitter.md new file mode 100644 index 00000000..b0d7ad91 --- /dev/null +++ b/docs/modules/Frontend_Utils_UIEmitter.md @@ -0,0 +1,11 @@ +# Module: Frontend/Utils/UIEmitter + +## Table of contents + +### Enumerations + +- [UIEmitterEvent](../enums/Frontend_Utils_UIEmitter.UIEmitterEvent.md) + +### Classes + +- [default](../classes/Frontend_Utils_UIEmitter.default.md) diff --git a/docs/modules/Frontend_Utils_constants.md b/docs/modules/Frontend_Utils_constants.md new file mode 100644 index 00000000..534df6d3 --- /dev/null +++ b/docs/modules/Frontend_Utils_constants.md @@ -0,0 +1,58 @@ +# Module: Frontend/Utils/constants + +## Table of contents + +### Enumerations + +- [GameWindowZIndex](../enums/Frontend_Utils_constants.GameWindowZIndex.md) + +### Variables + +- [BLOCK_EXPLORER_URL](Frontend_Utils_constants.md#block_explorer_url) +- [HAT_SIZES](Frontend_Utils_constants.md#hat_sizes) +- [LOCATION_ID_UB](Frontend_Utils_constants.md#location_id_ub) +- [MAX_CHUNK_SIZE](Frontend_Utils_constants.md#max_chunk_size) +- [MIN_CHUNK_SIZE](Frontend_Utils_constants.md#min_chunk_size) +- [XDAI_CHAIN_ID](Frontend_Utils_constants.md#xdai_chain_id) + +## Variables + +### BLOCK_EXPLORER_URL + +• `Const` **BLOCK_EXPLORER_URL**: `"https://blockscout.com/poa/xdai"` + +--- + +### HAT_SIZES + +• `Const` **HAT_SIZES**: `string`[] + +--- + +### LOCATION_ID_UB + +• `Const` **LOCATION_ID_UB**: `BigInteger` + +--- + +### MAX_CHUNK_SIZE + +• `Const` **MAX_CHUNK_SIZE**: `number` + +**`tutorial`** to speed up the game's background rendering code, it is possible to set this value to +be a higher power of two. This means that smaller chunks will be merged into larger chunks via +the algorithms implemented in {@link ChunkUtils}. + +{@code Math.floor(Math.pow(2, 16))} should be large enough for most. + +--- + +### MIN_CHUNK_SIZE + +• `Const` **MIN_CHUNK_SIZE**: `16` + +--- + +### XDAI_CHAIN_ID + +• `Const` **XDAI_CHAIN_ID**: `100` diff --git a/docs/modules/frontend_utils_createdefinedcontext.md b/docs/modules/Frontend_Utils_createDefinedContext.md similarity index 71% rename from docs/modules/frontend_utils_createdefinedcontext.md rename to docs/modules/Frontend_Utils_createDefinedContext.md index 5510154d..dd6fceb8 100644 --- a/docs/modules/frontend_utils_createdefinedcontext.md +++ b/docs/modules/Frontend_Utils_createDefinedContext.md @@ -4,13 +4,13 @@ ### Functions -- [createDefinedContext](frontend_utils_createdefinedcontext.md#createdefinedcontext) +- [createDefinedContext](Frontend_Utils_createDefinedContext.md#createdefinedcontext) ## Functions ### createDefinedContext -▸ **createDefinedContext**(): _ContextHookWithProvider_ +▸ **createDefinedContext**<`T`\>(): `ContextHookWithProvider`<`T`\> Return a hook and a provider which return a value that must be defined. Normally is difficult because `React.createContext()` defaults to `undefined`. @@ -23,4 +23,6 @@ because `React.createContext()` defaults to `undefined`. | :--- | | `T` | -**Returns:** _ContextHookWithProvider_ +#### Returns + +`ContextHookWithProvider`<`T`\> diff --git a/docs/modules/Frontend_Views_ArtifactLink.md b/docs/modules/Frontend_Views_ArtifactLink.md new file mode 100644 index 00000000..c57826ec --- /dev/null +++ b/docs/modules/Frontend_Views_ArtifactLink.md @@ -0,0 +1,26 @@ +# Module: Frontend/Views/ArtifactLink + +## Table of contents + +### Functions + +- [ArtifactLink](Frontend_Views_ArtifactLink.md#artifactlink) + +## Functions + +### ArtifactLink + +▸ **ArtifactLink**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------------- | :---------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | +| `__namedParameters.children` | `React.ReactNode` | +| `__namedParameters.setDetailsOpen` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_DFErrorBoundary.md b/docs/modules/Frontend_Views_DFErrorBoundary.md new file mode 100644 index 00000000..ab5e1faf --- /dev/null +++ b/docs/modules/Frontend_Views_DFErrorBoundary.md @@ -0,0 +1,7 @@ +# Module: Frontend/Views/DFErrorBoundary + +## Table of contents + +### Classes + +- [DFErrorBoundary](../classes/Frontend_Views_DFErrorBoundary.DFErrorBoundary.md) diff --git a/docs/modules/Frontend_Views_DarkForestTips.md b/docs/modules/Frontend_Views_DarkForestTips.md new file mode 100644 index 00000000..f4b1b44a --- /dev/null +++ b/docs/modules/Frontend_Views_DarkForestTips.md @@ -0,0 +1,28 @@ +# Module: Frontend/Views/DarkForestTips + +## Table of contents + +### Functions + +- [DarkForestTips](Frontend_Views_DarkForestTips.md#darkforesttips) +- [MakeDarkForestTips](Frontend_Views_DarkForestTips.md#makedarkforesttips) + +## Functions + +### DarkForestTips + +▸ **DarkForestTips**(): `Element` + +#### Returns + +`Element` + +--- + +### MakeDarkForestTips + +▸ **MakeDarkForestTips**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_EmojiPicker.md b/docs/modules/Frontend_Views_EmojiPicker.md new file mode 100644 index 00000000..5e26878f --- /dev/null +++ b/docs/modules/Frontend_Views_EmojiPicker.md @@ -0,0 +1,25 @@ +# Module: Frontend/Views/EmojiPicker + +## Table of contents + +### Functions + +- [EmojiPicker](Frontend_Views_EmojiPicker.md#emojipicker) + +## Functions + +### EmojiPicker + +▸ **EmojiPicker**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.emoji` | `string` \| `undefined` | +| `__namedParameters.setEmoji` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_EmojiPlanetNotification.md b/docs/modules/Frontend_Views_EmojiPlanetNotification.md new file mode 100644 index 00000000..f88d0f2e --- /dev/null +++ b/docs/modules/Frontend_Views_EmojiPlanetNotification.md @@ -0,0 +1,24 @@ +# Module: Frontend/Views/EmojiPlanetNotification + +## Table of contents + +### Functions + +- [EmojiPlanetNotification](Frontend_Views_EmojiPlanetNotification.md#emojiplanetnotification) + +## Functions + +### EmojiPlanetNotification + +▸ **EmojiPlanetNotification**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------- | :--------------------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.wrapper` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_views_gamewindowlayout.md b/docs/modules/Frontend_Views_GameWindowLayout.md similarity index 50% rename from docs/modules/frontend_views_gamewindowlayout.md rename to docs/modules/Frontend_Views_GameWindowLayout.md index e8deaaef..e6ec43cb 100644 --- a/docs/modules/frontend_views_gamewindowlayout.md +++ b/docs/modules/Frontend_Views_GameWindowLayout.md @@ -4,12 +4,14 @@ ### Functions -- [GameWindowLayout](frontend_views_gamewindowlayout.md#gamewindowlayout) +- [GameWindowLayout](Frontend_Views_GameWindowLayout.md#gamewindowlayout) ## Functions ### GameWindowLayout -▸ **GameWindowLayout**(): _Element_ +▸ **GameWindowLayout**(): `Element` -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_GenericErrorBoundary.md b/docs/modules/Frontend_Views_GenericErrorBoundary.md new file mode 100644 index 00000000..aaff26d5 --- /dev/null +++ b/docs/modules/Frontend_Views_GenericErrorBoundary.md @@ -0,0 +1,7 @@ +# Module: Frontend/Views/GenericErrorBoundary + +## Table of contents + +### Classes + +- [GenericErrorBoundary](../classes/Frontend_Views_GenericErrorBoundary.GenericErrorBoundary.md) diff --git a/docs/modules/Frontend_Views_Leaderboard.md b/docs/modules/Frontend_Views_Leaderboard.md new file mode 100644 index 00000000..76d58463 --- /dev/null +++ b/docs/modules/Frontend_Views_Leaderboard.md @@ -0,0 +1,17 @@ +# Module: Frontend/Views/Leaderboard + +## Table of contents + +### Functions + +- [LeadboardDisplay](Frontend_Views_Leaderboard.md#leadboarddisplay) + +## Functions + +### LeadboardDisplay + +▸ **LeadboardDisplay**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_MenuBar.md b/docs/modules/Frontend_Views_MenuBar.md new file mode 100644 index 00000000..e1a9db0c --- /dev/null +++ b/docs/modules/Frontend_Views_MenuBar.md @@ -0,0 +1,37 @@ +# Module: Frontend/Views/MenuBar + +## Table of contents + +### Variables + +- [MenuBar](Frontend_Views_MenuBar.md#menubar) + +### Functions + +- [MenuBarSection](Frontend_Views_MenuBar.md#menubarsection) + +## Variables + +### MenuBar + +• `Const` **MenuBar**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +Left bar (with all the modal icons) + +## Functions + +### MenuBarSection + +▸ **MenuBarSection**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------- | :---------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | +| `__namedParameters.collapsible?` | `boolean` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_ModalIcon.md b/docs/modules/Frontend_Views_ModalIcon.md new file mode 100644 index 00000000..1ae0ccfc --- /dev/null +++ b/docs/modules/Frontend_Views_ModalIcon.md @@ -0,0 +1,313 @@ +# Module: Frontend/Views/ModalIcon + +## Table of contents + +### Functions + +- [ModalAccountIcon](Frontend_Views_ModalIcon.md#modalaccounticon) +- [ModalArtifactIcon](Frontend_Views_ModalIcon.md#modalartifacticon) +- [ModalArtifactsConversationIcon](Frontend_Views_ModalIcon.md#modalartifactsconversationicon) +- [ModalHatIcon](Frontend_Views_ModalIcon.md#modalhaticon) +- [ModalHelpIcon](Frontend_Views_ModalIcon.md#modalhelpicon) +- [ModalIcon](Frontend_Views_ModalIcon.md#modalicon) +- [ModalLeaderboardIcon](Frontend_Views_ModalIcon.md#modalleaderboardicon) +- [ModalMapShareIcon](Frontend_Views_ModalIcon.md#modalmapshareicon) +- [ModalPlanetDetailsIcon](Frontend_Views_ModalIcon.md#modalplanetdetailsicon) +- [ModalPlanetDexIcon](Frontend_Views_ModalIcon.md#modalplanetdexicon) +- [ModalPluginIcon](Frontend_Views_ModalIcon.md#modalpluginicon) +- [ModalSettingsIcon](Frontend_Views_ModalIcon.md#modalsettingsicon) +- [ModalTwitterBroadcastIcon](Frontend_Views_ModalIcon.md#modaltwitterbroadcasticon) +- [ModalTwitterVerifyIcon](Frontend_Views_ModalIcon.md#modaltwitterverifyicon) +- [ModalUpgradeDetailsIcon](Frontend_Views_ModalIcon.md#modalupgradedetailsicon) +- [ModalWithdrawIcon](Frontend_Views_ModalIcon.md#modalwithdrawicon) +- [ModalYourArtifactsIcon](Frontend_Views_ModalIcon.md#modalyourartifactsicon) + +## Functions + +### ModalAccountIcon + +▸ **ModalAccountIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalArtifactIcon + +▸ **ModalArtifactIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalArtifactsConversationIcon + +▸ **ModalArtifactsConversationIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalHatIcon + +▸ **ModalHatIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalHelpIcon + +▸ **ModalHelpIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalIcon + +▸ **ModalIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------ | :------------------------------------------------------------ | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.modal` | [`ModalName`](../enums/Frontend_Views_ModalPane.ModalName.md) | + +#### Returns + +`Element` + +--- + +### ModalLeaderboardIcon + +▸ **ModalLeaderboardIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalMapShareIcon + +▸ **ModalMapShareIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalPlanetDetailsIcon + +▸ **ModalPlanetDetailsIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalPlanetDexIcon + +▸ **ModalPlanetDexIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalPluginIcon + +▸ **ModalPluginIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalSettingsIcon + +▸ **ModalSettingsIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalTwitterBroadcastIcon + +▸ **ModalTwitterBroadcastIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalTwitterVerifyIcon + +▸ **ModalTwitterVerifyIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalUpgradeDetailsIcon + +▸ **ModalUpgradeDetailsIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalWithdrawIcon + +▸ **ModalWithdrawIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` + +--- + +### ModalYourArtifactsIcon + +▸ **ModalYourArtifactsIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_ModalPane.md b/docs/modules/Frontend_Views_ModalPane.md new file mode 100644 index 00000000..3862b61a --- /dev/null +++ b/docs/modules/Frontend_Views_ModalPane.md @@ -0,0 +1,47 @@ +# Module: Frontend/Views/ModalPane + +## Table of contents + +### Enumerations + +- [ModalName](../enums/Frontend_Views_ModalPane.ModalName.md) + +### Type aliases + +- [ModalHook](Frontend_Views_ModalPane.md#modalhook) + +### Variables + +- [RECOMMENDED_WIDTH](Frontend_Views_ModalPane.md#recommended_width) + +### Functions + +- [ModalPane](Frontend_Views_ModalPane.md#modalpane) + +## Type aliases + +### ModalHook + +Ƭ **ModalHook**: [`Hook`](_types_global_GlobalTypes.md#hook)<`boolean`\> + +## Variables + +### RECOMMENDED_WIDTH + +• `Const` **RECOMMENDED_WIDTH**: `"450px"` + +## Functions + +### ModalPane + +▸ **ModalPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__namedParameters` | [`PaneProps`](Frontend_Components_GameWindowComponents.md#paneprops) & { `backgroundColor?`: `string` ; `borderColor?`: `string` ; `hideClose?`: `boolean` ; `hook`: [`Hook`](_types_global_GlobalTypes.md#hook)<`boolean`\> ; `name?`: [`ModalName`](../enums/Frontend_Views_ModalPane.ModalName.md) ; `noPadding?`: `boolean` ; `style?`: `React.CSSProperties` ; `titlebarColor?`: `string` ; `width?`: `string` ; `helpContent?`: () => `ReactNode` } | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_Notifications.md b/docs/modules/Frontend_Views_Notifications.md new file mode 100644 index 00000000..16b5d844 --- /dev/null +++ b/docs/modules/Frontend_Views_Notifications.md @@ -0,0 +1,17 @@ +# Module: Frontend/Views/Notifications + +## Table of contents + +### Functions + +- [NotificationsPane](Frontend_Views_Notifications.md#notificationspane) + +## Functions + +### NotificationsPane + +▸ **NotificationsPane**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_OwnedPluginView.md b/docs/modules/Frontend_Views_OwnedPluginView.md new file mode 100644 index 00000000..7d3679be --- /dev/null +++ b/docs/modules/Frontend_Views_OwnedPluginView.md @@ -0,0 +1,52 @@ +# Module: Frontend/Views/OwnedPluginView + +## Table of contents + +### Classes + +- [OwnedPluginView](../classes/Frontend_Views_OwnedPluginView.OwnedPluginView.md) + +### Type aliases + +- [OpenEditor](Frontend_Views_OwnedPluginView.md#openeditor) + +### Variables + +- [Actions](Frontend_Views_OwnedPluginView.md#actions) + +## Type aliases + +### OpenEditor + +Ƭ **OpenEditor**: (`pluginId`: [`PluginId`](Backend_Plugins_SerializedPlugin.md#pluginid)) => () => `void` + +#### Type declaration + +▸ (`pluginId`): () => `void` + +Should + +1. open an editor for this plugin +2. return a function that closes the editor. + +##### Parameters + +| Name | Type | +| :--------- | :--------------------------------------------------------- | +| `pluginId` | [`PluginId`](Backend_Plugins_SerializedPlugin.md#pluginid) | + +##### Returns + +`fn` + +▸ (): `void` + +##### Returns + +`void` + +## Variables + +### Actions + +• `Const` **Actions**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> diff --git a/docs/modules/Frontend_Views_PlanetCard.md b/docs/modules/Frontend_Views_PlanetCard.md new file mode 100644 index 00000000..fa84b366 --- /dev/null +++ b/docs/modules/Frontend_Views_PlanetCard.md @@ -0,0 +1,26 @@ +# Module: Frontend/Views/PlanetCard + +## Table of contents + +### Functions + +- [PlanetCard](Frontend_Views_PlanetCard.md#planetcard) + +## Functions + +### PlanetCard + +▸ **PlanetCard**(`__namedParameters`): `Element` + +Preview basic planet information - used in `PlanetContextPane` and `HoverPlanetPane` + +#### Parameters + +| Name | Type | +| :-------------------------------- | :--------------------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planetWrapper` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_PlanetCardComponents.md b/docs/modules/Frontend_Views_PlanetCardComponents.md new file mode 100644 index 00000000..4f992854 --- /dev/null +++ b/docs/modules/Frontend_Views_PlanetCardComponents.md @@ -0,0 +1,165 @@ +# Module: Frontend/Views/PlanetCardComponents + +## Table of contents + +### Variables + +- [ArtifactSection](Frontend_Views_PlanetCardComponents.md#artifactsection) +- [BigStatCell](Frontend_Views_PlanetCardComponents.md#bigstatcell) +- [DestroyedMarker](Frontend_Views_PlanetCardComponents.md#destroyedmarker) +- [IconsWrapper](Frontend_Views_PlanetCardComponents.md#iconswrapper) +- [PlanetTag](Frontend_Views_PlanetCardComponents.md#planettag) +- [PreviewSection](Frontend_Views_PlanetCardComponents.md#previewsection) +- [Small](Frontend_Views_PlanetCardComponents.md#small) +- [StatCell](Frontend_Views_PlanetCardComponents.md#statcell) +- [StatRow](Frontend_Views_PlanetCardComponents.md#statrow) +- [StatSection](Frontend_Views_PlanetCardComponents.md#statsection) +- [StyledPlanetCard](Frontend_Views_PlanetCardComponents.md#styledplanetcard) +- [StyledStatIcon](Frontend_Views_PlanetCardComponents.md#styledstaticon) +- [TitleBar](Frontend_Views_PlanetCardComponents.md#titlebar) +- [TopRow](Frontend_Views_PlanetCardComponents.md#toprow) + +### Functions + +- [PCStatIcon](Frontend_Views_PlanetCardComponents.md#pcstaticon) +- [PlanetActiveArtifact](Frontend_Views_PlanetCardComponents.md#planetactiveartifact) +- [RowTip](Frontend_Views_PlanetCardComponents.md#rowtip) + +## Variables + +### ArtifactSection + +• `Const` **ArtifactSection**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### BigStatCell + +• `Const` **BigStatCell**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### DestroyedMarker + +• `Const` **DestroyedMarker**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### IconsWrapper + +• `Const` **IconsWrapper**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### PlanetTag + +• `Const` **PlanetTag**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### PreviewSection + +• `Const` **PreviewSection**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### Small + +• `Const` **Small**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### StatCell + +• `Const` **StatCell**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### StatRow + +• `Const` **StatRow**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### StatSection + +• `Const` **StatSection**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### StyledPlanetCard + +• `Const` **StyledPlanetCard**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### StyledStatIcon + +• `Const` **StyledStatIcon**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### TitleBar + +• `Const` **TitleBar**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### TopRow + +• `Const` **TopRow**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +## Functions + +### PCStatIcon + +▸ **PCStatIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | +| `__namedParameters.planet` | `Planet` \| `undefined` | +| `__namedParameters.stat` | [`StatIdx`](../enums/_types_global_GlobalTypes.StatIdx.md) | + +#### Returns + +`Element` + +--- + +### PlanetActiveArtifact + +▸ **PlanetActiveArtifact**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | +| `__namedParameters.planet` | `Planet` \| `undefined` | + +#### Returns + +`Element` + +--- + +### RowTip + +▸ `Const` **RowTip**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `ReactNode` | +| `__namedParameters.name` | [`TooltipName`](../enums/Frontend_Game_WindowManager.TooltipName.md) | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_PlanetLink.md b/docs/modules/Frontend_Views_PlanetLink.md new file mode 100644 index 00000000..195f1b92 --- /dev/null +++ b/docs/modules/Frontend_Views_PlanetLink.md @@ -0,0 +1,25 @@ +# Module: Frontend/Views/PlanetLink + +## Table of contents + +### Functions + +- [PlanetLink](Frontend_Views_PlanetLink.md#planetlink) + +## Functions + +### PlanetLink + +▸ **PlanetLink**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :---------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | +| `__namedParameters.planet` | `Planet` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_PlanetNotifications.md b/docs/modules/Frontend_Views_PlanetNotifications.md new file mode 100644 index 00000000..b04949b7 --- /dev/null +++ b/docs/modules/Frontend_Views_PlanetNotifications.md @@ -0,0 +1,61 @@ +# Module: Frontend/Views/PlanetNotifications + +## Table of contents + +### Enumerations + +- [PlanetNotifType](../enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md) + +### Type aliases + +- [PlanetNotifHooks](Frontend_Views_PlanetNotifications.md#planetnotifhooks) + +### Functions + +- [PlanetNotifications](Frontend_Views_PlanetNotifications.md#planetnotifications) +- [getNotifsForPlanet](Frontend_Views_PlanetNotifications.md#getnotifsforplanet) + +## Type aliases + +### PlanetNotifHooks + +Ƭ **PlanetNotifHooks**: `Object` + +#### Type declaration + +| Name | Type | +| :--------------- | :--------------------------------------------------- | +| `upgradeDetHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +## Functions + +### PlanetNotifications + +▸ **PlanetNotifications**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__namedParameters` | { `notifs`: [`PlanetNotifType`](../enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md)[] ; `wrapper`: [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> } & [`PlanetNotifHooks`](Frontend_Views_PlanetNotifications.md#planetnotifhooks) | + +#### Returns + +`Element` + +--- + +### getNotifsForPlanet + +▸ **getNotifsForPlanet**(`planet`, `currentBlockNumber`): [`PlanetNotifType`](../enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md)[] + +#### Parameters + +| Name | Type | +| :------------------- | :---------------------- | +| `planet` | `Planet` \| `undefined` | +| `currentBlockNumber` | `number` \| `undefined` | + +#### Returns + +[`PlanetNotifType`](../enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md)[] diff --git a/docs/modules/Frontend_Views_SendResources.md b/docs/modules/Frontend_Views_SendResources.md new file mode 100644 index 00000000..09d06275 --- /dev/null +++ b/docs/modules/Frontend_Views_SendResources.md @@ -0,0 +1,24 @@ +# Module: Frontend/Views/SendResources + +## Table of contents + +### Functions + +- [SendResources](Frontend_Views_SendResources.md#sendresources) + +## Functions + +### SendResources + +▸ **SendResources**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------------- | :--------------------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planetWrapper` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | + +#### Returns + +`Element` diff --git a/docs/modules/frontend_views_share.md b/docs/modules/Frontend_Views_Share.md similarity index 64% rename from docs/modules/frontend_views_share.md rename to docs/modules/Frontend_Views_Share.md index 706fdbdd..34dbce9d 100644 --- a/docs/modules/frontend_views_share.md +++ b/docs/modules/Frontend_Views_Share.md @@ -4,17 +4,17 @@ ### Interfaces -- [ShareProps](../interfaces/frontend_views_share.shareprops.md) +- [ShareProps](../interfaces/Frontend_Views_Share.ShareProps.md) ### Functions -- [Share](frontend_views_share.md#share) +- [Share](Frontend_Views_Share.md#share) ## Functions ### Share -▸ **Share**(`props`: [_ShareProps_](../interfaces/frontend_views_share.shareprops.md)): _Element_ +▸ **Share**<`T`\>(`props`): `Element` Helper component that allows you to load data from the contract, as if it was viewed from a particular account. Allows you to switch accounts. Just pass in: @@ -32,8 +32,10 @@ viewed from a particular account. Allows you to switch accounts. Just pass in: #### Parameters -| Name | Type | -| :------ | :------------------------------------------------------------------- | -| `props` | [_ShareProps_](../interfaces/frontend_views_share.shareprops.md) | +| Name | Type | +| :------ | :--------------------------------------------------------------------- | +| `props` | [`ShareProps`](../interfaces/Frontend_Views_Share.ShareProps.md)<`T`\> | -**Returns:** _Element_ +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_SortableTable.md b/docs/modules/Frontend_Views_SortableTable.md new file mode 100644 index 00000000..ea431d41 --- /dev/null +++ b/docs/modules/Frontend_Views_SortableTable.md @@ -0,0 +1,34 @@ +# Module: Frontend/Views/SortableTable + +## Table of contents + +### Functions + +- [SortableTable](Frontend_Views_SortableTable.md#sortabletable) + +## Functions + +### SortableTable + +▸ **SortableTable**<`T`\>(`__namedParameters`): `Element` + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | +| :-------------------------------- | :----------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.alignments?` | (`"r"` \| `"c"` \| `"l"`)[] | +| `__namedParameters.columns` | (`t`: `T`, `i`: `number`) => `React.ReactNode`[] | +| `__namedParameters.headers` | `React.ReactNode`[] | +| `__namedParameters.rows` | `T`[] | +| `__namedParameters.sortFunctions` | (`left`: `T`, `right`: `T`) => `number`[] | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_TabbedView.md b/docs/modules/Frontend_Views_TabbedView.md new file mode 100644 index 00000000..482b1569 --- /dev/null +++ b/docs/modules/Frontend_Views_TabbedView.md @@ -0,0 +1,29 @@ +# Module: Frontend/Views/TabbedView + +## Table of contents + +### Functions + +- [TabbedView](Frontend_Views_TabbedView.md#tabbedview) + +## Functions + +### TabbedView + +▸ **TabbedView**(`__namedParameters`): `Element` + +This component allows you to render several tabs of content. Each tab can be selected for viewing +by clicking on its corresponding tab button. Useful for displaying lots of slightly different but +related information to the user. + +#### Parameters + +| Name | Type | +| :------------------------------ | :--------- | +| `__namedParameters` | `Object` | +| `__namedParameters.tabTitles` | `string`[] | +| `__namedParameters.tabContents` | | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_Table.md b/docs/modules/Frontend_Views_Table.md new file mode 100644 index 00000000..5b470ef1 --- /dev/null +++ b/docs/modules/Frontend_Views_Table.md @@ -0,0 +1,36 @@ +# Module: Frontend/Views/Table + +## Table of contents + +### Functions + +- [Table](Frontend_Views_Table.md#table) + +## Functions + +### Table + +▸ **Table**<`T`\>(`__namedParameters`): `Element` + +React api for creating tables. + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | Description | +| :------------------------------- | :----------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `__namedParameters` | `Object` | - | +| `__namedParameters.alignments?` | (`"r"` \| `"c"` \| `"l"`)[] | optional, one per column, specifies that the text-alignment in that cell is either right, center, or left, represented by the characters 'r', 'c', and 'l' | +| `__namedParameters.columns` | (`t`: `T`, `i`: `number`) => `React.ReactNode`[] | functions, one per column, that convert a row into the react representation of that row's column's value. | +| `__namedParameters.headerStyle?` | `React.CSSProperties` | - | +| `__namedParameters.headers` | `React.ReactNode`[] | required (for now) array of strings that head each column | +| `__namedParameters.rows` | `T`[] | rows of an arbitrary type | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_Terminal.md b/docs/modules/Frontend_Views_Terminal.md new file mode 100644 index 00000000..4f7b72bc --- /dev/null +++ b/docs/modules/Frontend_Views_Terminal.md @@ -0,0 +1,18 @@ +# Module: Frontend/Views/Terminal + +## Table of contents + +### Interfaces + +- [TerminalHandle](../interfaces/Frontend_Views_Terminal.TerminalHandle.md) +- [TerminalProps](../interfaces/Frontend_Views_Terminal.TerminalProps.md) + +### Variables + +- [Terminal](Frontend_Views_Terminal.md#terminal) + +## Variables + +### Terminal + +• `Const` **Terminal**: `ForwardRefExoticComponent`<[`TerminalProps`](../interfaces/Frontend_Views_Terminal.TerminalProps.md) & `RefAttributes`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\>\> diff --git a/docs/modules/Frontend_Views_TopBar.md b/docs/modules/Frontend_Views_TopBar.md new file mode 100644 index 00000000..62c601ec --- /dev/null +++ b/docs/modules/Frontend_Views_TopBar.md @@ -0,0 +1,27 @@ +# Module: Frontend/Views/TopBar + +## Table of contents + +### Variables + +- [TOP_BAR_HEIGHT](Frontend_Views_TopBar.md#top_bar_height) + +### Functions + +- [TopBar](Frontend_Views_TopBar.md#topbar) + +## Variables + +### TOP_BAR_HEIGHT + +• `Const` **TOP_BAR_HEIGHT**: `"2.5em"` + +## Functions + +### TopBar + +▸ **TopBar**(): `Element` + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_UpgradePreview.md b/docs/modules/Frontend_Views_UpgradePreview.md new file mode 100644 index 00000000..7d250bb8 --- /dev/null +++ b/docs/modules/Frontend_Views_UpgradePreview.md @@ -0,0 +1,27 @@ +# Module: Frontend/Views/UpgradePreview + +## Table of contents + +### Functions + +- [UpgradePreview](Frontend_Views_UpgradePreview.md#upgradepreview) + +## Functions + +### UpgradePreview + +▸ **UpgradePreview**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------ | :--------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.branchName` | `UpgradeBranchName` \| `undefined` | +| `__namedParameters.cantUpgrade` | `boolean` | +| `__namedParameters.planet` | `Planet` \| `undefined` | +| `__namedParameters.upgrade` | `Upgrade` \| `undefined` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Views_WithdrawSilver.md b/docs/modules/Frontend_Views_WithdrawSilver.md new file mode 100644 index 00000000..28c79959 --- /dev/null +++ b/docs/modules/Frontend_Views_WithdrawSilver.md @@ -0,0 +1,24 @@ +# Module: Frontend/Views/WithdrawSilver + +## Table of contents + +### Functions + +- [WithdrawSilver](Frontend_Views_WithdrawSilver.md#withdrawsilver) + +## Functions + +### WithdrawSilver + +▸ **WithdrawSilver**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------- | :--------------------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.wrapper` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | + +#### Returns + +`Element` diff --git a/docs/modules/_types_darkforest_api_ChunkStoreTypes.md b/docs/modules/_types_darkforest_api_ChunkStoreTypes.md new file mode 100644 index 00000000..92e57ef8 --- /dev/null +++ b/docs/modules/_types_darkforest_api_ChunkStoreTypes.md @@ -0,0 +1,30 @@ +# Module: \_types/darkforest/api/ChunkStoreTypes + +## Table of contents + +### Interfaces + +- [ChunkStore](../interfaces/_types_darkforest_api_ChunkStoreTypes.ChunkStore.md) +- [PersistedChunk](../interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedChunk.md) +- [PersistedLocation](../interfaces/_types_darkforest_api_ChunkStoreTypes.PersistedLocation.md) + +### Type aliases + +- [BucketId](_types_darkforest_api_ChunkStoreTypes.md#bucketid) +- [ChunkId](_types_darkforest_api_ChunkStoreTypes.md#chunkid) + +## Type aliases + +### BucketId + +Ƭ **BucketId**: `string` & { `__value__`: `never` } + +one of "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + +--- + +### ChunkId + +Ƭ **ChunkId**: `string` & { `__value__`: `never` } + +Don't worry about the values here. Never base code off the values here. PLEASE. diff --git a/docs/modules/_types_darkforest_api_ContractsAPITypes.md b/docs/modules/_types_darkforest_api_ContractsAPITypes.md new file mode 100644 index 00000000..e3279d25 --- /dev/null +++ b/docs/modules/_types_darkforest_api_ContractsAPITypes.md @@ -0,0 +1,76 @@ +# Module: \_types/darkforest/api/ContractsAPITypes + +## Table of contents + +### Enumerations + +- [ContractEvent](../enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md) +- [ContractsAPIEvent](../enums/_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md) +- [InitArgIdxs](../enums/_types_darkforest_api_ContractsAPITypes.InitArgIdxs.md) +- [MoveArgIdxs](../enums/_types_darkforest_api_ContractsAPITypes.MoveArgIdxs.md) +- [PlanetEventType](../enums/_types_darkforest_api_ContractsAPITypes.PlanetEventType.md) +- [UpgradeArgIdxs](../enums/_types_darkforest_api_ContractsAPITypes.UpgradeArgIdxs.md) +- [ZKArgIdx](../enums/_types_darkforest_api_ContractsAPITypes.ZKArgIdx.md) + +### Interfaces + +- [ContractConstants](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) + +### Type aliases + +- [ClientMockchainData](_types_darkforest_api_ContractsAPITypes.md#clientmockchaindata) +- [DepositArtifactArgs](_types_darkforest_api_ContractsAPITypes.md#depositartifactargs) +- [MoveArgs](_types_darkforest_api_ContractsAPITypes.md#moveargs) +- [PlanetTypeWeights](_types_darkforest_api_ContractsAPITypes.md#planettypeweights) +- [PlanetTypeWeightsByLevel](_types_darkforest_api_ContractsAPITypes.md#planettypeweightsbylevel) +- [PlanetTypeWeightsBySpaceType](_types_darkforest_api_ContractsAPITypes.md#planettypeweightsbyspacetype) +- [UpgradeArgs](_types_darkforest_api_ContractsAPITypes.md#upgradeargs) +- [WithdrawArtifactArgs](_types_darkforest_api_ContractsAPITypes.md#withdrawartifactargs) + +## Type aliases + +### ClientMockchainData + +Ƭ **ClientMockchainData**: `null` \| `undefined` \| `number` \| `string` \| `boolean` \| `EthersBN` \| [`ClientMockchainData`](_types_darkforest_api_ContractsAPITypes.md#clientmockchaindata)[] \| { [key in string \| number]: ClientMockchainData} + +--- + +### DepositArtifactArgs + +Ƭ **DepositArtifactArgs**: [`string`, `string`] + +--- + +### MoveArgs + +Ƭ **MoveArgs**: [[`string`, `string`], [[`string`, `string`], [`string`, `string`]], [`string`, `string`], [`string`, `string`, `string`, `string`, `string`, `string`, `string`, `string`, `string`, `string`, `string`, `string`, `string`]] + +--- + +### PlanetTypeWeights + +Ƭ **PlanetTypeWeights**: [`number`, `number`, `number`, `number`, `number`] + +--- + +### PlanetTypeWeightsByLevel + +Ƭ **PlanetTypeWeightsByLevel**: [[`PlanetTypeWeights`](_types_darkforest_api_ContractsAPITypes.md#planettypeweights), [`PlanetTypeWeights`](_types_darkforest_api_ContractsAPITypes.md#planettypeweights), [`PlanetTypeWeights`](_types_darkforest_api_ContractsAPITypes.md#planettypeweights), [`PlanetTypeWeights`](_types_darkforest_api_ContractsAPITypes.md#planettypeweights), [`PlanetTypeWeights`](_types_darkforest_api_ContractsAPITypes.md#planettypeweights), [`PlanetTypeWeights`](_types_darkforest_api_ContractsAPITypes.md#planettypeweights), [`PlanetTypeWeights`](_types_darkforest_api_ContractsAPITypes.md#planettypeweights), [`PlanetTypeWeights`](_types_darkforest_api_ContractsAPITypes.md#planettypeweights), [`PlanetTypeWeights`](_types_darkforest_api_ContractsAPITypes.md#planettypeweights), [`PlanetTypeWeights`](_types_darkforest_api_ContractsAPITypes.md#planettypeweights)] + +--- + +### PlanetTypeWeightsBySpaceType + +Ƭ **PlanetTypeWeightsBySpaceType**: [[`PlanetTypeWeightsByLevel`](_types_darkforest_api_ContractsAPITypes.md#planettypeweightsbylevel), [`PlanetTypeWeightsByLevel`](_types_darkforest_api_ContractsAPITypes.md#planettypeweightsbylevel), [`PlanetTypeWeightsByLevel`](_types_darkforest_api_ContractsAPITypes.md#planettypeweightsbylevel), [`PlanetTypeWeightsByLevel`](_types_darkforest_api_ContractsAPITypes.md#planettypeweightsbylevel)] + +--- + +### UpgradeArgs + +Ƭ **UpgradeArgs**: [`string`, `string`] + +--- + +### WithdrawArtifactArgs + +Ƭ **WithdrawArtifactArgs**: [`string`, `string`] diff --git a/docs/modules/_types_darkforest_api_utilityserverapitypes.md b/docs/modules/_types_darkforest_api_UtilityServerAPITypes.md similarity index 50% rename from docs/modules/_types_darkforest_api_utilityserverapitypes.md rename to docs/modules/_types_darkforest_api_UtilityServerAPITypes.md index bb3c3640..58625219 100644 --- a/docs/modules/_types_darkforest_api_utilityserverapitypes.md +++ b/docs/modules/_types_darkforest_api_UtilityServerAPITypes.md @@ -4,12 +4,14 @@ ### Type aliases -- [AddressTwitterMap](_types_darkforest_api_utilityserverapitypes.md#addresstwittermap) +- [AddressTwitterMap](_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap) ## Type aliases ### AddressTwitterMap -Ƭ **AddressTwitterMap**: _object_ +Ƭ **AddressTwitterMap**: `Object` -#### Type declaration +#### Index signature + +▪ [ethAddress: `string`]: `string` diff --git a/docs/modules/_types_darkforest_api_chunkstoretypes.md b/docs/modules/_types_darkforest_api_chunkstoretypes.md deleted file mode 100644 index cc627025..00000000 --- a/docs/modules/_types_darkforest_api_chunkstoretypes.md +++ /dev/null @@ -1,30 +0,0 @@ -# Module: \_types/darkforest/api/ChunkStoreTypes - -## Table of contents - -### Interfaces - -- [ChunkStore](../interfaces/_types_darkforest_api_chunkstoretypes.chunkstore.md) -- [PersistedChunk](../interfaces/_types_darkforest_api_chunkstoretypes.persistedchunk.md) -- [PersistedLocation](../interfaces/_types_darkforest_api_chunkstoretypes.persistedlocation.md) - -### Type aliases - -- [BucketId](_types_darkforest_api_chunkstoretypes.md#bucketid) -- [ChunkId](_types_darkforest_api_chunkstoretypes.md#chunkid) - -## Type aliases - -### BucketId - -Ƭ **BucketId**: _string_ & { `__value__`: _never_ } - -one of "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - ---- - -### ChunkId - -Ƭ **ChunkId**: _string_ & { `__value__`: _never_ } - -Don't worry about the values here. Never base code off the values here. PLEASE. diff --git a/docs/modules/_types_darkforest_api_contractsapitypes.md b/docs/modules/_types_darkforest_api_contractsapitypes.md deleted file mode 100644 index bb5239e4..00000000 --- a/docs/modules/_types_darkforest_api_contractsapitypes.md +++ /dev/null @@ -1,76 +0,0 @@ -# Module: \_types/darkforest/api/ContractsAPITypes - -## Table of contents - -### Enumerations - -- [ContractEvent](../enums/_types_darkforest_api_contractsapitypes.contractevent.md) -- [ContractsAPIEvent](../enums/_types_darkforest_api_contractsapitypes.contractsapievent.md) -- [InitArgIdxs](../enums/_types_darkforest_api_contractsapitypes.initargidxs.md) -- [MoveArgIdxs](../enums/_types_darkforest_api_contractsapitypes.moveargidxs.md) -- [PlanetEventType](../enums/_types_darkforest_api_contractsapitypes.planeteventtype.md) -- [UpgradeArgIdxs](../enums/_types_darkforest_api_contractsapitypes.upgradeargidxs.md) -- [ZKArgIdx](../enums/_types_darkforest_api_contractsapitypes.zkargidx.md) - -### Interfaces - -- [ContractConstants](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) - -### Type aliases - -- [ClientMockchainData](_types_darkforest_api_contractsapitypes.md#clientmockchaindata) -- [DepositArtifactArgs](_types_darkforest_api_contractsapitypes.md#depositartifactargs) -- [MoveArgs](_types_darkforest_api_contractsapitypes.md#moveargs) -- [PlanetTypeWeights](_types_darkforest_api_contractsapitypes.md#planettypeweights) -- [PlanetTypeWeightsByLevel](_types_darkforest_api_contractsapitypes.md#planettypeweightsbylevel) -- [PlanetTypeWeightsBySpaceType](_types_darkforest_api_contractsapitypes.md#planettypeweightsbyspacetype) -- [UpgradeArgs](_types_darkforest_api_contractsapitypes.md#upgradeargs) -- [WithdrawArtifactArgs](_types_darkforest_api_contractsapitypes.md#withdrawartifactargs) - -## Type aliases - -### ClientMockchainData - -Ƭ **ClientMockchainData**: `null` \| _undefined_ \| _number_ \| _string_ \| _boolean_ \| EthersBN \| [_ClientMockchainData_](_types_darkforest_api_contractsapitypes.md#clientmockchaindata)[] \| { [key in string \| number]: ClientMockchainData} - ---- - -### DepositArtifactArgs - -Ƭ **DepositArtifactArgs**: [*string*, *string*] - ---- - -### MoveArgs - -Ƭ **MoveArgs**: [[*string*, *string*], [[*string*, *string*], [*string*, *string*]], [*string*, *string*], [*string*, *string*, *string*, *string*, *string*, *string*, *string*, *string*, *string*, *string*, *string*, *string*, *string*]] - ---- - -### PlanetTypeWeights - -Ƭ **PlanetTypeWeights**: [*number*, *number*, *number*, *number*, *number*] - ---- - -### PlanetTypeWeightsByLevel - -Ƭ **PlanetTypeWeightsByLevel**: [[_PlanetTypeWeights_](_types_darkforest_api_contractsapitypes.md#planettypeweights), [_PlanetTypeWeights_](_types_darkforest_api_contractsapitypes.md#planettypeweights), [_PlanetTypeWeights_](_types_darkforest_api_contractsapitypes.md#planettypeweights), [_PlanetTypeWeights_](_types_darkforest_api_contractsapitypes.md#planettypeweights), [_PlanetTypeWeights_](_types_darkforest_api_contractsapitypes.md#planettypeweights), [_PlanetTypeWeights_](_types_darkforest_api_contractsapitypes.md#planettypeweights), [_PlanetTypeWeights_](_types_darkforest_api_contractsapitypes.md#planettypeweights), [_PlanetTypeWeights_](_types_darkforest_api_contractsapitypes.md#planettypeweights), [_PlanetTypeWeights_](_types_darkforest_api_contractsapitypes.md#planettypeweights), [_PlanetTypeWeights_](_types_darkforest_api_contractsapitypes.md#planettypeweights)] - ---- - -### PlanetTypeWeightsBySpaceType - -Ƭ **PlanetTypeWeightsBySpaceType**: [[_PlanetTypeWeightsByLevel_](_types_darkforest_api_contractsapitypes.md#planettypeweightsbylevel), [_PlanetTypeWeightsByLevel_](_types_darkforest_api_contractsapitypes.md#planettypeweightsbylevel), [_PlanetTypeWeightsByLevel_](_types_darkforest_api_contractsapitypes.md#planettypeweightsbylevel), [_PlanetTypeWeightsByLevel_](_types_darkforest_api_contractsapitypes.md#planettypeweightsbylevel)] - ---- - -### UpgradeArgs - -Ƭ **UpgradeArgs**: [*string*, *string*] - ---- - -### WithdrawArtifactArgs - -Ƭ **WithdrawArtifactArgs**: [*string*, *string*] diff --git a/docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_contracts_abis___json_.md b/docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_contracts_abis___json_.md new file mode 100644 index 00000000..f18d2afa --- /dev/null +++ b/docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_contracts_abis___json_.md @@ -0,0 +1,15 @@ +# Namespace: "@darkforest_eth/contracts/abis/\*.json" + +[\_types/file-loader/FileWorkerTypes](_types_file_loader_FileWorkerTypes.md)."@darkforest_eth/contracts/abis/\*.json" + +## Table of contents + +### Variables + +- [default](_types_file_loader_FileWorkerTypes.__darkforest_eth_contracts_abis___json_.md#default) + +## Variables + +### default + +• `Const` **default**: `string` diff --git a/docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___wasm_.md b/docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___wasm_.md new file mode 100644 index 00000000..c8e21b50 --- /dev/null +++ b/docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___wasm_.md @@ -0,0 +1,15 @@ +# Namespace: "@darkforest_eth/snarks/\*.wasm" + +[\_types/file-loader/FileWorkerTypes](_types_file_loader_FileWorkerTypes.md)."@darkforest_eth/snarks/\*.wasm" + +## Table of contents + +### Variables + +- [default](_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___wasm_.md#default) + +## Variables + +### default + +• `Const` **default**: `string` diff --git a/docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___zkey_.md b/docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___zkey_.md new file mode 100644 index 00000000..1db556f6 --- /dev/null +++ b/docs/modules/_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___zkey_.md @@ -0,0 +1,15 @@ +# Namespace: "@darkforest_eth/snarks/\*.zkey" + +[\_types/file-loader/FileWorkerTypes](_types_file_loader_FileWorkerTypes.md)."@darkforest_eth/snarks/\*.zkey" + +## Table of contents + +### Variables + +- [default](_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___zkey_.md#default) + +## Variables + +### default + +• `Const` **default**: `string` diff --git a/docs/modules/_types_file_loader_fileworkertypes.md b/docs/modules/_types_file_loader_FileWorkerTypes.md similarity index 62% rename from docs/modules/_types_file_loader_fileworkertypes.md rename to docs/modules/_types_file_loader_FileWorkerTypes.md index bb6e634a..7a7465ae 100644 --- a/docs/modules/_types_file_loader_fileworkertypes.md +++ b/docs/modules/_types_file_loader_FileWorkerTypes.md @@ -4,6 +4,6 @@ ### Namespaces -- ["@darkforest_eth/contracts/abis/\*.json"](_types_file_loader_fileworkertypes.__darkforest_eth_contracts_abis___json_.md) -- ["@darkforest_eth/snarks/\*.wasm"](_types_file_loader_fileworkertypes.__darkforest_eth_snarks___wasm_.md) -- ["@darkforest_eth/snarks/\*.zkey"](_types_file_loader_fileworkertypes.__darkforest_eth_snarks___zkey_.md) +- ["@darkforest_eth/contracts/abis/\*.json"](_types_file_loader_FileWorkerTypes.__darkforest_eth_contracts_abis___json_.md) +- ["@darkforest_eth/snarks/\*.wasm"](_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___wasm_.md) +- ["@darkforest_eth/snarks/\*.zkey"](_types_file_loader_FileWorkerTypes.__darkforest_eth_snarks___zkey_.md) diff --git a/docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_contracts_abis___json_.md b/docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_contracts_abis___json_.md deleted file mode 100644 index b80374e9..00000000 --- a/docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_contracts_abis___json_.md +++ /dev/null @@ -1,15 +0,0 @@ -# Namespace: "@darkforest_eth/contracts/abis/\*.json" - -[\_types/file-loader/FileWorkerTypes](_types_file_loader_fileworkertypes.md)."@darkforest_eth/contracts/abis/\*.json" - -## Table of contents - -### Variables - -- [default](_types_file_loader_fileworkertypes.__darkforest_eth_contracts_abis___json_.md#default) - -## Variables - -### default - -• `Const` **default**: _string_ diff --git a/docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_snarks___wasm_.md b/docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_snarks___wasm_.md deleted file mode 100644 index 1c99bb7c..00000000 --- a/docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_snarks___wasm_.md +++ /dev/null @@ -1,15 +0,0 @@ -# Namespace: "@darkforest_eth/snarks/\*.wasm" - -[\_types/file-loader/FileWorkerTypes](_types_file_loader_fileworkertypes.md)."@darkforest_eth/snarks/\*.wasm" - -## Table of contents - -### Variables - -- [default](_types_file_loader_fileworkertypes.__darkforest_eth_snarks___wasm_.md#default) - -## Variables - -### default - -• `Const` **default**: _string_ diff --git a/docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_snarks___zkey_.md b/docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_snarks___zkey_.md deleted file mode 100644 index e5ba3bf8..00000000 --- a/docs/modules/_types_file_loader_fileworkertypes.__darkforest_eth_snarks___zkey_.md +++ /dev/null @@ -1,15 +0,0 @@ -# Namespace: "@darkforest_eth/snarks/\*.zkey" - -[\_types/file-loader/FileWorkerTypes](_types_file_loader_fileworkertypes.md)."@darkforest_eth/snarks/\*.zkey" - -## Table of contents - -### Variables - -- [default](_types_file_loader_fileworkertypes.__darkforest_eth_snarks___zkey_.md#default) - -## Variables - -### default - -• `Const` **default**: _string_ diff --git a/docs/modules/_types_global_GlobalTypes.md b/docs/modules/_types_global_GlobalTypes.md new file mode 100644 index 00000000..b3b7d610 --- /dev/null +++ b/docs/modules/_types_global_GlobalTypes.md @@ -0,0 +1,102 @@ +# Module: \_types/global/GlobalTypes + +## Table of contents + +### Enumerations + +- [StatIdx](../enums/_types_global_GlobalTypes.StatIdx.md) + +### Classes + +- [Chunk](../classes/_types_global_GlobalTypes.Chunk.md) + +### Interfaces + +- [MinerWorkerMessage](../interfaces/_types_global_GlobalTypes.MinerWorkerMessage.md) +- [Rectangle](../interfaces/_types_global_GlobalTypes.Rectangle.md) +- [RevealCountdownInfo](../interfaces/_types_global_GlobalTypes.RevealCountdownInfo.md) + +### Type aliases + +- [HashConfig](_types_global_GlobalTypes.md#hashconfig) +- [Hook](_types_global_GlobalTypes.md#hook) +- [Wormhole](_types_global_GlobalTypes.md#wormhole) + +### Functions + +- [isEmojiFlagMessage](_types_global_GlobalTypes.md#isemojiflagmessage) +- [isLocatable](_types_global_GlobalTypes.md#islocatable) + +## Type aliases + +### HashConfig + +Ƭ **HashConfig**: `Object` + +#### Type declaration + +| Name | Type | +| :------------------ | :-------- | +| `biomebaseKey` | `number` | +| `perlinLengthScale` | `number` | +| `perlinMirrorX` | `boolean` | +| `perlinMirrorY` | `boolean` | +| `planetHashKey` | `number` | +| `spaceTypeKey` | `number` | + +--- + +### Hook + +Ƭ **Hook**<`T`\>: [`T`, `Dispatch`<`SetStateAction`<`T`\>\>] + +#### Type parameters + +| Name | +| :--- | +| `T` | + +--- + +### Wormhole + +Ƭ **Wormhole**: `Object` + +#### Type declaration + +| Name | Type | +| :----- | :----------- | +| `from` | `LocationId` | +| `to` | `LocationId` | + +## Functions + +### isEmojiFlagMessage + +▸ **isEmojiFlagMessage**(`planetMessage`): planetMessage is PlanetMessage + +#### Parameters + +| Name | Type | +| :-------------- | :-------------------------- | +| `planetMessage` | `PlanetMessage`<`unknown`\> | + +#### Returns + +planetMessage is PlanetMessage + +--- + +### isLocatable + +▸ **isLocatable**(`planet`): planet is LocatablePlanet + +#### Parameters + +| Name | Type | +| :------- | :------- | +| `planet` | `Planet` | + +#### Returns + +planet is LocatablePlanet diff --git a/docs/modules/_types_global_globals.md b/docs/modules/_types_global_globals.md deleted file mode 100644 index af47e6a7..00000000 --- a/docs/modules/_types_global_globals.md +++ /dev/null @@ -1 +0,0 @@ -# Module: \_types/global/globals diff --git a/docs/modules/_types_global_globaltypes.md b/docs/modules/_types_global_globaltypes.md deleted file mode 100644 index 681a3ca1..00000000 --- a/docs/modules/_types_global_globaltypes.md +++ /dev/null @@ -1,98 +0,0 @@ -# Module: \_types/global/GlobalTypes - -## Table of contents - -### Enumerations - -- [StatIdx](../enums/_types_global_globaltypes.statidx.md) - -### Classes - -- [Chunk](../classes/_types_global_globaltypes.chunk.md) - -### Interfaces - -- [MinerWorkerMessage](../interfaces/_types_global_globaltypes.minerworkermessage.md) -- [Rectangle](../interfaces/_types_global_globaltypes.rectangle.md) -- [RevealCountdownInfo](../interfaces/_types_global_globaltypes.revealcountdowninfo.md) - -### Type aliases - -- [HashConfig](_types_global_globaltypes.md#hashconfig) -- [Hook](_types_global_globaltypes.md#hook) -- [Wormhole](_types_global_globaltypes.md#wormhole) - -### Functions - -- [isEmojiFlagMessage](_types_global_globaltypes.md#isemojiflagmessage) -- [isLocatable](_types_global_globaltypes.md#islocatable) - -## Type aliases - -### HashConfig - -Ƭ **HashConfig**: _object_ - -#### Type declaration - -| Name | Type | -| :------------------ | :-------- | -| `biomebaseKey` | _number_ | -| `perlinLengthScale` | _number_ | -| `perlinMirrorX` | _boolean_ | -| `perlinMirrorY` | _boolean_ | -| `planetHashKey` | _number_ | -| `spaceTypeKey` | _number_ | - ---- - -### Hook - -Ƭ **Hook**: [T, *Dispatch*\>] - -#### Type parameters - -| Name | -| :--- | -| `T` | - ---- - -### Wormhole - -Ƭ **Wormhole**: _object_ - -#### Type declaration - -| Name | Type | -| :----- | :--------- | -| `from` | LocationId | -| `to` | LocationId | - -## Functions - -### isEmojiFlagMessage - -▸ **isEmojiFlagMessage**(`planetMessage`: _PlanetMessage_): planetMessage is PlanetMessage - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------ | -| `planetMessage` | _PlanetMessage_ | - -**Returns:** planetMessage is PlanetMessage - ---- - -### isLocatable - -▸ **isLocatable**(`planet`: Planet): planet is LocatablePlanet - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** planet is LocatablePlanet diff --git a/docs/modules/_types_worker_loader_workertypes.md b/docs/modules/_types_worker_loader_WorkerTypes.md similarity index 56% rename from docs/modules/_types_worker_loader_workertypes.md rename to docs/modules/_types_worker_loader_WorkerTypes.md index 4923dde3..d6df9d78 100644 --- a/docs/modules/_types_worker_loader_workertypes.md +++ b/docs/modules/_types_worker_loader_WorkerTypes.md @@ -4,4 +4,4 @@ ### Classes -- [default](../classes/_types_worker_loader_workertypes.default.md) +- [default](../classes/_types_worker_loader_WorkerTypes.default.md) diff --git a/docs/modules/backend_gamelogic_arrivalutils.md b/docs/modules/backend_gamelogic_arrivalutils.md deleted file mode 100644 index 643cb4f0..00000000 --- a/docs/modules/backend_gamelogic_arrivalutils.md +++ /dev/null @@ -1,156 +0,0 @@ -# Module: Backend/GameLogic/ArrivalUtils - -## Table of contents - -### Functions - -- [applyUpgrade](backend_gamelogic_arrivalutils.md#applyupgrade) -- [arrive](backend_gamelogic_arrivalutils.md#arrive) -- [blocksLeftToProspectExpiration](backend_gamelogic_arrivalutils.md#blockslefttoprospectexpiration) -- [enoughEnergyToProspect](backend_gamelogic_arrivalutils.md#enoughenergytoprospect) -- [getEmojiMessage](backend_gamelogic_arrivalutils.md#getemojimessage) -- [isFindable](backend_gamelogic_arrivalutils.md#isfindable) -- [isProspectable](backend_gamelogic_arrivalutils.md#isprospectable) -- [prospectExpired](backend_gamelogic_arrivalutils.md#prospectexpired) -- [updatePlanetToTime](backend_gamelogic_arrivalutils.md#updateplanettotime) - -## Functions - -### applyUpgrade - -▸ `Const` **applyUpgrade**(`planet`: Planet, `upgrade`: Upgrade, `unApply?`: _boolean_): _void_ - -#### Parameters - -| Name | Type | Default value | -| :-------- | :-------- | :------------ | -| `planet` | Planet | - | -| `upgrade` | Upgrade | - | -| `unApply` | _boolean_ | false | - -**Returns:** _void_ - ---- - -### arrive - -▸ `Const` **arrive**(`toPlanet`: Planet, `artifactsOnPlanet`: Artifact[], `arrival`: QueuedArrival, `contractConstants`: [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md)): _void_ - -#### Parameters - -| Name | Type | -| :------------------ | :------------------------------------------------------------------------------------------------ | -| `toPlanet` | Planet | -| `artifactsOnPlanet` | Artifact[] | -| `arrival` | QueuedArrival | -| `contractConstants` | [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) | - -**Returns:** _void_ - ---- - -### blocksLeftToProspectExpiration - -▸ `Const` **blocksLeftToProspectExpiration**(`currentBlockNumber`: _number_, `prospectedBlockNumber?`: _number_): _number_ - -#### Parameters - -| Name | Type | -| :----------------------- | :------- | -| `currentBlockNumber` | _number_ | -| `prospectedBlockNumber?` | _number_ | - -**Returns:** _number_ - ---- - -### enoughEnergyToProspect - -▸ `Const` **enoughEnergyToProspect**(`p`: Planet): _boolean_ - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `p` | Planet | - -**Returns:** _boolean_ - ---- - -### getEmojiMessage - -▸ **getEmojiMessage**(`planet`: Planet \| _undefined_): _PlanetMessage_ \| _undefined_ - -**`todo`** ArrivalUtils has become a dumping ground for functions that should just live inside of a -`Planet` class. - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | Planet \| _undefined_ | - -**Returns:** _PlanetMessage_ \| _undefined_ - ---- - -### isFindable - -▸ `Const` **isFindable**(`planet`: Planet, `currentBlockNumber?`: _number_): _boolean_ - -#### Parameters - -| Name | Type | -| :-------------------- | :------- | -| `planet` | Planet | -| `currentBlockNumber?` | _number_ | - -**Returns:** _boolean_ - ---- - -### isProspectable - -▸ `Const` **isProspectable**(`planet`: Planet): _boolean_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _boolean_ - ---- - -### prospectExpired - -▸ `Const` **prospectExpired**(`currentBlockNumber`: _number_, `prospectedBlockNumber`: _number_): _boolean_ - -#### Parameters - -| Name | Type | -| :---------------------- | :------- | -| `currentBlockNumber` | _number_ | -| `prospectedBlockNumber` | _number_ | - -**Returns:** _boolean_ - ---- - -### updatePlanetToTime - -▸ `Const` **updatePlanetToTime**(`planet`: Planet, `planetArtifacts`: Artifact[], `atTimeMillis`: _number_, `contractConstants`: [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md), `setPlanet?`: (`p`: Planet) => _void_): _void_ - -#### Parameters - -| Name | Type | -| :------------------ | :------------------------------------------------------------------------------------------------ | -| `planet` | Planet | -| `planetArtifacts` | Artifact[] | -| `atTimeMillis` | _number_ | -| `contractConstants` | [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) | -| `setPlanet` | (`p`: Planet) => _void_ | - -**Returns:** _void_ diff --git a/docs/modules/backend_gamelogic_artifactutils.md b/docs/modules/backend_gamelogic_artifactutils.md deleted file mode 100644 index 910230fe..00000000 --- a/docs/modules/backend_gamelogic_artifactutils.md +++ /dev/null @@ -1,287 +0,0 @@ -# Module: Backend/GameLogic/ArtifactUtils - -## Table of contents - -### Enumerations - -- [ArtifactFileColor](../enums/backend_gamelogic_artifactutils.artifactfilecolor.md) - -### Interfaces - -- [RenderedArtifact](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md) - -### Variables - -- [RelicsList](backend_gamelogic_artifactutils.md#relicslist) - -### Functions - -- [artifactAvailableTimestamp](backend_gamelogic_artifactutils.md#artifactavailabletimestamp) -- [artifactBiomeName](backend_gamelogic_artifactutils.md#artifactbiomename) -- [artifactFileName](backend_gamelogic_artifactutils.md#artifactfilename) -- [artifactRoll](backend_gamelogic_artifactutils.md#artifactroll) -- [biomeName](backend_gamelogic_artifactutils.md#biomename) -- [getActivatedArtifact](backend_gamelogic_artifactutils.md#getactivatedartifact) -- [getActiveBlackDomain](backend_gamelogic_artifactutils.md#getactiveblackdomain) -- [getArtifactDebugName](backend_gamelogic_artifactutils.md#getartifactdebugname) -- [hasUnconfirmedArtifactTx](backend_gamelogic_artifactutils.md#hasunconfirmedartifacttx) -- [isActivated](backend_gamelogic_artifactutils.md#isactivated) -- [isAncient](backend_gamelogic_artifactutils.md#isancient) -- [isBasic](backend_gamelogic_artifactutils.md#isbasic) -- [isRelic](backend_gamelogic_artifactutils.md#isrelic) -- [levelFromRarity](backend_gamelogic_artifactutils.md#levelfromrarity) -- [rarityName](backend_gamelogic_artifactutils.md#rarityname) -- [rarityNameFromArtifact](backend_gamelogic_artifactutils.md#raritynamefromartifact) -- [setForceAncient](backend_gamelogic_artifactutils.md#setforceancient) - -## Variables - -### RelicsList - -• `Const` **RelicsList**: ArtifactType[] - -## Functions - -### artifactAvailableTimestamp - -▸ **artifactAvailableTimestamp**(`artifact`: Artifact): _number_ - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `artifact` | Artifact | - -**Returns:** _number_ - ---- - -### artifactBiomeName - -▸ **artifactBiomeName**(`artifact`: Artifact): _string_ - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `artifact` | Artifact | - -**Returns:** _string_ - ---- - -### artifactFileName - -▸ **artifactFileName**(`videoMode`: _boolean_, `thumb`: _boolean_, `artifact`: [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md), `color`: [_ArtifactFileColor_](../enums/backend_gamelogic_artifactutils.artifactfilecolor.md), `debugProps?`: { `forceAncient`: _boolean_ ; `skipCaching`: _boolean_ } \| _undefined_): _string_ - -#### Parameters - -| Name | Type | -| :----------- | :-------------------------------------------------------------------------------------- | -| `videoMode` | _boolean_ | -| `thumb` | _boolean_ | -| `artifact` | [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md) | -| `color` | [_ArtifactFileColor_](../enums/backend_gamelogic_artifactutils.artifactfilecolor.md) | -| `debugProps` | { `forceAncient`: _boolean_ ; `skipCaching`: _boolean_ } \| _undefined_ | - -**Returns:** _string_ - ---- - -### artifactRoll - -▸ **artifactRoll**(`id`: ArtifactId): _number_ - -Convert an `artifactId` to an int in [0, 255] - -#### Parameters - -| Name | Type | -| :--- | :--------- | -| `id` | ArtifactId | - -**Returns:** _number_ - ---- - -### biomeName - -▸ `Const` **biomeName**(`biome`: Biome): _string_ - -#### Parameters - -| Name | Type | -| :------ | :---- | -| `biome` | Biome | - -**Returns:** _string_ - ---- - -### getActivatedArtifact - -▸ **getActivatedArtifact**(`artifacts`: Artifact[]): Artifact \| _undefined_ - -#### Parameters - -| Name | Type | -| :---------- | :--------- | -| `artifacts` | Artifact[] | - -**Returns:** Artifact \| _undefined_ - ---- - -### getActiveBlackDomain - -▸ **getActiveBlackDomain**(`artifacts`: Artifact[]): Artifact \| _undefined_ - -#### Parameters - -| Name | Type | -| :---------- | :--------- | -| `artifacts` | Artifact[] | - -**Returns:** Artifact \| _undefined_ - ---- - -### getArtifactDebugName - -▸ **getArtifactDebugName**(`a?`: Artifact): _string_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `a?` | Artifact | - -**Returns:** _string_ - ---- - -### hasUnconfirmedArtifactTx - -▸ `Const` **hasUnconfirmedArtifactTx**(`p`: _undefined_ \| Planet): _boolean_ - -#### Parameters - -| Name | Type | -| :--- | :-------------------- | -| `p` | _undefined_ \| Planet | - -**Returns:** _boolean_ - ---- - -### isActivated - -▸ **isActivated**(`artifact`: Artifact \| _undefined_): _boolean_ - -#### Parameters - -| Name | Type | -| :--------- | :---------------------- | -| `artifact` | Artifact \| _undefined_ | - -**Returns:** _boolean_ - ---- - -### isAncient - -▸ **isAncient**(`artifact`: [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md)): _boolean_ - -#### Parameters - -| Name | Type | -| :--------- | :-------------------------------------------------------------------------------------- | -| `artifact` | [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md) | - -**Returns:** _boolean_ - ---- - -### isBasic - -▸ **isBasic**(`type`: ArtifactType): _boolean_ - -#### Parameters - -| Name | Type | -| :----- | :----------- | -| `type` | ArtifactType | - -**Returns:** _boolean_ - ---- - -### isRelic - -▸ **isRelic**(`type`: ArtifactType): _boolean_ - -#### Parameters - -| Name | Type | -| :----- | :----------- | -| `type` | ArtifactType | - -**Returns:** _boolean_ - ---- - -### levelFromRarity - -▸ `Const` **levelFromRarity**(`rarity`: ArtifactRarity): PlanetLevel - -#### Parameters - -| Name | Type | -| :------- | :------------- | -| `rarity` | ArtifactRarity | - -**Returns:** PlanetLevel - ---- - -### rarityName - -▸ `Const` **rarityName**(`rarity`: ArtifactRarity): _string_ - -#### Parameters - -| Name | Type | -| :------- | :------------- | -| `rarity` | ArtifactRarity | - -**Returns:** _string_ - ---- - -### rarityNameFromArtifact - -▸ `Const` **rarityNameFromArtifact**(`a`: Artifact): _string_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `a` | Artifact | - -**Returns:** _string_ - ---- - -### setForceAncient - -▸ **setForceAncient**(`force`: _boolean_): _void_ - -Really, really shitty workaround to add a `return true` or `return false` to the above `isAncient`. Used in `GifRenderer.ts` - -#### Parameters - -| Name | Type | -| :------ | :-------- | -| `force` | _boolean_ | - -**Returns:** _void_ diff --git a/docs/modules/backend_gamelogic_contractcaller.md b/docs/modules/backend_gamelogic_contractcaller.md deleted file mode 100644 index ac394d53..00000000 --- a/docs/modules/backend_gamelogic_contractcaller.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/GameLogic/ContractCaller - -## Table of contents - -### Classes - -- [ContractCaller](../classes/backend_gamelogic_contractcaller.contractcaller.md) diff --git a/docs/modules/backend_gamelogic_conversationmanager.md b/docs/modules/backend_gamelogic_conversationmanager.md deleted file mode 100644 index 1e9e6a60..00000000 --- a/docs/modules/backend_gamelogic_conversationmanager.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/GameLogic/ConversationManager - -## Table of contents - -### Classes - -- [ConversationManager](../classes/backend_gamelogic_conversationmanager.conversationmanager.md) diff --git a/docs/modules/backend_gamelogic_gamemanager.md b/docs/modules/backend_gamelogic_gamemanager.md deleted file mode 100644 index 60318d58..00000000 --- a/docs/modules/backend_gamelogic_gamemanager.md +++ /dev/null @@ -1,11 +0,0 @@ -# Module: Backend/GameLogic/GameManager - -## Table of contents - -### Enumerations - -- [GameManagerEvent](../enums/backend_gamelogic_gamemanager.gamemanagerevent.md) - -### Classes - -- [default](../classes/backend_gamelogic_gamemanager.default.md) diff --git a/docs/modules/backend_gamelogic_gameuimanager.md b/docs/modules/backend_gamelogic_gameuimanager.md deleted file mode 100644 index 74db3e2b..00000000 --- a/docs/modules/backend_gamelogic_gameuimanager.md +++ /dev/null @@ -1,11 +0,0 @@ -# Module: Backend/GameLogic/GameUIManager - -## Table of contents - -### Enumerations - -- [GameUIManagerEvent](../enums/backend_gamelogic_gameuimanager.gameuimanagerevent.md) - -### Classes - -- [default](../classes/backend_gamelogic_gameuimanager.default.md) diff --git a/docs/modules/backend_gamelogic_initialgamestatedownloader.md b/docs/modules/backend_gamelogic_initialgamestatedownloader.md deleted file mode 100644 index 68f44bc0..00000000 --- a/docs/modules/backend_gamelogic_initialgamestatedownloader.md +++ /dev/null @@ -1,11 +0,0 @@ -# Module: Backend/GameLogic/InitialGameStateDownloader - -## Table of contents - -### Classes - -- [InitialGameStateDownloader](../classes/backend_gamelogic_initialgamestatedownloader.initialgamestatedownloader.md) - -### Interfaces - -- [InitialGameState](../interfaces/backend_gamelogic_initialgamestatedownloader.initialgamestate.md) diff --git a/docs/modules/backend_gamelogic_paidconversationmanager.md b/docs/modules/backend_gamelogic_paidconversationmanager.md deleted file mode 100644 index 83dc5133..00000000 --- a/docs/modules/backend_gamelogic_paidconversationmanager.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/GameLogic/PaidConversationManager - -## Table of contents - -### Classes - -- [PaidConversationManager](../classes/backend_gamelogic_paidconversationmanager.paidconversationmanager.md) diff --git a/docs/modules/backend_gamelogic_pluginmanager.md b/docs/modules/backend_gamelogic_pluginmanager.md deleted file mode 100644 index 32d0daf4..00000000 --- a/docs/modules/backend_gamelogic_pluginmanager.md +++ /dev/null @@ -1,8 +0,0 @@ -# Module: Backend/GameLogic/PluginManager - -## Table of contents - -### Classes - -- [PluginManager](../classes/backend_gamelogic_pluginmanager.pluginmanager.md) -- [ProcessInfo](../classes/backend_gamelogic_pluginmanager.processinfo.md) diff --git a/docs/modules/backend_gamelogic_tutorialmanager.md b/docs/modules/backend_gamelogic_tutorialmanager.md deleted file mode 100644 index 731db306..00000000 --- a/docs/modules/backend_gamelogic_tutorialmanager.md +++ /dev/null @@ -1,12 +0,0 @@ -# Module: Backend/GameLogic/TutorialManager - -## Table of contents - -### Enumerations - -- [TutorialManagerEvent](../enums/backend_gamelogic_tutorialmanager.tutorialmanagerevent.md) -- [TutorialState](../enums/backend_gamelogic_tutorialmanager.tutorialstate.md) - -### Classes - -- [default](../classes/backend_gamelogic_tutorialmanager.default.md) diff --git a/docs/modules/backend_gamelogic_viewportentities.md b/docs/modules/backend_gamelogic_viewportentities.md deleted file mode 100644 index b9982131..00000000 --- a/docs/modules/backend_gamelogic_viewportentities.md +++ /dev/null @@ -1,12 +0,0 @@ -# Module: Backend/GameLogic/ViewportEntities - -## Table of contents - -### Classes - -- [ViewportEntities](../classes/backend_gamelogic_viewportentities.viewportentities.md) - -### Interfaces - -- [PlanetRenderInfo](../interfaces/backend_gamelogic_viewportentities.planetrenderinfo.md) -- [Radii](../interfaces/backend_gamelogic_viewportentities.radii.md) diff --git a/docs/modules/backend_interfaces_diagnosticupdater.md b/docs/modules/backend_interfaces_diagnosticupdater.md deleted file mode 100644 index 6c471947..00000000 --- a/docs/modules/backend_interfaces_diagnosticupdater.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/Interfaces/DiagnosticUpdater - -## Table of contents - -### Interfaces - -- [DiagnosticUpdater](../interfaces/backend_interfaces_diagnosticupdater.diagnosticupdater.md) diff --git a/docs/modules/backend_miner_miner_worker.md b/docs/modules/backend_miner_miner_worker.md deleted file mode 100644 index 3feafe53..00000000 --- a/docs/modules/backend_miner_miner_worker.md +++ /dev/null @@ -1 +0,0 @@ -# Module: Backend/Miner/miner.worker diff --git a/docs/modules/backend_miner_minermanager.md b/docs/modules/backend_miner_minermanager.md deleted file mode 100644 index 7d891220..00000000 --- a/docs/modules/backend_miner_minermanager.md +++ /dev/null @@ -1,12 +0,0 @@ -# Module: Backend/Miner/MinerManager - -## Table of contents - -### Enumerations - -- [MinerManagerEvent](../enums/backend_miner_minermanager.minermanagerevent.md) - -### Classes - -- [HomePlanetMinerChunkStore](../classes/backend_miner_minermanager.homeplanetminerchunkstore.md) -- [default](../classes/backend_miner_minermanager.default.md) diff --git a/docs/modules/backend_miner_miningpatterns.md b/docs/modules/backend_miner_miningpatterns.md deleted file mode 100644 index 0b67fff3..00000000 --- a/docs/modules/backend_miner_miningpatterns.md +++ /dev/null @@ -1,16 +0,0 @@ -# Module: Backend/Miner/MiningPatterns - -## Table of contents - -### Enumerations - -- [MiningPatternType](../enums/backend_miner_miningpatterns.miningpatterntype.md) - -### Classes - -- [SpiralPattern](../classes/backend_miner_miningpatterns.spiralpattern.md) -- [SwissCheesePattern](../classes/backend_miner_miningpatterns.swisscheesepattern.md) - -### Interfaces - -- [MiningPattern](../interfaces/backend_miner_miningpatterns.miningpattern.md) diff --git a/docs/modules/backend_miner_permutation.md b/docs/modules/backend_miner_permutation.md deleted file mode 100644 index c004e1f7..00000000 --- a/docs/modules/backend_miner_permutation.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Backend/Miner/permutation - -## Table of contents - -### Functions - -- [getPlanetLocations](backend_miner_permutation.md#getplanetlocations) - -## Functions - -### getPlanetLocations - -▸ `Const` **getPlanetLocations**(`spaceTypeKey`: _number_, `biomebaseKey`: _number_, `perlinLengthScale`: _number_, `perlinMirrorX`: _boolean_, `perlinMirrorY`: _boolean_): _function_ - -#### Parameters - -| Name | Type | -| :------------------ | :-------- | -| `spaceTypeKey` | _number_ | -| `biomebaseKey` | _number_ | -| `perlinLengthScale` | _number_ | -| `perlinMirrorX` | _boolean_ | -| `perlinMirrorY` | _boolean_ | - -**Returns:** (`chunkFootprint`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), `planetRarity`: _number_) => WorldLocation[] diff --git a/docs/modules/backend_network_conversationapi.md b/docs/modules/backend_network_conversationapi.md deleted file mode 100644 index 688c33e9..00000000 --- a/docs/modules/backend_network_conversationapi.md +++ /dev/null @@ -1,93 +0,0 @@ -# Module: Backend/Network/ConversationAPI - -## Table of contents - -### Functions - -- [getConversation](backend_network_conversationapi.md#getconversation) -- [startConversation](backend_network_conversationapi.md#startconversation) -- [startConversationOpenAI](backend_network_conversationapi.md#startconversationopenai) -- [stepConversation](backend_network_conversationapi.md#stepconversation) -- [stepConversationOpenAI](backend_network_conversationapi.md#stepconversationopenai) - -## Functions - -### getConversation - -▸ **getConversation**(`artifactId`: ArtifactId): _Promise_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `artifactId` | ArtifactId | - -**Returns:** _Promise_ - ---- - -### startConversation - -▸ **startConversation**(`timestamp`: _number_, `player`: EthAddress, `signature`: _string_, `artifactId`: ArtifactId): _Promise_ - -IN-GAME ROUTES - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `timestamp` | _number_ | -| `player` | EthAddress | -| `signature` | _string_ | -| `artifactId` | ArtifactId | - -**Returns:** _Promise_ - ---- - -### startConversationOpenAI - -▸ **startConversationOpenAI**(`artifact`: ConversationArtifact, `artifactId`: _string_, `username`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :----------- | :------------------- | -| `artifact` | ConversationArtifact | -| `artifactId` | _string_ | -| `username` | _string_ | - -**Returns:** _Promise_ - ---- - -### stepConversation - -▸ **stepConversation**(`timestamp`: _number_, `player`: EthAddress, `signature`: _string_, `artifactId`: ArtifactId, `message`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `timestamp` | _number_ | -| `player` | EthAddress | -| `signature` | _string_ | -| `artifactId` | ArtifactId | -| `message` | _string_ | - -**Returns:** _Promise_ - ---- - -### stepConversationOpenAI - -▸ **stepConversationOpenAI**(`artifactId`: _string_, `message`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :----------- | :------- | -| `artifactId` | _string_ | -| `message` | _string_ | - -**Returns:** _Promise_ diff --git a/docs/modules/backend_network_leaderboardapi.md b/docs/modules/backend_network_leaderboardapi.md deleted file mode 100644 index 737cc11b..00000000 --- a/docs/modules/backend_network_leaderboardapi.md +++ /dev/null @@ -1,15 +0,0 @@ -# Module: Backend/Network/LeaderboardApi - -## Table of contents - -### Functions - -- [loadLeaderboard](backend_network_leaderboardapi.md#loadleaderboard) - -## Functions - -### loadLeaderboard - -▸ **loadLeaderboard**(): _Promise_ - -**Returns:** _Promise_ diff --git a/docs/modules/backend_network_messageapi.md b/docs/modules/backend_network_messageapi.md deleted file mode 100644 index 5ec964bc..00000000 --- a/docs/modules/backend_network_messageapi.md +++ /dev/null @@ -1,51 +0,0 @@ -# Module: Backend/Network/MessageAPI - -## Table of contents - -### Functions - -- [addMessage](backend_network_messageapi.md#addmessage) -- [deleteMessages](backend_network_messageapi.md#deletemessages) -- [getMessagesOnPlanets](backend_network_messageapi.md#getmessagesonplanets) - -## Functions - -### addMessage - -▸ **addMessage**(`request`: _SignedMessage_\>): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :--------------------------------------------- | -| `request` | _SignedMessage_\> | - -**Returns:** _Promise_ - ---- - -### deleteMessages - -▸ **deleteMessages**(`request`: _SignedMessage_): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :-------------------------------------- | -| `request` | _SignedMessage_ | - -**Returns:** _Promise_ - ---- - -### getMessagesOnPlanets - -▸ **getMessagesOnPlanets**(`request`: PlanetMessageRequest): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :------------------- | -| `request` | PlanetMessageRequest | - -**Returns:** _Promise_ diff --git a/docs/modules/backend_network_throttledconcurrentqueue.md b/docs/modules/backend_network_throttledconcurrentqueue.md deleted file mode 100644 index 9d174b04..00000000 --- a/docs/modules/backend_network_throttledconcurrentqueue.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/Network/ThrottledConcurrentQueue - -## Table of contents - -### Classes - -- [ThrottledConcurrentQueue](../classes/backend_network_throttledconcurrentqueue.throttledconcurrentqueue.md) diff --git a/docs/modules/backend_network_txexecutor.md b/docs/modules/backend_network_txexecutor.md deleted file mode 100644 index 95679c77..00000000 --- a/docs/modules/backend_network_txexecutor.md +++ /dev/null @@ -1,12 +0,0 @@ -# Module: Backend/Network/TxExecutor - -## Table of contents - -### Classes - -- [TxExecutor](../classes/backend_network_txexecutor.txexecutor.md) - -### Interfaces - -- [PendingTransaction](../interfaces/backend_network_txexecutor.pendingtransaction.md) -- [QueuedTxRequest](../interfaces/backend_network_txexecutor.queuedtxrequest.md) diff --git a/docs/modules/backend_network_utilityserverapi.md b/docs/modules/backend_network_utilityserverapi.md deleted file mode 100644 index 84a31429..00000000 --- a/docs/modules/backend_network_utilityserverapi.md +++ /dev/null @@ -1,122 +0,0 @@ -# Module: Backend/Network/UtilityServerAPI - -## Table of contents - -### Enumerations - -- [EmailResponse](../enums/backend_network_utilityserverapi.emailresponse.md) - -### Variables - -- [WEBSERVER_URL](backend_network_utilityserverapi.md#webserver_url) - -### Functions - -- [getAllTwitters](backend_network_utilityserverapi.md#getalltwitters) -- [requestDevFaucet](backend_network_utilityserverapi.md#requestdevfaucet) -- [submitInterestedEmail](backend_network_utilityserverapi.md#submitinterestedemail) -- [submitPlayerEmail](backend_network_utilityserverapi.md#submitplayeremail) -- [submitUnsubscribeEmail](backend_network_utilityserverapi.md#submitunsubscribeemail) -- [submitWhitelistKey](backend_network_utilityserverapi.md#submitwhitelistkey) -- [verifyTwitterHandle](backend_network_utilityserverapi.md#verifytwitterhandle) - -## Variables - -### WEBSERVER_URL - -• `Const` **WEBSERVER_URL**: _string_ - -## Functions - -### getAllTwitters - -▸ `Const` **getAllTwitters**(): _Promise_<[_AddressTwitterMap_](_types_darkforest_api_utilityserverapitypes.md#addresstwittermap)\> - -**Returns:** _Promise_<[_AddressTwitterMap_](_types_darkforest_api_utilityserverapitypes.md#addresstwittermap)\> - ---- - -### requestDevFaucet - -▸ `Const` **requestDevFaucet**(`address`: EthAddress): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :--------- | -| `address` | EthAddress | - -**Returns:** _Promise_ - ---- - -### submitInterestedEmail - -▸ `Const` **submitInterestedEmail**(`email`: _string_): _Promise_<[_EmailResponse_](../enums/backend_network_utilityserverapi.emailresponse.md)\> - -#### Parameters - -| Name | Type | -| :------ | :------- | -| `email` | _string_ | - -**Returns:** _Promise_<[_EmailResponse_](../enums/backend_network_utilityserverapi.emailresponse.md)\> - ---- - -### submitPlayerEmail - -▸ `Const` **submitPlayerEmail**(`email`: _string_, `ethAddress`: EthAddress): _Promise_<[_EmailResponse_](../enums/backend_network_utilityserverapi.emailresponse.md)\> - -#### Parameters - -| Name | Type | -| :----------- | :--------- | -| `email` | _string_ | -| `ethAddress` | EthAddress | - -**Returns:** _Promise_<[_EmailResponse_](../enums/backend_network_utilityserverapi.emailresponse.md)\> - ---- - -### submitUnsubscribeEmail - -▸ `Const` **submitUnsubscribeEmail**(`email`: _string_): _Promise_<[_EmailResponse_](../enums/backend_network_utilityserverapi.emailresponse.md)\> - -#### Parameters - -| Name | Type | -| :------ | :------- | -| `email` | _string_ | - -**Returns:** _Promise_<[_EmailResponse_](../enums/backend_network_utilityserverapi.emailresponse.md)\> - ---- - -### submitWhitelistKey - -▸ `Const` **submitWhitelistKey**(`key`: _string_, `address`: EthAddress): _Promise_<`null` \| string\> - -#### Parameters - -| Name | Type | -| :-------- | :--------- | -| `key` | _string_ | -| `address` | EthAddress | - -**Returns:** _Promise_<`null` \| string\> - ---- - -### verifyTwitterHandle - -▸ `Const` **verifyTwitterHandle**(`twitter`: _string_, `address`: EthAddress): _Promise_ - -#### Parameters - -| Name | Type | -| :-------- | :--------- | -| `twitter` | _string_ | -| `address` | EthAddress | - -**Returns:** _Promise_ diff --git a/docs/modules/backend_plugins_embeddedpluginloader.md b/docs/modules/backend_plugins_embeddedpluginloader.md deleted file mode 100644 index 63de9ff9..00000000 --- a/docs/modules/backend_plugins_embeddedpluginloader.md +++ /dev/null @@ -1,19 +0,0 @@ -# Module: Backend/Plugins/EmbeddedPluginLoader - -## Table of contents - -### Interfaces - -- [EmbeddedPlugin](../interfaces/backend_plugins_embeddedpluginloader.embeddedplugin.md) - -### Functions - -- [getEmbeddedPlugins](backend_plugins_embeddedpluginloader.md#getembeddedplugins) - -## Functions - -### getEmbeddedPlugins - -▸ **getEmbeddedPlugins**(): { `code`: _string_ ; `id`: [_PluginId_](backend_plugins_serializedplugin.md#pluginid) ; `name`: _string_ }[] - -**Returns:** { `code`: _string_ ; `id`: [_PluginId_](backend_plugins_serializedplugin.md#pluginid) ; `name`: _string_ }[] diff --git a/docs/modules/backend_plugins_pluginprocess.md b/docs/modules/backend_plugins_pluginprocess.md deleted file mode 100644 index f38e9dab..00000000 --- a/docs/modules/backend_plugins_pluginprocess.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/Plugins/PluginProcess - -## Table of contents - -### Interfaces - -- [PluginProcess](../interfaces/backend_plugins_pluginprocess.pluginprocess.md) diff --git a/docs/modules/backend_plugins_serializedplugin.md b/docs/modules/backend_plugins_serializedplugin.md deleted file mode 100644 index 452fa5eb..00000000 --- a/docs/modules/backend_plugins_serializedplugin.md +++ /dev/null @@ -1,17 +0,0 @@ -# Module: Backend/Plugins/SerializedPlugin - -## Table of contents - -### Interfaces - -- [SerializedPlugin](../interfaces/backend_plugins_serializedplugin.serializedplugin.md) - -### Type aliases - -- [PluginId](backend_plugins_serializedplugin.md#pluginid) - -## Type aliases - -### PluginId - -Ƭ **PluginId**: _string_ & { `__nothing__`: _never_ } diff --git a/docs/modules/backend_procedural_artifactprocgen.md b/docs/modules/backend_procedural_artifactprocgen.md deleted file mode 100644 index c8c4ee51..00000000 --- a/docs/modules/backend_procedural_artifactprocgen.md +++ /dev/null @@ -1,116 +0,0 @@ -# Module: Backend/Procedural/ArtifactProcgen - -## Table of contents - -### Variables - -- [mockCommon](backend_procedural_artifactprocgen.md#mockcommon) -- [mockEpic](backend_procedural_artifactprocgen.md#mockepic) -- [mockLegendary](backend_procedural_artifactprocgen.md#mocklegendary) -- [mockRare](backend_procedural_artifactprocgen.md#mockrare) - -### Functions - -- [artifactBiomeAndName](backend_procedural_artifactprocgen.md#artifactbiomeandname) -- [artifactName](backend_procedural_artifactprocgen.md#artifactname) -- [dateMintedAt](backend_procedural_artifactprocgen.md#datemintedat) -- [mockArtifact](backend_procedural_artifactprocgen.md#mockartifact) -- [mockArtifactWithRarity](backend_procedural_artifactprocgen.md#mockartifactwithrarity) - -## Variables - -### mockCommon - -• `Const` **mockCommon**: Artifact - ---- - -### mockEpic - -• `Const` **mockEpic**: Artifact - ---- - -### mockLegendary - -• `Const` **mockLegendary**: Artifact - ---- - -### mockRare - -• `Const` **mockRare**: Artifact - -## Functions - -### artifactBiomeAndName - -▸ `Const` **artifactBiomeAndName**(`artifact`: _undefined_ \| Artifact): _string_ - -#### Parameters - -| Name | Type | -| :--------- | :---------------------- | -| `artifact` | _undefined_ \| Artifact | - -**Returns:** _string_ - ---- - -### artifactName - -▸ `Const` **artifactName**(`artifact`: _undefined_ \| Artifact): _string_ - -#### Parameters - -| Name | Type | -| :--------- | :---------------------- | -| `artifact` | _undefined_ \| Artifact | - -**Returns:** _string_ - ---- - -### dateMintedAt - -▸ `Const` **dateMintedAt**(`artifact`: _undefined_ \| Artifact): _string_ - -#### Parameters - -| Name | Type | -| :--------- | :---------------------- | -| `artifact` | _undefined_ \| Artifact | - -**Returns:** _string_ - ---- - -### mockArtifact - -▸ `Const` **mockArtifact**(`rarity`: ArtifactRarity, `artifactType?`: ArtifactType, `planetBiome?`: Biome): Artifact - -#### Parameters - -| Name | Type | -| :------------- | :------------- | -| `rarity` | ArtifactRarity | -| `artifactType` | ArtifactType | -| `planetBiome` | Biome | - -**Returns:** Artifact - ---- - -### mockArtifactWithRarity - -▸ `Const` **mockArtifactWithRarity**(`rarity`: ArtifactRarity, `artifactType?`: ArtifactType, `planetBiome?`: Biome): Artifact - -#### Parameters - -| Name | Type | -| :------------- | :------------- | -| `rarity` | ArtifactRarity | -| `artifactType` | ArtifactType | -| `planetBiome` | Biome | - -**Returns:** Artifact diff --git a/docs/modules/backend_procedural_procgenconsts.md b/docs/modules/backend_procedural_procgenconsts.md deleted file mode 100644 index 54f8d2c0..00000000 --- a/docs/modules/backend_procedural_procgenconsts.md +++ /dev/null @@ -1,99 +0,0 @@ -# Module: Backend/Procedural/ProcgenConsts - -## Table of contents - -### Variables - -- [blurb2grammar](backend_procedural_procgenconsts.md#blurb2grammar) -- [blurbGrammar](backend_procedural_procgenconsts.md#blurbgrammar) -- [planetNameWords](backend_procedural_procgenconsts.md#planetnamewords) -- [planetTagAdj](backend_procedural_procgenconsts.md#planettagadj) -- [planetTagNoun](backend_procedural_procgenconsts.md#planettagnoun) - -## Variables - -### blurb2grammar - -• `Const` **blurb2grammar**: _object_ - -#### Type declaration - -| Name | Type | -| :------------ | :--------- | -| `alongtheway` | _string_[] | -| `bads` | _string_[] | -| `box` | _string_[] | -| `chocolate` | _string_[] | -| `chocolates` | _string_[] | -| `flock` | _string_[] | -| `friend` | _string_[] | -| `friends` | _string_[] | -| `get` | _string_[] | -| `know` | _string_[] | -| `learned` | _string_[] | -| `lesson` | _string_[] | -| `life` | _string_[] | -| `live` | _string_[] | -| `made` | _string_[] | -| `removed` | _string_[] | -| `sends` | _string_[] | -| `sometimes` | _string_[] | -| `sun` | _string_[] | -| `theres` | _string_[] | -| `throwing` | _string_[] | -| `treasure` | _string_[] | -| `warbears` | _string_[] | -| `way` | _string_[] | -| `when` | _string_[] | -| `will` | _string_[] | -| `willway` | _string_[] | -| `years` | _string_[] | - ---- - -### blurbGrammar - -• `Const` **blurbGrammar**: _object_ - -#### Type declaration - -| Name | Type | -| :---------- | :--------- | -| `adj` | _string_[] | -| `air` | _string_[] | -| `bloom` | _string_[] | -| `colors` | _string_[] | -| `descair` | _any_[] | -| `eyecansee` | _any_[] | -| `flora` | _string_[] | -| `fruit` | _string_[] | -| `funfact` | _string_[] | -| `geography` | _any_[] | -| `gravity` | _string_[] | -| `habitat` | _string_[] | -| `landscape` | _string_[] | -| `many` | _string_[] | -| `noun` | _string_[] | -| `populate` | _string_[] | -| `populates` | _string_[] | -| `species` | _string_[] | -| `stretch` | _string_[] | -| `verb` | _string_[] | - ---- - -### planetNameWords - -• `Const` **planetNameWords**: _string_[] - ---- - -### planetTagAdj - -• `Const` **planetTagAdj**: _string_[] - ---- - -### planetTagNoun - -• `Const` **planetTagNoun**: _string_[] diff --git a/docs/modules/backend_procedural_procgenutils.md b/docs/modules/backend_procedural_procgenutils.md deleted file mode 100644 index 0727d04d..00000000 --- a/docs/modules/backend_procedural_procgenutils.md +++ /dev/null @@ -1,38 +0,0 @@ -# Module: Backend/Procedural/ProcgenUtils - -## Table of contents - -### Classes - -- [ProcgenUtils](../classes/backend_procedural_procgenutils.procgenutils.md) - -### Type aliases - -- [PixelCoords](backend_procedural_procgenutils.md#pixelcoords) -- [QuoteData](backend_procedural_procgenutils.md#quotedata) - -## Type aliases - -### PixelCoords - -Ƭ **PixelCoords**: _object_ - -#### Type declaration - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | - ---- - -### QuoteData - -Ƭ **QuoteData**: _object_ - -#### Type declaration - -| Name | Type | -| :------- | :------- | -| `author` | _string_ | -| `quote` | _string_ | diff --git a/docs/modules/backend_procedural_tracery_modifiers.md b/docs/modules/backend_procedural_tracery_modifiers.md deleted file mode 100644 index ce51825e..00000000 --- a/docs/modules/backend_procedural_tracery_modifiers.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Backend/Procedural/tracery-modifiers - -## Table of contents - -### Variables - -- [baseEngModifiers](backend_procedural_tracery_modifiers.md#baseengmodifiers) - -## Variables - -### baseEngModifiers - -• **baseEngModifiers**: _object_ - -#### Type declaration - -| Name | Type | -| :-------------- | :------------------------------------- | -| `a` | (`s`: _any_) => _string_ | -| `capitalize` | (`s`: _any_) => _any_ | -| `capitalizeAll` | (`s`: _any_) => _string_ | -| `ed` | (`s`: _any_) => _string_ | -| `firstS` | (`s`: _any_) => _string_ | -| `replace` | (`s`: _any_, `params`: _any_) => _any_ | -| `s` | (`s`: _any_) => _string_ | diff --git a/docs/modules/backend_storage_readerdatastore.md b/docs/modules/backend_storage_readerdatastore.md deleted file mode 100644 index 8dc90bb4..00000000 --- a/docs/modules/backend_storage_readerdatastore.md +++ /dev/null @@ -1,11 +0,0 @@ -# Module: Backend/Storage/ReaderDataStore - -## Table of contents - -### Enumerations - -- [SinglePlanetDataStoreEvent](../enums/backend_storage_readerdatastore.singleplanetdatastoreevent.md) - -### Classes - -- [default](../classes/backend_storage_readerdatastore.default.md) diff --git a/docs/modules/backend_utils_animation.md b/docs/modules/backend_utils_animation.md deleted file mode 100644 index 283c07f3..00000000 --- a/docs/modules/backend_utils_animation.md +++ /dev/null @@ -1,83 +0,0 @@ -# Module: Backend/Utils/Animation - -## Table of contents - -### Functions - -- [constantAnimation](backend_utils_animation.md#constantanimation) -- [easeInAnimation](backend_utils_animation.md#easeinanimation) -- [emojiEaseOutAnimation](backend_utils_animation.md#emojieaseoutanimation) -- [planetLevelToAnimationSpeed](backend_utils_animation.md#planetleveltoanimationspeed) -- [sinusoidalAnimation](backend_utils_animation.md#sinusoidalanimation) - -## Functions - -### constantAnimation - -▸ **constantAnimation**(`constant`: _number_): DFAnimation - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `constant` | _number_ | - -**Returns:** DFAnimation - ---- - -### easeInAnimation - -▸ **easeInAnimation**(`durationMs`: _number_, `delayMs?`: _number_): DFAnimation - -#### Parameters - -| Name | Type | -| :----------- | :------- | -| `durationMs` | _number_ | -| `delayMs?` | _number_ | - -**Returns:** DFAnimation - ---- - -### emojiEaseOutAnimation - -▸ **emojiEaseOutAnimation**(`durationMs`: _number_, `emoji`: _string_): _DFStatefulAnimation_ - -#### Parameters - -| Name | Type | -| :----------- | :------- | -| `durationMs` | _number_ | -| `emoji` | _string_ | - -**Returns:** _DFStatefulAnimation_ - ---- - -### planetLevelToAnimationSpeed - -▸ **planetLevelToAnimationSpeed**(`level`: PlanetLevel): _number_ - -#### Parameters - -| Name | Type | -| :------ | :---------- | -| `level` | PlanetLevel | - -**Returns:** _number_ - ---- - -### sinusoidalAnimation - -▸ **sinusoidalAnimation**(`rps`: _number_): DFAnimation - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `rps` | _number_ | - -**Returns:** DFAnimation diff --git a/docs/modules/backend_utils_coordinates.md b/docs/modules/backend_utils_coordinates.md deleted file mode 100644 index c4c8af48..00000000 --- a/docs/modules/backend_utils_coordinates.md +++ /dev/null @@ -1,93 +0,0 @@ -# Module: Backend/Utils/Coordinates - -## Table of contents - -### Interfaces - -- [CanvasCoords](../interfaces/backend_utils_coordinates.canvascoords.md) - -### Functions - -- [coordsEqual](backend_utils_coordinates.md#coordsequal) -- [distL2](backend_utils_coordinates.md#distl2) -- [normalizeVector](backend_utils_coordinates.md#normalizevector) -- [scaleVector](backend_utils_coordinates.md#scalevector) -- [vectorLength](backend_utils_coordinates.md#vectorlength) - -## Functions - -### coordsEqual - -▸ `Const` **coordsEqual**(`a`: WorldCoords, `b`: WorldCoords): _boolean_ - -#### Parameters - -| Name | Type | -| :--- | :---------- | -| `a` | WorldCoords | -| `b` | WorldCoords | - -**Returns:** _boolean_ - ---- - -### distL2 - -▸ `Const` **distL2**(`a`: WorldCoords \| [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md), `b`: WorldCoords \| [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md)): _number_ - -#### Parameters - -| Name | Type | -| :--- | :--------------------------------------------------------------------------------------- | -| `a` | WorldCoords \| [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | -| `b` | WorldCoords \| [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - -**Returns:** _number_ - ---- - -### normalizeVector - -▸ `Const` **normalizeVector**(`a`: WorldCoords): WorldCoords - -#### Parameters - -| Name | Type | -| :--- | :---------- | -| `a` | WorldCoords | - -**Returns:** WorldCoords - ---- - -### scaleVector - -▸ `Const` **scaleVector**(`a`: WorldCoords, `k`: _number_): _object_ - -#### Parameters - -| Name | Type | -| :--- | :---------- | -| `a` | WorldCoords | -| `k` | _number_ | - -**Returns:** _object_ - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | - ---- - -### vectorLength - -▸ `Const` **vectorLength**(`a`: WorldCoords \| [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md)): _number_ - -#### Parameters - -| Name | Type | -| :--- | :--------------------------------------------------------------------------------------- | -| `a` | WorldCoords \| [_CanvasCoords_](../interfaces/backend_utils_coordinates.canvascoords.md) | - -**Returns:** _number_ diff --git a/docs/modules/backend_utils_typeassertions.md b/docs/modules/backend_utils_typeassertions.md deleted file mode 100644 index dd6d2aa0..00000000 --- a/docs/modules/backend_utils_typeassertions.md +++ /dev/null @@ -1,216 +0,0 @@ -# Module: Backend/Utils/TypeAssertions - -## Table of contents - -### Functions - -- [isUnconfirmedActivateArtifact](backend_utils_typeassertions.md#isunconfirmedactivateartifact) -- [isUnconfirmedBuyGPTCredits](backend_utils_typeassertions.md#isunconfirmedbuygptcredits) -- [isUnconfirmedBuyHat](backend_utils_typeassertions.md#isunconfirmedbuyhat) -- [isUnconfirmedDeactivateArtifact](backend_utils_typeassertions.md#isunconfirmeddeactivateartifact) -- [isUnconfirmedDepositArtifact](backend_utils_typeassertions.md#isunconfirmeddepositartifact) -- [isUnconfirmedFindArtifact](backend_utils_typeassertions.md#isunconfirmedfindartifact) -- [isUnconfirmedInit](backend_utils_typeassertions.md#isunconfirmedinit) -- [isUnconfirmedMove](backend_utils_typeassertions.md#isunconfirmedmove) -- [isUnconfirmedProspectPlanet](backend_utils_typeassertions.md#isunconfirmedprospectplanet) -- [isUnconfirmedReveal](backend_utils_typeassertions.md#isunconfirmedreveal) -- [isUnconfirmedTransfer](backend_utils_typeassertions.md#isunconfirmedtransfer) -- [isUnconfirmedUpgrade](backend_utils_typeassertions.md#isunconfirmedupgrade) -- [isUnconfirmedWithdrawArtifact](backend_utils_typeassertions.md#isunconfirmedwithdrawartifact) -- [isUnconfirmedWithdrawSilver](backend_utils_typeassertions.md#isunconfirmedwithdrawsilver) - -## Functions - -### isUnconfirmedActivateArtifact - -▸ **isUnconfirmedActivateArtifact**(`txIntent`: TxIntent): txIntent is UnconfirmedActivateArtifact - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedActivateArtifact - ---- - -### isUnconfirmedBuyGPTCredits - -▸ **isUnconfirmedBuyGPTCredits**(`txIntent`: TxIntent): txIntent is UnconfirmedBuyGPTCredits - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedBuyGPTCredits - ---- - -### isUnconfirmedBuyHat - -▸ **isUnconfirmedBuyHat**(`txIntent`: TxIntent): txIntent is UnconfirmedBuyHat - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedBuyHat - ---- - -### isUnconfirmedDeactivateArtifact - -▸ **isUnconfirmedDeactivateArtifact**(`txIntent`: TxIntent): txIntent is UnconfirmedDeactivateArtifact - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedDeactivateArtifact - ---- - -### isUnconfirmedDepositArtifact - -▸ **isUnconfirmedDepositArtifact**(`txIntent`: TxIntent): txIntent is UnconfirmedDepositArtifact - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedDepositArtifact - ---- - -### isUnconfirmedFindArtifact - -▸ **isUnconfirmedFindArtifact**(`txIntent`: TxIntent): txIntent is UnconfirmedFindArtifact - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedFindArtifact - ---- - -### isUnconfirmedInit - -▸ **isUnconfirmedInit**(`txIntent`: TxIntent): txIntent is UnconfirmedInit - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedInit - ---- - -### isUnconfirmedMove - -▸ **isUnconfirmedMove**(`txIntent`: TxIntent): txIntent is UnconfirmedMove - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedMove - ---- - -### isUnconfirmedProspectPlanet - -▸ **isUnconfirmedProspectPlanet**(`txIntent`: TxIntent): txIntent is UnconfirmedProspectPlanet - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedProspectPlanet - ---- - -### isUnconfirmedReveal - -▸ **isUnconfirmedReveal**(`txIntent`: TxIntent): txIntent is UnconfirmedReveal - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedReveal - ---- - -### isUnconfirmedTransfer - -▸ **isUnconfirmedTransfer**(`txIntent`: TxIntent): txIntent is UnconfirmedPlanetTransfer - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedPlanetTransfer - ---- - -### isUnconfirmedUpgrade - -▸ **isUnconfirmedUpgrade**(`txIntent`: TxIntent): txIntent is UnconfirmedUpgrade - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedUpgrade - ---- - -### isUnconfirmedWithdrawArtifact - -▸ **isUnconfirmedWithdrawArtifact**(`txIntent`: TxIntent): txIntent is UnconfirmedWithdrawArtifact - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedWithdrawArtifact - ---- - -### isUnconfirmedWithdrawSilver - -▸ **isUnconfirmedWithdrawSilver**(`txIntent`: TxIntent): txIntent is UnconfirmedWithdrawSilver - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `txIntent` | TxIntent | - -**Returns:** txIntent is UnconfirmedWithdrawSilver diff --git a/docs/modules/backend_utils_utils.md b/docs/modules/backend_utils_utils.md deleted file mode 100644 index 132ad966..00000000 --- a/docs/modules/backend_utils_utils.md +++ /dev/null @@ -1,435 +0,0 @@ -# Module: Backend/Utils/Utils - -## Table of contents - -### Type aliases - -- [RetryErrorHandler](backend_utils_utils.md#retryerrorhandler) - -### Variables - -- [ONE_DAY](backend_utils_utils.md#one_day) - -### Functions - -- [aggregateBulkGetter](backend_utils_utils.md#aggregatebulkgetter) -- [callWithRetry](backend_utils_utils.md#callwithretry) -- [deferred](backend_utils_utils.md#deferred) -- [formatNumber](backend_utils_utils.md#formatnumber) -- [getFormatProp](backend_utils_utils.md#getformatprop) -- [getGasSettingGwei](backend_utils_utils.md#getgassettinggwei) -- [getOwnerColor](backend_utils_utils.md#getownercolor) -- [getPlanetMaxRank](backend_utils_utils.md#getplanetmaxrank) -- [getPlanetRank](backend_utils_utils.md#getplanetrank) -- [getPlanetShortHash](backend_utils_utils.md#getplanetshorthash) -- [getPlayerColor](backend_utils_utils.md#getplayercolor) -- [getPlayerShortHash](backend_utils_utils.md#getplayershorthash) -- [getRandomActionId](backend_utils_utils.md#getrandomactionid) -- [getUpgradeStat](backend_utils_utils.md#getupgradestat) -- [hasOwner](backend_utils_utils.md#hasowner) -- [hexifyBigIntNestedArray](backend_utils_utils.md#hexifybigintnestedarray) -- [hslStr](backend_utils_utils.md#hslstr) -- [isFullRank](backend_utils_utils.md#isfullrank) -- [neverResolves](backend_utils_utils.md#neverresolves) -- [rejectAfter](backend_utils_utils.md#rejectafter) -- [sleep](backend_utils_utils.md#sleep) -- [timeoutAfter](backend_utils_utils.md#timeoutafter) -- [titleCase](backend_utils_utils.md#titlecase) -- [upgradeName](backend_utils_utils.md#upgradename) - -## Type aliases - -### RetryErrorHandler - -Ƭ **RetryErrorHandler**: (`i`: _number_, `e`: Error) => _void_ - -#### Type declaration - -▸ (`i`: _number_, `e`: Error): _void_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `i` | _number_ | -| `e` | Error | - -**Returns:** _void_ - -## Variables - -### ONE_DAY - -• `Const` **ONE_DAY**: _number_ - -## Functions - -### aggregateBulkGetter - -▸ `Const` **aggregateBulkGetter**(`logTag`: _string_, `total`: _number_, `querySize`: _number_, `getterFn`: (`startIdx`: _number_, `endIdx`: _number_) => _Promise_, `onProgress?`: (`fractionCompleted`: _number_) => _void_): _Promise_ - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :------------ | :------------------------------------------------------------ | -| `logTag` | _string_ | -| `total` | _number_ | -| `querySize` | _number_ | -| `getterFn` | (`startIdx`: _number_, `endIdx`: _number_) => _Promise_ | -| `onProgress?` | (`fractionCompleted`: _number_) => _void_ | - -**Returns:** _Promise_ - ---- - -### callWithRetry - -▸ `Const` **callWithRetry**(`fn`: (...`args`: _unknown_[]) => _Promise_, `args?`: _unknown_[], `onError?`: [_RetryErrorHandler_](backend_utils_utils.md#retryerrorhandler), `maxRetries?`: _number_, `retryInterval?`: _number_): _Promise_ - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Default value | -| :-------------- | :-------------------------------------------------------------- | :------------ | -| `fn` | (...`args`: _unknown_[]) => _Promise_ | - | -| `args` | _unknown_[] | [] | -| `onError?` | [_RetryErrorHandler_](backend_utils_utils.md#retryerrorhandler) | - | -| `maxRetries` | _number_ | 10 | -| `retryInterval` | _number_ | 1000 | - -**Returns:** _Promise_ - ---- - -### deferred - -▸ **deferred**(): [(`t`: T) => *void*, (`t`: Error) => *void*, *Promise*] - -#### Type parameters - -| Name | -| :--- | -| `T` | - -**Returns:** [(`t`: T) => *void*, (`t`: Error) => *void*, *Promise*] - ---- - -### formatNumber - -▸ `Const` **formatNumber**(`num`: _number_, `smallDec?`: _number_): _string_ - -#### Parameters - -| Name | Type | Default value | -| :--------- | :------- | :------------ | -| `num` | _number_ | - | -| `smallDec` | _number_ | 0 | - -**Returns:** _string_ - ---- - -### getFormatProp - -▸ `Const` **getFormatProp**(`planet`: _undefined_ \| Planet, `prop`: _string_): _string_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | -| `prop` | _string_ | - -**Returns:** _string_ - ---- - -### getGasSettingGwei - -▸ **getGasSettingGwei**(`setting`: [_AutoGasSetting_](../enums/frontend_utils_settingshooks.autogassetting.md), `gasPrices`: GasPrices): _number_ \| _undefined_ - -#### Parameters - -| Name | Type | -| :---------- | :-------------------------------------------------------------------------- | -| `setting` | [_AutoGasSetting_](../enums/frontend_utils_settingshooks.autogassetting.md) | -| `gasPrices` | GasPrices | - -**Returns:** _number_ \| _undefined_ - ---- - -### getOwnerColor - -▸ `Const` **getOwnerColor**(`planet`: Planet): _string_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _string_ - ---- - -### getPlanetMaxRank - -▸ `Const` **getPlanetMaxRank**(`planet`: _undefined_ \| Planet): _number_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _number_ - ---- - -### getPlanetRank - -▸ `Const` **getPlanetRank**(`planet`: _undefined_ \| Planet): _number_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _number_ - ---- - -### getPlanetShortHash - -▸ `Const` **getPlanetShortHash**(`planet`: _undefined_ \| Planet): _string_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _string_ - ---- - -### getPlayerColor - -▸ `Const` **getPlayerColor**(`player`: EthAddress): _string_ - -#### Parameters - -| Name | Type | -| :------- | :--------- | -| `player` | EthAddress | - -**Returns:** _string_ - ---- - -### getPlayerShortHash - -▸ `Const` **getPlayerShortHash**(`address`: EthAddress): _string_ - -#### Parameters - -| Name | Type | -| :-------- | :--------- | -| `address` | EthAddress | - -**Returns:** _string_ - ---- - -### getRandomActionId - -▸ `Const` **getRandomActionId**(): _string_ - -**Returns:** _string_ - ---- - -### getUpgradeStat - -▸ `Const` **getUpgradeStat**(`upgrade`: Upgrade, `stat`: [_StatIdx_](../enums/_types_global_globaltypes.statidx.md)): _number_ - -#### Parameters - -| Name | Type | -| :-------- | :--------------------------------------------------------- | -| `upgrade` | Upgrade | -| `stat` | [_StatIdx_](../enums/_types_global_globaltypes.statidx.md) | - -**Returns:** _number_ - ---- - -### hasOwner - -▸ `Const` **hasOwner**(`planet`: Planet): _boolean_ - -#### Parameters - -| Name | Type | -| :------- | :----- | -| `planet` | Planet | - -**Returns:** _boolean_ - ---- - -### hexifyBigIntNestedArray - -▸ `Const` **hexifyBigIntNestedArray**(`arr`: NestedBigIntArray): NestedStringArray - -#### Parameters - -| Name | Type | -| :---- | :---------------- | -| `arr` | NestedBigIntArray | - -**Returns:** NestedStringArray - ---- - -### hslStr - -▸ `Const` **hslStr**(`h`: _number_, `s`: _number_, `l`: _number_): _string_ - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `h` | _number_ | -| `s` | _number_ | -| `l` | _number_ | - -**Returns:** _string_ - ---- - -### isFullRank - -▸ `Const` **isFullRank**(`planet`: _undefined_ \| Planet): _boolean_ - -#### Parameters - -| Name | Type | -| :------- | :-------------------- | -| `planet` | _undefined_ \| Planet | - -**Returns:** _boolean_ - ---- - -### neverResolves - -▸ **neverResolves**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### rejectAfter - -▸ **rejectAfter**(`ms`: _number_, `msg`: _string_): _Promise_ - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `ms` | _number_ | -| `msg` | _string_ | - -**Returns:** _Promise_ - ---- - -### sleep - -▸ **sleep**(`timeout`: _number_, `returns?`: T): _Promise_ - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `timeout` | _number_ | -| `returns?` | T | - -**Returns:** _Promise_ - ---- - -### timeoutAfter - -▸ `Const` **timeoutAfter**(`promise`: _Promise_, `ms`: _number_, `timeoutMsg`: _string_): _Promise_ - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :----------- | :------------ | -| `promise` | _Promise_ | -| `ms` | _number_ | -| `timeoutMsg` | _string_ | - -**Returns:** _Promise_ - ---- - -### titleCase - -▸ `Const` **titleCase**(`title`: _string_): _string_ - -#### Parameters - -| Name | Type | -| :------ | :------- | -| `title` | _string_ | - -**Returns:** _string_ - ---- - -### upgradeName - -▸ `Const` **upgradeName**(`branchName`: UpgradeBranchName): _string_ - -#### Parameters - -| Name | Type | -| :----------- | :---------------- | -| `branchName` | UpgradeBranchName | - -**Returns:** _string_ diff --git a/docs/modules/backend_utils_utilstypes.md b/docs/modules/backend_utils_utilstypes.md deleted file mode 100644 index e509704e..00000000 --- a/docs/modules/backend_utils_utilstypes.md +++ /dev/null @@ -1,17 +0,0 @@ -# Module: Backend/Utils/UtilsTypes - -## Table of contents - -### Interfaces - -- [PlanetCosmeticInfo](../interfaces/backend_utils_utilstypes.planetcosmeticinfo.md) - -### Type aliases - -- [RuinsInfo](backend_utils_utilstypes.md#ruinsinfo) - -## Type aliases - -### RuinsInfo - -Ƭ **RuinsInfo**: _Record_ diff --git a/docs/modules/frontend_components_ancientlabel.md b/docs/modules/frontend_components_ancientlabel.md deleted file mode 100644 index d242a10a..00000000 --- a/docs/modules/frontend_components_ancientlabel.md +++ /dev/null @@ -1,34 +0,0 @@ -# Module: Frontend/Components/AncientLabel - -## Table of contents - -### Variables - -- [ancientAnim](frontend_components_ancientlabel.md#ancientanim) - -### Functions - -- [AncientLabel](frontend_components_ancientlabel.md#ancientlabel) -- [AncientLabelAnim](frontend_components_ancientlabel.md#ancientlabelanim) - -## Variables - -### ancientAnim - -• `Const` **ancientAnim**: FlattenSimpleInterpolation - -## Functions - -### AncientLabel - -▸ `Const` **AncientLabel**(): _Element_ - -**Returns:** _Element_ - ---- - -### AncientLabelAnim - -▸ `Const` **AncientLabelAnim**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_artifactimage.md b/docs/modules/frontend_components_artifactimage.md deleted file mode 100644 index 5988ba2d..00000000 --- a/docs/modules/frontend_components_artifactimage.md +++ /dev/null @@ -1,35 +0,0 @@ -# Module: Frontend/Components/ArtifactImage - -## Table of contents - -### Variables - -- [ARTIFACT_URL](frontend_components_artifactimage.md#artifact_url) - -### Functions - -- [ArtifactImage](frontend_components_artifactimage.md#artifactimage) - -## Variables - -### ARTIFACT_URL - -• `Const` **ARTIFACT_URL**: `"https://d2wspbczt15cqu.cloudfront.net/v0.6.0-artifacts/"`= 'https://d2wspbczt15cqu.cloudfront.net/v0.6.0-artifacts/' - -## Functions - -### ArtifactImage - -▸ **ArtifactImage**(`__namedParameters`: { `artifact`: Artifact ; `bgColor?`: [_ArtifactFileColor_](../enums/backend_gamelogic_artifactutils.artifactfilecolor.md) ; `size`: _number_ ; `thumb?`: _boolean_ }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | -| `__namedParameters.bgColor?` | [_ArtifactFileColor_](../enums/backend_gamelogic_artifactutils.artifactfilecolor.md) | -| `__namedParameters.size` | _number_ | -| `__namedParameters.thumb?` | _boolean_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_biomeanims.md b/docs/modules/frontend_components_biomeanims.md deleted file mode 100644 index 4c7a0c30..00000000 --- a/docs/modules/frontend_components_biomeanims.md +++ /dev/null @@ -1,34 +0,0 @@ -# Module: Frontend/Components/BiomeAnims - -## Table of contents - -### Variables - -- [burnAnim](frontend_components_biomeanims.md#burnanim) -- [icyAnim](frontend_components_biomeanims.md#icyanim) -- [shakeAnim](frontend_components_biomeanims.md#shakeanim) -- [wiggle](frontend_components_biomeanims.md#wiggle) - -## Variables - -### burnAnim - -• `Const` **burnAnim**: FlattenSimpleInterpolation - ---- - -### icyAnim - -• `Const` **icyAnim**: FlattenSimpleInterpolation - ---- - -### shakeAnim - -• `Const` **shakeAnim**: FlattenSimpleInterpolation - ---- - -### wiggle - -• `Const` **wiggle**: Keyframes diff --git a/docs/modules/frontend_components_btn.md b/docs/modules/frontend_components_btn.md deleted file mode 100644 index dca8081a..00000000 --- a/docs/modules/frontend_components_btn.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Components/Btn - -## Table of contents - -### Interfaces - -- [BtnProps](../interfaces/frontend_components_btn.btnprops.md) - -### Functions - -- [Btn](frontend_components_btn.md#btn) - -## Functions - -### Btn - -▸ **Btn**(`props`: [_BtnProps_](../interfaces/frontend_components_btn.btnprops.md) & _React.HTMLAttributes_): _Element_ - -#### Parameters - -| Name | Type | -| :------ | :--------------------------------------------------------------------------------------------------------- | -| `props` | [_BtnProps_](../interfaces/frontend_components_btn.btnprops.md) & _React.HTMLAttributes_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_button.md b/docs/modules/frontend_components_button.md deleted file mode 100644 index 1c830fa7..00000000 --- a/docs/modules/frontend_components_button.md +++ /dev/null @@ -1,21 +0,0 @@ -# Module: Frontend/Components/Button - -## Table of contents - -### Functions - -- [default](frontend_components_button.md#default) - -## Functions - -### default - -▸ **default**(`__namedParameters`: ButtonProps): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :---------- | -| `__namedParameters` | ButtonProps | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_coreui.md b/docs/modules/frontend_components_coreui.md deleted file mode 100644 index a95b07bc..00000000 --- a/docs/modules/frontend_components_coreui.md +++ /dev/null @@ -1,112 +0,0 @@ -# Module: Frontend/Components/CoreUI - -## Table of contents - -### Variables - -- [CenterBackgroundSubtext](frontend_components_coreui.md#centerbackgroundsubtext) -- [CenterRow](frontend_components_coreui.md#centerrow) -- [Hidden](frontend_components_coreui.md#hidden) -- [HoverableTooltip](frontend_components_coreui.md#hoverabletooltip) -- [MaxWidth](frontend_components_coreui.md#maxwidth) -- [PluginElements](frontend_components_coreui.md#pluginelements) -- [Select](frontend_components_coreui.md#select) -- [Spacer](frontend_components_coreui.md#spacer) -- [Truncate](frontend_components_coreui.md#truncate) -- [Underline](frontend_components_coreui.md#underline) - -### Functions - -- [SelectFrom](frontend_components_coreui.md#selectfrom) - -## Variables - -### CenterBackgroundSubtext - -• `Const` **CenterBackgroundSubtext**: _StyledComponent_<`"div"`, any, { `height`: _string_ ; `width`: _string_ }, never\> - -A box which centers some darkened text. Useful for displaying -_somthing_ instead of empty space, if there isn't something to -be displayed. Think of it as a placeholder. - ---- - -### CenterRow - -• `Const` **CenterRow**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### Hidden - -• `Const` **Hidden**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### HoverableTooltip - -• `Const` **HoverableTooltip**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### MaxWidth - -• `Const` **MaxWidth**: _StyledComponent_<`"div"`, any, { `width`: _string_ }, never\> - ---- - -### PluginElements - -• `Const` **PluginElements**: _StyledComponent_<`"div"`, any, {}, never\> - -The container element into which a plugin renders its html elements. -Contains styles for child elements so that plugins can use UI -that is consistent with the rest of Dark Forest's UI. Keeping this up -to date will be an ongoing challange, but there's probably some better -way to do this. - ---- - -### Select - -• `Const` **Select**: _StyledComponent_<`"select"`, any, {}, never\> - ---- - -### Spacer - -• `Const` **Spacer**: _StyledComponent_<`"div"`, any, { `height?`: _number_ ; `width?`: _number_ }, never\> - ---- - -### Truncate - -• `Const` **Truncate**: _StyledComponent_<`"div"`, any, { `maxWidth?`: _string_ }, never\> - ---- - -### Underline - -• `Const` **Underline**: _StyledComponent_<`"span"`, any, {}, never\> - -## Functions - -### SelectFrom - -▸ **SelectFrom**(`__namedParameters`: { `labels`: _string_[] ; `setValue`: (`value`: _string_) => _void_ ; `style?`: React.CSSProperties ; `value`: _string_ ; `values`: _string_[] }): _Element_ - -Controllable input that allows the user to select from one of the -given string values. - -#### Parameters - -| Name | Type | -| :--------------------------- | :---------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.labels` | _string_[] | -| `__namedParameters.setValue` | (`value`: _string_) => _void_ | -| `__namedParameters.style?` | React.CSSProperties | -| `__namedParameters.value` | _string_ | -| `__namedParameters.values` | _string_[] | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_corner.md b/docs/modules/frontend_components_corner.md deleted file mode 100644 index 08dd1ddb..00000000 --- a/docs/modules/frontend_components_corner.md +++ /dev/null @@ -1,21 +0,0 @@ -# Module: Frontend/Components/Corner - -## Table of contents - -### Functions - -- [Corner](frontend_components_corner.md#corner) - -## Functions - -### Corner - -▸ **Corner**(`__namedParameters`: CornerProps): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :---------- | -| `__namedParameters` | CornerProps | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_displaygasprices.md b/docs/modules/frontend_components_displaygasprices.md deleted file mode 100644 index dcad431c..00000000 --- a/docs/modules/frontend_components_displaygasprices.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Components/DisplayGasPrices - -## Table of contents - -### Functions - -- [DisplayGasPrices](frontend_components_displaygasprices.md#displaygasprices) - -## Functions - -### DisplayGasPrices - -▸ **DisplayGasPrices**(`__namedParameters`: { `gasPrices?`: GasPrices }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------------- | :-------- | -| `__namedParameters` | _object_ | -| `__namedParameters.gasPrices?` | GasPrices | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_email.md b/docs/modules/frontend_components_email.md deleted file mode 100644 index 27a17056..00000000 --- a/docs/modules/frontend_components_email.md +++ /dev/null @@ -1,26 +0,0 @@ -# Module: Frontend/Components/Email - -## Table of contents - -### Enumerations - -- [EmailCTAMode](../enums/frontend_components_email.emailctamode.md) - -### Functions - -- [EmailCTA](frontend_components_email.md#emailcta) - -## Functions - -### EmailCTA - -▸ `Const` **EmailCTA**(`__namedParameters`: { `mode`: [_EmailCTAMode_](../enums/frontend_components_email.emailctamode.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :------------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.mode` | [_EmailCTAMode_](../enums/frontend_components_email.emailctamode.md) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_flexrows.md b/docs/modules/frontend_components_flexrows.md deleted file mode 100644 index bd5ddf35..00000000 --- a/docs/modules/frontend_components_flexrows.md +++ /dev/null @@ -1,13 +0,0 @@ -# Module: Frontend/Components/FlexRows - -## Table of contents - -### Variables - -- [SpacedFlexRow](frontend_components_flexrows.md#spacedflexrow) - -## Variables - -### SpacedFlexRow - -• `Const` **SpacedFlexRow**: _StyledComponent_<`"div"`, any, {}, never\> diff --git a/docs/modules/frontend_components_gamelandingpagecomponents.md b/docs/modules/frontend_components_gamelandingpagecomponents.md deleted file mode 100644 index 37325ed2..00000000 --- a/docs/modules/frontend_components_gamelandingpagecomponents.md +++ /dev/null @@ -1,78 +0,0 @@ -# Module: Frontend/Components/GameLandingPageComponents - -## Table of contents - -### Variables - -- [Hidden](frontend_components_gamelandingpagecomponents.md#hidden) - -### Functions - -- [GameWindowWrapper](frontend_components_gamelandingpagecomponents.md#gamewindowwrapper) -- [TerminalToggler](frontend_components_gamelandingpagecomponents.md#terminaltoggler) -- [TerminalWrapper](frontend_components_gamelandingpagecomponents.md#terminalwrapper) -- [Wrapper](frontend_components_gamelandingpagecomponents.md#wrapper) - -## Variables - -### Hidden - -• `Const` **Hidden**: _StyledComponent_<`"div"`, any, {}, never\> - -## Functions - -### GameWindowWrapper - -▸ **GameWindowWrapper**(`__namedParameters`: LandingWrapperProps): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :------------------ | -| `__namedParameters` | LandingWrapperProps | - -**Returns:** _Element_ - ---- - -### TerminalToggler - -▸ **TerminalToggler**(`__namedParameters`: { `setTerminalEnabled`: _Dispatch_\> ; `terminalEnabled`: _boolean_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------------------- | :------------------------------------ | -| `__namedParameters` | _object_ | -| `__namedParameters.setTerminalEnabled` | _Dispatch_\> | -| `__namedParameters.terminalEnabled` | _boolean_ | - -**Returns:** _Element_ - ---- - -### TerminalWrapper - -▸ **TerminalWrapper**(`__namedParameters`: LandingWrapperProps): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :------------------ | -| `__namedParameters` | LandingWrapperProps | - -**Returns:** _Element_ - ---- - -### Wrapper - -▸ **Wrapper**(`__namedParameters`: LandingWrapperProps): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :------------------ | -| `__namedParameters` | LandingWrapperProps | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_gamewindowcomponents.md b/docs/modules/frontend_components_gamewindowcomponents.md deleted file mode 100644 index fddc0f8c..00000000 --- a/docs/modules/frontend_components_gamewindowcomponents.md +++ /dev/null @@ -1,66 +0,0 @@ -# Module: Frontend/Components/GameWindowComponents - -## Table of contents - -### Type aliases - -- [PaneProps](frontend_components_gamewindowcomponents.md#paneprops) - -### Variables - -- [CanvasContainer](frontend_components_gamewindowcomponents.md#canvascontainer) -- [CanvasWrapper](frontend_components_gamewindowcomponents.md#canvaswrapper) -- [MainWindow](frontend_components_gamewindowcomponents.md#mainwindow) -- [StyledPane](frontend_components_gamewindowcomponents.md#styledpane) -- [UpperLeft](frontend_components_gamewindowcomponents.md#upperleft) -- [WindowWrapper](frontend_components_gamewindowcomponents.md#windowwrapper) - -## Type aliases - -### PaneProps - -Ƭ **PaneProps**: _object_ - -#### Type declaration - -| Name | Type | -| :------------- | :-------------- | -| `children` | React.ReactNode | -| `headerItems?` | React.ReactNode | -| `title` | _string_ | - -## Variables - -### CanvasContainer - -• `Const` **CanvasContainer**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### CanvasWrapper - -• `Const` **CanvasWrapper**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### MainWindow - -• `Const` **MainWindow**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### StyledPane - -• `Const` **StyledPane**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### UpperLeft - -• `Const` **UpperLeft**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### WindowWrapper - -• `Const` **WindowWrapper**: _StyledComponent_<`"div"`, any, {}, never\> diff --git a/docs/modules/frontend_components_hoverable.md b/docs/modules/frontend_components_hoverable.md deleted file mode 100644 index d2836b9f..00000000 --- a/docs/modules/frontend_components_hoverable.md +++ /dev/null @@ -1,35 +0,0 @@ -# Module: Frontend/Components/Hoverable - -## Table of contents - -### Variables - -- [TOOLTIP_SLOW](frontend_components_hoverable.md#tooltip_slow) - -### Functions - -- [Hoverable](frontend_components_hoverable.md#hoverable) - -## Variables - -### TOOLTIP_SLOW - -• `Const` **TOOLTIP_SLOW**: `1000`= 1000 - -## Functions - -### Hoverable - -▸ **Hoverable**(`__namedParameters`: { `children`: JSX.Element \| JSX.Element[] ; `hoverContents`: () => JSX.Element ; `hoverDelay?`: _number_ ; `quick?`: _boolean_ }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------------- | :--------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | JSX.Element \| JSX.Element[] | -| `__namedParameters.hoverContents` | () => JSX.Element | -| `__namedParameters.hoverDelay?` | _number_ | -| `__namedParameters.quick?` | _boolean_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_iconbutton.md b/docs/modules/frontend_components_iconbutton.md deleted file mode 100644 index b3a7049b..00000000 --- a/docs/modules/frontend_components_iconbutton.md +++ /dev/null @@ -1,13 +0,0 @@ -# Module: Frontend/Components/IconButton - -## Table of contents - -### Variables - -- [IconButton](frontend_components_iconbutton.md#iconbutton) - -## Variables - -### IconButton - -• `Const` **IconButton**: _StyledComponent_<`"div"`, any, { `width?`: _string_ }, never\> diff --git a/docs/modules/frontend_components_icons.md b/docs/modules/frontend_components_icons.md deleted file mode 100644 index 03701b11..00000000 --- a/docs/modules/frontend_components_icons.md +++ /dev/null @@ -1,514 +0,0 @@ -# Module: Frontend/Components/Icons - -## Table of contents - -### Functions - -- [ActivateIcon](frontend_components_icons.md#activateicon) -- [ArtifactIcon](frontend_components_icons.md#artifacticon) -- [BranchIcon](frontend_components_icons.md#branchicon) -- [BroadcastIcon](frontend_components_icons.md#broadcasticon) -- [CloseCircleIcon](frontend_components_icons.md#closecircleicon) -- [DeactivateIcon](frontend_components_icons.md#deactivateicon) -- [DefenseIcon](frontend_components_icons.md#defenseicon) -- [DepositIcon](frontend_components_icons.md#depositicon) -- [EnergyGrowthIcon](frontend_components_icons.md#energygrowthicon) -- [EnergyIcon](frontend_components_icons.md#energyicon) -- [EthIcon](frontend_components_icons.md#ethicon) -- [FullRankIcon](frontend_components_icons.md#fullrankicon) -- [HatIcon](frontend_components_icons.md#haticon) -- [HelpIcon](frontend_components_icons.md#helpicon) -- [LeaderboardIcon](frontend_components_icons.md#leaderboardicon) -- [LockIcon](frontend_components_icons.md#lockicon) -- [MaxLevelIcon](frontend_components_icons.md#maxlevelicon) -- [MaximizeCircleIcon](frontend_components_icons.md#maximizecircleicon) -- [MinimizeCircleIcon](frontend_components_icons.md#minimizecircleicon) -- [PauseIcon](frontend_components_icons.md#pauseicon) -- [PiratesIcon](frontend_components_icons.md#piratesicon) -- [PlanetIcon](frontend_components_icons.md#planeticon) -- [PlanetdexIcon](frontend_components_icons.md#planetdexicon) -- [PlayIcon](frontend_components_icons.md#playicon) -- [PluginIcon](frontend_components_icons.md#pluginicon) -- [QuestionCircleIcon](frontend_components_icons.md#questioncircleicon) -- [RangeIcon](frontend_components_icons.md#rangeicon) -- [Rank1Icon](frontend_components_icons.md#rank1icon) -- [Rank2Icon](frontend_components_icons.md#rank2icon) -- [Rank3Icon](frontend_components_icons.md#rank3icon) -- [Rank4Icon](frontend_components_icons.md#rank4icon) -- [RankIcon](frontend_components_icons.md#rankicon) -- [RightarrowIcon](frontend_components_icons.md#rightarrowicon) -- [SettingsIcon](frontend_components_icons.md#settingsicon) -- [ShareIcon](frontend_components_icons.md#shareicon) -- [SilverGrowthIcon](frontend_components_icons.md#silvergrowthicon) -- [SilverIcon](frontend_components_icons.md#silvericon) -- [SilverProdIcon](frontend_components_icons.md#silverprodicon) -- [SpeedIcon](frontend_components_icons.md#speedicon) -- [StatIcon](frontend_components_icons.md#staticon) -- [TargetIcon](frontend_components_icons.md#targeticon) -- [TwitterIcon](frontend_components_icons.md#twittericon) -- [UpgradeIcon](frontend_components_icons.md#upgradeicon) -- [WithdrawIcon](frontend_components_icons.md#withdrawicon) - -## Functions - -### ActivateIcon - -▸ `Const` **ActivateIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### ArtifactIcon - -▸ `Const` **ArtifactIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### BranchIcon - -▸ `Const` **BranchIcon**(`__namedParameters`: { `branch`: _number_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.branch` | _number_ | - -**Returns:** _Element_ - ---- - -### BroadcastIcon - -▸ `Const` **BroadcastIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### CloseCircleIcon - -▸ `Const` **CloseCircleIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### DeactivateIcon - -▸ `Const` **DeactivateIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### DefenseIcon - -▸ `Const` **DefenseIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### DepositIcon - -▸ `Const` **DepositIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### EnergyGrowthIcon - -▸ `Const` **EnergyGrowthIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### EnergyIcon - -▸ `Const` **EnergyIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### EthIcon - -▸ `Const` **EthIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### FullRankIcon - -▸ `Const` **FullRankIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### HatIcon - -▸ `Const` **HatIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### HelpIcon - -▸ `Const` **HelpIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### LeaderboardIcon - -▸ `Const` **LeaderboardIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### LockIcon - -▸ `Const` **LockIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### MaxLevelIcon - -▸ `Const` **MaxLevelIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### MaximizeCircleIcon - -▸ `Const` **MaximizeCircleIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### MinimizeCircleIcon - -▸ `Const` **MinimizeCircleIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### PauseIcon - -▸ `Const` **PauseIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### PiratesIcon - -▸ `Const` **PiratesIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### PlanetIcon - -▸ `Const` **PlanetIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### PlanetdexIcon - -▸ `Const` **PlanetdexIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### PlayIcon - -▸ `Const` **PlayIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### PluginIcon - -▸ `Const` **PluginIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### QuestionCircleIcon - -▸ `Const` **QuestionCircleIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### RangeIcon - -▸ `Const` **RangeIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### Rank1Icon - -▸ `Const` **Rank1Icon**(): _Element_ - -**Returns:** _Element_ - ---- - -### Rank2Icon - -▸ `Const` **Rank2Icon**(): _Element_ - -**Returns:** _Element_ - ---- - -### Rank3Icon - -▸ `Const` **Rank3Icon**(): _Element_ - -**Returns:** _Element_ - ---- - -### Rank4Icon - -▸ `Const` **Rank4Icon**(): _Element_ - -**Returns:** _Element_ - ---- - -### RankIcon - -▸ `Const` **RankIcon**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### RightarrowIcon - -▸ `Const` **RightarrowIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### SettingsIcon - -▸ `Const` **SettingsIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### ShareIcon - -▸ `Const` **ShareIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### SilverGrowthIcon - -▸ `Const` **SilverGrowthIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### SilverIcon - -▸ `Const` **SilverIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### SilverProdIcon - -▸ `Const` **SilverProdIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### SpeedIcon - -▸ `Const` **SpeedIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ - ---- - -### StatIcon - -▸ `Const` **StatIcon**(`__namedParameters`: { `stat`: [_StatIdx_](../enums/_types_global_globaltypes.statidx.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.stat` | [_StatIdx_](../enums/_types_global_globaltypes.statidx.md) | - -**Returns:** _Element_ - ---- - -### TargetIcon - -▸ `Const` **TargetIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### TwitterIcon - -▸ `Const` **TwitterIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### UpgradeIcon - -▸ `Const` **UpgradeIcon**(): _Element_ - -**Returns:** _Element_ - ---- - -### WithdrawIcon - -▸ `Const` **WithdrawIcon**(`__namedParameters`: { `color?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _string_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_input.md b/docs/modules/frontend_components_input.md deleted file mode 100644 index fba2db69..00000000 --- a/docs/modules/frontend_components_input.md +++ /dev/null @@ -1,20 +0,0 @@ -# Module: Frontend/Components/Input - -## Table of contents - -### Variables - -- [DFInput](frontend_components_input.md#dfinput) -- [Input](frontend_components_input.md#input) - -## Variables - -### DFInput - -• `Const` **DFInput**: _StyledComponent_<`"input"`, any, { `wide?`: _boolean_ }, never\> - ---- - -### Input - -• `Const` **Input**: _ForwardRefExoticComponent_<_Pick_<_ClassAttributes_ & _InputHTMLAttributes_ & InputProps, `"id"` \| `"children"` \| `"list"` \| `"step"` \| `"type"` \| `"key"` \| `"size"` \| `"name"` \| `"value"` \| `"form"` \| `"accept"` \| `"wide"` \| `"slot"` \| `"style"` \| `"title"` \| `"pattern"` \| `"defaultChecked"` \| `"defaultValue"` \| `"suppressContentEditableWarning"` \| `"suppressHydrationWarning"` \| `"accessKey"` \| `"className"` \| `"contentEditable"` \| `"contextMenu"` \| `"dir"` \| `"draggable"` \| `"hidden"` \| `"lang"` \| `"placeholder"` \| `"spellCheck"` \| `"tabIndex"` \| `"translate"` \| `"radioGroup"` \| `"role"` \| `"about"` \| `"datatype"` \| `"inlist"` \| `"prefix"` \| `"property"` \| `"resource"` \| `"typeof"` \| `"vocab"` \| `"autoCapitalize"` \| `"autoCorrect"` \| `"autoSave"` \| `"color"` \| `"itemProp"` \| `"itemScope"` \| `"itemType"` \| `"itemID"` \| `"itemRef"` \| `"results"` \| `"security"` \| `"unselectable"` \| `"inputMode"` \| `"is"` \| `"aria-activedescendant"` \| `"aria-atomic"` \| `"aria-autocomplete"` \| `"aria-busy"` \| `"aria-checked"` \| `"aria-colcount"` \| `"aria-colindex"` \| `"aria-colspan"` \| `"aria-controls"` \| `"aria-current"` \| `"aria-describedby"` \| `"aria-details"` \| `"aria-disabled"` \| `"aria-dropeffect"` \| `"aria-errormessage"` \| `"aria-expanded"` \| `"aria-flowto"` \| `"aria-grabbed"` \| `"aria-haspopup"` \| `"aria-hidden"` \| `"aria-invalid"` \| `"aria-keyshortcuts"` \| `"aria-label"` \| `"aria-labelledby"` \| `"aria-level"` \| `"aria-live"` \| `"aria-modal"` \| `"aria-multiline"` \| `"aria-multiselectable"` \| `"aria-orientation"` \| `"aria-owns"` \| `"aria-placeholder"` \| `"aria-posinset"` \| `"aria-pressed"` \| `"aria-readonly"` \| `"aria-relevant"` \| `"aria-required"` \| `"aria-roledescription"` \| `"aria-rowcount"` \| `"aria-rowindex"` \| `"aria-rowspan"` \| `"aria-selected"` \| `"aria-setsize"` \| `"aria-sort"` \| `"aria-valuemax"` \| `"aria-valuemin"` \| `"aria-valuenow"` \| `"aria-valuetext"` \| `"dangerouslySetInnerHTML"` \| `"onCopy"` \| `"onCopyCapture"` \| `"onCut"` \| `"onCutCapture"` \| `"onPaste"` \| `"onPasteCapture"` \| `"onCompositionEnd"` \| `"onCompositionEndCapture"` \| `"onCompositionStart"` \| `"onCompositionStartCapture"` \| `"onCompositionUpdate"` \| `"onCompositionUpdateCapture"` \| `"onFocus"` \| `"onFocusCapture"` \| `"onBlur"` \| `"onBlurCapture"` \| `"onChange"` \| `"onChangeCapture"` \| `"onBeforeInput"` \| `"onBeforeInputCapture"` \| `"onInput"` \| `"onInputCapture"` \| `"onReset"` \| `"onResetCapture"` \| `"onSubmit"` \| `"onSubmitCapture"` \| `"onInvalid"` \| `"onInvalidCapture"` \| `"onLoad"` \| `"onLoadCapture"` \| `"onError"` \| `"onErrorCapture"` \| `"onKeyDown"` \| `"onKeyDownCapture"` \| `"onKeyPress"` \| `"onKeyPressCapture"` \| `"onKeyUp"` \| `"onKeyUpCapture"` \| `"onAbort"` \| `"onAbortCapture"` \| `"onCanPlay"` \| `"onCanPlayCapture"` \| `"onCanPlayThrough"` \| `"onCanPlayThroughCapture"` \| `"onDurationChange"` \| `"onDurationChangeCapture"` \| `"onEmptied"` \| `"onEmptiedCapture"` \| `"onEncrypted"` \| `"onEncryptedCapture"` \| `"onEnded"` \| `"onEndedCapture"` \| `"onLoadedData"` \| `"onLoadedDataCapture"` \| `"onLoadedMetadata"` \| `"onLoadedMetadataCapture"` \| `"onLoadStart"` \| `"onLoadStartCapture"` \| `"onPause"` \| `"onPauseCapture"` \| `"onPlay"` \| `"onPlayCapture"` \| `"onPlaying"` \| `"onPlayingCapture"` \| `"onProgress"` \| `"onProgressCapture"` \| `"onRateChange"` \| `"onRateChangeCapture"` \| `"onSeeked"` \| `"onSeekedCapture"` \| `"onSeeking"` \| `"onSeekingCapture"` \| `"onStalled"` \| `"onStalledCapture"` \| `"onSuspend"` \| `"onSuspendCapture"` \| `"onTimeUpdate"` \| `"onTimeUpdateCapture"` \| `"onVolumeChange"` \| `"onVolumeChangeCapture"` \| `"onWaiting"` \| `"onWaitingCapture"` \| `"onAuxClick"` \| `"onAuxClickCapture"` \| `"onClick"` \| `"onClickCapture"` \| `"onContextMenu"` \| `"onContextMenuCapture"` \| `"onDoubleClick"` \| `"onDoubleClickCapture"` \| `"onDrag"` \| `"onDragCapture"` \| `"onDragEnd"` \| `"onDragEndCapture"` \| `"onDragEnter"` \| `"onDragEnterCapture"` \| `"onDragExit"` \| `"onDragExitCapture"` \| `"onDragLeave"` \| `"onDragLeaveCapture"` \| `"onDragOver"` \| `"onDragOverCapture"` \| `"onDragStart"` \| `"onDragStartCapture"` \| `"onDrop"` \| `"onDropCapture"` \| `"onMouseDown"` \| `"onMouseDownCapture"` \| `"onMouseEnter"` \| `"onMouseLeave"` \| `"onMouseMove"` \| `"onMouseMoveCapture"` \| `"onMouseOut"` \| `"onMouseOutCapture"` \| `"onMouseOver"` \| `"onMouseOverCapture"` \| `"onMouseUp"` \| `"onMouseUpCapture"` \| `"onSelect"` \| `"onSelectCapture"` \| `"onTouchCancel"` \| `"onTouchCancelCapture"` \| `"onTouchEnd"` \| `"onTouchEndCapture"` \| `"onTouchMove"` \| `"onTouchMoveCapture"` \| `"onTouchStart"` \| `"onTouchStartCapture"` \| `"onPointerDown"` \| `"onPointerDownCapture"` \| `"onPointerMove"` \| `"onPointerMoveCapture"` \| `"onPointerUp"` \| `"onPointerUpCapture"` \| `"onPointerCancel"` \| `"onPointerCancelCapture"` \| `"onPointerEnter"` \| `"onPointerEnterCapture"` \| `"onPointerLeave"` \| `"onPointerLeaveCapture"` \| `"onPointerOver"` \| `"onPointerOverCapture"` \| `"onPointerOut"` \| `"onPointerOutCapture"` \| `"onGotPointerCapture"` \| `"onGotPointerCaptureCapture"` \| `"onLostPointerCapture"` \| `"onLostPointerCaptureCapture"` \| `"onScroll"` \| `"onScrollCapture"` \| `"onWheel"` \| `"onWheelCapture"` \| `"onAnimationStart"` \| `"onAnimationStartCapture"` \| `"onAnimationEnd"` \| `"onAnimationEndCapture"` \| `"onAnimationIteration"` \| `"onAnimationIterationCapture"` \| `"onTransitionEnd"` \| `"onTransitionEndCapture"` \| `"width"` \| `"height"` \| `"max"` \| `"min"` \| `"crossOrigin"` \| `"autoFocus"` \| `"disabled"` \| `"formAction"` \| `"formEncType"` \| `"formMethod"` \| `"formNoValidate"` \| `"formTarget"` \| `"autoComplete"` \| `"alt"` \| `"src"` \| `"capture"` \| `"checked"` \| `"maxLength"` \| `"minLength"` \| `"multiple"` \| `"readOnly"` \| `"required"`\> & _RefAttributes_\> diff --git a/docs/modules/frontend_components_labels_artifactlabels.md b/docs/modules/frontend_components_labels_artifactlabels.md deleted file mode 100644 index 3cd745fb..00000000 --- a/docs/modules/frontend_components_labels_artifactlabels.md +++ /dev/null @@ -1,112 +0,0 @@ -# Module: Frontend/Components/Labels/ArtifactLabels - -## Table of contents - -### Variables - -- [StyledArtifactRarityLabel](frontend_components_labels_artifactlabels.md#styledartifactraritylabel) - -### Functions - -- [ArtifactBiomeText](frontend_components_labels_artifactlabels.md#artifactbiometext) -- [ArtifactRarityBiomeTypeText](frontend_components_labels_artifactlabels.md#artifactraritybiometypetext) -- [ArtifactRarityLabel](frontend_components_labels_artifactlabels.md#artifactraritylabel) -- [ArtifactRarityLabelAnim](frontend_components_labels_artifactlabels.md#artifactraritylabelanim) -- [ArtifactRarityText](frontend_components_labels_artifactlabels.md#artifactraritytext) -- [ArtifactTypeText](frontend_components_labels_artifactlabels.md#artifacttypetext) - -## Variables - -### StyledArtifactRarityLabel - -• `Const` **StyledArtifactRarityLabel**: _StyledComponent_<`"span"`, any, { `rarity`: ArtifactRarity }, never\> - -## Functions - -### ArtifactBiomeText - -▸ `Const` **ArtifactBiomeText**(`__namedParameters`: { `artifact`: Artifact }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | - -**Returns:** _Element_ - ---- - -### ArtifactRarityBiomeTypeText - -▸ `Const` **ArtifactRarityBiomeTypeText**(`__namedParameters`: { `artifact`: Artifact }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | - -**Returns:** _Element_ - ---- - -### ArtifactRarityLabel - -▸ `Const` **ArtifactRarityLabel**(`__namedParameters`: { `artifact`: Artifact }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | - -**Returns:** _Element_ - ---- - -### ArtifactRarityLabelAnim - -▸ `Const` **ArtifactRarityLabelAnim**(`__namedParameters`: { `artifact`: Artifact }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | - -**Returns:** _Element_ - ---- - -### ArtifactRarityText - -▸ `Const` **ArtifactRarityText**(`__namedParameters`: { `artifact`: Artifact }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | - -**Returns:** _Element_ - ---- - -### ArtifactTypeText - -▸ `Const` **ArtifactTypeText**(`__namedParameters`: { `artifact`: Artifact }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_labels_biomelabels.md b/docs/modules/frontend_components_labels_biomelabels.md deleted file mode 100644 index 136458dd..00000000 --- a/docs/modules/frontend_components_labels_biomelabels.md +++ /dev/null @@ -1,100 +0,0 @@ -# Module: Frontend/Components/Labels/BiomeLabels - -## Table of contents - -### Variables - -- [BiomeLabel](frontend_components_labels_biomelabels.md#biomelabel) - -### Functions - -- [ArtifactBiomeLabel](frontend_components_labels_biomelabels.md#artifactbiomelabel) -- [ArtifactBiomeLabelAnim](frontend_components_labels_biomelabels.md#artifactbiomelabelanim) -- [BiomeLabelAnim](frontend_components_labels_biomelabels.md#biomelabelanim) -- [OptionalPlanetBiomeLabelAnim](frontend_components_labels_biomelabels.md#optionalplanetbiomelabelanim) -- [PlanetBiomeLabelAnim](frontend_components_labels_biomelabels.md#planetbiomelabelanim) - -## Variables - -### BiomeLabel - -• `Const` **BiomeLabel**: _StyledComponent_<`"span"`, any, { `biome`: Biome }, never\> - -Renders colored text corresponding to a biome - -## Functions - -### ArtifactBiomeLabel - -▸ `Const` **ArtifactBiomeLabel**(`__namedParameters`: { `artifact`: Artifact }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | - -**Returns:** _Element_ - ---- - -### ArtifactBiomeLabelAnim - -▸ `Const` **ArtifactBiomeLabelAnim**(`__namedParameters`: { `artifact`: Artifact }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | - -**Returns:** _Element_ - ---- - -### BiomeLabelAnim - -▸ `Const` **BiomeLabelAnim**(`__namedParameters`: { `biome`: Biome }): _Element_ - -Renders animated colored text corresponding to a biome - -#### Parameters - -| Name | Type | -| :------------------------ | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.biome` | Biome | - -**Returns:** _Element_ - ---- - -### OptionalPlanetBiomeLabelAnim - -▸ `Const` **OptionalPlanetBiomeLabelAnim**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### PlanetBiomeLabelAnim - -▸ `Const` **PlanetBiomeLabelAnim**(`__namedParameters`: { `planet`: LocatablePlanet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | LocatablePlanet | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_labels_keywordlabels.md b/docs/modules/frontend_components_labels_keywordlabels.md deleted file mode 100644 index acc063f8..00000000 --- a/docs/modules/frontend_components_labels_keywordlabels.md +++ /dev/null @@ -1,42 +0,0 @@ -# Module: Frontend/Components/Labels/KeywordLabels - -## Table of contents - -### Functions - -- [ScoreLabel](frontend_components_labels_keywordlabels.md#scorelabel) -- [ScoreLabelTip](frontend_components_labels_keywordlabels.md#scorelabeltip) -- [SilverLabel](frontend_components_labels_keywordlabels.md#silverlabel) -- [SilverLabelTip](frontend_components_labels_keywordlabels.md#silverlabeltip) - -## Functions - -### ScoreLabel - -▸ `Const` **ScoreLabel**(): _Element_ - -**Returns:** _Element_ - ---- - -### ScoreLabelTip - -▸ `Const` **ScoreLabelTip**(): _Element_ - -**Returns:** _Element_ - ---- - -### SilverLabel - -▸ `Const` **SilverLabel**(): _Element_ - -**Returns:** _Element_ - ---- - -### SilverLabelTip - -▸ `Const` **SilverLabelTip**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_labels_labels.md b/docs/modules/frontend_components_labels_labels.md deleted file mode 100644 index a4b7b238..00000000 --- a/docs/modules/frontend_components_labels_labels.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Components/Labels/Labels - -## Table of contents - -### Functions - -- [AccountLabel](frontend_components_labels_labels.md#accountlabel) - -## Functions - -### AccountLabel - -▸ **AccountLabel**(`__namedParameters`: { `account`: EthAddress \| _undefined_ }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------- | :------------------------ | -| `__namedParameters` | _object_ | -| `__namedParameters.account` | EthAddress \| _undefined_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_labels_lavalabel.md b/docs/modules/frontend_components_labels_lavalabel.md deleted file mode 100644 index d6f02e27..00000000 --- a/docs/modules/frontend_components_labels_lavalabel.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Components/Labels/LavaLabel - -## Table of contents - -### Variables - -- [LavaLabel](frontend_components_labels_lavalabel.md#lavalabel) - -### Functions - -- [LavaLabelRaw](frontend_components_labels_lavalabel.md#lavalabelraw) - -## Variables - -### LavaLabel - -• `Const` **LavaLabel**: _MemoExoticComponent_<() => _Element_\> - -## Functions - -### LavaLabelRaw - -▸ **LavaLabelRaw**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_labels_mythiclabel.md b/docs/modules/frontend_components_labels_mythiclabel.md deleted file mode 100644 index 4f5beb20..00000000 --- a/docs/modules/frontend_components_labels_mythiclabel.md +++ /dev/null @@ -1,13 +0,0 @@ -# Module: Frontend/Components/Labels/MythicLabel - -## Table of contents - -### Variables - -- [MythicLabel](frontend_components_labels_mythiclabel.md#mythiclabel) - -## Variables - -### MythicLabel - -• `Const` **MythicLabel**: _MemoExoticComponent_<() => _Element_\> diff --git a/docs/modules/frontend_components_labels_planetlabels.md b/docs/modules/frontend_components_labels_planetlabels.md deleted file mode 100644 index 52075a5c..00000000 --- a/docs/modules/frontend_components_labels_planetlabels.md +++ /dev/null @@ -1,315 +0,0 @@ -# Module: Frontend/Components/Labels/PlanetLabels - -## Table of contents - -### Functions - -- [DefenseText](frontend_components_labels_planetlabels.md#defensetext) -- [EnergyCapText](frontend_components_labels_planetlabels.md#energycaptext) -- [EnergyGrowthText](frontend_components_labels_planetlabels.md#energygrowthtext) -- [EnergyText](frontend_components_labels_planetlabels.md#energytext) -- [LevelRankText](frontend_components_labels_planetlabels.md#levelranktext) -- [LevelRankTextEm](frontend_components_labels_planetlabels.md#levelranktextem) -- [PlanetBiomeTypeLabelAnim](frontend_components_labels_planetlabels.md#planetbiometypelabelanim) -- [PlanetEnergyLabel](frontend_components_labels_planetlabels.md#planetenergylabel) -- [PlanetLevelText](frontend_components_labels_planetlabels.md#planetleveltext) -- [PlanetOwnerLabel](frontend_components_labels_planetlabels.md#planetownerlabel) -- [PlanetRankText](frontend_components_labels_planetlabels.md#planetranktext) -- [PlanetSilverLabel](frontend_components_labels_planetlabels.md#planetsilverlabel) -- [PlanetTypeLabelAnim](frontend_components_labels_planetlabels.md#planettypelabelanim) -- [RangeText](frontend_components_labels_planetlabels.md#rangetext) -- [SilverCapText](frontend_components_labels_planetlabels.md#silvercaptext) -- [SilverGrowthText](frontend_components_labels_planetlabels.md#silvergrowthtext) -- [SilverText](frontend_components_labels_planetlabels.md#silvertext) -- [SpeedText](frontend_components_labels_planetlabels.md#speedtext) -- [StatText](frontend_components_labels_planetlabels.md#stattext) - -## Functions - -### DefenseText - -▸ `Const` **DefenseText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### EnergyCapText - -▸ `Const` **EnergyCapText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### EnergyGrowthText - -▸ `Const` **EnergyGrowthText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### EnergyText - -▸ `Const` **EnergyText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### LevelRankText - -▸ `Const` **LevelRankText**(`__namedParameters`: { `delim?`: _string_ ; `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.delim?` | _string_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### LevelRankTextEm - -▸ `Const` **LevelRankTextEm**(`__namedParameters`: { `delim?`: _string_ ; `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.delim?` | _string_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### PlanetBiomeTypeLabelAnim - -▸ `Const` **PlanetBiomeTypeLabelAnim**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### PlanetEnergyLabel - -▸ **PlanetEnergyLabel**(`__namedParameters`: { `planet`: Planet \| _undefined_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | Planet \| _undefined_ | - -**Returns:** _Element_ - ---- - -### PlanetLevelText - -▸ `Const` **PlanetLevelText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### PlanetOwnerLabel - -▸ **PlanetOwnerLabel**(`__namedParameters`: { `color?`: _boolean_ ; `planet`: Planet \| _undefined_ ; `showYours?`: _boolean_ }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.color?` | _boolean_ | -| `__namedParameters.planet` | Planet \| _undefined_ | -| `__namedParameters.showYours?` | _boolean_ | - -**Returns:** _Element_ - ---- - -### PlanetRankText - -▸ `Const` **PlanetRankText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### PlanetSilverLabel - -▸ **PlanetSilverLabel**(`__namedParameters`: { `planet`: Planet \| _undefined_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | Planet \| _undefined_ | - -**Returns:** _Element_ - ---- - -### PlanetTypeLabelAnim - -▸ `Const` **PlanetTypeLabelAnim**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### RangeText - -▸ `Const` **RangeText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### SilverCapText - -▸ `Const` **SilverCapText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### SilverGrowthText - -▸ `Const` **SilverGrowthText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### SilverText - -▸ `Const` **SilverText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### SpeedText - -▸ `Const` **SpeedText**(`__namedParameters`: { `planet`: _undefined_ \| Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | _undefined_ \| Planet | - -**Returns:** _Element_ - ---- - -### StatText - -▸ **StatText**(`__namedParameters`: { `getStat`: (`p`: Planet) => _number_ ; `planet`: Planet \| _undefined_ }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------- | :------------------------ | -| `__namedParameters` | _object_ | -| `__namedParameters.getStat` | (`p`: Planet) => _number_ | -| `__namedParameters.planet` | Planet \| _undefined_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_labels_wastelandlabel.md b/docs/modules/frontend_components_labels_wastelandlabel.md deleted file mode 100644 index ca989efe..00000000 --- a/docs/modules/frontend_components_labels_wastelandlabel.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Components/Labels/WastelandLabel - -## Table of contents - -### Variables - -- [WastelandLabel](frontend_components_labels_wastelandlabel.md#wastelandlabel) - -### Functions - -- [WastelandLabelRaw](frontend_components_labels_wastelandlabel.md#wastelandlabelraw) - -## Variables - -### WastelandLabel - -• `Const` **WastelandLabel**: _MemoExoticComponent_<() => _Element_\> - -## Functions - -### WastelandLabelRaw - -▸ **WastelandLabelRaw**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_loadingspinner.md b/docs/modules/frontend_components_loadingspinner.md deleted file mode 100644 index d79f1f46..00000000 --- a/docs/modules/frontend_components_loadingspinner.md +++ /dev/null @@ -1,23 +0,0 @@ -# Module: Frontend/Components/LoadingSpinner - -## Table of contents - -### Functions - -- [LoadingSpinner](frontend_components_loadingspinner.md#loadingspinner) - -## Functions - -### LoadingSpinner - -▸ **LoadingSpinner**(`__namedParameters`: { `initialText?`: _string_ ; `rate?`: _number_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.initialText?` | _string_ | -| `__namedParameters.rate?` | _number_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_planetpreview.md b/docs/modules/frontend_components_planetpreview.md deleted file mode 100644 index cb53df10..00000000 --- a/docs/modules/frontend_components_planetpreview.md +++ /dev/null @@ -1,41 +0,0 @@ -# Module: Frontend/Components/PlanetPreview - -## Table of contents - -### Functions - -- [PlanetPreview](frontend_components_planetpreview.md#planetpreview) -- [PlanetPreviewImage](frontend_components_planetpreview.md#planetpreviewimage) - -## Functions - -### PlanetPreview - -▸ **PlanetPreview**(`__namedParameters`: { `planet`: Planet \| _undefined_ ; `res`: _number_ ; `size`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | Planet \| _undefined_ | -| `__namedParameters.res` | _number_ | -| `__namedParameters.size` | _string_ | - -**Returns:** _Element_ - ---- - -### PlanetPreviewImage - -▸ **PlanetPreviewImage**(`__namedParameters`: { `planet`: Planet \| _undefined_ ; `res`: _number_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | Planet \| _undefined_ | -| `__namedParameters.res` | _number_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_readmore.md b/docs/modules/frontend_components_readmore.md deleted file mode 100644 index 48fa37c8..00000000 --- a/docs/modules/frontend_components_readmore.md +++ /dev/null @@ -1,23 +0,0 @@ -# Module: Frontend/Components/ReadMore - -## Table of contents - -### Functions - -- [ReadMore](frontend_components_readmore.md#readmore) - -## Functions - -### ReadMore - -▸ **ReadMore**(`__namedParameters`: { `children`: React.ReactChild[] \| React.ReactChild ; `height?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactChild[] \| React.ReactChild | -| `__namedParameters.height?` | _string_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_remotemodal.md b/docs/modules/frontend_components_remotemodal.md deleted file mode 100644 index 3b578a78..00000000 --- a/docs/modules/frontend_components_remotemodal.md +++ /dev/null @@ -1,29 +0,0 @@ -# Module: Frontend/Components/RemoteModal - -## Table of contents - -### Functions - -- [RemoteModal](frontend_components_remotemodal.md#remotemodal) - -## Functions - -### RemoteModal - -▸ **RemoteModal**(`__namedParameters`: { `children`: React.ReactElement ; `container`: Element ; `hook`: [*boolean*, (`set`: *boolean*) => *void*] ; `title`: _string_ }): _ReactPortal_ - -Allows you to instantiate a modal, and render it into the desired element. -Useful for loading temporary modals from ANYWHERE in the UI, not just -[GameWindowLayout](frontend_views_gamewindowlayout.md#gamewindowlayout) - -#### Parameters - -| Name | Type | -| :---------------------------- | :---------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactElement | -| `__namedParameters.container` | Element | -| `__namedParameters.hook` | [*boolean*, (`set`: *boolean*) => *void*] | -| `__namedParameters.title` | _string_ | - -**Returns:** _ReactPortal_ diff --git a/docs/modules/frontend_components_text.md b/docs/modules/frontend_components_text.md deleted file mode 100644 index 1929faec..00000000 --- a/docs/modules/frontend_components_text.md +++ /dev/null @@ -1,350 +0,0 @@ -# Module: Frontend/Components/Text - -## Table of contents - -### Variables - -- [BasicLink](frontend_components_text.md#basiclink) -- [Blue](frontend_components_text.md#blue) -- [Colored](frontend_components_text.md#colored) -- [Gold](frontend_components_text.md#gold) -- [Green](frontend_components_text.md#green) -- [HideSmall](frontend_components_text.md#hidesmall) -- [Invisible](frontend_components_text.md#invisible) -- [Item](frontend_components_text.md#item) -- [List](frontend_components_text.md#list) -- [Paragraph](frontend_components_text.md#paragraph) -- [Red](frontend_components_text.md#red) -- [Smaller](frontend_components_text.md#smaller) -- [StyledLink](frontend_components_text.md#styledlink) -- [Sub](frontend_components_text.md#sub) -- [Subber](frontend_components_text.md#subber) -- [White](frontend_components_text.md#white) - -### Functions - -- [ArtifactNameLink](frontend_components_text.md#artifactnamelink) -- [BlinkCursor](frontend_components_text.md#blinkcursor) -- [CenterChunkLink](frontend_components_text.md#centerchunklink) -- [CenterPlanetLink](frontend_components_text.md#centerplanetlink) -- [Coords](frontend_components_text.md#coords) -- [FAQ04Link](frontend_components_text.md#faq04link) -- [FakeLine](frontend_components_text.md#fakeline) -- [Header](frontend_components_text.md#header) -- [Link](frontend_components_text.md#link) -- [LongDash](frontend_components_text.md#longdash) -- [PlanetNameLink](frontend_components_text.md#planetnamelink) -- [Space](frontend_components_text.md#space) -- [Tab](frontend_components_text.md#tab) -- [Text](frontend_components_text.md#text) -- [Title](frontend_components_text.md#title) -- [TxLink](frontend_components_text.md#txlink) - -## Variables - -### BasicLink - -• `Const` **BasicLink**: _StyledComponent_<`"u"`, any, {}, never\> - ---- - -### Blue - -• `Const` **Blue**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### Colored - -• `Const` **Colored**: _StyledComponent_<`"span"`, any, { `color`: _string_ }, never\> - ---- - -### Gold - -• `Const` **Gold**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### Green - -• `Const` **Green**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### HideSmall - -• `Const` **HideSmall**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### Invisible - -• `Const` **Invisible**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### Item - -• `Const` **Item**: _StyledComponent_<`"li"`, any, {}, never\> - ---- - -### List - -• `Const` **List**: _StyledComponent_<`"ul"`, any, {}, never\> - ---- - -### Paragraph - -• `Const` **Paragraph**: _StyledComponent_<`"p"`, any, {}, never\> - ---- - -### Red - -• `Const` **Red**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### Smaller - -• `Const` **Smaller**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### StyledLink - -• `Const` **StyledLink**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### Sub - -• `Const` **Sub**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### Subber - -• `Const` **Subber**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### White - -• `Const` **White**: _StyledComponent_<`"span"`, any, {}, never\> - -## Functions - -### ArtifactNameLink - -▸ **ArtifactNameLink**(`__namedParameters`: { `id`: ArtifactId }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------- | :--------- | -| `__namedParameters` | _object_ | -| `__namedParameters.id` | ArtifactId | - -**Returns:** _Element_ - ---- - -### BlinkCursor - -▸ **BlinkCursor**(): _Element_ - -**Returns:** _Element_ - ---- - -### CenterChunkLink - -▸ **CenterChunkLink**(`__namedParameters`: { `children`: React.ReactNode ; `chunk`: [_Chunk_](../classes/_types_global_globaltypes.chunk.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactNode | -| `__namedParameters.chunk` | [_Chunk_](../classes/_types_global_globaltypes.chunk.md) | - -**Returns:** _Element_ - ---- - -### CenterPlanetLink - -▸ **CenterPlanetLink**(`__namedParameters`: { `children`: React.ReactNode ; `planet`: Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :-------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactNode | -| `__namedParameters.planet` | Planet | - -**Returns:** _Element_ - ---- - -### Coords - -▸ `Const` **Coords**(`__namedParameters`: { `coords`: WorldCoords }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :---------- | -| `__namedParameters` | _object_ | -| `__namedParameters.coords` | WorldCoords | - -**Returns:** _Element_ - ---- - -### FAQ04Link - -▸ **FAQ04Link**(`__namedParameters`: { `children`: React.ReactNode }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :-------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactNode | - -**Returns:** _Element_ - ---- - -### FakeLine - -▸ `Const` **FakeLine**(): _Element_ - -**Returns:** _Element_ - ---- - -### Header - -▸ **Header**(`__namedParameters`: { `children`: React.ReactNode ; `style?`: React.CSSProperties }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------------------ | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactNode | -| `__namedParameters.style?` | React.CSSProperties | - -**Returns:** _Element_ - ---- - -### Link - -▸ **Link**(`__namedParameters`: LinkProps): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :-------- | -| `__namedParameters` | LinkProps | - -**Returns:** _Element_ - ---- - -### LongDash - -▸ `Const` **LongDash**(): _Element_ - -**Returns:** _Element_ - ---- - -### PlanetNameLink - -▸ **PlanetNameLink**(`__namedParameters`: { `planet`: Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | Planet | - -**Returns:** _Element_ - ---- - -### Space - -▸ **Space**(`__namedParameters`: { `length`: _number_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.length` | _number_ | - -**Returns:** _Element_ - ---- - -### Tab - -▸ `Const` **Tab**(): _Element_ - -**Returns:** _Element_ - ---- - -### Text - -▸ **Text**(`__namedParameters`: TextProps): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :-------- | -| `__namedParameters` | TextProps | - -**Returns:** _Element_ - ---- - -### Title - -▸ **Title**(`__namedParameters`: { `children`: React.ReactNode }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :-------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactNode | - -**Returns:** _Element_ - ---- - -### TxLink - -▸ **TxLink**(`__namedParameters`: { `tx`: SubmittedTx }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------- | :---------- | -| `__namedParameters` | _object_ | -| `__namedParameters.tx` | SubmittedTx | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_textloadingbar.md b/docs/modules/frontend_components_textloadingbar.md deleted file mode 100644 index 802596d6..00000000 --- a/docs/modules/frontend_components_textloadingbar.md +++ /dev/null @@ -1,36 +0,0 @@ -# Module: Frontend/Components/TextLoadingBar - -## Table of contents - -### Interfaces - -- [LoadingBarHandle](../interfaces/frontend_components_textloadingbar.loadingbarhandle.md) - -### Variables - -- [TextLoadingBar](frontend_components_textloadingbar.md#textloadingbar) - -### Functions - -- [TextLoadingBarImpl](frontend_components_textloadingbar.md#textloadingbarimpl) - -## Variables - -### TextLoadingBar - -• `Const` **TextLoadingBar**: _ForwardRefExoticComponent_\> - -## Functions - -### TextLoadingBarImpl - -▸ **TextLoadingBarImpl**(`__namedParameters`: LoadingBarProps, `ref`: _React.Ref_<[_LoadingBarHandle_](../interfaces/frontend_components_textloadingbar.loadingbarhandle.md)\>): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :------------------------------------------------------------------------------------------------------- | -| `__namedParameters` | LoadingBarProps | -| `ref` | _React.Ref_<[_LoadingBarHandle_](../interfaces/frontend_components_textloadingbar.loadingbarhandle.md)\> | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_components_textpreview.md b/docs/modules/frontend_components_textpreview.md deleted file mode 100644 index 5d9c4271..00000000 --- a/docs/modules/frontend_components_textpreview.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Components/TextPreview - -## Table of contents - -### Functions - -- [TextPreview](frontend_components_textpreview.md#textpreview) - -## Functions - -### TextPreview - -▸ **TextPreview**(`__namedParameters`: { `focusedWidthPx?`: _number_ ; `maxLength?`: _number_ ; `text`: _string_ ; `unFocusedWidthPx?`: _number_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------------------ | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.focusedWidthPx?` | _number_ | -| `__namedParameters.maxLength?` | _number_ | -| `__namedParameters.text` | _string_ | -| `__namedParameters.unFocusedWidthPx?` | _number_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_entrypoints.md b/docs/modules/frontend_entrypoints.md deleted file mode 100644 index 9657f7cf..00000000 --- a/docs/modules/frontend_entrypoints.md +++ /dev/null @@ -1 +0,0 @@ -# Module: Frontend/EntryPoints diff --git a/docs/modules/frontend_game_notificationmanager.md b/docs/modules/frontend_game_notificationmanager.md deleted file mode 100644 index b06f2ab8..00000000 --- a/docs/modules/frontend_game_notificationmanager.md +++ /dev/null @@ -1,34 +0,0 @@ -# Module: Frontend/Game/NotificationManager - -## Table of contents - -### Enumerations - -- [NotificationManagerEvent](../enums/frontend_game_notificationmanager.notificationmanagerevent.md) -- [NotificationType](../enums/frontend_game_notificationmanager.notificationtype.md) - -### Classes - -- [default](../classes/frontend_game_notificationmanager.default.md) - -### Type aliases - -- [NotificationInfo](frontend_game_notificationmanager.md#notificationinfo) - -## Type aliases - -### NotificationInfo - -Ƭ **NotificationInfo**: _object_ - -#### Type declaration - -| Name | Type | -| :---------- | :----------------------------------------------------------------------------------- | -| `color?` | _string_ | -| `icon` | React.ReactNode | -| `id` | _string_ | -| `message` | React.ReactNode | -| `txData?` | TxIntent | -| `txStatus?` | EthTxStatus | -| `type` | [_NotificationType_](../enums/frontend_game_notificationmanager.notificationtype.md) | diff --git a/docs/modules/frontend_game_popups.md b/docs/modules/frontend_game_popups.md deleted file mode 100644 index 6b640fc7..00000000 --- a/docs/modules/frontend_game_popups.md +++ /dev/null @@ -1,24 +0,0 @@ -# Module: Frontend/Game/Popups - -## Table of contents - -### Functions - -- [openConfirmationWindowForTransaction](frontend_game_popups.md#openconfirmationwindowfortransaction) - -## Functions - -### openConfirmationWindowForTransaction - -▸ **openConfirmationWindowForTransaction**(`ethConnection`: [_default_](../classes/backend_network_ethconnection.default.md), `txRequest`: [_QueuedTxRequest_](../interfaces/backend_network_txexecutor.queuedtxrequest.md), `from`: EthAddress, `gasFeeGwei`: _number_): _Promise_ - -#### Parameters - -| Name | Type | -| :-------------- | :------------------------------------------------------------------------------- | -| `ethConnection` | [_default_](../classes/backend_network_ethconnection.default.md) | -| `txRequest` | [_QueuedTxRequest_](../interfaces/backend_network_txexecutor.queuedtxrequest.md) | -| `from` | EthAddress | -| `gasFeeGwei` | _number_ | - -**Returns:** _Promise_ diff --git a/docs/modules/frontend_game_viewport.md b/docs/modules/frontend_game_viewport.md deleted file mode 100644 index 99dd63a7..00000000 --- a/docs/modules/frontend_game_viewport.md +++ /dev/null @@ -1,19 +0,0 @@ -# Module: Frontend/Game/Viewport - -## Table of contents - -### Classes - -- [default](../classes/frontend_game_viewport.default.md) - -### Functions - -- [getDefaultScroll](frontend_game_viewport.md#getdefaultscroll) - -## Functions - -### getDefaultScroll - -▸ `Const` **getDefaultScroll**(): _number_ - -**Returns:** _number_ diff --git a/docs/modules/frontend_game_viewportanimation.md b/docs/modules/frontend_game_viewportanimation.md deleted file mode 100644 index 6371c78e..00000000 --- a/docs/modules/frontend_game_viewportanimation.md +++ /dev/null @@ -1,8 +0,0 @@ -# Module: Frontend/Game/ViewportAnimation - -## Table of contents - -### Classes - -- [AnimationManager](../classes/frontend_game_viewportanimation.animationmanager.md) -- [ViewportAnimation](../classes/frontend_game_viewportanimation.viewportanimation.md) diff --git a/docs/modules/frontend_game_windowmanager.md b/docs/modules/frontend_game_windowmanager.md deleted file mode 100644 index 957f7e32..00000000 --- a/docs/modules/frontend_game_windowmanager.md +++ /dev/null @@ -1,30 +0,0 @@ -# Module: Frontend/Game/WindowManager - -## Table of contents - -### Enumerations - -- [CursorState](../enums/frontend_game_windowmanager.cursorstate.md) -- [TooltipName](../enums/frontend_game_windowmanager.tooltipname.md) -- [WindowManagerEvent](../enums/frontend_game_windowmanager.windowmanagerevent.md) - -### Classes - -- [default](../classes/frontend_game_windowmanager.default.md) - -### Type aliases - -- [MousePos](frontend_game_windowmanager.md#mousepos) - -## Type aliases - -### MousePos - -Ƭ **MousePos**: _object_ - -#### Type declaration - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | diff --git a/docs/modules/frontend_pages_gamelandingpage.md b/docs/modules/frontend_pages_gamelandingpage.md deleted file mode 100644 index 88a54d3f..00000000 --- a/docs/modules/frontend_pages_gamelandingpage.md +++ /dev/null @@ -1,19 +0,0 @@ -# Module: Frontend/Pages/GameLandingPage - -## Table of contents - -### Enumerations - -- [InitRenderState](../enums/frontend_pages_gamelandingpage.initrenderstate.md) - -### Functions - -- [default](frontend_pages_gamelandingpage.md#default) - -## Functions - -### default - -▸ **default**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_pages_landingpage.md b/docs/modules/frontend_pages_landingpage.md deleted file mode 100644 index 1f62222f..00000000 --- a/docs/modules/frontend_pages_landingpage.md +++ /dev/null @@ -1,19 +0,0 @@ -# Module: Frontend/Pages/LandingPage - -## Table of contents - -### Enumerations - -- [LandingPageZIndex](../enums/frontend_pages_landingpage.landingpagezindex.md) - -### Functions - -- [default](frontend_pages_landingpage.md#default) - -## Functions - -### default - -▸ **default**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_pages_previewpage.md b/docs/modules/frontend_pages_previewpage.md deleted file mode 100644 index 1912edd5..00000000 --- a/docs/modules/frontend_pages_previewpage.md +++ /dev/null @@ -1,15 +0,0 @@ -# Module: Frontend/Pages/PreviewPage - -## Table of contents - -### Functions - -- [PreviewPage](frontend_pages_previewpage.md#previewpage) - -## Functions - -### PreviewPage - -▸ **PreviewPage**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_pages_shareartifact.md b/docs/modules/frontend_pages_shareartifact.md deleted file mode 100644 index ecea47c5..00000000 --- a/docs/modules/frontend_pages_shareartifact.md +++ /dev/null @@ -1,21 +0,0 @@ -# Module: Frontend/Pages/ShareArtifact - -## Table of contents - -### Functions - -- [ShareArtifact](frontend_pages_shareartifact.md#shareartifact) - -## Functions - -### ShareArtifact - -▸ **ShareArtifact**(`__namedParameters`: _RouteComponentProps_<{ `artifactId`: ArtifactId }\>): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :--------------------------------------------------- | -| `__namedParameters` | _RouteComponentProps_<{ `artifactId`: ArtifactId }\> | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_pages_shareplanet.md b/docs/modules/frontend_pages_shareplanet.md deleted file mode 100644 index b0df29fb..00000000 --- a/docs/modules/frontend_pages_shareplanet.md +++ /dev/null @@ -1,21 +0,0 @@ -# Module: Frontend/Pages/SharePlanet - -## Table of contents - -### Functions - -- [SharePlanet](frontend_pages_shareplanet.md#shareplanet) - -## Functions - -### SharePlanet - -▸ **SharePlanet**(`__namedParameters`: _RouteComponentProps_<{ `locationId`: LocationId }\>): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :--------------------------------------------------- | -| `__namedParameters` | _RouteComponentProps_<{ `locationId`: LocationId }\> | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_pages_txconfirmpopup.md b/docs/modules/frontend_pages_txconfirmpopup.md deleted file mode 100644 index 62d5c5da..00000000 --- a/docs/modules/frontend_pages_txconfirmpopup.md +++ /dev/null @@ -1,21 +0,0 @@ -# Module: Frontend/Pages/TxConfirmPopup - -## Table of contents - -### Functions - -- [TxConfirmPopup](frontend_pages_txconfirmpopup.md#txconfirmpopup) - -## Functions - -### TxConfirmPopup - -▸ **TxConfirmPopup**(`__namedParameters`: RouteComponentProps): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :------------------ | -| `__namedParameters` | RouteComponentProps | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_pages_unsubscribepage.md b/docs/modules/frontend_pages_unsubscribepage.md deleted file mode 100644 index d7c3fe42..00000000 --- a/docs/modules/frontend_pages_unsubscribepage.md +++ /dev/null @@ -1,19 +0,0 @@ -# Module: Frontend/Pages/UnsubscribePage - -## Table of contents - -### Enumerations - -- [LandingPageZIndex](../enums/frontend_pages_unsubscribepage.landingpagezindex.md) - -### Functions - -- [default](frontend_pages_unsubscribepage.md#default) - -## Functions - -### default - -▸ **default**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_pages_valhallapage.md b/docs/modules/frontend_pages_valhallapage.md deleted file mode 100644 index c713c72f..00000000 --- a/docs/modules/frontend_pages_valhallapage.md +++ /dev/null @@ -1,15 +0,0 @@ -# Module: Frontend/Pages/ValhallaPage - -## Table of contents - -### Functions - -- [ValhallaPage](frontend_pages_valhallapage.md#valhallapage) - -## Functions - -### ValhallaPage - -▸ **ValhallaPage**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_artifactconversation_artifactconversationpane.md b/docs/modules/frontend_panes_artifactconversation_artifactconversationpane.md deleted file mode 100644 index 400d84b4..00000000 --- a/docs/modules/frontend_panes_artifactconversation_artifactconversationpane.md +++ /dev/null @@ -1,23 +0,0 @@ -# Module: Frontend/Panes/ArtifactConversation/ArtifactConversationPane - -## Table of contents - -### Functions - -- [ArtifactConversationPane](frontend_panes_artifactconversation_artifactconversationpane.md#artifactconversationpane) - -## Functions - -### ArtifactConversationPane - -▸ **ArtifactConversationPane**(`__namedParameters`: { `artifact`: Artifact \| _undefined_ ; `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact \| _undefined_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_artifactconversation_conversationsuggestions.md b/docs/modules/frontend_panes_artifactconversation_conversationsuggestions.md deleted file mode 100644 index a4674a50..00000000 --- a/docs/modules/frontend_panes_artifactconversation_conversationsuggestions.md +++ /dev/null @@ -1,24 +0,0 @@ -# Module: Frontend/Panes/ArtifactConversation/ConversationSuggestions - -## Table of contents - -### Functions - -- [ConversationSuggestions](frontend_panes_artifactconversation_conversationsuggestions.md#conversationsuggestions) - -## Functions - -### ConversationSuggestions - -▸ **ConversationSuggestions**(`__namedParameters`: { `disabled`: _boolean_ ; `exampleQuestions?`: _string_[] ; `selectQuestion`: (`question`: _string_) => _void_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------------------ | :------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.disabled` | _boolean_ | -| `__namedParameters.exampleQuestions?` | _string_[] | -| `__namedParameters.selectQuestion` | (`question`: _string_) => _void_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_artifactdetailspane.md b/docs/modules/frontend_panes_artifactdetailspane.md deleted file mode 100644 index f806ee77..00000000 --- a/docs/modules/frontend_panes_artifactdetailspane.md +++ /dev/null @@ -1,58 +0,0 @@ -# Module: Frontend/Panes/ArtifactDetailsPane - -## Table of contents - -### Functions - -- [ArtifactDetailsBody](frontend_panes_artifactdetailspane.md#artifactdetailsbody) -- [ArtifactDetailsPane](frontend_panes_artifactdetailspane.md#artifactdetailspane) -- [UpgradeStatInfo](frontend_panes_artifactdetailspane.md#upgradestatinfo) - -## Functions - -### ArtifactDetailsBody - -▸ **ArtifactDetailsBody**(`__namedParameters`: { `artifactWrapper`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) ; `contractConstants`: [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) ; `openConversationForArtifact`: (`id`: ArtifactId) => _void_ }): `null` \| _Element_ - -#### Parameters - -| Name | Type | -| :---------------------------------------------- | :------------------------------------------------------------------------------------------------ | -| `__namedParameters` | _object_ | -| `__namedParameters.artifactWrapper` | [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) | -| `__namedParameters.contractConstants` | [_ContractConstants_](../interfaces/_types_darkforest_api_contractsapitypes.contractconstants.md) | -| `__namedParameters.openConversationForArtifact` | (`id`: ArtifactId) => _void_ | - -**Returns:** `null` \| _Element_ - ---- - -### ArtifactDetailsPane - -▸ **ArtifactDetailsPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) ; `openConversationForArtifact`: (`id`: ArtifactId) => _void_ }): _Element_ - -#### Parameters - -| Name | Type | -| :---------------------------------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | -| `__namedParameters.openConversationForArtifact` | (`id`: ArtifactId) => _void_ | - -**Returns:** _Element_ - ---- - -### UpgradeStatInfo - -▸ **UpgradeStatInfo**(`__namedParameters`: { `stat`: [_StatIdx_](../enums/_types_global_globaltypes.statidx.md) ; `upgrades`: (Upgrade \| _undefined_)[] }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :--------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.stat` | [_StatIdx_](../enums/_types_global_globaltypes.statidx.md) | -| `__namedParameters.upgrades` | (Upgrade \| _undefined_)[] | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_coordspane.md b/docs/modules/frontend_panes_coordspane.md deleted file mode 100644 index 3fed59f3..00000000 --- a/docs/modules/frontend_panes_coordspane.md +++ /dev/null @@ -1,15 +0,0 @@ -# Module: Frontend/Panes/CoordsPane - -## Table of contents - -### Functions - -- [CoordsPane](frontend_panes_coordspane.md#coordspane) - -## Functions - -### CoordsPane - -▸ **CoordsPane**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_diagnosticspane.md b/docs/modules/frontend_panes_diagnosticspane.md deleted file mode 100644 index 0ce4af5f..00000000 --- a/docs/modules/frontend_panes_diagnosticspane.md +++ /dev/null @@ -1,26 +0,0 @@ -# Module: Frontend/Panes/DiagnosticsPane - -## Table of contents - -### Interfaces - -- [Diagnostics](../interfaces/frontend_panes_diagnosticspane.diagnostics.md) - -### Functions - -- [DiagnosticsPane](frontend_panes_diagnosticspane.md#diagnosticspane) - -## Functions - -### DiagnosticsPane - -▸ **DiagnosticsPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_explorepane.md b/docs/modules/frontend_panes_explorepane.md deleted file mode 100644 index 3a1156bb..00000000 --- a/docs/modules/frontend_panes_explorepane.md +++ /dev/null @@ -1,15 +0,0 @@ -# Module: Frontend/Panes/ExplorePane - -## Table of contents - -### Functions - -- [ExplorePane](frontend_panes_explorepane.md#explorepane) - -## Functions - -### ExplorePane - -▸ **ExplorePane**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_hoverplanetpane.md b/docs/modules/frontend_panes_hoverplanetpane.md deleted file mode 100644 index 74f15475..00000000 --- a/docs/modules/frontend_panes_hoverplanetpane.md +++ /dev/null @@ -1,15 +0,0 @@ -# Module: Frontend/Panes/HoverPlanetPane - -## Table of contents - -### Functions - -- [HoverPlanetPane](frontend_panes_hoverplanetpane.md#hoverplanetpane) - -## Functions - -### HoverPlanetPane - -▸ **HoverPlanetPane**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_leaderboardpane.md b/docs/modules/frontend_panes_leaderboardpane.md deleted file mode 100644 index 21847c1a..00000000 --- a/docs/modules/frontend_panes_leaderboardpane.md +++ /dev/null @@ -1,38 +0,0 @@ -# Module: Frontend/Panes/LeaderboardPane - -## Table of contents - -### Functions - -- [LeaderboardPane](frontend_panes_leaderboardpane.md#leaderboardpane) -- [calculateRankAndScore](frontend_panes_leaderboardpane.md#calculaterankandscore) - -## Functions - -### LeaderboardPane - -▸ **LeaderboardPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### calculateRankAndScore - -▸ **calculateRankAndScore**(`scoreboard`: ScoreboardEntry[], `account`: EthAddress): [*number*, *number*] - -#### Parameters - -| Name | Type | -| :----------- | :---------------- | -| `scoreboard` | ScoreboardEntry[] | -| `account` | EthAddress | - -**Returns:** [*number*, *number*] diff --git a/docs/modules/frontend_panes_manageplanetartifacts_artifactactions.md b/docs/modules/frontend_panes_manageplanetartifacts_artifactactions.md deleted file mode 100644 index 5a655978..00000000 --- a/docs/modules/frontend_panes_manageplanetartifacts_artifactactions.md +++ /dev/null @@ -1,31 +0,0 @@ -# Module: Frontend/Panes/ManagePlanetArtifacts/ArtifactActions - -## Table of contents - -### Functions - -- [ArtifactActions](frontend_panes_manageplanetartifacts_artifactactions.md#artifactactions) - -## Functions - -### ArtifactActions - -▸ **ArtifactActions**(`__namedParameters`: { `activate`: (`artifact`: Artifact) => _void_ ; `anyArtifactActive`: _boolean_ ; `artifact`: Artifact ; `deactivate`: (`artifact`: Artifact) => _void_ ; `deposit`: (`artifact`: Artifact) => _void_ ; `planetIsTradingPost`: _boolean_ ; `planetLevel`: _number_ ; `planetOwnedByPlayer`: _boolean_ ; `viewingDepositList`: _boolean_ ; `withdraw`: (`artifact`: Artifact) => _void_ }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------------------- | :------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.activate` | (`artifact`: Artifact) => _void_ | -| `__namedParameters.anyArtifactActive` | _boolean_ | -| `__namedParameters.artifact` | Artifact | -| `__namedParameters.deactivate` | (`artifact`: Artifact) => _void_ | -| `__namedParameters.deposit` | (`artifact`: Artifact) => _void_ | -| `__namedParameters.planetIsTradingPost` | _boolean_ | -| `__namedParameters.planetLevel` | _number_ | -| `__namedParameters.planetOwnedByPlayer` | _boolean_ | -| `__namedParameters.viewingDepositList` | _boolean_ | -| `__namedParameters.withdraw` | (`artifact`: Artifact) => _void_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_manageplanetartifacts_artifactlistitem.md b/docs/modules/frontend_panes_manageplanetartifacts_artifactlistitem.md deleted file mode 100644 index e5b48521..00000000 --- a/docs/modules/frontend_panes_manageplanetartifacts_artifactlistitem.md +++ /dev/null @@ -1,24 +0,0 @@ -# Module: Frontend/Panes/ManagePlanetArtifacts/ArtifactListItem - -## Table of contents - -### Functions - -- [ArtifactListItem](frontend_panes_manageplanetartifacts_artifactlistitem.md#artifactlistitem) - -## Functions - -### ArtifactListItem - -▸ **ArtifactListItem**(`__namedParameters`: { `actions`: (`artifact`: Artifact) => React.ReactElement \| _undefined_ ; `artifact`: Artifact \| _undefined_ ; `openArtifactDetails`: (`artifactId`: ArtifactId) => _void_ }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------------------- | :---------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.actions` | (`artifact`: Artifact) => React.ReactElement \| _undefined_ | -| `__namedParameters.artifact` | Artifact \| _undefined_ | -| `__namedParameters.openArtifactDetails` | (`artifactId`: ArtifactId) => _void_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_manageplanetartifacts_artifactslist.md b/docs/modules/frontend_panes_manageplanetartifacts_artifactslist.md deleted file mode 100644 index c8698519..00000000 --- a/docs/modules/frontend_panes_manageplanetartifacts_artifactslist.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Panes/ManagePlanetArtifacts/ArtifactsList - -## Table of contents - -### Functions - -- [ArtifactsList](frontend_panes_manageplanetartifacts_artifactslist.md#artifactslist) - -## Functions - -### ArtifactsList - -▸ **ArtifactsList**(`__namedParameters`: { `actions`: (`artifact`: Artifact) => React.ReactElement \| _undefined_ ; `artifacts`: (Artifact \| _undefined_)[] ; `openArtifactDetails`: (`artifactId`: ArtifactId) => _void_ ; `sortBy`: keyof Upgrade \| _undefined_ }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------------------- | :---------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.actions` | (`artifact`: Artifact) => React.ReactElement \| _undefined_ | -| `__namedParameters.artifacts` | (Artifact \| _undefined_)[] | -| `__namedParameters.openArtifactDetails` | (`artifactId`: ArtifactId) => _void_ | -| `__namedParameters.sortBy` | keyof Upgrade \| _undefined_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_manageplanetartifacts_find.md b/docs/modules/frontend_panes_manageplanetartifacts_find.md deleted file mode 100644 index f4c552ab..00000000 --- a/docs/modules/frontend_panes_manageplanetartifacts_find.md +++ /dev/null @@ -1,26 +0,0 @@ -# Module: Frontend/Panes/ManagePlanetArtifacts/Find - -## Table of contents - -### Functions - -- [Find](frontend_panes_manageplanetartifacts_find.md#find) - -## Functions - -### Find - -▸ **Find**(`__namedParameters`: { `currentBlockNumber`: _number_ \| _undefined_ ; `find`: () => _void_ ; `isFinding`: _boolean_ ; `planet`: Planet ; `roundOver`: _boolean_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------------------- | :---------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.currentBlockNumber` | _number_ \| _undefined_ | -| `__namedParameters.find` | () => _void_ | -| `__namedParameters.isFinding` | _boolean_ | -| `__namedParameters.planet` | Planet | -| `__namedParameters.roundOver` | _boolean_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_manageplanetartifacts_manageartifacts.md b/docs/modules/frontend_panes_manageplanetartifacts_manageartifacts.md deleted file mode 100644 index 5b0078b8..00000000 --- a/docs/modules/frontend_panes_manageplanetartifacts_manageartifacts.md +++ /dev/null @@ -1,34 +0,0 @@ -# Module: Frontend/Panes/ManagePlanetArtifacts/ManageArtifacts - -## Table of contents - -### Functions - -- [ManageArtifactsPane](frontend_panes_manageplanetartifacts_manageartifacts.md#manageartifactspane) - -## Functions - -### ManageArtifactsPane - -▸ **ManageArtifactsPane**(`__namedParameters`: { `activate`: (`artifact`: Artifact) => _void_ ; `artifactsInInventory`: Artifact[] ; `artifactsOnPlanet`: (Artifact \| _undefined_)[] ; `currentBlockNumber`: _number_ \| _undefined_ ; `deactivate`: (`artifact`: Artifact) => _void_ ; `deposit`: (`artifact`: Artifact) => _void_ ; `find`: () => _void_ ; `openArtifactDetails`: (`artifactId`: ArtifactId) => _void_ ; `planet`: LocatablePlanet ; `playerAddress`: _string_ ; `prospect`: () => _void_ ; `roundOver`: _boolean_ ; `withdraw`: (`artifact`: Artifact) => _void_ }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------------------- | :----------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.activate` | (`artifact`: Artifact) => _void_ | -| `__namedParameters.artifactsInInventory` | Artifact[] | -| `__namedParameters.artifactsOnPlanet` | (Artifact \| _undefined_)[] | -| `__namedParameters.currentBlockNumber` | _number_ \| _undefined_ | -| `__namedParameters.deactivate` | (`artifact`: Artifact) => _void_ | -| `__namedParameters.deposit` | (`artifact`: Artifact) => _void_ | -| `__namedParameters.find` | () => _void_ | -| `__namedParameters.openArtifactDetails` | (`artifactId`: ArtifactId) => _void_ | -| `__namedParameters.planet` | LocatablePlanet | -| `__namedParameters.playerAddress` | _string_ | -| `__namedParameters.prospect` | () => _void_ | -| `__namedParameters.roundOver` | _boolean_ | -| `__namedParameters.withdraw` | (`artifact`: Artifact) => _void_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_manageplanetartifacts_manageplanetartifactspane.md b/docs/modules/frontend_panes_manageplanetartifacts_manageplanetartifactspane.md deleted file mode 100644 index 84a2361e..00000000 --- a/docs/modules/frontend_panes_manageplanetartifacts_manageplanetartifactspane.md +++ /dev/null @@ -1,27 +0,0 @@ -# Module: Frontend/Panes/ManagePlanetArtifacts/ManagePlanetArtifactsPane - -## Table of contents - -### Functions - -- [ManagePlanetArtifactsPane](frontend_panes_manageplanetartifacts_manageplanetartifactspane.md#manageplanetartifactspane) - -## Functions - -### ManagePlanetArtifactsPane - -▸ **ManagePlanetArtifactsPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) ; `setArtifactDetailsOpen`: (`open`: _boolean_) => _void_ }): _Element_ - -This is the place where a user can manage all of their artifacts on a -particular planet. This includes prospecting, withdrawing, depositing, -activating, and deactivating artifacts. - -#### Parameters - -| Name | Type | -| :----------------------------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | -| `__namedParameters.setArtifactDetailsOpen` | (`open`: _boolean_) => _void_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_manageplanetartifacts_prospect.md b/docs/modules/frontend_panes_manageplanetartifacts_prospect.md deleted file mode 100644 index 3181ed7d..00000000 --- a/docs/modules/frontend_panes_manageplanetartifacts_prospect.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Panes/ManagePlanetArtifacts/Prospect - -## Table of contents - -### Functions - -- [Prospect](frontend_panes_manageplanetartifacts_prospect.md#prospect) - -## Functions - -### Prospect - -▸ **Prospect**(`__namedParameters`: { `isProspecting`: _boolean_ ; `planet`: Planet ; `prospect`: () => _void_ ; `roundOver`: _boolean_ }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------------- | :----------- | -| `__namedParameters` | _object_ | -| `__namedParameters.isProspecting` | _boolean_ | -| `__namedParameters.planet` | Planet | -| `__namedParameters.prospect` | () => _void_ | -| `__namedParameters.roundOver` | _boolean_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_manageplanetartifacts_sortby.md b/docs/modules/frontend_panes_manageplanetartifacts_sortby.md deleted file mode 100644 index 738eaa22..00000000 --- a/docs/modules/frontend_panes_manageplanetartifacts_sortby.md +++ /dev/null @@ -1,23 +0,0 @@ -# Module: Frontend/Panes/ManagePlanetArtifacts/SortBy - -## Table of contents - -### Functions - -- [SortBy](frontend_panes_manageplanetartifacts_sortby.md#sortby) - -## Functions - -### SortBy - -▸ **SortBy**(`__namedParameters`: { `setSortBy`: (`k`: keyof Upgrade \| _undefined_) => _void_ ; `sortBy`: keyof Upgrade \| _undefined_ }): _Element_ - -#### Parameters - -| Name | Type | -| :---------------------------- | :-------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.setSortBy` | (`k`: keyof Upgrade \| _undefined_) => _void_ | -| `__namedParameters.sortBy` | keyof Upgrade \| _undefined_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_manageplanetartifacts_upgradestatsview.md b/docs/modules/frontend_panes_manageplanetartifacts_upgradestatsview.md deleted file mode 100644 index 1a844b35..00000000 --- a/docs/modules/frontend_panes_manageplanetartifacts_upgradestatsview.md +++ /dev/null @@ -1,24 +0,0 @@ -# Module: Frontend/Panes/ManagePlanetArtifacts/UpgradeStatsView - -## Table of contents - -### Functions - -- [UpgradeStatsView](frontend_panes_manageplanetartifacts_upgradestatsview.md#upgradestatsview) - -## Functions - -### UpgradeStatsView - -▸ **UpgradeStatsView**(`__namedParameters`: { `artifactType`: ArtifactType ; `isActive`: _boolean_ ; `upgrade`: Upgrade }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------------- | :----------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifactType` | ArtifactType | -| `__namedParameters.isActive` | _boolean_ | -| `__namedParameters.upgrade` | Upgrade | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_onboardingpane.md b/docs/modules/frontend_panes_onboardingpane.md deleted file mode 100644 index bfe4d254..00000000 --- a/docs/modules/frontend_panes_onboardingpane.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Panes/OnboardingPane - -## Table of contents - -### Functions - -- [default](frontend_panes_onboardingpane.md#default) - -## Functions - -### default - -▸ **default**(`__namedParameters`: { `newPlayerHook`: [_Hook_](_types_global_globaltypes.md#hook) }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------------- | :---------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.newPlayerHook` | [_Hook_](_types_global_globaltypes.md#hook) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_paidartifactconversation_conversationinfo.md b/docs/modules/frontend_panes_paidartifactconversation_conversationinfo.md deleted file mode 100644 index d446004b..00000000 --- a/docs/modules/frontend_panes_paidartifactconversation_conversationinfo.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Panes/PaidArtifactConversation/ConversationInfo - -## Table of contents - -### Functions - -- [ConversationInfo](frontend_panes_paidartifactconversation_conversationinfo.md#conversationinfo) - -## Functions - -### ConversationInfo - -▸ **ConversationInfo**(`_`: { `questionsRemaining`: _number_ }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------- | :------- | -| `_` | _object_ | -| `_.questionsRemaining` | _number_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_paidartifactconversation_currencyview.md b/docs/modules/frontend_panes_paidartifactconversation_currencyview.md deleted file mode 100644 index 1f046e34..00000000 --- a/docs/modules/frontend_panes_paidartifactconversation_currencyview.md +++ /dev/null @@ -1,15 +0,0 @@ -# Module: Frontend/Panes/PaidArtifactConversation/CurrencyView - -## Table of contents - -### Functions - -- [CurrencyView](frontend_panes_paidartifactconversation_currencyview.md#currencyview) - -## Functions - -### CurrencyView - -▸ **CurrencyView**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_paidartifactconversation_paidartifactconversationpane.md b/docs/modules/frontend_panes_paidartifactconversation_paidartifactconversationpane.md deleted file mode 100644 index d4513aa7..00000000 --- a/docs/modules/frontend_panes_paidartifactconversation_paidartifactconversationpane.md +++ /dev/null @@ -1,23 +0,0 @@ -# Module: Frontend/Panes/PaidArtifactConversation/PaidArtifactConversationPane - -## Table of contents - -### Functions - -- [PaidArtifactConversationPane](frontend_panes_paidartifactconversation_paidartifactconversationpane.md#paidartifactconversationpane) - -## Functions - -### PaidArtifactConversationPane - -▸ **PaidArtifactConversationPane**(`__namedParameters`: { `artifact`: Artifact \| _undefined_ ; `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact \| _undefined_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_planetdetailspane.md b/docs/modules/frontend_panes_planetdetailspane.md deleted file mode 100644 index c12f4f70..00000000 --- a/docs/modules/frontend_panes_planetdetailspane.md +++ /dev/null @@ -1,23 +0,0 @@ -# Module: Frontend/Panes/PlanetDetailsPane - -## Table of contents - -### Functions - -- [PlanetDetailsPane](frontend_panes_planetdetailspane.md#planetdetailspane) - -## Functions - -### PlanetDetailsPane - -▸ **PlanetDetailsPane**(`__namedParameters`: { `hatHook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) ; `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hatHook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_planetdexpane.md b/docs/modules/frontend_panes_planetdexpane.md deleted file mode 100644 index 90e27555..00000000 --- a/docs/modules/frontend_panes_planetdexpane.md +++ /dev/null @@ -1,38 +0,0 @@ -# Module: Frontend/Panes/PlanetDexPane - -## Table of contents - -### Functions - -- [PlanetDexPane](frontend_panes_planetdexpane.md#planetdexpane) -- [PlanetThumb](frontend_panes_planetdexpane.md#planetthumb) - -## Functions - -### PlanetDexPane - -▸ **PlanetDexPane**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### PlanetThumb - -▸ **PlanetThumb**(`__namedParameters`: { `planet`: Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | Planet | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_playerartifactspane.md b/docs/modules/frontend_panes_playerartifactspane.md deleted file mode 100644 index 0f001de0..00000000 --- a/docs/modules/frontend_panes_playerartifactspane.md +++ /dev/null @@ -1,23 +0,0 @@ -# Module: Frontend/Panes/PlayerArtifactsPane - -## Table of contents - -### Functions - -- [PlayerArtifactsPane](frontend_panes_playerartifactspane.md#playerartifactspane) - -## Functions - -### PlayerArtifactsPane - -▸ **PlayerArtifactsPane**(`__namedParameters`: { `artifactDetailsHook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) ; `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifactDetailsHook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_plugineditorpane.md b/docs/modules/frontend_panes_plugineditorpane.md deleted file mode 100644 index fdf771d6..00000000 --- a/docs/modules/frontend_panes_plugineditorpane.md +++ /dev/null @@ -1,30 +0,0 @@ -# Module: Frontend/Panes/PluginEditorPane - -## Table of contents - -### Functions - -- [PluginEditorPane](frontend_panes_plugineditorpane.md#plugineditorpane) - -## Functions - -### PluginEditorPane - -▸ **PluginEditorPane**(`__namedParameters`: { `overwrite`: (`newPluginName`: _string_, `newPluginCode`: _string_, `pluginId?`: [_PluginId_](backend_plugins_serializedplugin.md#pluginid)) => _void_ ; `pluginHost?`: [_PluginManager_](../classes/backend_gamelogic_pluginmanager.pluginmanager.md) \| `null` ; `pluginId?`: [_PluginId_](backend_plugins_serializedplugin.md#pluginid) ; `setIsOpen`: (`open`: _boolean_) => _void_ }): _Element_ - -Component for editing plugins. Saving causes its containing modal -to be closed, and the `overwrite` to be called, indicating that the -given plugin's source should be overwritten and reloaded. If no -plugin id is provided, assumes we're editing a new plugin. - -#### Parameters - -| Name | Type | -| :------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.overwrite` | (`newPluginName`: _string_, `newPluginCode`: _string_, `pluginId?`: [_PluginId_](backend_plugins_serializedplugin.md#pluginid)) => _void_ | -| `__namedParameters.pluginHost?` | [_PluginManager_](../classes/backend_gamelogic_pluginmanager.pluginmanager.md) \| `null` | -| `__namedParameters.pluginId?` | [_PluginId_](backend_plugins_serializedplugin.md#pluginid) | -| `__namedParameters.setIsOpen` | (`open`: _boolean_) => _void_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_settingspane.md b/docs/modules/frontend_panes_settingspane.md deleted file mode 100644 index f4f29b8d..00000000 --- a/docs/modules/frontend_panes_settingspane.md +++ /dev/null @@ -1,24 +0,0 @@ -# Module: Frontend/Panes/SettingsPane - -## Table of contents - -### Functions - -- [SettingsPane](frontend_panes_settingspane.md#settingspane) - -## Functions - -### SettingsPane - -▸ **SettingsPane**(`__namedParameters`: { `ethConnection`: [_default_](../classes/backend_network_ethconnection.default.md) ; `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) ; `privateHook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------------- | :--------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.ethConnection` | [_default_](../classes/backend_network_ethconnection.default.md) | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | -| `__namedParameters.privateHook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_tooltip.md b/docs/modules/frontend_panes_tooltip.md deleted file mode 100644 index e308361a..00000000 --- a/docs/modules/frontend_panes_tooltip.md +++ /dev/null @@ -1,30 +0,0 @@ -# Module: Frontend/Panes/Tooltip - -## Table of contents - -### Functions - -- [Tooltip](frontend_panes_tooltip.md#tooltip) -- [TooltipTrigger](frontend_panes_tooltip.md#tooltiptrigger) - -## Functions - -### Tooltip - -▸ **Tooltip**(): _Element_ - -**Returns:** _Element_ - ---- - -### TooltipTrigger - -▸ **TooltipTrigger**(`__namedParameters`: TooltipProps): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :----------- | -| `__namedParameters` | TooltipProps | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_tooltippanes.md b/docs/modules/frontend_panes_tooltippanes.md deleted file mode 100644 index 3410c1d9..00000000 --- a/docs/modules/frontend_panes_tooltippanes.md +++ /dev/null @@ -1,346 +0,0 @@ -# Module: Frontend/Panes/TooltipPanes - -## Table of contents - -### Functions - -- [BonusDefenseTooltipPane](frontend_panes_tooltippanes.md#bonusdefensetooltippane) -- [BonusEnergyCapTooltipPane](frontend_panes_tooltippanes.md#bonusenergycaptooltippane) -- [BonusEnergyGroTooltipPane](frontend_panes_tooltippanes.md#bonusenergygrotooltippane) -- [BonusRangeTooltipPane](frontend_panes_tooltippanes.md#bonusrangetooltippane) -- [BonusSpeedTooltipPane](frontend_panes_tooltippanes.md#bonusspeedtooltippane) -- [BonusTooltipPane](frontend_panes_tooltippanes.md#bonustooltippane) -- [ClowntownTooltipPane](frontend_panes_tooltippanes.md#clowntowntooltippane) -- [CurrentMiningTooltipPane](frontend_panes_tooltippanes.md#currentminingtooltippane) -- [EnergyGrowthTooltipPane](frontend_panes_tooltippanes.md#energygrowthtooltippane) -- [EnergyTooltipPane](frontend_panes_tooltippanes.md#energytooltippane) -- [MaxLevelTooltipPane](frontend_panes_tooltippanes.md#maxleveltooltippane) -- [MinEnergyTooltipPane](frontend_panes_tooltippanes.md#minenergytooltippane) -- [MiningPauseTooltipPane](frontend_panes_tooltippanes.md#miningpausetooltippane) -- [MiningTargetTooltipPane](frontend_panes_tooltippanes.md#miningtargettooltippane) -- [ModalBroadcastTooltipPane](frontend_panes_tooltippanes.md#modalbroadcasttooltippane) -- [ModalHelpTooltipPane](frontend_panes_tooltippanes.md#modalhelptooltippane) -- [ModalLeaderboardTooltipPane](frontend_panes_tooltippanes.md#modalleaderboardtooltippane) -- [ModalPlanetDetailsTooltipPane](frontend_panes_tooltippanes.md#modalplanetdetailstooltippane) -- [ModalPlanetDexTooltipPane](frontend_panes_tooltippanes.md#modalplanetdextooltippane) -- [ModalTwitterVerificationTooltipPane](frontend_panes_tooltippanes.md#modaltwitterverificationtooltippane) -- [ModalUpgradeDetailsTooltipPane](frontend_panes_tooltippanes.md#modalupgradedetailstooltippane) -- [PiratesTooltipPane](frontend_panes_tooltippanes.md#piratestooltippane) -- [PlanetRankTooltipPane](frontend_panes_tooltippanes.md#planetranktooltippane) -- [RangeTooltipPane](frontend_panes_tooltippanes.md#rangetooltippane) -- [RankTooltipPane](frontend_panes_tooltippanes.md#ranktooltippane) -- [ScoreTooltipPane](frontend_panes_tooltippanes.md#scoretooltippane) -- [SelectedEnergyTooltipPane](frontend_panes_tooltippanes.md#selectedenergytooltippane) -- [SelectedSilverTooltipPane](frontend_panes_tooltippanes.md#selectedsilvertooltippane) -- [SilverCapTooltipPane](frontend_panes_tooltippanes.md#silvercaptooltippane) -- [SilverGrowthTooltipPane](frontend_panes_tooltippanes.md#silvergrowthtooltippane) -- [SilverProdTooltipPane](frontend_panes_tooltippanes.md#silverprodtooltippane) -- [SilverTooltipPane](frontend_panes_tooltippanes.md#silvertooltippane) -- [Time50TooltipPane](frontend_panes_tooltippanes.md#time50tooltippane) -- [Time90TooltipPane](frontend_panes_tooltippanes.md#time90tooltippane) -- [TooltipContent](frontend_panes_tooltippanes.md#tooltipcontent) -- [TwitterHandleTooltipPane](frontend_panes_tooltippanes.md#twitterhandletooltippane) -- [UpgradesTooltipPane](frontend_panes_tooltippanes.md#upgradestooltippane) - -## Functions - -### BonusDefenseTooltipPane - -▸ **BonusDefenseTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### BonusEnergyCapTooltipPane - -▸ **BonusEnergyCapTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### BonusEnergyGroTooltipPane - -▸ **BonusEnergyGroTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### BonusRangeTooltipPane - -▸ **BonusRangeTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### BonusSpeedTooltipPane - -▸ **BonusSpeedTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### BonusTooltipPane - -▸ **BonusTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### ClowntownTooltipPane - -▸ **ClowntownTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### CurrentMiningTooltipPane - -▸ **CurrentMiningTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### EnergyGrowthTooltipPane - -▸ **EnergyGrowthTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### EnergyTooltipPane - -▸ **EnergyTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### MaxLevelTooltipPane - -▸ **MaxLevelTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### MinEnergyTooltipPane - -▸ **MinEnergyTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### MiningPauseTooltipPane - -▸ **MiningPauseTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### MiningTargetTooltipPane - -▸ **MiningTargetTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### ModalBroadcastTooltipPane - -▸ **ModalBroadcastTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### ModalHelpTooltipPane - -▸ **ModalHelpTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### ModalLeaderboardTooltipPane - -▸ **ModalLeaderboardTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### ModalPlanetDetailsTooltipPane - -▸ **ModalPlanetDetailsTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### ModalPlanetDexTooltipPane - -▸ **ModalPlanetDexTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### ModalTwitterVerificationTooltipPane - -▸ **ModalTwitterVerificationTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### ModalUpgradeDetailsTooltipPane - -▸ **ModalUpgradeDetailsTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### PiratesTooltipPane - -▸ **PiratesTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### PlanetRankTooltipPane - -▸ **PlanetRankTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### RangeTooltipPane - -▸ **RangeTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### RankTooltipPane - -▸ **RankTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### ScoreTooltipPane - -▸ **ScoreTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### SelectedEnergyTooltipPane - -▸ **SelectedEnergyTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### SelectedSilverTooltipPane - -▸ **SelectedSilverTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### SilverCapTooltipPane - -▸ **SilverCapTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### SilverGrowthTooltipPane - -▸ **SilverGrowthTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### SilverProdTooltipPane - -▸ **SilverProdTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### SilverTooltipPane - -▸ **SilverTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### Time50TooltipPane - -▸ **Time50TooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### Time90TooltipPane - -▸ **Time90TooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### TooltipContent - -▸ **TooltipContent**(`__namedParameters`: { `name`: [_TooltipName_](../enums/frontend_game_windowmanager.tooltipname.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :------------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.name` | [_TooltipName_](../enums/frontend_game_windowmanager.tooltipname.md) | - -**Returns:** _Element_ - ---- - -### TwitterHandleTooltipPane - -▸ **TwitterHandleTooltipPane**(): _Element_ - -**Returns:** _Element_ - ---- - -### UpgradesTooltipPane - -▸ **UpgradesTooltipPane**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_tutorialpane.md b/docs/modules/frontend_panes_tutorialpane.md deleted file mode 100644 index b90da6c8..00000000 --- a/docs/modules/frontend_panes_tutorialpane.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Panes/TutorialPane - -## Table of contents - -### Functions - -- [TutorialPane](frontend_panes_tutorialpane.md#tutorialpane) - -## Functions - -### TutorialPane - -▸ **TutorialPane**(`__namedParameters`: { `tutorialHook`: [_Hook_](_types_global_globaltypes.md#hook) }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------------- | :---------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.tutorialHook` | [_Hook_](_types_global_globaltypes.md#hook) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_wikipane.md b/docs/modules/frontend_panes_wikipane.md deleted file mode 100644 index cd0fbcb0..00000000 --- a/docs/modules/frontend_panes_wikipane.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Panes/WikiPane - -## Table of contents - -### Functions - -- [WikiPane](frontend_panes_wikipane.md#wikipane) - -## Functions - -### WikiPane - -▸ **WikiPane**(`__namedParameters`: { `children`: React.ReactNode }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :-------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactNode | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_panes_zoompane.md b/docs/modules/frontend_panes_zoompane.md deleted file mode 100644 index ddb4cef3..00000000 --- a/docs/modules/frontend_panes_zoompane.md +++ /dev/null @@ -1,15 +0,0 @@ -# Module: Frontend/Panes/ZoomPane - -## Table of contents - -### Functions - -- [ZoomPane](frontend_panes_zoompane.md#zoompane) - -## Functions - -### ZoomPane - -▸ **ZoomPane**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_renderers_artifacts_artifactrenderer.md b/docs/modules/frontend_renderers_artifacts_artifactrenderer.md deleted file mode 100644 index ff492aa4..00000000 --- a/docs/modules/frontend_renderers_artifacts_artifactrenderer.md +++ /dev/null @@ -1,52 +0,0 @@ -# Module: Frontend/Renderers/Artifacts/ArtifactRenderer - -## Table of contents - -### Classes - -- [ArtifactRenderer](../classes/frontend_renderers_artifacts_artifactrenderer.artifactrenderer.md) - -### Variables - -- [aDexCanvasH](frontend_renderers_artifacts_artifactrenderer.md#adexcanvash) -- [aDexCanvasW](frontend_renderers_artifacts_artifactrenderer.md#adexcanvasw) -- [aListCanvasH](frontend_renderers_artifacts_artifactrenderer.md#alistcanvash) -- [aListCanvasW](frontend_renderers_artifacts_artifactrenderer.md#alistcanvasw) -- [artifactColM](frontend_renderers_artifacts_artifactrenderer.md#artifactcolm) -- [artifactColW](frontend_renderers_artifacts_artifactrenderer.md#artifactcolw) - -## Variables - -### aDexCanvasH - -• `Const` **aDexCanvasH**: _number_ - ---- - -### aDexCanvasW - -• `Const` **aDexCanvasW**: _number_ - ---- - -### aListCanvasH - -• `Const` **aListCanvasH**: `400`= 400 - ---- - -### aListCanvasW - -• `Const` **aListCanvasW**: `48` - ---- - -### artifactColM - -• `Const` **artifactColM**: `32`= 32 - ---- - -### artifactColW - -• `Const` **artifactColW**: _number_ diff --git a/docs/modules/frontend_renderers_gamerenderer_engineconsts.md b/docs/modules/frontend_renderers_gamerenderer_engineconsts.md deleted file mode 100644 index 4295f76b..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_engineconsts.md +++ /dev/null @@ -1,60 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/EngineConsts - -## Table of contents - -### Variables - -- [engineConsts](frontend_renderers_gamerenderer_engineconsts.md#engineconsts) - -## Variables - -### engineConsts - -• `Const` **engineConsts**: _object_ - -#### Type declaration - -| Name | Type | -| :----------------------- | :------------------------------------------------------------------ | -| `colors` | _object_ | -| `colors.artifacts` | _object_ | -| `colors.artifacts.shine` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.artifacts.trim` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.barbs` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.barbsA` | [_RGBAVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | -| `colors.belt` | _object_ | -| `colors.belt.defense` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.belt.range` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.belt.silver` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.belt.speed` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.bonus` | _object_ | -| `colors.bonus.defense` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.bonus.energyCap` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.bonus.energyGro` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.bonus.range` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.bonus.speed` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.gold` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.purple` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.purpleA` | [_RGBAVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | -| `colors.range` | _object_ | -| `colors.range.dash` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.range.energy` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.red` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.redA` | [_RGBAVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | -| `colors.voyage` | _object_ | -| `colors.voyage.enemy` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.voyage.enemyA` | [_RGBAVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | -| `colors.voyage.mine` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.voyage.mineA` | [_RGBAVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | -| `colors.white` | [_RGBVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) | -| `colors.whiteA` | [_RGBAVec_](frontend_renderers_gamerenderer_enginetypes.md#rgbavec) | -| `dashLength` | _number_ | -| `fontStyle` | _string_ | -| `glyphs` | _object_ | -| `glyphs.canvasDim` | _number_ | -| `glyphs.glyphH` | _number_ | -| `glyphs.glyphW` | _number_ | -| `glyphs.rowL` | _number_ | -| `glyphs.scale` | _number_ | -| `planet` | _object_ | -| `planet.maxRadius` | _number_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_enginetypes.md b/docs/modules/frontend_renderers_gamerenderer_enginetypes.md deleted file mode 100644 index e9d05600..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_enginetypes.md +++ /dev/null @@ -1,108 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/EngineTypes - -## Table of contents - -### Enumerations - -- [AttribType](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) -- [DrawMode](../enums/frontend_renderers_gamerenderer_enginetypes.drawmode.md) -- [RenderZIndex](../enums/frontend_renderers_gamerenderer_enginetypes.renderzindex.md) -- [TextAlign](../enums/frontend_renderers_gamerenderer_enginetypes.textalign.md) -- [TextAnchor](../enums/frontend_renderers_gamerenderer_enginetypes.textanchor.md) -- [UniformType](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) - -### Type aliases - -- [AttribProps](frontend_renderers_gamerenderer_enginetypes.md#attribprops) -- [HSLVec](frontend_renderers_gamerenderer_enginetypes.md#hslvec) -- [RGBAVec](frontend_renderers_gamerenderer_enginetypes.md#rgbavec) -- [RGBVec](frontend_renderers_gamerenderer_enginetypes.md#rgbvec) -- [Scaling](frontend_renderers_gamerenderer_enginetypes.md#scaling) -- [Translation](frontend_renderers_gamerenderer_enginetypes.md#translation) -- [UniformJSType](frontend_renderers_gamerenderer_enginetypes.md#uniformjstype) -- [UniformProps](frontend_renderers_gamerenderer_enginetypes.md#uniformprops) -- [Vec3](frontend_renderers_gamerenderer_enginetypes.md#vec3) - -## Type aliases - -### AttribProps - -Ƭ **AttribProps**: _object_ - -#### Type declaration - -| Name | Type | -| :---------- | :--------------------------------------------------------------------------------- | -| `dim` | _number_ | -| `name` | _string_ | -| `normalize` | _boolean_ | -| `type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | - ---- - -### HSLVec - -Ƭ **HSLVec**: [*number*, *number*, *number*] - ---- - -### RGBAVec - -Ƭ **RGBAVec**: [*number*, *number*, *number*, *number*] - ---- - -### RGBVec - -Ƭ **RGBVec**: [*number*, *number*, *number*] - ---- - -### Scaling - -Ƭ **Scaling**: _object_ - -#### Type declaration - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | - ---- - -### Translation - -Ƭ **Translation**: _object_ - -#### Type declaration - -| Name | Type | -| :--- | :------- | -| `x` | _number_ | -| `y` | _number_ | - ---- - -### UniformJSType - -Ƭ **UniformJSType**: mat4 \| mat3 \| _number_ \| [_Vec3_](frontend_renderers_gamerenderer_enginetypes.md#vec3) - ---- - -### UniformProps - -Ƭ **UniformProps**: _object_ - -#### Type declaration - -| Name | Type | -| :----- | :----------------------------------------------------------------------------------- | -| `name` | _string_ | -| `type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | - ---- - -### Vec3 - -Ƭ **Vec3**: [*number*, *number*, *number*] diff --git a/docs/modules/frontend_renderers_gamerenderer_engineutils.md b/docs/modules/frontend_renderers_gamerenderer_engineutils.md deleted file mode 100644 index d766d5aa..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_engineutils.md +++ /dev/null @@ -1,26 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/EngineUtils - -## Table of contents - -### Classes - -- [default](../classes/frontend_renderers_gamerenderer_engineutils.default.md) - -### Functions - -- [glsl](frontend_renderers_gamerenderer_engineutils.md#glsl) - -## Functions - -### glsl - -▸ `Const` **glsl**(`arr`: _TemplateStringsArray_, ...`args`: _any_[]): _string_ - -#### Parameters - -| Name | Type | -| :-------- | :--------------------- | -| `arr` | _TemplateStringsArray_ | -| `...args` | _any_[] | - -**Returns:** _string_ diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_minebodyrenderer.md b/docs/modules/frontend_renderers_gamerenderer_entities_minebodyrenderer.md deleted file mode 100644 index 715f6ede..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_entities_minebodyrenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Entities/MineBodyRenderer - -## Table of contents - -### Classes - -- [MineBodyRenderer](../classes/frontend_renderers_gamerenderer_entities_minebodyrenderer.minebodyrenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_perlinrenderer.md b/docs/modules/frontend_renderers_gamerenderer_entities_perlinrenderer.md deleted file mode 100644 index bccf7995..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_entities_perlinrenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Entities/PerlinRenderer - -## Table of contents - -### Classes - -- [PerlinRenderer](../classes/frontend_renderers_gamerenderer_entities_perlinrenderer.perlinrenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_perlinutils.md b/docs/modules/frontend_renderers_gamerenderer_entities_perlinutils.md deleted file mode 100644 index f3f43ca5..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_entities_perlinutils.md +++ /dev/null @@ -1,139 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Entities/PerlinUtils - -## Table of contents - -### Enumerations - -- [PerlinOctave](../enums/frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md) - -### Type aliases - -- [GridPoint](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint) -- [PerlinRand](frontend_renderers_gamerenderer_entities_perlinutils.md#perlinrand) - -### Functions - -- [getCachedGradient](frontend_renderers_gamerenderer_entities_perlinutils.md#getcachedgradient) -- [getGridPoint](frontend_renderers_gamerenderer_entities_perlinutils.md#getgridpoint) -- [getPerlinChunks](frontend_renderers_gamerenderer_entities_perlinutils.md#getperlinchunks) -- [isGridPoint](frontend_renderers_gamerenderer_entities_perlinutils.md#isgridpoint) -- [right](frontend_renderers_gamerenderer_entities_perlinutils.md#right) -- [up](frontend_renderers_gamerenderer_entities_perlinutils.md#up) -- [valueOf](frontend_renderers_gamerenderer_entities_perlinutils.md#valueof) - -## Type aliases - -### GridPoint - -Ƭ **GridPoint**: WorldCoords & { `__value`: _never_ } - ---- - -### PerlinRand - -Ƭ **PerlinRand**: _ReturnType_<_typeof_ rand\> - -## Functions - -### getCachedGradient - -▸ **getCachedGradient**(`coords`: [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint), `config`: PerlinConfig, `pow`: [_PerlinOctave_](../enums/frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md)): Vector - -#### Parameters - -| Name | Type | -| :------- | :---------------------------------------------------------------------------------------------- | -| `coords` | [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint) | -| `config` | PerlinConfig | -| `pow` | [_PerlinOctave_](../enums/frontend_renderers_gamerenderer_entities_perlinutils.perlinoctave.md) | - -**Returns:** Vector - ---- - -### getGridPoint - -▸ **getGridPoint**(`bottomLeft`: WorldCoords, `scale`: _number_): [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint) - -#### Parameters - -| Name | Type | -| :----------- | :---------- | -| `bottomLeft` | WorldCoords | -| `scale` | _number_ | - -**Returns:** [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint) - ---- - -### getPerlinChunks - -▸ **getPerlinChunks**(`footprint`: [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md), `lengthScale`: _number_): _Iterable_<[_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)\> - -#### Parameters - -| Name | Type | -| :------------ | :------------------------------------------------------------------ | -| `footprint` | [_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md) | -| `lengthScale` | _number_ | - -**Returns:** _Iterable_<[_Rectangle_](../interfaces/_types_global_globaltypes.rectangle.md)\> - ---- - -### isGridPoint - -▸ **isGridPoint**(`coords`: WorldCoords, `scale`: _number_): coords is GridPoint - -#### Parameters - -| Name | Type | -| :------- | :---------- | -| `coords` | WorldCoords | -| `scale` | _number_ | - -**Returns:** coords is GridPoint - ---- - -### right - -▸ **right**(`topLeft`: [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint), `scale`: _number_): [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint) - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------------------------- | -| `topLeft` | [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint) | -| `scale` | _number_ | - -**Returns:** [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint) - ---- - -### up - -▸ **up**(`topLeft`: [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint), `scale`: _number_): [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint) - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------------------------- | -| `topLeft` | [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint) | -| `scale` | _number_ | - -**Returns:** [_GridPoint_](frontend_renderers_gamerenderer_entities_perlinutils.md#gridpoint) - ---- - -### valueOf - -▸ `Const` **valueOf**(`v`: Vector): [*number*, *number*] - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `v` | Vector | - -**Returns:** [*number*, *number*] diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.md b/docs/modules/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.md deleted file mode 100644 index f6d67577..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Entities/QuasarBodyRenderer - -## Table of contents - -### Classes - -- [QuasarBodyRenderer](../classes/frontend_renderers_gamerenderer_entities_quasarbodyrenderer.quasarbodyrenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_quasarrayrenderer.md b/docs/modules/frontend_renderers_gamerenderer_entities_quasarrayrenderer.md deleted file mode 100644 index 70d54761..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_entities_quasarrayrenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Entities/QuasarRayRenderer - -## Table of contents - -### Classes - -- [QuasarRayRenderer](../classes/frontend_renderers_gamerenderer_entities_quasarrayrenderer.quasarrayrenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_quasarrenderer.md b/docs/modules/frontend_renderers_gamerenderer_entities_quasarrenderer.md deleted file mode 100644 index 10b5df38..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_entities_quasarrenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Entities/QuasarRenderer - -## Table of contents - -### Classes - -- [QuasarRenderer](../classes/frontend_renderers_gamerenderer_entities_quasarrenderer.quasarrenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_ruinsrenderer.md b/docs/modules/frontend_renderers_gamerenderer_entities_ruinsrenderer.md deleted file mode 100644 index c940174b..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_entities_ruinsrenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Entities/RuinsRenderer - -## Table of contents - -### Classes - -- [RuinsRenderer](../classes/frontend_renderers_gamerenderer_entities_ruinsrenderer.ruinsrenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.md b/docs/modules/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.md deleted file mode 100644 index af147424..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer - -## Table of contents - -### Classes - -- [SpacetimeRipRenderer](../classes/frontend_renderers_gamerenderer_entities_spacetimeriprenderer.spacetimeriprenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_spriterenderer.md b/docs/modules/frontend_renderers_gamerenderer_entities_spriterenderer.md deleted file mode 100644 index 60cfa378..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_entities_spriterenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Entities/SpriteRenderer - -## Table of contents - -### Classes - -- [SpriteRenderer](../classes/frontend_renderers_gamerenderer_entities_spriterenderer.spriterenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_entities_wormholerenderer.md b/docs/modules/frontend_renderers_gamerenderer_entities_wormholerenderer.md deleted file mode 100644 index f525b039..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_entities_wormholerenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Entities/WormholeRenderer - -## Table of contents - -### Classes - -- [WormholeRenderer](../classes/frontend_renderers_gamerenderer_entities_wormholerenderer.wormholerenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_asteroidprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_asteroidprogram.md deleted file mode 100644 index 87838778..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_asteroidprogram.md +++ /dev/null @@ -1,53 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/AsteroidProgram - -## Table of contents - -### Variables - -- [ASTEROID_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_asteroidprogram.md#asteroid_program_definition) - -## Variables - -### ASTEROID_PROGRAM_DEFINITION - -• `Const` **ASTEROID_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.radius` | _object_ | -| `attribs.radius.dim` | _number_ | -| `attribs.radius.name` | _string_ | -| `attribs.radius.normalize` | _boolean_ | -| `attribs.radius.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.seed` | _object_ | -| `attribs.seed.dim` | _number_ | -| `attribs.seed.name` | _string_ | -| `attribs.seed.normalize` | _boolean_ | -| `attribs.seed.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.theta` | _object_ | -| `attribs.theta.dim` | _number_ | -| `attribs.theta.name` | _string_ | -| `attribs.theta.normalize` | _boolean_ | -| `attribs.theta.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.now` | _object_ | -| `uniforms.now.name` | _string_ | -| `uniforms.now.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_beltprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_beltprogram.md deleted file mode 100644 index c3015ca0..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_beltprogram.md +++ /dev/null @@ -1,76 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/BeltProgram - -## Table of contents - -### Type aliases - -- [BeltProps](frontend_renderers_gamerenderer_programs_beltprogram.md#beltprops) - -### Variables - -- [BELT_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_beltprogram.md#belt_program_definition) - -### Functions - -- [propsFromIdx](frontend_renderers_gamerenderer_programs_beltprogram.md#propsfromidx) - -## Type aliases - -### BeltProps - -Ƭ **BeltProps**: [*number*, *number*, *number*, *number*] - -## Variables - -### BELT_PROGRAM_DEFINITION - -• `Const` **BELT_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.props` | _object_ | -| `attribs.props.dim` | _number_ | -| `attribs.props.name` | _string_ | -| `attribs.props.normalize` | _boolean_ | -| `attribs.props.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.rectPos` | _object_ | -| `attribs.rectPos.dim` | _number_ | -| `attribs.rectPos.name` | _string_ | -| `attribs.rectPos.normalize` | _boolean_ | -| `attribs.rectPos.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.now` | _object_ | -| `uniforms.now.name` | _string_ | -| `uniforms.now.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | - -## Functions - -### propsFromIdx - -▸ `Const` **propsFromIdx**(`idx`: _number_): [_BeltProps_](frontend_renderers_gamerenderer_programs_beltprogram.md#beltprops) - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `idx` | _number_ | - -**Returns:** [_BeltProps_](frontend_renderers_gamerenderer_programs_beltprogram.md#beltprops) diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_blackdomainprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_blackdomainprogram.md deleted file mode 100644 index dbfe2599..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_blackdomainprogram.md +++ /dev/null @@ -1,38 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/BlackDomainProgram - -## Table of contents - -### Variables - -- [BLACKDOMAIN_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_blackdomainprogram.md#blackdomain_program_definition) - -## Variables - -### BLACKDOMAIN_PROGRAM_DEFINITION - -• `Const` **BLACKDOMAIN_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.rectPos` | _object_ | -| `attribs.rectPos.dim` | _number_ | -| `attribs.rectPos.name` | _string_ | -| `attribs.rectPos.normalize` | _boolean_ | -| `attribs.rectPos.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.now` | _object_ | -| `uniforms.now.name` | _string_ | -| `uniforms.now.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_circleprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_circleprogram.md deleted file mode 100644 index 6c31e96b..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_circleprogram.md +++ /dev/null @@ -1,45 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/CircleProgram - -## Table of contents - -### Variables - -- [CIRCLE_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_circleprogram.md#circle_program_definition) - -## Variables - -### CIRCLE_PROGRAM_DEFINITION - -• `Const` **CIRCLE_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.eps` | _object_ | -| `attribs.eps.dim` | _number_ | -| `attribs.eps.name` | _string_ | -| `attribs.eps.normalize` | _boolean_ | -| `attribs.eps.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.props` | _object_ | -| `attribs.props.dim` | _number_ | -| `attribs.props.name` | _string_ | -| `attribs.props.normalize` | _boolean_ | -| `attribs.props.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_glassprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_glassprogram.md deleted file mode 100644 index 028ce534..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_glassprogram.md +++ /dev/null @@ -1,69 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/GlassProgram - -## Table of contents - -### Type aliases - -- [GlassProgramWithUniforms](frontend_renderers_gamerenderer_programs_glassprogram.md#glassprogramwithuniforms) -- [GlassUniforms](frontend_renderers_gamerenderer_programs_glassprogram.md#glassuniforms) - -### Variables - -- [glassPosProps](frontend_renderers_gamerenderer_programs_glassprogram.md#glassposprops) -- [glassTexProps](frontend_renderers_gamerenderer_programs_glassprogram.md#glasstexprops) - -### Functions - -- [getGlassProgramAndUniforms](frontend_renderers_gamerenderer_programs_glassprogram.md#getglassprogramanduniforms) - -## Type aliases - -### GlassProgramWithUniforms - -Ƭ **GlassProgramWithUniforms**: _object_ - -#### Type declaration - -| Name | Type | -| :--------- | :---------------------------------------------------------------------------------------- | -| `program` | WebGLProgram | -| `uniforms` | [_GlassUniforms_](frontend_renderers_gamerenderer_programs_glassprogram.md#glassuniforms) | - ---- - -### GlassUniforms - -Ƭ **GlassUniforms**: _object_ - -#### Type declaration - -| Name | Type | -| :-------- | :----------------------------- | -| `matrix` | WebGLUniformLocation \| `null` | -| `texture` | WebGLUniformLocation \| `null` | - -## Variables - -### glassPosProps - -• `Const` **glassPosProps**: [_AttribProps_](frontend_renderers_gamerenderer_enginetypes.md#attribprops) - ---- - -### glassTexProps - -• `Const` **glassTexProps**: [_AttribProps_](frontend_renderers_gamerenderer_enginetypes.md#attribprops) - -## Functions - -### getGlassProgramAndUniforms - -▸ `Const` **getGlassProgramAndUniforms**(`gl`: WebGL2RenderingContext): [_GlassProgramWithUniforms_](frontend_renderers_gamerenderer_programs_glassprogram.md#glassprogramwithuniforms) - -#### Parameters - -| Name | Type | -| :--- | :--------------------- | -| `gl` | WebGL2RenderingContext | - -**Returns:** [_GlassProgramWithUniforms_](frontend_renderers_gamerenderer_programs_glassprogram.md#glassprogramwithuniforms) diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_lineprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_lineprogram.md deleted file mode 100644 index 9c005f32..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_lineprogram.md +++ /dev/null @@ -1,40 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/LineProgram - -## Table of contents - -### Variables - -- [LINE_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_lineprogram.md#line_program_definition) - -## Variables - -### LINE_PROGRAM_DEFINITION - -• `Const` **LINE_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.dist` | _object_ | -| `attribs.dist.dim` | _number_ | -| `attribs.dist.name` | _string_ | -| `attribs.dist.normalize` | _boolean_ | -| `attribs.dist.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_maskprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_maskprogram.md deleted file mode 100644 index 83c8da19..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_maskprogram.md +++ /dev/null @@ -1,30 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/MaskProgram - -## Table of contents - -### Variables - -- [MASK_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_maskprogram.md#mask_program_definition) - -## Variables - -### MASK_PROGRAM_DEFINITION - -• `Const` **MASK_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_mineprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_mineprogram.md deleted file mode 100644 index 1ca456f5..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_mineprogram.md +++ /dev/null @@ -1,53 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/MineProgram - -## Table of contents - -### Variables - -- [MINE_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_mineprogram.md#mine_program_definition) - -## Variables - -### MINE_PROGRAM_DEFINITION - -• `Const` **MINE_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.offset` | _object_ | -| `attribs.offset.dim` | _number_ | -| `attribs.offset.name` | _string_ | -| `attribs.offset.normalize` | _boolean_ | -| `attribs.offset.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.radius` | _object_ | -| `attribs.radius.dim` | _number_ | -| `attribs.radius.name` | _string_ | -| `attribs.radius.normalize` | _boolean_ | -| `attribs.radius.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.seed` | _object_ | -| `attribs.seed.dim` | _number_ | -| `attribs.seed.name` | _string_ | -| `attribs.seed.normalize` | _boolean_ | -| `attribs.seed.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.now` | _object_ | -| `uniforms.now.name` | _string_ | -| `uniforms.now.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_noiseprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_noiseprogram.md deleted file mode 100644 index d1b20aca..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_noiseprogram.md +++ /dev/null @@ -1 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/NoiseProgram diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_perlinprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_perlinprogram.md deleted file mode 100644 index e165012f..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_perlinprogram.md +++ /dev/null @@ -1,71 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/PerlinProgram - -## Table of contents - -### Variables - -- [PERLIN_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_perlinprogram.md#perlin_program_definition) - -## Variables - -### PERLIN_PROGRAM_DEFINITION - -• `Const` **PERLIN_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :------------------------------ | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.p0botGrad` | _object_ | -| `attribs.p0botGrad.dim` | _number_ | -| `attribs.p0botGrad.name` | _string_ | -| `attribs.p0botGrad.normalize` | _boolean_ | -| `attribs.p0botGrad.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.p0topGrad` | _object_ | -| `attribs.p0topGrad.dim` | _number_ | -| `attribs.p0topGrad.name` | _string_ | -| `attribs.p0topGrad.normalize` | _boolean_ | -| `attribs.p0topGrad.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.p1botGrad` | _object_ | -| `attribs.p1botGrad.dim` | _number_ | -| `attribs.p1botGrad.name` | _string_ | -| `attribs.p1botGrad.normalize` | _boolean_ | -| `attribs.p1botGrad.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.p1topGrad` | _object_ | -| `attribs.p1topGrad.dim` | _number_ | -| `attribs.p1topGrad.name` | _string_ | -| `attribs.p1topGrad.normalize` | _boolean_ | -| `attribs.p1topGrad.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.p2botGrad` | _object_ | -| `attribs.p2botGrad.dim` | _number_ | -| `attribs.p2botGrad.name` | _string_ | -| `attribs.p2botGrad.normalize` | _boolean_ | -| `attribs.p2botGrad.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.p2topGrad` | _object_ | -| `attribs.p2topGrad.dim` | _number_ | -| `attribs.p2topGrad.name` | _string_ | -| `attribs.p2topGrad.normalize` | _boolean_ | -| `attribs.p2topGrad.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.worldCoords` | _object_ | -| `attribs.worldCoords.dim` | _number_ | -| `attribs.worldCoords.name` | _string_ | -| `attribs.worldCoords.normalize` | _boolean_ | -| `attribs.worldCoords.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.lengthScale` | _object_ | -| `uniforms.lengthScale.name` | _string_ | -| `uniforms.lengthScale.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.thresholds` | _object_ | -| `uniforms.thresholds.name` | _string_ | -| `uniforms.thresholds.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_planetprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_planetprogram.md deleted file mode 100644 index ab20130e..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_planetprogram.md +++ /dev/null @@ -1,159 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/PlanetProgram - -## Table of contents - -### Variables - -- [PLANET_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_planetprogram.md#planet_program_definition) - -### Functions - -- [beachFromPlanet](frontend_renderers_gamerenderer_programs_planetprogram.md#beachfromplanet) -- [cloudsFromPlanet](frontend_renderers_gamerenderer_programs_planetprogram.md#cloudsfromplanet) -- [distortFromPlanet](frontend_renderers_gamerenderer_programs_planetprogram.md#distortfromplanet) -- [morphFromPlanet](frontend_renderers_gamerenderer_programs_planetprogram.md#morphfromplanet) -- [octavesFromPlanet](frontend_renderers_gamerenderer_programs_planetprogram.md#octavesfromplanet) -- [propsFromPlanet](frontend_renderers_gamerenderer_programs_planetprogram.md#propsfromplanet) - -## Variables - -### PLANET_PROGRAM_DEFINITION - -• `Const` **PLANET_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.color2` | _object_ | -| `attribs.color2.dim` | _number_ | -| `attribs.color2.name` | _string_ | -| `attribs.color2.normalize` | _boolean_ | -| `attribs.color2.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.color3` | _object_ | -| `attribs.color3.dim` | _number_ | -| `attribs.color3.name` | _string_ | -| `attribs.color3.normalize` | _boolean_ | -| `attribs.color3.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.props` | _object_ | -| `attribs.props.dim` | _number_ | -| `attribs.props.name` | _string_ | -| `attribs.props.normalize` | _boolean_ | -| `attribs.props.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.props2` | _object_ | -| `attribs.props2.dim` | _number_ | -| `attribs.props2.name` | _string_ | -| `attribs.props2.normalize` | _boolean_ | -| `attribs.props2.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.rectPos` | _object_ | -| `attribs.rectPos.dim` | _number_ | -| `attribs.rectPos.name` | _string_ | -| `attribs.rectPos.normalize` | _boolean_ | -| `attribs.rectPos.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.time` | _object_ | -| `uniforms.time.name` | _string_ | -| `uniforms.time.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.timeMatrix` | _object_ | -| `uniforms.timeMatrix.name` | _string_ | -| `uniforms.timeMatrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | - -## Functions - -### beachFromPlanet - -▸ `Const` **beachFromPlanet**(`p`: Planet): _number_ - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `p` | Planet | - -**Returns:** _number_ - ---- - -### cloudsFromPlanet - -▸ `Const` **cloudsFromPlanet**(`p`: Planet): _number_ - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `p` | Planet | - -**Returns:** _number_ - ---- - -### distortFromPlanet - -▸ **distortFromPlanet**(`p`: Planet): _number_ - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `p` | Planet | - -**Returns:** _number_ - ---- - -### morphFromPlanet - -▸ `Const` **morphFromPlanet**(`p`: Planet): _number_ - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `p` | Planet | - -**Returns:** _number_ - ---- - -### octavesFromPlanet - -▸ `Const` **octavesFromPlanet**(`p`: Planet): _number_ - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `p` | Planet | - -**Returns:** _number_ - ---- - -### propsFromPlanet - -▸ `Const` **propsFromPlanet**(`p`: Planet): [*number*, *number*, *number*, *number*] - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `p` | Planet | - -**Returns:** [*number*, *number*, *number*, *number*] diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_quasarbodyprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_quasarbodyprogram.md deleted file mode 100644 index 822f17a2..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_quasarbodyprogram.md +++ /dev/null @@ -1,43 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/QuasarBodyProgram - -## Table of contents - -### Variables - -- [QUASARBODY_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_quasarbodyprogram.md#quasarbody_program_definition) - -## Variables - -### QUASARBODY_PROGRAM_DEFINITION - -• `Const` **QUASARBODY_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.rectPos` | _object_ | -| `attribs.rectPos.dim` | _number_ | -| `attribs.rectPos.name` | _string_ | -| `attribs.rectPos.normalize` | _boolean_ | -| `attribs.rectPos.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.time` | _object_ | -| `uniforms.time.name` | _string_ | -| `uniforms.time.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_quasarrayprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_quasarrayprogram.md deleted file mode 100644 index cfcce401..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_quasarrayprogram.md +++ /dev/null @@ -1,43 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/QuasarRayProgram - -## Table of contents - -### Variables - -- [QUASARRAY_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_quasarrayprogram.md#quasarray_program_definition) - -## Variables - -### QUASARRAY_PROGRAM_DEFINITION - -• `Const` **QUASARRAY_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.rectPos` | _object_ | -| `attribs.rectPos.dim` | _number_ | -| `attribs.rectPos.name` | _string_ | -| `attribs.rectPos.normalize` | _boolean_ | -| `attribs.rectPos.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.time` | _object_ | -| `uniforms.time.name` | _string_ | -| `uniforms.time.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_rectprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_rectprogram.md deleted file mode 100644 index 6dc55db9..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_rectprogram.md +++ /dev/null @@ -1,50 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/RectProgram - -## Table of contents - -### Variables - -- [RECT_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_rectprogram.md#rect_program_definition) - -## Variables - -### RECT_PROGRAM_DEFINITION - -• `Const` **RECT_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.rectPos` | _object_ | -| `attribs.rectPos.dim` | _number_ | -| `attribs.rectPos.name` | _string_ | -| `attribs.rectPos.normalize` | _boolean_ | -| `attribs.rectPos.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.strokeX` | _object_ | -| `attribs.strokeX.dim` | _number_ | -| `attribs.strokeX.name` | _string_ | -| `attribs.strokeX.normalize` | _boolean_ | -| `attribs.strokeX.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.strokeY` | _object_ | -| `attribs.strokeY.dim` | _number_ | -| `attribs.strokeY.name` | _string_ | -| `attribs.strokeY.normalize` | _boolean_ | -| `attribs.strokeY.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_ringprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_ringprogram.md deleted file mode 100644 index 4064f954..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_ringprogram.md +++ /dev/null @@ -1,76 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/RingProgram - -## Table of contents - -### Type aliases - -- [RingProps](frontend_renderers_gamerenderer_programs_ringprogram.md#ringprops) - -### Variables - -- [RING_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_ringprogram.md#ring_program_definition) - -### Functions - -- [propsFromIdx](frontend_renderers_gamerenderer_programs_ringprogram.md#propsfromidx) - -## Type aliases - -### RingProps - -Ƭ **RingProps**: [*number*, *number*, *number*] - -## Variables - -### RING_PROGRAM_DEFINITION - -• `Const` **RING_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.props` | _object_ | -| `attribs.props.dim` | _number_ | -| `attribs.props.name` | _string_ | -| `attribs.props.normalize` | _boolean_ | -| `attribs.props.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.rectPos` | _object_ | -| `attribs.rectPos.dim` | _number_ | -| `attribs.rectPos.name` | _string_ | -| `attribs.rectPos.normalize` | _boolean_ | -| `attribs.rectPos.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.now` | _object_ | -| `uniforms.now.name` | _string_ | -| `uniforms.now.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | - -## Functions - -### propsFromIdx - -▸ `Const` **propsFromIdx**(`idx`: _number_): [_RingProps_](frontend_renderers_gamerenderer_programs_ringprogram.md#ringprops) - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `idx` | _number_ | - -**Returns:** [_RingProps_](frontend_renderers_gamerenderer_programs_ringprogram.md#ringprops) diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_ruinsprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_ruinsprogram.md deleted file mode 100644 index 94c7fe8f..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_ruinsprogram.md +++ /dev/null @@ -1,53 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/RuinsProgram - -## Table of contents - -### Variables - -- [RUINS_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_ruinsprogram.md#ruins_program_definition) - -## Variables - -### RUINS_PROGRAM_DEFINITION - -• `Const` **RUINS_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.props` | _object_ | -| `attribs.props.dim` | _number_ | -| `attribs.props.name` | _string_ | -| `attribs.props.normalize` | _boolean_ | -| `attribs.props.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.rectPos` | _object_ | -| `attribs.rectPos.dim` | _number_ | -| `attribs.rectPos.name` | _string_ | -| `attribs.rectPos.normalize` | _boolean_ | -| `attribs.rectPos.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.weights` | _object_ | -| `attribs.weights.dim` | _number_ | -| `attribs.weights.name` | _string_ | -| `attribs.weights.normalize` | _boolean_ | -| `attribs.weights.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.time` | _object_ | -| `uniforms.time.name` | _string_ | -| `uniforms.time.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_spacetimeripprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_spacetimeripprogram.md deleted file mode 100644 index fc035b42..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_spacetimeripprogram.md +++ /dev/null @@ -1,58 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/SpacetimeRipProgram - -## Table of contents - -### Variables - -- [SPACETIMERIP_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_spacetimeripprogram.md#spacetimerip_program_definition) - -## Variables - -### SPACETIMERIP_PROGRAM_DEFINITION - -• `Const` **SPACETIMERIP_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.inColor1` | _object_ | -| `attribs.inColor1.dim` | _number_ | -| `attribs.inColor1.name` | _string_ | -| `attribs.inColor1.normalize` | _boolean_ | -| `attribs.inColor1.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.inColor2` | _object_ | -| `attribs.inColor2.dim` | _number_ | -| `attribs.inColor2.name` | _string_ | -| `attribs.inColor2.normalize` | _boolean_ | -| `attribs.inColor2.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.inColor3` | _object_ | -| `attribs.inColor3.dim` | _number_ | -| `attribs.inColor3.name` | _string_ | -| `attribs.inColor3.normalize` | _boolean_ | -| `attribs.inColor3.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.rectPos` | _object_ | -| `attribs.rectPos.dim` | _number_ | -| `attribs.rectPos.name` | _string_ | -| `attribs.rectPos.normalize` | _boolean_ | -| `attribs.rectPos.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.time` | _object_ | -| `uniforms.time.name` | _string_ | -| `uniforms.time.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_spriteprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_spriteprogram.md deleted file mode 100644 index 62df2e1b..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_spriteprogram.md +++ /dev/null @@ -1,63 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/SpriteProgram - -## Table of contents - -### Variables - -- [SPRITE_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_spriteprogram.md#sprite_program_definition) - -## Variables - -### SPRITE_PROGRAM_DEFINITION - -• `Const` **SPRITE_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.invert` | _object_ | -| `attribs.invert.dim` | _number_ | -| `attribs.invert.name` | _string_ | -| `attribs.invert.normalize` | _boolean_ | -| `attribs.invert.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.mythic` | _object_ | -| `attribs.mythic.dim` | _number_ | -| `attribs.mythic.name` | _string_ | -| `attribs.mythic.normalize` | _boolean_ | -| `attribs.mythic.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.rectPos` | _object_ | -| `attribs.rectPos.dim` | _number_ | -| `attribs.rectPos.name` | _string_ | -| `attribs.rectPos.normalize` | _boolean_ | -| `attribs.rectPos.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.shine` | _object_ | -| `attribs.shine.dim` | _number_ | -| `attribs.shine.name` | _string_ | -| `attribs.shine.normalize` | _boolean_ | -| `attribs.shine.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.texcoord` | _object_ | -| `attribs.texcoord.dim` | _number_ | -| `attribs.texcoord.name` | _string_ | -| `attribs.texcoord.normalize` | _boolean_ | -| `attribs.texcoord.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.texture` | _object_ | -| `uniforms.texture.name` | _string_ | -| `uniforms.texture.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_programs_textprogram.md b/docs/modules/frontend_renderers_gamerenderer_programs_textprogram.md deleted file mode 100644 index e949faea..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_programs_textprogram.md +++ /dev/null @@ -1,43 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/Programs/TextProgram - -## Table of contents - -### Variables - -- [TEXT_PROGRAM_DEFINITION](frontend_renderers_gamerenderer_programs_textprogram.md#text_program_definition) - -## Variables - -### TEXT_PROGRAM_DEFINITION - -• `Const` **TEXT_PROGRAM_DEFINITION**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------------------- | :----------------------------------------------------------------------------------- | -| `attribs` | _object_ | -| `attribs.color` | _object_ | -| `attribs.color.dim` | _number_ | -| `attribs.color.name` | _string_ | -| `attribs.color.normalize` | _boolean_ | -| `attribs.color.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.position` | _object_ | -| `attribs.position.dim` | _number_ | -| `attribs.position.name` | _string_ | -| `attribs.position.normalize` | _boolean_ | -| `attribs.position.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `attribs.texcoord` | _object_ | -| `attribs.texcoord.dim` | _number_ | -| `attribs.texcoord.name` | _string_ | -| `attribs.texcoord.normalize` | _boolean_ | -| `attribs.texcoord.type` | [_AttribType_](../enums/frontend_renderers_gamerenderer_enginetypes.attribtype.md) | -| `fragmentShader` | _string_ | -| `uniforms` | _object_ | -| `uniforms.matrix` | _object_ | -| `uniforms.matrix.name` | _string_ | -| `uniforms.matrix.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `uniforms.texture` | _object_ | -| `uniforms.texture.name` | _string_ | -| `uniforms.texture.type` | [_UniformType_](../enums/frontend_renderers_gamerenderer_enginetypes.uniformtype.md) | -| `vertexShader` | _string_ | diff --git a/docs/modules/frontend_renderers_gamerenderer_texturemanager.md b/docs/modules/frontend_renderers_gamerenderer_texturemanager.md deleted file mode 100644 index 12021dfc..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_texturemanager.md +++ /dev/null @@ -1,156 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/TextureManager - -## Table of contents - -### Type aliases - -- [SpriteRectangle](frontend_renderers_gamerenderer_texturemanager.md#spriterectangle) - -### Variables - -- [ARTIFACTS_THUMBS_URL](frontend_renderers_gamerenderer_texturemanager.md#artifacts_thumbs_url) -- [ARTIFACTS_URL](frontend_renderers_gamerenderer_texturemanager.md#artifacts_url) -- [EMPTY_SET](frontend_renderers_gamerenderer_texturemanager.md#empty_set) -- [EMPTY_SPRITE](frontend_renderers_gamerenderer_texturemanager.md#empty_sprite) -- [GLASS_URL](frontend_renderers_gamerenderer_texturemanager.md#glass_url) -- [SPRITESHEET_HEIGHT_PX](frontend_renderers_gamerenderer_texturemanager.md#spritesheet_height_px) -- [SPRITESHEET_WIDTH_PX](frontend_renderers_gamerenderer_texturemanager.md#spritesheet_width_px) -- [SPRITES_HORIZONTALLY](frontend_renderers_gamerenderer_texturemanager.md#sprites_horizontally) -- [SPRITES_VERTICALLY](frontend_renderers_gamerenderer_texturemanager.md#sprites_vertically) - -### Functions - -- [isShiny](frontend_renderers_gamerenderer_texturemanager.md#isshiny) -- [loadArtifactAtlas](frontend_renderers_gamerenderer_texturemanager.md#loadartifactatlas) -- [loadArtifactThumbAtlas](frontend_renderers_gamerenderer_texturemanager.md#loadartifactthumbatlas) -- [loadSprite](frontend_renderers_gamerenderer_texturemanager.md#loadsprite) -- [spriteFromArtifact](frontend_renderers_gamerenderer_texturemanager.md#spritefromartifact) - -## Type aliases - -### SpriteRectangle - -Ƭ **SpriteRectangle**: _object_ - -#### Type declaration - -| Name | Type | -| :--- | :------- | -| `x1` | _number_ | -| `x2` | _number_ | -| `y1` | _number_ | -| `y2` | _number_ | - -## Variables - -### ARTIFACTS_THUMBS_URL - -• `Const` **ARTIFACTS_THUMBS_URL**: `"public/sprites/artifactthumbs.png"`= 'public/sprites/artifactthumbs.png' - ---- - -### ARTIFACTS_URL - -• `Const` **ARTIFACTS_URL**: `"public/sprites/artifacts.png"`= 'public/sprites/artifacts.png' - ---- - -### EMPTY_SET - -• `Const` **EMPTY_SET**: SpriteSet - ---- - -### EMPTY_SPRITE - -• `Const` **EMPTY_SPRITE**: [_SpriteRectangle_](frontend_renderers_gamerenderer_texturemanager.md#spriterectangle) - -Represents a sprite that doesn't exist. - ---- - -### GLASS_URL - -• `Const` **GLASS_URL**: `"public/sprites/glass.png"`= 'public/sprites/glass.png' - ---- - -### SPRITESHEET_HEIGHT_PX - -• `Const` **SPRITESHEET_HEIGHT_PX**: _number_ - ---- - -### SPRITESHEET_WIDTH_PX - -• `Const` **SPRITESHEET_WIDTH_PX**: _number_ - ---- - -### SPRITES_HORIZONTALLY - -• `Const` **SPRITES_HORIZONTALLY**: `16`= 16 - ---- - -### SPRITES_VERTICALLY - -• `Const` **SPRITES_VERTICALLY**: `16`= 16 - -## Functions - -### isShiny - -▸ **isShiny**(`rarity`: ArtifactRarity): _boolean_ - -#### Parameters - -| Name | Type | -| :------- | :------------- | -| `rarity` | ArtifactRarity | - -**Returns:** _boolean_ - ---- - -### loadArtifactAtlas - -▸ **loadArtifactAtlas**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### loadArtifactThumbAtlas - -▸ **loadArtifactThumbAtlas**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### loadSprite - -▸ **loadSprite**(`imageUrl`: _string_): _Promise_ - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `imageUrl` | _string_ | - -**Returns:** _Promise_ - ---- - -### spriteFromArtifact - -▸ **spriteFromArtifact**(`artifact`: [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md)): [_SpriteRectangle_](frontend_renderers_gamerenderer_texturemanager.md#spriterectangle) - -#### Parameters - -| Name | Type | -| :--------- | :-------------------------------------------------------------------------------------- | -| `artifact` | [_RenderedArtifact_](../interfaces/backend_gamelogic_artifactutils.renderedartifact.md) | - -**Returns:** [_SpriteRectangle_](frontend_renderers_gamerenderer_texturemanager.md#spriterectangle) diff --git a/docs/modules/frontend_renderers_gamerenderer_webgl_attribarray.md b/docs/modules/frontend_renderers_gamerenderer_webgl_attribarray.md deleted file mode 100644 index aef658bd..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_webgl_attribarray.md +++ /dev/null @@ -1,17 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/WebGL/AttribArray - -## Table of contents - -### Classes - -- [AttribArray](../classes/frontend_renderers_gamerenderer_webgl_attribarray.attribarray.md) - -### Type aliases - -- [GLArray](frontend_renderers_gamerenderer_webgl_attribarray.md#glarray) - -## Type aliases - -### GLArray - -Ƭ **GLArray**: Float32Array \| Uint8Array diff --git a/docs/modules/frontend_renderers_gamerenderer_webgl_gameglmanager.md b/docs/modules/frontend_renderers_gamerenderer_webgl_gameglmanager.md deleted file mode 100644 index bfd8fc74..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_webgl_gameglmanager.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/WebGL/GameGLManager - -## Table of contents - -### Classes - -- [GameGLManager](../classes/frontend_renderers_gamerenderer_webgl_gameglmanager.gameglmanager.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_webgl_genericrenderer.md b/docs/modules/frontend_renderers_gamerenderer_webgl_genericrenderer.md deleted file mode 100644 index 1ca9bdbf..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_webgl_genericrenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/WebGL/GenericRenderer - -## Table of contents - -### Classes - -- [GenericRenderer](../classes/frontend_renderers_gamerenderer_webgl_genericrenderer.genericrenderer.md) diff --git a/docs/modules/frontend_renderers_gamerenderer_webgl_webgllibtypes.md b/docs/modules/frontend_renderers_gamerenderer_webgl_webgllibtypes.md deleted file mode 100644 index 958193ee..00000000 --- a/docs/modules/frontend_renderers_gamerenderer_webgl_webgllibtypes.md +++ /dev/null @@ -1,72 +0,0 @@ -# Module: Frontend/Renderers/GameRenderer/WebGL/WebGLLibTypes - -## Table of contents - -### Interfaces - -- [Attributes](../interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.attributes.md) -- [Uniforms](../interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.uniforms.md) - -### Type aliases - -- [AttributeSetters](frontend_renderers_gamerenderer_webgl_webgllibtypes.md#attributesetters) -- [CompiledProgram](frontend_renderers_gamerenderer_webgl_webgllibtypes.md#compiledprogram) -- [ProgramInfo](frontend_renderers_gamerenderer_webgl_webgllibtypes.md#programinfo) -- [UniformSetters](frontend_renderers_gamerenderer_webgl_webgllibtypes.md#uniformsetters) - -## Type aliases - -### AttributeSetters - -Ƭ **AttributeSetters**: { [key in keyof U]: function} - -#### Type parameters - -| Name | Type | -| :--- | :---------------------------------------------------------------------------------------------- | -| `U` | [_Attributes_](../interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.attributes.md) | - ---- - -### CompiledProgram - -Ƭ **CompiledProgram**: _object_ - -#### Type parameters - -| Name | Type | -| :--- | :------------------------------------------------------------------------------------------ | -| `U` | [_Uniforms_](../interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.uniforms.md) | - -#### Type declaration - -| Name | Type | -| :----------- | :-------------------------------------------------------------------------------------------- | -| `program` | WebGLProgram | -| `setUniform` | [_UniformSetters_](frontend_renderers_gamerenderer_webgl_webgllibtypes.md#uniformsetters) | - ---- - -### ProgramInfo - -Ƭ **ProgramInfo**: _object_ - -#### Type declaration - -| Name | Type | -| :------------- | :------------------------------------------------------------------------------------------ | -| `fragShader` | _string_ | -| `uniforms` | [_Uniforms_](../interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.uniforms.md) | -| `vertexShader` | _string_ | - ---- - -### UniformSetters - -Ƭ **UniformSetters**: { [key in keyof U]: function} - -#### Type parameters - -| Name | Type | -| :--- | :------------------------------------------------------------------------------------------ | -| `U` | [_Uniforms_](../interfaces/frontend_renderers_gamerenderer_webgl_webgllibtypes.uniforms.md) | diff --git a/docs/modules/frontend_renderers_landingpagecanvas.md b/docs/modules/frontend_renderers_landingpagecanvas.md deleted file mode 100644 index 213a5b18..00000000 --- a/docs/modules/frontend_renderers_landingpagecanvas.md +++ /dev/null @@ -1,24 +0,0 @@ -# Module: Frontend/Renderers/LandingPageCanvas - -## Table of contents - -### Functions - -- [LandingPageBackground](frontend_renderers_landingpagecanvas.md#landingpagebackground) -- [default](frontend_renderers_landingpagecanvas.md#default) - -## Functions - -### LandingPageBackground - -▸ **LandingPageBackground**(): _Element_ - -**Returns:** _Element_ - ---- - -### default - -▸ **default**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_renderers_planetscaperenderer_pathprogram.md b/docs/modules/frontend_renderers_planetscaperenderer_pathprogram.md deleted file mode 100644 index 2d41c4e8..00000000 --- a/docs/modules/frontend_renderers_planetscaperenderer_pathprogram.md +++ /dev/null @@ -1,68 +0,0 @@ -# Module: Frontend/Renderers/PlanetscapeRenderer/PathProgram - -## Table of contents - -### Type aliases - -- [PathProgramWithUniforms](frontend_renderers_planetscaperenderer_pathprogram.md#pathprogramwithuniforms) -- [ScapeUniforms](frontend_renderers_planetscaperenderer_pathprogram.md#scapeuniforms) - -### Variables - -- [scapeColorProps](frontend_renderers_planetscaperenderer_pathprogram.md#scapecolorprops) -- [scapePosProps](frontend_renderers_planetscaperenderer_pathprogram.md#scapeposprops) - -### Functions - -- [getPathProgramAndUniforms](frontend_renderers_planetscaperenderer_pathprogram.md#getpathprogramanduniforms) - -## Type aliases - -### PathProgramWithUniforms - -Ƭ **PathProgramWithUniforms**: _object_ - -#### Type declaration - -| Name | Type | -| :--------- | :------------------------------------------------------------------------------------- | -| `program` | WebGLProgram | -| `uniforms` | [_ScapeUniforms_](frontend_renderers_planetscaperenderer_pathprogram.md#scapeuniforms) | - ---- - -### ScapeUniforms - -Ƭ **ScapeUniforms**: _object_ - -#### Type declaration - -| Name | Type | -| :------- | :----------------------------- | -| `matrix` | WebGLUniformLocation \| `null` | - -## Variables - -### scapeColorProps - -• `Const` **scapeColorProps**: [_AttribProps_](frontend_renderers_gamerenderer_enginetypes.md#attribprops) - ---- - -### scapePosProps - -• `Const` **scapePosProps**: [_AttribProps_](frontend_renderers_gamerenderer_enginetypes.md#attribprops) - -## Functions - -### getPathProgramAndUniforms - -▸ `Const` **getPathProgramAndUniforms**(`gl`: WebGL2RenderingContext): [_PathProgramWithUniforms_](frontend_renderers_planetscaperenderer_pathprogram.md#pathprogramwithuniforms) - -#### Parameters - -| Name | Type | -| :--- | :--------------------- | -| `gl` | WebGL2RenderingContext | - -**Returns:** [_PathProgramWithUniforms_](frontend_renderers_planetscaperenderer_pathprogram.md#pathprogramwithuniforms) diff --git a/docs/modules/frontend_renderers_planetscaperenderer_planeticons.md b/docs/modules/frontend_renderers_planetscaperenderer_planeticons.md deleted file mode 100644 index 9dfd693e..00000000 --- a/docs/modules/frontend_renderers_planetscaperenderer_planeticons.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Renderers/PlanetscapeRenderer/PlanetIcons - -## Table of contents - -### Functions - -- [PlanetIcons](frontend_renderers_planetscaperenderer_planeticons.md#planeticons) - -## Functions - -### PlanetIcons - -▸ **PlanetIcons**(`__namedParameters`: { `planet`: Planet \| _undefined_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | Planet \| _undefined_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_renderers_planetscaperenderer_planetscape.md b/docs/modules/frontend_renderers_planetscaperenderer_planetscape.md deleted file mode 100644 index 6e86d663..00000000 --- a/docs/modules/frontend_renderers_planetscaperenderer_planetscape.md +++ /dev/null @@ -1,39 +0,0 @@ -# Module: Frontend/Renderers/PlanetscapeRenderer/PlanetScape - -## Table of contents - -### Variables - -- [SCAPE_HEIGHT](frontend_renderers_planetscaperenderer_planetscape.md#scape_height) -- [SCAPE_WIDTH](frontend_renderers_planetscaperenderer_planetscape.md#scape_width) - -### Functions - -- [PlanetScape](frontend_renderers_planetscaperenderer_planetscape.md#planetscape) - -## Variables - -### SCAPE_HEIGHT - -• `Const` **SCAPE_HEIGHT**: `150`= 150 - ---- - -### SCAPE_WIDTH - -• `Const` **SCAPE_WIDTH**: `450`= 450 - -## Functions - -### PlanetScape - -▸ **PlanetScape**(`__namedParameters`: { `wrapper`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------- | :----------------------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.wrapper` | [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_renderers_planetscaperenderer_planetscaperenderer.md b/docs/modules/frontend_renderers_planetscaperenderer_planetscaperenderer.md deleted file mode 100644 index fb182bbf..00000000 --- a/docs/modules/frontend_renderers_planetscaperenderer_planetscaperenderer.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer - -## Table of contents - -### Classes - -- [PlanetscapeRenderer](../classes/frontend_renderers_planetscaperenderer_planetscaperenderer.planetscaperenderer.md) diff --git a/docs/modules/frontend_styles_colors.md b/docs/modules/frontend_styles_colors.md deleted file mode 100644 index bfccc77c..00000000 --- a/docs/modules/frontend_styles_colors.md +++ /dev/null @@ -1,29 +0,0 @@ -# Module: Frontend/Styles/colors - -## Table of contents - -### Properties - -- [default](frontend_styles_colors.md#default) - -## Properties - -### default - -• **default**: _object_ - -#### Type declaration - -| Name | Type | -| :--------- | :------- | -| `black` | _string_ | -| `gray-100` | _string_ | -| `gray-200` | _string_ | -| `gray-300` | _string_ | -| `gray-400` | _string_ | -| `gray-500` | _string_ | -| `gray-600` | _string_ | -| `gray-700` | _string_ | -| `gray-800` | _string_ | -| `gray-900` | _string_ | -| `white` | _string_ | diff --git a/docs/modules/frontend_styles_dfstyles.md b/docs/modules/frontend_styles_dfstyles.md deleted file mode 100644 index 1c7715df..00000000 --- a/docs/modules/frontend_styles_dfstyles.md +++ /dev/null @@ -1,88 +0,0 @@ -# Module: Frontend/Styles/dfstyles - -## Table of contents - -### Variables - -- [ARTIFACT_ROW_H](frontend_styles_dfstyles.md#artifact_row_h) -- [SPACE_TYPE_COLORS](frontend_styles_dfstyles.md#space_type_colors) -- [default](frontend_styles_dfstyles.md#default) - -## Variables - -### ARTIFACT_ROW_H - -• `Const` **ARTIFACT_ROW_H**: `48`= 48 - ---- - -### SPACE_TYPE_COLORS - -• `Const` **SPACE_TYPE_COLORS**: _Record_ - ---- - -### default - -• `Const` **default**: _object_ - -#### Type declaration - -| Name | Type | -| :----------------------------- | :------------------------- | -| `borderRadius` | _string_ | -| `colors` | _object_ | -| `colors.artifactBackground` | _string_ | -| `colors.background` | _string_ | -| `colors.backgrounddark` | _string_ | -| `colors.backgroundlight` | _string_ | -| `colors.backgroundlighter` | _string_ | -| `colors.blueBackground` | _string_ | -| `colors.dfblue` | _string_ | -| `colors.dfgreen` | _string_ | -| `colors.dfgreendark` | _string_ | -| `colors.dfgreenlight` | _string_ | -| `colors.dfred` | _string_ | -| `colors.dfyellow` | _string_ | -| `colors.icons` | _object_ | -| `colors.icons.blog` | _string_ | -| `colors.icons.discord` | _string_ | -| `colors.icons.email` | _string_ | -| `colors.icons.github` | _string_ | -| `colors.icons.twitter` | _string_ | -| `colors.subbertext` | _string_ | -| `colors.subbesttext` | _string_ | -| `colors.subtext` | _string_ | -| `colors.text` | _string_ | -| `fontH1` | _string_ | -| `fontH1S` | _string_ | -| `fontH2` | _string_ | -| `fontSize` | _string_ | -| `fontSizeS` | _string_ | -| `fontSizeXS` | _string_ | -| `game` | _object_ | -| `game.bonuscolors` | _object_ | -| `game.bonuscolors.def` | _string_ | -| `game.bonuscolors.energyCap` | _string_ | -| `game.bonuscolors.energyGro` | _string_ | -| `game.bonuscolors.range` | _string_ | -| `game.bonuscolors.speed` | _string_ | -| `game.canvasbg` | _string_ | -| `game.fontSize` | _string_ | -| `game.rangecolors` | _object_ | -| `game.rangecolors.color100` | _string_ | -| `game.rangecolors.color25` | _string_ | -| `game.rangecolors.color50` | _string_ | -| `game.rangecolors.colorenergy` | _string_ | -| `game.rangecolors.dash` | _string_ | -| `game.rangecolors.dashenergy` | _string_ | -| `game.styles` | _object_ | -| `game.styles.active` | _string_ | -| `game.styles.animProps` | _string_ | -| `game.terminalFontSize` | _string_ | -| `game.terminalWidth` | _string_ | -| `game.toolbarHeight` | _string_ | -| `prefabs` | _object_ | -| `prefabs.noselect` | FlattenSimpleInterpolation | -| `screenSizeS` | _string_ | -| `titleFont` | _string_ | diff --git a/docs/modules/frontend_styles_mixins.md b/docs/modules/frontend_styles_mixins.md deleted file mode 100644 index 168fb472..00000000 --- a/docs/modules/frontend_styles_mixins.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Styles/Mixins - -## Table of contents - -### Functions - -- [planetBackground](frontend_styles_mixins.md#planetbackground) - -## Functions - -### planetBackground - -▸ **planetBackground**(`__namedParameters`: { `planet`: Planet \| _undefined_ }): `""` \| FlattenSimpleInterpolation - -#### Parameters - -| Name | Type | -| :------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planet` | Planet \| _undefined_ | - -**Returns:** `""` \| FlattenSimpleInterpolation diff --git a/docs/modules/frontend_styles_tailwind_config.export_.md b/docs/modules/frontend_styles_tailwind_config.export_.md deleted file mode 100644 index 737e9adc..00000000 --- a/docs/modules/frontend_styles_tailwind_config.export_.md +++ /dev/null @@ -1,3 +0,0 @@ -# Namespace: export= - -[Frontend/Styles/tailwind.config](frontend_styles_tailwind_config.md).export= diff --git a/docs/modules/frontend_styles_tailwind_config.md b/docs/modules/frontend_styles_tailwind_config.md deleted file mode 100644 index e4d6f7ee..00000000 --- a/docs/modules/frontend_styles_tailwind_config.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Styles/tailwind.config - -## Table of contents - -### Namespaces - -- [export=](frontend_styles_tailwind_config.export_.md) - -### Properties - -- [export=](frontend_styles_tailwind_config.md#export=) - -## Properties - -### export= - -• **export=**: _object_ - -#### Type declaration - -| Name | Type | -| :--------- | :-------- | -| `plugins` | _never_[] | -| `theme` | _object_ | -| `variants` | _object_ | diff --git a/docs/modules/frontend_utils_apphooks.md b/docs/modules/frontend_utils_apphooks.md deleted file mode 100644 index fe04a83e..00000000 --- a/docs/modules/frontend_utils_apphooks.md +++ /dev/null @@ -1,221 +0,0 @@ -# Module: Frontend/Utils/AppHooks - -## Table of contents - -### Variables - -- [TopLevelDivProvider](frontend_utils_apphooks.md#topleveldivprovider) -- [UIManagerProvider](frontend_utils_apphooks.md#uimanagerprovider) - -### Functions - -- [useAccount](frontend_utils_apphooks.md#useaccount) -- [useActiveArtifact](frontend_utils_apphooks.md#useactiveartifact) -- [useControlDown](frontend_utils_apphooks.md#usecontroldown) -- [useHoverPlanet](frontend_utils_apphooks.md#usehoverplanet) -- [useLeaderboard](frontend_utils_apphooks.md#useleaderboard) -- [useMyArtifacts](frontend_utils_apphooks.md#usemyartifacts) -- [usePlanetArtifacts](frontend_utils_apphooks.md#useplanetartifacts) -- [usePlanetInactiveArtifacts](frontend_utils_apphooks.md#useplanetinactiveartifacts) -- [useSelectedArtifact](frontend_utils_apphooks.md#useselectedartifact) -- [useSelectedPlanet](frontend_utils_apphooks.md#useselectedplanet) -- [useTopLevelDiv](frontend_utils_apphooks.md#usetopleveldiv) -- [useTwitter](frontend_utils_apphooks.md#usetwitter) -- [useUIManager](frontend_utils_apphooks.md#useuimanager) - -## Variables - -### TopLevelDivProvider - -• **TopLevelDivProvider**: _Provider_ - ---- - -### UIManagerProvider - -• **UIManagerProvider**: _Provider_<[_default_](../classes/backend_gamelogic_gameuimanager.default.md)\> - -## Functions - -### useAccount - -▸ **useAccount**(`uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md)): EthAddress \| _undefined_ - -Get the currently used account on the client. - -#### Parameters - -| Name | Type | Description | -| :---------- | :----------------------------------------------------------------- | :------------------------ | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | instance of GameUIManager | - -**Returns:** EthAddress \| _undefined_ - ---- - -### useActiveArtifact - -▸ **useActiveArtifact**(`planet`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md), `uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md)): Artifact \| _undefined_ - -#### Parameters - -| Name | Type | -| :---------- | :----------------------------------------------------------------------------- | -| `planet` | [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | - -**Returns:** Artifact \| _undefined_ - ---- - -### useControlDown - -▸ **useControlDown**(): _boolean_ - -Return a bool that indicates if the control key is pressed. - -**Returns:** _boolean_ - ---- - -### useHoverPlanet - -▸ **useHoverPlanet**(`uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md)): [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) - -Create a subscription to the currently hovering planet. - -#### Parameters - -| Name | Type | Description | -| :---------- | :----------------------------------------------------------------- | :------------------------ | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | instance of GameUIManager | - -**Returns:** [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) - ---- - -### useLeaderboard - -▸ **useLeaderboard**(`poll?`: _number_ \| _undefined_): _object_ - -Loads the leaderboard - -#### Parameters - -| Name | Type | -| :----- | :---------------------- | -| `poll` | _number_ \| _undefined_ | - -**Returns:** _object_ - -| Name | Type | -| :------------ | :------------------------- | -| `error` | Error \| _undefined_ | -| `leaderboard` | Leaderboard \| _undefined_ | - ---- - -### useMyArtifacts - -▸ **useMyArtifacts**(`uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md)): [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) \| undefined\> - -#### Parameters - -| Name | Type | -| :---------- | :----------------------------------------------------------------- | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | - -**Returns:** [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) \| undefined\> - ---- - -### usePlanetArtifacts - -▸ **usePlanetArtifacts**(`planet`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md), `uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md)): Artifact[] - -#### Parameters - -| Name | Type | -| :---------- | :----------------------------------------------------------------------------- | -| `planet` | [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | - -**Returns:** Artifact[] - ---- - -### usePlanetInactiveArtifacts - -▸ **usePlanetInactiveArtifacts**(`planet`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md), `uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md)): Artifact[] - -#### Parameters - -| Name | Type | -| :---------- | :----------------------------------------------------------------------------- | -| `planet` | [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | - -**Returns:** Artifact[] - ---- - -### useSelectedArtifact - -▸ **useSelectedArtifact**(`uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md)): [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) - -Create a subscription to the currently selected artifact. - -#### Parameters - -| Name | Type | Description | -| :---------- | :----------------------------------------------------------------- | :------------------------ | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | instance of GameUIManager | - -**Returns:** [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) - ---- - -### useSelectedPlanet - -▸ **useSelectedPlanet**(`uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md)): [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) - -Create a subscription to the currently selected planet. - -#### Parameters - -| Name | Type | Description | -| :---------- | :----------------------------------------------------------------- | :------------------------ | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | instance of GameUIManager | - -**Returns:** [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) - ---- - -### useTopLevelDiv - -▸ **useTopLevelDiv**(): HTMLDivElement - -**Returns:** HTMLDivElement - ---- - -### useTwitter - -▸ **useTwitter**(`account`: EthAddress \| _undefined_, `uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md)): _string_ \| _undefined_ - -#### Parameters - -| Name | Type | -| :---------- | :----------------------------------------------------------------- | -| `account` | EthAddress \| _undefined_ | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | - -**Returns:** _string_ \| _undefined_ - ---- - -### useUIManager - -▸ **useUIManager**(): [_default_](../classes/backend_gamelogic_gameuimanager.default.md) - -**Returns:** [_default_](../classes/backend_gamelogic_gameuimanager.default.md) diff --git a/docs/modules/frontend_utils_browserchecks.md b/docs/modules/frontend_utils_browserchecks.md deleted file mode 100644 index 94542f88..00000000 --- a/docs/modules/frontend_utils_browserchecks.md +++ /dev/null @@ -1,64 +0,0 @@ -# Module: Frontend/Utils/BrowserChecks - -## Table of contents - -### Enumerations - -- [Incompatibility](../enums/frontend_utils_browserchecks.incompatibility.md) - -### Functions - -- [hasTouchscreen](frontend_utils_browserchecks.md#hastouchscreen) -- [isBrave](frontend_utils_browserchecks.md#isbrave) -- [isChrome](frontend_utils_browserchecks.md#ischrome) -- [isFirefox](frontend_utils_browserchecks.md#isfirefox) -- [isMobileOrTablet](frontend_utils_browserchecks.md#ismobileortablet) -- [unsupportedFeatures](frontend_utils_browserchecks.md#unsupportedfeatures) - -## Functions - -### hasTouchscreen - -▸ `Const` **hasTouchscreen**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### isBrave - -▸ `Const` **isBrave**(): _Promise_ - -**Returns:** _Promise_ - ---- - -### isChrome - -▸ `Const` **isChrome**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### isFirefox - -▸ `Const` **isFirefox**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### isMobileOrTablet - -▸ `Const` **isMobileOrTablet**(): _boolean_ - -**Returns:** _boolean_ - ---- - -### unsupportedFeatures - -▸ `Const` **unsupportedFeatures**(): _Promise_<[_Incompatibility_](../enums/frontend_utils_browserchecks.incompatibility.md)[]\> - -**Returns:** _Promise_<[_Incompatibility_](../enums/frontend_utils_browserchecks.incompatibility.md)[]\> diff --git a/docs/modules/frontend_utils_constants.md b/docs/modules/frontend_utils_constants.md deleted file mode 100644 index 037336e9..00000000 --- a/docs/modules/frontend_utils_constants.md +++ /dev/null @@ -1,58 +0,0 @@ -# Module: Frontend/Utils/constants - -## Table of contents - -### Enumerations - -- [GameWindowZIndex](../enums/frontend_utils_constants.gamewindowzindex.md) - -### Variables - -- [BLOCK_EXPLORER_URL](frontend_utils_constants.md#block_explorer_url) -- [HAT_SIZES](frontend_utils_constants.md#hat_sizes) -- [LOCATION_ID_UB](frontend_utils_constants.md#location_id_ub) -- [MAX_CHUNK_SIZE](frontend_utils_constants.md#max_chunk_size) -- [MIN_CHUNK_SIZE](frontend_utils_constants.md#min_chunk_size) -- [XDAI_CHAIN_ID](frontend_utils_constants.md#xdai_chain_id) - -## Variables - -### BLOCK_EXPLORER_URL - -• `Const` **BLOCK_EXPLORER_URL**: `"https://blockscout.com/poa/xdai"`= 'https://blockscout.com/poa/xdai' - ---- - -### HAT_SIZES - -• `Const` **HAT_SIZES**: _string_[] - ---- - -### LOCATION_ID_UB - -• `Const` **LOCATION_ID_UB**: BigInteger - ---- - -### MAX_CHUNK_SIZE - -• `Const` **MAX_CHUNK_SIZE**: _number_ - -**`tutorial`** to speed up the game's background rendering code, it is possible to set this value to -be a higher power of two. This means that smaller chunks will be merged into larger chunks via -the algorithms implemented in {@link ChunkUtils}. - -{@code Math.floor(Math.pow(2, 16))} should be large enough for most. - ---- - -### MIN_CHUNK_SIZE - -• `Const` **MIN_CHUNK_SIZE**: `16`= 16 - ---- - -### XDAI_CHAIN_ID - -• `Const` **XDAI_CHAIN_ID**: `100`= 100 diff --git a/docs/modules/frontend_utils_emitterhooks.md b/docs/modules/frontend_utils_emitterhooks.md deleted file mode 100644 index e9ee9d88..00000000 --- a/docs/modules/frontend_utils_emitterhooks.md +++ /dev/null @@ -1,96 +0,0 @@ -# Module: Frontend/Utils/EmitterHooks - -## Table of contents - -### Functions - -- [useEmitterSubscribe](frontend_utils_emitterhooks.md#useemittersubscribe) -- [useEmitterValue](frontend_utils_emitterhooks.md#useemittervalue) -- [useKeyPressed](frontend_utils_emitterhooks.md#usekeypressed) -- [useWrappedEmitter](frontend_utils_emitterhooks.md#usewrappedemitter) - -## Functions - -### useEmitterSubscribe - -▸ **useEmitterSubscribe**(`emitter`: [_Monomitter_](frontend_utils_monomitter.md#monomitter), `callback`: [_Callback_](frontend_utils_monomitter.md#callback)): _void_ - -Execute something on emitter callback - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Description | -| :--------- | :---------------------------------------------------------- | :--------------------------- | -| `emitter` | [_Monomitter_](frontend_utils_monomitter.md#monomitter) | `Monomitter` to subscribe to | -| `callback` | [_Callback_](frontend_utils_monomitter.md#callback) | callback to subscribe | - -**Returns:** _void_ - ---- - -### useEmitterValue - -▸ **useEmitterValue**(`emitter`: [_Monomitter_](frontend_utils_monomitter.md#monomitter), `initialVal`: T): T - -Use returned value from an emitter - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Description | -| :----------- | :---------------------------------------------------------- | :--------------------------- | -| `emitter` | [_Monomitter_](frontend_utils_monomitter.md#monomitter) | `Monomitter` to subscribe to | -| `initialVal` | T | initial state value | - -**Returns:** T - ---- - -### useKeyPressed - -▸ **useKeyPressed**(`keydown$`: [_Monomitter_](frontend_utils_monomitter.md#monomitter), `keyup$`: [_Monomitter_](frontend_utils_monomitter.md#monomitter)): _boolean_ - -Return a bool indicating if a key is pressed - -#### Parameters - -| Name | Type | Description | -| :--------- | :---------------------------------------------------------------------- | :----------------- | -| `keydown$` | [_Monomitter_](frontend_utils_monomitter.md#monomitter) | keydown monomitter | -| `keyup$` | [_Monomitter_](frontend_utils_monomitter.md#monomitter) | keyup monomitter | - -**Returns:** _boolean_ - ---- - -### useWrappedEmitter - -▸ **useWrappedEmitter**(`emitter`: [_Monomitter_](frontend_utils_monomitter.md#monomitter), `initialVal`: T \| _undefined_): [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) - -Use returned value from an emitter, and clone the reference - used to force an update to the UI - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Description | -| :----------- | :----------------------------------------------------------------------- | :--------------------------- | -| `emitter` | [_Monomitter_](frontend_utils_monomitter.md#monomitter) | `Monomitter` to subscribe to | -| `initialVal` | T \| _undefined_ | initial state value | - -**Returns:** [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) diff --git a/docs/modules/frontend_utils_emitterutils.md b/docs/modules/frontend_utils_emitterutils.md deleted file mode 100644 index aa24160c..00000000 --- a/docs/modules/frontend_utils_emitterutils.md +++ /dev/null @@ -1,125 +0,0 @@ -# Module: Frontend/Utils/EmitterUtils - -## Table of contents - -### Functions - -- [getArtifactId](frontend_utils_emitterutils.md#getartifactid) -- [getArtifactOwner](frontend_utils_emitterutils.md#getartifactowner) -- [getObjectWithIdFromMap](frontend_utils_emitterutils.md#getobjectwithidfrommap) -- [getPlanetId](frontend_utils_emitterutils.md#getplanetid) -- [getPlanetOwner](frontend_utils_emitterutils.md#getplanetowner) -- [setObjectSyncState](frontend_utils_emitterutils.md#setobjectsyncstate) - -## Functions - -### getArtifactId - -▸ `Const` **getArtifactId**(`a`: Artifact): ArtifactId - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `a` | Artifact | - -**Returns:** ArtifactId - ---- - -### getArtifactOwner - -▸ `Const` **getArtifactOwner**(`a`: Artifact): EthAddress - -#### Parameters - -| Name | Type | -| :--- | :------- | -| `a` | Artifact | - -**Returns:** EthAddress - ---- - -### getObjectWithIdFromMap - -▸ **getObjectWithIdFromMap**(`objMap`: _Map_, `objId$`: [_Monomitter_](frontend_utils_monomitter.md#monomitter), `objUpdated$`: [_Monomitter_](frontend_utils_monomitter.md#monomitter)): [_Monomitter_](frontend_utils_monomitter.md#monomitter) - -Create a monomitter to emit objects with a given id from a cached map of ids to objects. - -#### Type parameters - -| Name | -| :---- | -| `Obj` | -| `Id` | - -#### Parameters - -| Name | Type | Description | -| :------------ | :------------------------------------------------------------------------ | :------------------------------------------------------ | -| `objMap` | _Map_ | the cached map of `` | -| `objId$` | [_Monomitter_](frontend_utils_monomitter.md#monomitter) | the object id to select | -| `objUpdated$` | [_Monomitter_](frontend_utils_monomitter.md#monomitter) | emitter which indicates when an object has been updated | - -**Returns:** [_Monomitter_](frontend_utils_monomitter.md#monomitter) - ---- - -### getPlanetId - -▸ `Const` **getPlanetId**(`p`: Planet): LocationId - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `p` | Planet | - -**Returns:** LocationId - ---- - -### getPlanetOwner - -▸ `Const` **getPlanetOwner**(`p`: Planet): EthAddress - -#### Parameters - -| Name | Type | -| :--- | :----- | -| `p` | Planet | - -**Returns:** EthAddress - ---- - -### setObjectSyncState - -▸ **setObjectSyncState**(`objectMap`: _Map_, `myObjectMap`: _Map_, `address`: EthAddress \| _undefined_, `objUpdated$`: [_Monomitter_](frontend_utils_monomitter.md#monomitter), `myObjListUpdated$`: [_Monomitter_](frontend_utils_monomitter.md#monomitter)\>, `getId`: (`o`: Obj) => Id, `getOwner`: (`o`: Obj) => EthAddress, `obj`: Obj): _void_ - -Utility function for setting a game entity into our internal data stores in a way -that is friendly to our application. Caches the object into a map, syncs it to a map -of our owned objects, and also emits a message that the object was updated. - -#### Type parameters - -| Name | -| :---- | -| `Obj` | -| `Id` | - -#### Parameters - -| Name | Type | Description | -| :------------------ | :---------------------------------------------------------------------- | :---------------------------------------------- | -| `objectMap` | _Map_ | map that caches known objects | -| `myObjectMap` | _Map_ | map that caches known objects owned by the user | -| `address` | EthAddress \| _undefined_ | the user's account address | -| `objUpdated$` | [_Monomitter_](frontend_utils_monomitter.md#monomitter) | emitter for announcing object updates | -| `myObjListUpdated$` | [_Monomitter_](frontend_utils_monomitter.md#monomitter)\> | - | -| `getId` | (`o`: Obj) => Id | - | -| `getOwner` | (`o`: Obj) => EthAddress | - | -| `obj` | Obj | the object we want to cache | - -**Returns:** _void_ diff --git a/docs/modules/frontend_utils_hats.md b/docs/modules/frontend_utils_hats.md deleted file mode 100644 index f7d0919e..00000000 --- a/docs/modules/frontend_utils_hats.md +++ /dev/null @@ -1,67 +0,0 @@ -# Module: Frontend/Utils/Hats - -## Table of contents - -### Enumerations - -- [HatType](../enums/frontend_utils_hats.hattype.md) - -### Type aliases - -- [Hat](frontend_utils_hats.md#hat) - -### Variables - -- [hats](frontend_utils_hats.md#hats) - -### Functions - -- [hatFromType](frontend_utils_hats.md#hatfromtype) -- [hatTypeFromHash](frontend_utils_hats.md#hattypefromhash) - -## Type aliases - -### Hat - -Ƭ **Hat**: _object_ - -#### Type declaration - -| Name | Type | -| :------------ | :--------- | -| `bottomLayer` | _string_[] | -| `topLayer` | _string_[] | - -## Variables - -### hats - -• `Const` **hats**: _Record_<[_HatType_](../enums/frontend_utils_hats.hattype.md), [_Hat_](frontend_utils_hats.md#hat)\> - -## Functions - -### hatFromType - -▸ `Const` **hatFromType**(`type`: [_HatType_](../enums/frontend_utils_hats.hattype.md)): [_Hat_](frontend_utils_hats.md#hat) - -#### Parameters - -| Name | Type | -| :----- | :--------------------------------------------------- | -| `type` | [_HatType_](../enums/frontend_utils_hats.hattype.md) | - -**Returns:** [_Hat_](frontend_utils_hats.md#hat) - ---- - -### hatTypeFromHash - -▸ `Const` **hatTypeFromHash**(`hash`: LocationId): [_HatType_](../enums/frontend_utils_hats.hattype.md) - -#### Parameters - -| Name | Type | -| :----- | :--------- | -| `hash` | LocationId | - -**Returns:** [_HatType_](../enums/frontend_utils_hats.hattype.md) diff --git a/docs/modules/frontend_utils_keyemitters.md b/docs/modules/frontend_utils_keyemitters.md deleted file mode 100644 index ffcd8138..00000000 --- a/docs/modules/frontend_utils_keyemitters.md +++ /dev/null @@ -1,34 +0,0 @@ -# Module: Frontend/Utils/KeyEmitters - -## Table of contents - -### Variables - -- [ctrlDown$](frontend_utils_keyemitters.md#ctrldown$) -- [ctrlUp$](frontend_utils_keyemitters.md#ctrlup$) -- [escapeDown$](frontend_utils_keyemitters.md#escapedown$) -- [keyUp$](frontend_utils_keyemitters.md#keyup$) - -## Variables - -### ctrlDown$ - -• `Const` **ctrlDown$**: [_Monomitter_](frontend_utils_monomitter.md#monomitter) - ---- - -### ctrlUp$ - -• `Const` **ctrlUp$**: [_Monomitter_](frontend_utils_monomitter.md#monomitter) - ---- - -### escapeDown$ - -• `Const` **escapeDown$**: [_Monomitter_](frontend_utils_monomitter.md#monomitter) - ---- - -### keyUp$ - -• `Const` **keyUp$**: [_Monomitter_](frontend_utils_monomitter.md#monomitter)<[_Wrapper_](../classes/backend_utils_wrapper.wrapper.md)\> diff --git a/docs/modules/frontend_utils_settingshooks.md b/docs/modules/frontend_utils_settingshooks.md deleted file mode 100644 index a1daf92d..00000000 --- a/docs/modules/frontend_utils_settingshooks.md +++ /dev/null @@ -1,263 +0,0 @@ -# Module: Frontend/Utils/SettingsHooks - -## Table of contents - -### Enumerations - -- [AutoGasSetting](../enums/frontend_utils_settingshooks.autogassetting.md) -- [Setting](../enums/frontend_utils_settingshooks.setting.md) - -### Variables - -- [ALL_AUTO_GAS_SETTINGS](frontend_utils_settingshooks.md#all_auto_gas_settings) -- [settingChanged$](frontend_utils_settingshooks.md#settingchanged$) - -### Functions - -- [BooleanSetting](frontend_utils_settingshooks.md#booleansetting) -- [MultiSelectSetting](frontend_utils_settingshooks.md#multiselectsetting) -- [getBooleanSetting](frontend_utils_settingshooks.md#getbooleansetting) -- [getLocalStorageSettingKey](frontend_utils_settingshooks.md#getlocalstoragesettingkey) -- [getNumberSetting](frontend_utils_settingshooks.md#getnumbersetting) -- [getSetting](frontend_utils_settingshooks.md#getsetting) -- [pollSetting](frontend_utils_settingshooks.md#pollsetting) -- [setBooleanSetting](frontend_utils_settingshooks.md#setbooleansetting) -- [setNumberSetting](frontend_utils_settingshooks.md#setnumbersetting) -- [setSetting](frontend_utils_settingshooks.md#setsetting) -- [useBooleanSetting](frontend_utils_settingshooks.md#usebooleansetting) -- [useSetting](frontend_utils_settingshooks.md#usesetting) - -## Variables - -### ALL_AUTO_GAS_SETTINGS - -• `Const` **ALL_AUTO_GAS_SETTINGS**: [_AutoGasSetting_](../enums/frontend_utils_settingshooks.autogassetting.md)[] - ---- - -### settingChanged$ - -• `Const` **settingChanged$**: [_Monomitter_](frontend_utils_monomitter.md#monomitter)<[_Setting_](../enums/frontend_utils_settingshooks.setting.md)\> - -Whenever a setting changes, we publish the setting's name to this event emitter. - -## Functions - -### BooleanSetting - -▸ **BooleanSetting**(`__namedParameters`: { `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md) ; `settingDescription?`: _string_ ; `uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md) }): _Element_ - -React component that renders a checkbox representing the current value of this particular -setting, interpreting its value as a boolean. Allows the player to click on the checkbox to -toggle the setting. Toggling the setting both notifies the rest of the game that the given -setting was changed, and also saves it to local storage. - -#### Parameters - -| Name | Type | -| :-------------------------------------- | :----------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | -| `__namedParameters.settingDescription?` | _string_ | -| `__namedParameters.uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | - -**Returns:** _Element_ - ---- - -### MultiSelectSetting - -▸ **MultiSelectSetting**(`__namedParameters`: { `labels`: _string_[] ; `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md) ; `style?`: React.CSSProperties ; `uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md) ; `values`: _string_[] }): _Element_ - -UI that is kept in-sync with a particular setting which allows you to set that setting to one of -several options. - -#### Parameters - -| Name | Type | -| :---------------------------- | :----------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.labels` | _string_[] | -| `__namedParameters.setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | -| `__namedParameters.style?` | React.CSSProperties | -| `__namedParameters.uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) | -| `__namedParameters.values` | _string_[] | - -**Returns:** _Element_ - ---- - -### getBooleanSetting - -▸ **getBooleanSetting**(`account`: EthAddress \| _undefined_, `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md)): _boolean_ - -Loads from local storage, and interprets as a boolean the setting with the given name. - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------ | -| `account` | EthAddress \| _undefined_ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | - -**Returns:** _boolean_ - ---- - -### getLocalStorageSettingKey - -▸ **getLocalStorageSettingKey**(`account`: EthAddress \| _undefined_, `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md)): _string_ - -Each setting is stored in local storage. Each account has their own setting. - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------ | -| `account` | EthAddress \| _undefined_ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | - -**Returns:** _string_ - ---- - -### getNumberSetting - -▸ **getNumberSetting**(`account`: EthAddress \| _undefined_, `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md)): _number_ - -Loads from local storage, and interprets as a boolean the setting with the given name. - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------ | -| `account` | EthAddress \| _undefined_ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | - -**Returns:** _number_ - ---- - -### getSetting - -▸ **getSetting**(`account`: EthAddress \| _undefined_, `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md)): _string_ - -Read the local storage setting from local storage. - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------ | -| `account` | EthAddress \| _undefined_ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | - -**Returns:** _string_ - ---- - -### pollSetting - -▸ **pollSetting**(`account`: EthAddress \| _undefined_, `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md)): _ReturnType_<_typeof_ setInterval\> - -Some settings can be set from another window. In particular, the 'auto accept transaction' -setting is set from multiple windows. As a result, the local storage setting can get out of sync -with the in memory setting. To fix this, we can poll the given setting from local storage, and -notify the rest of the game that it changed if it changed. - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------ | -| `account` | EthAddress \| _undefined_ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | - -**Returns:** _ReturnType_<_typeof_ setInterval\> - ---- - -### setBooleanSetting - -▸ **setBooleanSetting**(`account`: EthAddress \| _undefined_, `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md), `value`: _boolean_): _void_ - -Save the given setting to local storage. Publish an event to [settingChanged$](frontend_utils_settingshooks.md#settingchanged$). - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------ | -| `account` | EthAddress \| _undefined_ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | -| `value` | _boolean_ | - -**Returns:** _void_ - ---- - -### setNumberSetting - -▸ **setNumberSetting**(`account`: EthAddress \| _undefined_, `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md), `value`: _number_): _void_ - -Save the given setting to local storage. Publish an event to [settingChanged$](frontend_utils_settingshooks.md#settingchanged$). - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------ | -| `account` | EthAddress \| _undefined_ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | -| `value` | _number_ | - -**Returns:** _void_ - ---- - -### setSetting - -▸ **setSetting**(`account`: EthAddress \| _undefined_, `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md), `value`: _string_): _void_ - -Save the given setting to local storage. Publish an event to [settingChanged$](frontend_utils_settingshooks.md#settingchanged$). - -#### Parameters - -| Name | Type | -| :-------- | :------------------------------------------------------------ | -| `account` | EthAddress \| _undefined_ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | -| `value` | _string_ | - -**Returns:** _void_ - ---- - -### useBooleanSetting - -▸ **useBooleanSetting**(`uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md) \| _undefined_, `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md)): [*boolean*, (`newValue`: *boolean*) => *void*] - -Allows a react component to subscribe to changes to the given setting, interpreting its value as -a boolean. - -#### Parameters - -| Name | Type | -| :---------- | :-------------------------------------------------------------------------------- | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) \| _undefined_ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | - -**Returns:** [*boolean*, (`newValue`: *boolean*) => *void*] - ---- - -### useSetting - -▸ **useSetting**(`uiManager`: [_default_](../classes/backend_gamelogic_gameuimanager.default.md) \| _undefined_, `setting`: [_Setting_](../enums/frontend_utils_settingshooks.setting.md)): [*string*, (`newValue`: *string* \| *undefined*) => *void*] - -Allows a react component to subscribe to changes to the give setting. - -#### Parameters - -| Name | Type | -| :---------- | :-------------------------------------------------------------------------------- | -| `uiManager` | [_default_](../classes/backend_gamelogic_gameuimanager.default.md) \| _undefined_ | -| `setting` | [_Setting_](../enums/frontend_utils_settingshooks.setting.md) | - -**Returns:** [*string*, (`newValue`: *string* \| *undefined*) => *void*] diff --git a/docs/modules/frontend_utils_shortcutconstants.md b/docs/modules/frontend_utils_shortcutconstants.md deleted file mode 100644 index 579eff55..00000000 --- a/docs/modules/frontend_utils_shortcutconstants.md +++ /dev/null @@ -1,62 +0,0 @@ -# Module: Frontend/Utils/ShortcutConstants - -## Table of contents - -### Variables - -- [TOGGLE_ARTIFACTS_DEX_PANE](frontend_utils_shortcutconstants.md#toggle_artifacts_dex_pane) -- [TOGGLE_BROADCAST_PANE](frontend_utils_shortcutconstants.md#toggle_broadcast_pane) -- [TOGGLE_DIAGNOSTICS_PANE](frontend_utils_shortcutconstants.md#toggle_diagnostics_pane) -- [TOGGLE_HAT_PANE](frontend_utils_shortcutconstants.md#toggle_hat_pane) -- [TOGGLE_PLANET_ARTIFACTS_PANE](frontend_utils_shortcutconstants.md#toggle_planet_artifacts_pane) -- [TOGGLE_PLANET_DETAILS_PANE](frontend_utils_shortcutconstants.md#toggle_planet_details_pane) -- [TOGGLE_PLANET_DEX_PANE](frontend_utils_shortcutconstants.md#toggle_planet_dex_pane) -- [TOGGLE_UPGRADES_PANE](frontend_utils_shortcutconstants.md#toggle_upgrades_pane) - -## Variables - -### TOGGLE_ARTIFACTS_DEX_PANE - -• `Const` **TOGGLE_ARTIFACTS_DEX_PANE**: `"e"`= 'e' - ---- - -### TOGGLE_BROADCAST_PANE - -• `Const` **TOGGLE_BROADCAST_PANE**: `"b"`= 'b' - ---- - -### TOGGLE_DIAGNOSTICS_PANE - -• `Const` **TOGGLE_DIAGNOSTICS_PANE**: `"p"`= 'p' - ---- - -### TOGGLE_HAT_PANE - -• `Const` **TOGGLE_HAT_PANE**: `"h"`= 'h' - ---- - -### TOGGLE_PLANET_ARTIFACTS_PANE - -• `Const` **TOGGLE_PLANET_ARTIFACTS_PANE**: `"a"`= 'a' - ---- - -### TOGGLE_PLANET_DETAILS_PANE - -• `Const` **TOGGLE_PLANET_DETAILS_PANE**: `"d"`= 'd' - ---- - -### TOGGLE_PLANET_DEX_PANE - -• `Const` **TOGGLE_PLANET_DEX_PANE**: `"q"`= 'q' - ---- - -### TOGGLE_UPGRADES_PANE - -• `Const` **TOGGLE_UPGRADES_PANE**: `"u"`= 'u' diff --git a/docs/modules/frontend_utils_terminaltypes.md b/docs/modules/frontend_utils_terminaltypes.md deleted file mode 100644 index e9da2325..00000000 --- a/docs/modules/frontend_utils_terminaltypes.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Utils/TerminalTypes - -## Table of contents - -### Enumerations - -- [TerminalTextStyle](../enums/frontend_utils_terminaltypes.terminaltextstyle.md) diff --git a/docs/modules/frontend_utils_uiemitter.md b/docs/modules/frontend_utils_uiemitter.md deleted file mode 100644 index f8215ccf..00000000 --- a/docs/modules/frontend_utils_uiemitter.md +++ /dev/null @@ -1,11 +0,0 @@ -# Module: Frontend/Utils/UIEmitter - -## Table of contents - -### Enumerations - -- [UIEmitterEvent](../enums/frontend_utils_uiemitter.uiemitterevent.md) - -### Classes - -- [default](../classes/frontend_utils_uiemitter.default.md) diff --git a/docs/modules/frontend_views_artifactlink.md b/docs/modules/frontend_views_artifactlink.md deleted file mode 100644 index de9b0aed..00000000 --- a/docs/modules/frontend_views_artifactlink.md +++ /dev/null @@ -1,24 +0,0 @@ -# Module: Frontend/Views/ArtifactLink - -## Table of contents - -### Functions - -- [ArtifactLink](frontend_views_artifactlink.md#artifactlink) - -## Functions - -### ArtifactLink - -▸ **ArtifactLink**(`__namedParameters`: { `artifact`: Artifact ; `children`: React.ReactNode ; `setDetailsOpen`: (`open`: _boolean_) => _void_ }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------------- | :---------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | -| `__namedParameters.children` | React.ReactNode | -| `__namedParameters.setDetailsOpen` | (`open`: _boolean_) => _void_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_darkforesttips.md b/docs/modules/frontend_views_darkforesttips.md deleted file mode 100644 index 935691d8..00000000 --- a/docs/modules/frontend_views_darkforesttips.md +++ /dev/null @@ -1,24 +0,0 @@ -# Module: Frontend/Views/DarkForestTips - -## Table of contents - -### Functions - -- [DarkForestTips](frontend_views_darkforesttips.md#darkforesttips) -- [MakeDarkForestTips](frontend_views_darkforesttips.md#makedarkforesttips) - -## Functions - -### DarkForestTips - -▸ **DarkForestTips**(): _Element_ - -**Returns:** _Element_ - ---- - -### MakeDarkForestTips - -▸ **MakeDarkForestTips**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_dferrorboundary.md b/docs/modules/frontend_views_dferrorboundary.md deleted file mode 100644 index 754d9646..00000000 --- a/docs/modules/frontend_views_dferrorboundary.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Views/DFErrorBoundary - -## Table of contents - -### Classes - -- [DFErrorBoundary](../classes/frontend_views_dferrorboundary.dferrorboundary.md) diff --git a/docs/modules/frontend_views_emojipicker.md b/docs/modules/frontend_views_emojipicker.md deleted file mode 100644 index 42463bbc..00000000 --- a/docs/modules/frontend_views_emojipicker.md +++ /dev/null @@ -1,23 +0,0 @@ -# Module: Frontend/Views/EmojiPicker - -## Table of contents - -### Functions - -- [EmojiPicker](frontend_views_emojipicker.md#emojipicker) - -## Functions - -### EmojiPicker - -▸ **EmojiPicker**(`__namedParameters`: { `emoji`: _string_ \| _undefined_ ; `setEmoji`: (`emoji`: _string_) => _void_ }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :---------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.emoji` | _string_ \| _undefined_ | -| `__namedParameters.setEmoji` | (`emoji`: _string_) => _void_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_emojiplanetnotification.md b/docs/modules/frontend_views_emojiplanetnotification.md deleted file mode 100644 index ecaab296..00000000 --- a/docs/modules/frontend_views_emojiplanetnotification.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Views/EmojiPlanetNotification - -## Table of contents - -### Functions - -- [EmojiPlanetNotification](frontend_views_emojiplanetnotification.md#emojiplanetnotification) - -## Functions - -### EmojiPlanetNotification - -▸ **EmojiPlanetNotification**(`__namedParameters`: { `wrapper`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------- | :----------------------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.wrapper` | [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_genericerrorboundary.md b/docs/modules/frontend_views_genericerrorboundary.md deleted file mode 100644 index 509f72c8..00000000 --- a/docs/modules/frontend_views_genericerrorboundary.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Frontend/Views/GenericErrorBoundary - -## Table of contents - -### Classes - -- [GenericErrorBoundary](../classes/frontend_views_genericerrorboundary.genericerrorboundary.md) diff --git a/docs/modules/frontend_views_leaderboard.md b/docs/modules/frontend_views_leaderboard.md deleted file mode 100644 index b3d562f0..00000000 --- a/docs/modules/frontend_views_leaderboard.md +++ /dev/null @@ -1,15 +0,0 @@ -# Module: Frontend/Views/Leaderboard - -## Table of contents - -### Functions - -- [LeadboardDisplay](frontend_views_leaderboard.md#leadboarddisplay) - -## Functions - -### LeadboardDisplay - -▸ **LeadboardDisplay**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_menubar.md b/docs/modules/frontend_views_menubar.md deleted file mode 100644 index 76fe9b8c..00000000 --- a/docs/modules/frontend_views_menubar.md +++ /dev/null @@ -1,35 +0,0 @@ -# Module: Frontend/Views/MenuBar - -## Table of contents - -### Variables - -- [MenuBar](frontend_views_menubar.md#menubar) - -### Functions - -- [MenuBarSection](frontend_views_menubar.md#menubarsection) - -## Variables - -### MenuBar - -• `Const` **MenuBar**: _StyledComponent_<`"div"`, any, {}, never\> - -Left bar (with all the modal icons) - -## Functions - -### MenuBarSection - -▸ **MenuBarSection**(`__namedParameters`: { `children`: React.ReactNode ; `collapsible?`: _boolean_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------------- | :-------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactNode | -| `__namedParameters.collapsible?` | _boolean_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_modalicon.md b/docs/modules/frontend_views_modalicon.md deleted file mode 100644 index 1a3513a8..00000000 --- a/docs/modules/frontend_views_modalicon.md +++ /dev/null @@ -1,279 +0,0 @@ -# Module: Frontend/Views/ModalIcon - -## Table of contents - -### Functions - -- [ModalAccountIcon](frontend_views_modalicon.md#modalaccounticon) -- [ModalArtifactIcon](frontend_views_modalicon.md#modalartifacticon) -- [ModalArtifactsConversationIcon](frontend_views_modalicon.md#modalartifactsconversationicon) -- [ModalHatIcon](frontend_views_modalicon.md#modalhaticon) -- [ModalHelpIcon](frontend_views_modalicon.md#modalhelpicon) -- [ModalIcon](frontend_views_modalicon.md#modalicon) -- [ModalLeaderboardIcon](frontend_views_modalicon.md#modalleaderboardicon) -- [ModalMapShareIcon](frontend_views_modalicon.md#modalmapshareicon) -- [ModalPlanetDetailsIcon](frontend_views_modalicon.md#modalplanetdetailsicon) -- [ModalPlanetDexIcon](frontend_views_modalicon.md#modalplanetdexicon) -- [ModalPluginIcon](frontend_views_modalicon.md#modalpluginicon) -- [ModalSettingsIcon](frontend_views_modalicon.md#modalsettingsicon) -- [ModalTwitterBroadcastIcon](frontend_views_modalicon.md#modaltwitterbroadcasticon) -- [ModalTwitterVerifyIcon](frontend_views_modalicon.md#modaltwitterverifyicon) -- [ModalUpgradeDetailsIcon](frontend_views_modalicon.md#modalupgradedetailsicon) -- [ModalWithdrawIcon](frontend_views_modalicon.md#modalwithdrawicon) -- [ModalYourArtifactsIcon](frontend_views_modalicon.md#modalyourartifactsicon) - -## Functions - -### ModalAccountIcon - -▸ **ModalAccountIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalArtifactIcon - -▸ **ModalArtifactIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalArtifactsConversationIcon - -▸ **ModalArtifactsConversationIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalHatIcon - -▸ **ModalHatIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalHelpIcon - -▸ **ModalHelpIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalIcon - -▸ **ModalIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) ; `modal`: [_ModalName_](../enums/frontend_views_modalpane.modalname.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------ | :------------------------------------------------------------ | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | -| `__namedParameters.modal` | [_ModalName_](../enums/frontend_views_modalpane.modalname.md) | - -**Returns:** _Element_ - ---- - -### ModalLeaderboardIcon - -▸ **ModalLeaderboardIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalMapShareIcon - -▸ **ModalMapShareIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalPlanetDetailsIcon - -▸ **ModalPlanetDetailsIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalPlanetDexIcon - -▸ **ModalPlanetDexIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalPluginIcon - -▸ **ModalPluginIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalSettingsIcon - -▸ **ModalSettingsIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalTwitterBroadcastIcon - -▸ **ModalTwitterBroadcastIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalTwitterVerifyIcon - -▸ **ModalTwitterVerifyIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalUpgradeDetailsIcon - -▸ **ModalUpgradeDetailsIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalWithdrawIcon - -▸ **ModalWithdrawIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ - ---- - -### ModalYourArtifactsIcon - -▸ **ModalYourArtifactsIcon**(`__namedParameters`: { `hook`: [_ModalHook_](frontend_views_modalpane.md#modalhook) }): _Element_ - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.hook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_modalpane.md b/docs/modules/frontend_views_modalpane.md deleted file mode 100644 index bf7e0e6c..00000000 --- a/docs/modules/frontend_views_modalpane.md +++ /dev/null @@ -1,45 +0,0 @@ -# Module: Frontend/Views/ModalPane - -## Table of contents - -### Enumerations - -- [ModalName](../enums/frontend_views_modalpane.modalname.md) - -### Type aliases - -- [ModalHook](frontend_views_modalpane.md#modalhook) - -### Variables - -- [RECOMMENDED_WIDTH](frontend_views_modalpane.md#recommended_width) - -### Functions - -- [ModalPane](frontend_views_modalpane.md#modalpane) - -## Type aliases - -### ModalHook - -Ƭ **ModalHook**: [_Hook_](_types_global_globaltypes.md#hook) - -## Variables - -### RECOMMENDED_WIDTH - -• `Const` **RECOMMENDED_WIDTH**: `"450px"`= '450px' - -## Functions - -### ModalPane - -▸ **ModalPane**(`__namedParameters`: [_PaneProps_](frontend_components_gamewindowcomponents.md#paneprops) & { `backgroundColor?`: _string_ ; `borderColor?`: _string_ ; `helpContent?`: () => React.ReactNode ; `hideClose?`: _boolean_ ; `hook`: [_Hook_](_types_global_globaltypes.md#hook) ; `name?`: [_ModalName_](../enums/frontend_views_modalpane.modalname.md) ; `noPadding?`: _boolean_ ; `style?`: React.CSSProperties ; `titlebarColor?`: _string_ ; `width?`: _string_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `__namedParameters` | [_PaneProps_](frontend_components_gamewindowcomponents.md#paneprops) & { `backgroundColor?`: _string_ ; `borderColor?`: _string_ ; `helpContent?`: () => React.ReactNode ; `hideClose?`: _boolean_ ; `hook`: [_Hook_](_types_global_globaltypes.md#hook) ; `name?`: [_ModalName_](../enums/frontend_views_modalpane.modalname.md) ; `noPadding?`: _boolean_ ; `style?`: React.CSSProperties ; `titlebarColor?`: _string_ ; `width?`: _string_ } | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_notifications.md b/docs/modules/frontend_views_notifications.md deleted file mode 100644 index c8503782..00000000 --- a/docs/modules/frontend_views_notifications.md +++ /dev/null @@ -1,15 +0,0 @@ -# Module: Frontend/Views/Notifications - -## Table of contents - -### Functions - -- [NotificationsPane](frontend_views_notifications.md#notificationspane) - -## Functions - -### NotificationsPane - -▸ **NotificationsPane**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_ownedpluginview.md b/docs/modules/frontend_views_ownedpluginview.md deleted file mode 100644 index 6fd81da4..00000000 --- a/docs/modules/frontend_views_ownedpluginview.md +++ /dev/null @@ -1,44 +0,0 @@ -# Module: Frontend/Views/OwnedPluginView - -## Table of contents - -### Classes - -- [OwnedPluginView](../classes/frontend_views_ownedpluginview.ownedpluginview.md) - -### Type aliases - -- [OpenEditor](frontend_views_ownedpluginview.md#openeditor) - -### Variables - -- [Actions](frontend_views_ownedpluginview.md#actions) - -## Type aliases - -### OpenEditor - -Ƭ **OpenEditor**: (`pluginId`: [_PluginId_](backend_plugins_serializedplugin.md#pluginid)) => () => _void_ - -Should - -1. open an editor for this plugin -2. return a function that closes the editor. - -#### Type declaration - -▸ (`pluginId`: [_PluginId_](backend_plugins_serializedplugin.md#pluginid)): _function_ - -#### Parameters - -| Name | Type | -| :--------- | :--------------------------------------------------------- | -| `pluginId` | [_PluginId_](backend_plugins_serializedplugin.md#pluginid) | - -**Returns:** () => _void_ - -## Variables - -### Actions - -• `Const` **Actions**: _StyledComponent_<`"div"`, any, {}, never\> diff --git a/docs/modules/frontend_views_planetcard.md b/docs/modules/frontend_views_planetcard.md deleted file mode 100644 index 084055fb..00000000 --- a/docs/modules/frontend_views_planetcard.md +++ /dev/null @@ -1,24 +0,0 @@ -# Module: Frontend/Views/PlanetCard - -## Table of contents - -### Functions - -- [PlanetCard](frontend_views_planetcard.md#planetcard) - -## Functions - -### PlanetCard - -▸ **PlanetCard**(`__namedParameters`: { `planetWrapper`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) }): _Element_ - -Preview basic planet information - used in `PlanetContextPane` and `HoverPlanetPane` - -#### Parameters - -| Name | Type | -| :-------------------------------- | :----------------------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planetWrapper` | [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_planetcardcomponents.md b/docs/modules/frontend_views_planetcardcomponents.md deleted file mode 100644 index 13dbad4d..00000000 --- a/docs/modules/frontend_views_planetcardcomponents.md +++ /dev/null @@ -1,159 +0,0 @@ -# Module: Frontend/Views/PlanetCardComponents - -## Table of contents - -### Variables - -- [ArtifactSection](frontend_views_planetcardcomponents.md#artifactsection) -- [BigStatCell](frontend_views_planetcardcomponents.md#bigstatcell) -- [DestroyedMarker](frontend_views_planetcardcomponents.md#destroyedmarker) -- [IconsWrapper](frontend_views_planetcardcomponents.md#iconswrapper) -- [PlanetTag](frontend_views_planetcardcomponents.md#planettag) -- [PreviewSection](frontend_views_planetcardcomponents.md#previewsection) -- [Small](frontend_views_planetcardcomponents.md#small) -- [StatCell](frontend_views_planetcardcomponents.md#statcell) -- [StatRow](frontend_views_planetcardcomponents.md#statrow) -- [StatSection](frontend_views_planetcardcomponents.md#statsection) -- [StyledPlanetCard](frontend_views_planetcardcomponents.md#styledplanetcard) -- [StyledStatIcon](frontend_views_planetcardcomponents.md#styledstaticon) -- [TitleBar](frontend_views_planetcardcomponents.md#titlebar) -- [TopRow](frontend_views_planetcardcomponents.md#toprow) - -### Functions - -- [PCStatIcon](frontend_views_planetcardcomponents.md#pcstaticon) -- [PlanetActiveArtifact](frontend_views_planetcardcomponents.md#planetactiveartifact) -- [RowTip](frontend_views_planetcardcomponents.md#rowtip) - -## Variables - -### ArtifactSection - -• `Const` **ArtifactSection**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### BigStatCell - -• `Const` **BigStatCell**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### DestroyedMarker - -• `Const` **DestroyedMarker**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### IconsWrapper - -• `Const` **IconsWrapper**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### PlanetTag - -• `Const` **PlanetTag**: _StyledComponent_<`"div"`, any, { `planet`: _undefined_ \| Planet }, never\> - ---- - -### PreviewSection - -• `Const` **PreviewSection**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### Small - -• `Const` **Small**: _StyledComponent_<`"div"`, any, { `planet`: _undefined_ \| Planet }, never\> - ---- - -### StatCell - -• `Const` **StatCell**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### StatRow - -• `Const` **StatRow**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### StatSection - -• `Const` **StatSection**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### StyledPlanetCard - -• `Const` **StyledPlanetCard**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### StyledStatIcon - -• `Const` **StyledStatIcon**: _StyledComponent_<`"span"`, any, {}, never\> - ---- - -### TitleBar - -• `Const` **TitleBar**: _StyledComponent_<`"div"`, any, {}, never\> - ---- - -### TopRow - -• `Const` **TopRow**: _StyledComponent_<`"div"`, any, {}, never\> - -## Functions - -### PCStatIcon - -▸ **PCStatIcon**(`__namedParameters`: { `children`: React.ReactNode ; `planet`: Planet \| _undefined_ ; `stat`: [_StatIdx_](../enums/_types_global_globaltypes.statidx.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :--------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactNode | -| `__namedParameters.planet` | Planet \| _undefined_ | -| `__namedParameters.stat` | [_StatIdx_](../enums/_types_global_globaltypes.statidx.md) | - -**Returns:** _Element_ - ---- - -### PlanetActiveArtifact - -▸ **PlanetActiveArtifact**(`__namedParameters`: { `artifact`: Artifact ; `planet`: Planet \| _undefined_ }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :-------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.artifact` | Artifact | -| `__namedParameters.planet` | Planet \| _undefined_ | - -**Returns:** _Element_ - ---- - -### RowTip - -▸ `Const` **RowTip**(`__namedParameters`: { `children`: ReactNode ; `name`: [_TooltipName_](../enums/frontend_game_windowmanager.tooltipname.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :------------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | ReactNode | -| `__namedParameters.name` | [_TooltipName_](../enums/frontend_game_windowmanager.tooltipname.md) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_planetlink.md b/docs/modules/frontend_views_planetlink.md deleted file mode 100644 index 29419261..00000000 --- a/docs/modules/frontend_views_planetlink.md +++ /dev/null @@ -1,23 +0,0 @@ -# Module: Frontend/Views/PlanetLink - -## Table of contents - -### Functions - -- [PlanetLink](frontend_views_planetlink.md#planetlink) - -## Functions - -### PlanetLink - -▸ **PlanetLink**(`__namedParameters`: { `children`: React.ReactNode ; `planet`: Planet }): _Element_ - -#### Parameters - -| Name | Type | -| :--------------------------- | :-------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.children` | React.ReactNode | -| `__namedParameters.planet` | Planet | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_planetnotifications.md b/docs/modules/frontend_views_planetnotifications.md deleted file mode 100644 index e7036df9..00000000 --- a/docs/modules/frontend_views_planetnotifications.md +++ /dev/null @@ -1,57 +0,0 @@ -# Module: Frontend/Views/PlanetNotifications - -## Table of contents - -### Enumerations - -- [PlanetNotifType](../enums/frontend_views_planetnotifications.planetnotiftype.md) - -### Type aliases - -- [PlanetNotifHooks](frontend_views_planetnotifications.md#planetnotifhooks) - -### Functions - -- [PlanetNotifications](frontend_views_planetnotifications.md#planetnotifications) -- [getNotifsForPlanet](frontend_views_planetnotifications.md#getnotifsforplanet) - -## Type aliases - -### PlanetNotifHooks - -Ƭ **PlanetNotifHooks**: _object_ - -#### Type declaration - -| Name | Type | -| :--------------- | :--------------------------------------------------- | -| `upgradeDetHook` | [_ModalHook_](frontend_views_modalpane.md#modalhook) | - -## Functions - -### PlanetNotifications - -▸ **PlanetNotifications**(`__namedParameters`: { `notifs`: [_PlanetNotifType_](../enums/frontend_views_planetnotifications.planetnotiftype.md)[] ; `wrapper`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) } & [_PlanetNotifHooks_](frontend_views_planetnotifications.md#planetnotifhooks)): _Element_ - -#### Parameters - -| Name | Type | -| :------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `__namedParameters` | { `notifs`: [_PlanetNotifType_](../enums/frontend_views_planetnotifications.planetnotiftype.md)[] ; `wrapper`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) } & [_PlanetNotifHooks_](frontend_views_planetnotifications.md#planetnotifhooks) | - -**Returns:** _Element_ - ---- - -### getNotifsForPlanet - -▸ **getNotifsForPlanet**(`planet`: Planet \| _undefined_, `currentBlockNumber`: _number_ \| _undefined_): [_PlanetNotifType_](../enums/frontend_views_planetnotifications.planetnotiftype.md)[] - -#### Parameters - -| Name | Type | -| :------------------- | :---------------------- | -| `planet` | Planet \| _undefined_ | -| `currentBlockNumber` | _number_ \| _undefined_ | - -**Returns:** [_PlanetNotifType_](../enums/frontend_views_planetnotifications.planetnotiftype.md)[] diff --git a/docs/modules/frontend_views_sendresources.md b/docs/modules/frontend_views_sendresources.md deleted file mode 100644 index 36d3cf4f..00000000 --- a/docs/modules/frontend_views_sendresources.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Views/SendResources - -## Table of contents - -### Functions - -- [SendResources](frontend_views_sendresources.md#sendresources) - -## Functions - -### SendResources - -▸ **SendResources**(`__namedParameters`: { `planetWrapper`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------------- | :----------------------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.planetWrapper` | [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_sortabletable.md b/docs/modules/frontend_views_sortabletable.md deleted file mode 100644 index 075f5d40..00000000 --- a/docs/modules/frontend_views_sortabletable.md +++ /dev/null @@ -1,32 +0,0 @@ -# Module: Frontend/Views/SortableTable - -## Table of contents - -### Functions - -- [SortableTable](frontend_views_sortabletable.md#sortabletable) - -## Functions - -### SortableTable - -▸ **SortableTable**(`__namedParameters`: { `alignments?`: (`"r"` \| `"c"` \| `"l"`)[] ; `columns`: (`t`: T, `i`: _number_) => React.ReactNode[] ; `headers`: React.ReactNode[] ; `rows`: T[] ; `sortFunctions`: (`left`: T, `right`: T) => _number_[] }): _Element_ - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :-------------------------------- | :------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.alignments?` | (`"r"` \| `"c"` \| `"l"`)[] | -| `__namedParameters.columns` | (`t`: T, `i`: _number_) => React.ReactNode[] | -| `__namedParameters.headers` | React.ReactNode[] | -| `__namedParameters.rows` | T[] | -| `__namedParameters.sortFunctions` | (`left`: T, `right`: T) => _number_[] | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_tabbedview.md b/docs/modules/frontend_views_tabbedview.md deleted file mode 100644 index 1658d240..00000000 --- a/docs/modules/frontend_views_tabbedview.md +++ /dev/null @@ -1,27 +0,0 @@ -# Module: Frontend/Views/TabbedView - -## Table of contents - -### Functions - -- [TabbedView](frontend_views_tabbedview.md#tabbedview) - -## Functions - -### TabbedView - -▸ **TabbedView**(`__namedParameters`: { `tabContents`: (`tabIndex`: _number_) => React.ReactNode ; `tabTitles`: _string_[] }): _Element_ - -This component allows you to render several tabs of content. Each tab can be selected for viewing -by clicking on its corresponding tab button. Useful for displaying lots of slightly different but -related information to the user. - -#### Parameters - -| Name | Type | -| :------------------------------ | :---------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.tabContents` | (`tabIndex`: _number_) => React.ReactNode | -| `__namedParameters.tabTitles` | _string_[] | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_table.md b/docs/modules/frontend_views_table.md deleted file mode 100644 index 1c8d499d..00000000 --- a/docs/modules/frontend_views_table.md +++ /dev/null @@ -1,34 +0,0 @@ -# Module: Frontend/Views/Table - -## Table of contents - -### Functions - -- [Table](frontend_views_table.md#table) - -## Functions - -### Table - -▸ **Table**(`__namedParameters`: { `alignments?`: (`"r"` \| `"c"` \| `"l"`)[] ; `columns`: (`t`: T, `i`: _number_) => React.ReactNode[] ; `headerStyle?`: React.CSSProperties ; `headers`: React.ReactNode[] ; `rows`: T[] }): _Element_ - -React api for creating tables. - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Description | -| :------------------------------- | :------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `__namedParameters` | _object_ | - | -| `__namedParameters.alignments?` | (`"r"` \| `"c"` \| `"l"`)[] | optional, one per column, specifies that the text-alignment in that cell is either right, center, or left, represented by the characters 'r', 'c', and 'l' | -| `__namedParameters.columns` | (`t`: T, `i`: _number_) => React.ReactNode[] | functions, one per column, that convert a row into the react representation of that row's column's value. | -| `__namedParameters.headerStyle?` | React.CSSProperties | - | -| `__namedParameters.headers` | React.ReactNode[] | required (for now) array of strings that head each column | -| `__namedParameters.rows` | T[] | rows of an arbitrary type | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_terminal.md b/docs/modules/frontend_views_terminal.md deleted file mode 100644 index 52b7ab7b..00000000 --- a/docs/modules/frontend_views_terminal.md +++ /dev/null @@ -1,18 +0,0 @@ -# Module: Frontend/Views/Terminal - -## Table of contents - -### Interfaces - -- [TerminalHandle](../interfaces/frontend_views_terminal.terminalhandle.md) -- [TerminalProps](../interfaces/frontend_views_terminal.terminalprops.md) - -### Variables - -- [Terminal](frontend_views_terminal.md#terminal) - -## Variables - -### Terminal - -• `Const` **Terminal**: _ForwardRefExoticComponent_<[_TerminalProps_](../interfaces/frontend_views_terminal.terminalprops.md) & _RefAttributes_\> diff --git a/docs/modules/frontend_views_topbar.md b/docs/modules/frontend_views_topbar.md deleted file mode 100644 index d3ecaff6..00000000 --- a/docs/modules/frontend_views_topbar.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Views/TopBar - -## Table of contents - -### Variables - -- [TOP_BAR_HEIGHT](frontend_views_topbar.md#top_bar_height) - -### Functions - -- [TopBar](frontend_views_topbar.md#topbar) - -## Variables - -### TOP_BAR_HEIGHT - -• `Const` **TOP_BAR_HEIGHT**: `"2.5em"`= '2.5em' - -## Functions - -### TopBar - -▸ **TopBar**(): _Element_ - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_upgradepreview.md b/docs/modules/frontend_views_upgradepreview.md deleted file mode 100644 index a218df8b..00000000 --- a/docs/modules/frontend_views_upgradepreview.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Views/UpgradePreview - -## Table of contents - -### Functions - -- [UpgradePreview](frontend_views_upgradepreview.md#upgradepreview) - -## Functions - -### UpgradePreview - -▸ **UpgradePreview**(`__namedParameters`: { `branchName`: UpgradeBranchName \| _undefined_ ; `cantUpgrade`: _boolean_ ; `planet`: Planet \| _undefined_ ; `upgrade`: Upgrade \| _undefined_ }): _Element_ - -#### Parameters - -| Name | Type | -| :------------------------------ | :------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.branchName` | UpgradeBranchName \| _undefined_ | -| `__namedParameters.cantUpgrade` | _boolean_ | -| `__namedParameters.planet` | Planet \| _undefined_ | -| `__namedParameters.upgrade` | Upgrade \| _undefined_ | - -**Returns:** _Element_ diff --git a/docs/modules/frontend_views_withdrawsilver.md b/docs/modules/frontend_views_withdrawsilver.md deleted file mode 100644 index 5e5baf20..00000000 --- a/docs/modules/frontend_views_withdrawsilver.md +++ /dev/null @@ -1,22 +0,0 @@ -# Module: Frontend/Views/WithdrawSilver - -## Table of contents - -### Functions - -- [WithdrawSilver](frontend_views_withdrawsilver.md#withdrawsilver) - -## Functions - -### WithdrawSilver - -▸ **WithdrawSilver**(`__namedParameters`: { `wrapper`: [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) }): _Element_ - -#### Parameters - -| Name | Type | -| :-------------------------- | :----------------------------------------------------------------------------- | -| `__namedParameters` | _object_ | -| `__namedParameters.wrapper` | [_Wrapper_](../classes/backend_utils_wrapper.wrapper.md) | - -**Returns:** _Element_ diff --git a/last_updated.txt b/last_updated.txt index d2abbfa4..82e5d19d 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Fri Jul 9 21:16:52 UTC 2021 +last updated: Thu Jul 15 18:16:53 UTC 2021 diff --git a/package.json b/package.json index 6de36700..e5feaf99 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { "name": "client", - "version": "6.2.13", + "version": "6.2.14", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.13", - "@darkforest_eth/contracts": "6.2.13", - "@darkforest_eth/hashing": "6.2.13", - "@darkforest_eth/hexgen": "6.2.13", - "@darkforest_eth/serde": "6.2.13", - "@darkforest_eth/snarks": "6.2.13", - "@darkforest_eth/types": "6.2.13", + "@darkforest_eth/constants": "6.2.14", + "@darkforest_eth/contracts": "6.2.14", + "@darkforest_eth/hashing": "6.2.14", + "@darkforest_eth/hexgen": "6.2.14", + "@darkforest_eth/serde": "6.2.14", + "@darkforest_eth/snarks": "6.2.14", + "@darkforest_eth/types": "6.2.14", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", @@ -44,8 +44,8 @@ "styled-components": "^5.0.1", "timeago.js": "^4.0.2", "ts-dedent": "^2.0.0", - "typedoc": "^0.20.36", - "typedoc-plugin-markdown": "^3.8.1", + "typedoc": "^0.21.4", + "typedoc-plugin-markdown": "^3.10.3", "uuid": "^8.3.2" }, "scripts": { @@ -95,7 +95,7 @@ "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^5.1.1", "css-loader": "^3.2.0", - "eslint": "^7.26.0", + "eslint": "^7.30.0", "eslint-config-prettier": "^6.10.0", "eslint-plugin-react": "^7.17.0", "eslint-plugin-react-hooks": "^2.3.0", @@ -111,7 +111,7 @@ "speed-measure-webpack-plugin": "^1.3.1", "style-loader": "^1.0.0", "ts-loader": "^6.2.1", - "typescript": "^3.7.2", + "typescript": "^4.3.5", "typescript-plugin-styled-components": "^1.4.4", "webpack": "^4.41.2", "webpack-bundle-analyzer": "^3.6.0", diff --git a/public/icons/alerts/artifacts/find.svg b/public/icons/alerts/artifacts/find.svg new file mode 100644 index 00000000..c1425c32 --- /dev/null +++ b/public/icons/alerts/artifacts/find.svg @@ -0,0 +1 @@ +alert_ diff --git a/public/icons/alerts/artifacts/prospect.svg b/public/icons/alerts/artifacts/prospect.svg new file mode 100644 index 00000000..95d9c442 --- /dev/null +++ b/public/icons/alerts/artifacts/prospect.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/backgrounds/1.svg b/public/icons/alerts/backgrounds/1.svg new file mode 100644 index 00000000..f591f833 --- /dev/null +++ b/public/icons/alerts/backgrounds/1.svg @@ -0,0 +1 @@ +background \ No newline at end of file diff --git a/public/icons/alerts/backgrounds/2.svg b/public/icons/alerts/backgrounds/2.svg new file mode 100644 index 00000000..cb95a1ae --- /dev/null +++ b/public/icons/alerts/backgrounds/2.svg @@ -0,0 +1 @@ +background \ No newline at end of file diff --git a/public/icons/alerts/biomes/corrupted.svg b/public/icons/alerts/biomes/corrupted.svg new file mode 100644 index 00000000..c998c37c --- /dev/null +++ b/public/icons/alerts/biomes/corrupted.svg @@ -0,0 +1 @@ +alert_biome_corrupted diff --git a/public/icons/alerts/biomes/desert.svg b/public/icons/alerts/biomes/desert.svg new file mode 100644 index 00000000..e6dd225b --- /dev/null +++ b/public/icons/alerts/biomes/desert.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/biomes/forest.svg b/public/icons/alerts/biomes/forest.svg new file mode 100644 index 00000000..3f82c8ed --- /dev/null +++ b/public/icons/alerts/biomes/forest.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/biomes/grassland.svg b/public/icons/alerts/biomes/grassland.svg new file mode 100644 index 00000000..0c103075 --- /dev/null +++ b/public/icons/alerts/biomes/grassland.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/biomes/ice.svg b/public/icons/alerts/biomes/ice.svg new file mode 100644 index 00000000..4eabad37 --- /dev/null +++ b/public/icons/alerts/biomes/ice.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/biomes/lava.svg b/public/icons/alerts/biomes/lava.svg new file mode 100644 index 00000000..dfea38b8 --- /dev/null +++ b/public/icons/alerts/biomes/lava.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/biomes/ocean.svg b/public/icons/alerts/biomes/ocean.svg new file mode 100644 index 00000000..339a204a --- /dev/null +++ b/public/icons/alerts/biomes/ocean.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/biomes/swamp.svg b/public/icons/alerts/biomes/swamp.svg new file mode 100644 index 00000000..b096652d --- /dev/null +++ b/public/icons/alerts/biomes/swamp.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/biomes/tundra.svg b/public/icons/alerts/biomes/tundra.svg new file mode 100644 index 00000000..6f8a6904 --- /dev/null +++ b/public/icons/alerts/biomes/tundra.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/biomes/wasteland.svg b/public/icons/alerts/biomes/wasteland.svg new file mode 100644 index 00000000..ae233d68 --- /dev/null +++ b/public/icons/alerts/biomes/wasteland.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/borders/1.svg b/public/icons/alerts/borders/1.svg new file mode 100644 index 00000000..ae3a20c2 --- /dev/null +++ b/public/icons/alerts/borders/1.svg @@ -0,0 +1 @@ +border \ No newline at end of file diff --git a/public/icons/alerts/borders/2.svg b/public/icons/alerts/borders/2.svg new file mode 100644 index 00000000..17555fa8 --- /dev/null +++ b/public/icons/alerts/borders/2.svg @@ -0,0 +1 @@ +border \ No newline at end of file diff --git a/public/icons/alerts/combat/metplayer.svg b/public/icons/alerts/combat/metplayer.svg new file mode 100644 index 00000000..5fd897ae --- /dev/null +++ b/public/icons/alerts/combat/metplayer.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/combat/pirates.svg b/public/icons/alerts/combat/pirates.svg new file mode 100644 index 00000000..f338d4bb --- /dev/null +++ b/public/icons/alerts/combat/pirates.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/combat/planetattacked.svg b/public/icons/alerts/combat/planetattacked.svg new file mode 100644 index 00000000..e5629a8c --- /dev/null +++ b/public/icons/alerts/combat/planetattacked.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/combat/planetlost.svg b/public/icons/alerts/combat/planetlost.svg new file mode 100644 index 00000000..dc5ff574 --- /dev/null +++ b/public/icons/alerts/combat/planetlost.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/combat/planetwon.svg b/public/icons/alerts/combat/planetwon.svg new file mode 100644 index 00000000..a50650e6 --- /dev/null +++ b/public/icons/alerts/combat/planetwon.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/combat/playerfound.svg b/public/icons/alerts/combat/playerfound.svg new file mode 100644 index 00000000..4d8c6243 --- /dev/null +++ b/public/icons/alerts/combat/playerfound.svg @@ -0,0 +1 @@ +alert_icons2 \ No newline at end of file diff --git a/public/icons/alerts/generic/generic.svg b/public/icons/alerts/generic/generic.svg new file mode 100644 index 00000000..bdd5b343 --- /dev/null +++ b/public/icons/alerts/generic/generic.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/planettypes/asteroid.svg b/public/icons/alerts/planettypes/asteroid.svg new file mode 100644 index 00000000..eb2a9f69 --- /dev/null +++ b/public/icons/alerts/planettypes/asteroid.svg @@ -0,0 +1 @@ +alert_planettype_ \ No newline at end of file diff --git a/public/icons/alerts/planettypes/planet.svg b/public/icons/alerts/planettypes/planet.svg new file mode 100644 index 00000000..ba20d9ca --- /dev/null +++ b/public/icons/alerts/planettypes/planet.svg @@ -0,0 +1 @@ +alert_planettype_ \ No newline at end of file diff --git a/public/icons/alerts/planettypes/quasar.svg b/public/icons/alerts/planettypes/quasar.svg new file mode 100644 index 00000000..d1d2b6c6 --- /dev/null +++ b/public/icons/alerts/planettypes/quasar.svg @@ -0,0 +1 @@ +alert_planettype_ \ No newline at end of file diff --git a/public/icons/alerts/planettypes/ruins.svg b/public/icons/alerts/planettypes/ruins.svg new file mode 100644 index 00000000..99787316 --- /dev/null +++ b/public/icons/alerts/planettypes/ruins.svg @@ -0,0 +1 @@ +alert_planettype_ \ No newline at end of file diff --git a/public/icons/alerts/planettypes/tradingpost.svg b/public/icons/alerts/planettypes/tradingpost.svg new file mode 100644 index 00000000..f964a7f9 --- /dev/null +++ b/public/icons/alerts/planettypes/tradingpost.svg @@ -0,0 +1 @@ +alert_planettype_ \ No newline at end of file diff --git a/public/icons/alerts/spacetypes/alert_-19.svg b/public/icons/alerts/spacetypes/alert_-19.svg new file mode 100644 index 00000000..edcc74bd --- /dev/null +++ b/public/icons/alerts/spacetypes/alert_-19.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/spacetypes/deadspace.svg b/public/icons/alerts/spacetypes/deadspace.svg new file mode 100644 index 00000000..691a646d --- /dev/null +++ b/public/icons/alerts/spacetypes/deadspace.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/spacetypes/deepspace.svg b/public/icons/alerts/spacetypes/deepspace.svg new file mode 100644 index 00000000..8e47aa98 --- /dev/null +++ b/public/icons/alerts/spacetypes/deepspace.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/spacetypes/space.svg b/public/icons/alerts/spacetypes/space.svg new file mode 100644 index 00000000..5d0754bf --- /dev/null +++ b/public/icons/alerts/spacetypes/space.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/transactions/accepted.svg b/public/icons/alerts/transactions/accepted.svg new file mode 100644 index 00000000..b3f2b772 --- /dev/null +++ b/public/icons/alerts/transactions/accepted.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/transactions/confirmed.svg b/public/icons/alerts/transactions/confirmed.svg new file mode 100644 index 00000000..944b01c5 --- /dev/null +++ b/public/icons/alerts/transactions/confirmed.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/transactions/declined.svg b/public/icons/alerts/transactions/declined.svg new file mode 100644 index 00000000..e222087f --- /dev/null +++ b/public/icons/alerts/transactions/declined.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/public/icons/alerts/transactions/initialized.svg b/public/icons/alerts/transactions/initialized.svg new file mode 100644 index 00000000..462ef507 --- /dev/null +++ b/public/icons/alerts/transactions/initialized.svg @@ -0,0 +1 @@ +alert_ \ No newline at end of file diff --git a/src/Backend/GameLogic/ArrivalUtils.ts b/src/Backend/GameLogic/ArrivalUtils.ts index 11cdcbca..92c8858d 100644 --- a/src/Backend/GameLogic/ArrivalUtils.ts +++ b/src/Backend/GameLogic/ArrivalUtils.ts @@ -1,5 +1,6 @@ import { CONTRACT_PRECISION } from '@darkforest_eth/constants'; import { hasOwner } from '../Utils/Utils'; +import _ from 'lodash'; import { Artifact, ArtifactType, @@ -131,12 +132,23 @@ export const applyUpgrade = (planet: Planet, upgrade: Upgrade, unApply = false) } }; +/** + * @param previous The previously calculated state of a planet + * @param current The current calculated state of the planet + * @param arrival The Arrival that caused the state change + */ +export interface PlanetDiff { + previous: Planet; + current: Planet; + arrival: QueuedArrival; +} + export const arrive = ( toPlanet: Planet, artifactsOnPlanet: Artifact[], arrival: QueuedArrival, contractConstants: ContractConstants -): void => { +): PlanetDiff => { // this function optimistically simulates an arrival if (toPlanet.locationId !== arrival.toPlanet) { throw new Error(`attempted to apply arrival for wrong toPlanet ${toPlanet.locationId}`); @@ -145,8 +157,9 @@ export const arrive = ( // update toPlanet energy and silver right before arrival updatePlanetToTime(toPlanet, artifactsOnPlanet, arrival.arrivalTime * 1000, contractConstants); + const prevPlanet = _.cloneDeep(toPlanet); if (toPlanet.destroyed) { - return; + return { arrival: arrival, previous: toPlanet, current: toPlanet }; } // apply energy @@ -193,6 +206,7 @@ export const arrive = ( if (arrival.artifactId) { toPlanet.heldArtifactIds.push(arrival.artifactId); } + return { arrival, current: toPlanet, previous: prevPlanet }; }; /** diff --git a/src/Backend/GameLogic/ArtifactUtils.ts b/src/Backend/GameLogic/ArtifactUtils.ts index b582899b..5b99f3b5 100644 --- a/src/Backend/GameLogic/ArtifactUtils.ts +++ b/src/Backend/GameLogic/ArtifactUtils.ts @@ -70,9 +70,18 @@ export function setForceAncient(force: boolean): void { forceAncient = force; } -const artifactCooldownHoursMap: Record = [ - 24, 24, 24, 24, 24, 48, 24, 24, 24, 24, -]; +const artifactCooldownHoursMap = { + [ArtifactType.Unknown]: 24, + [ArtifactType.Monolith]: 24, + [ArtifactType.Colossus]: 24, + [ArtifactType.Spaceship]: 24, + [ArtifactType.Pyramid]: 24, + [ArtifactType.Wormhole]: 48, + [ArtifactType.PlanetaryShield]: 24, + [ArtifactType.PhotoidCannon]: 24, + [ArtifactType.BloomFilter]: 24, + [ArtifactType.BlackDomain]: 24, +} as const; export function artifactAvailableTimestamp(artifact: Artifact) { if (artifact.lastDeactivated === 0) { @@ -126,16 +135,16 @@ export function artifactBiomeName(artifact: Artifact): string { } export const levelFromRarity = (rarity: ArtifactRarity): PlanetLevel => { - if (rarity === ArtifactRarity.Mythic) return 9; - else if (rarity === ArtifactRarity.Legendary) return 7; - else if (rarity === ArtifactRarity.Epic) return 5; - else if (rarity === ArtifactRarity.Rare) return 3; - else return 1; + if (rarity === ArtifactRarity.Mythic) return PlanetLevel.NINE; + else if (rarity === ArtifactRarity.Legendary) return PlanetLevel.SEVEN; + else if (rarity === ArtifactRarity.Epic) return PlanetLevel.FIVE; + else if (rarity === ArtifactRarity.Rare) return PlanetLevel.THREE; + else return PlanetLevel.ONE; }; const artifactFileNamesById: Map = new Map(); -export enum ArtifactFileColor { +export const enum ArtifactFileColor { BLUE, APP_BACKGROUND, } diff --git a/src/Backend/GameLogic/GameManager.ts b/src/Backend/GameLogic/GameManager.ts index 0f1e0d53..41a0a7af 100644 --- a/src/Backend/GameLogic/GameManager.ts +++ b/src/Backend/GameLogic/GameManager.ts @@ -107,6 +107,8 @@ import { import { addMessage, deleteMessages, getMessagesOnPlanets } from '../Network/MessageAPI'; import { getEmojiMessage } from './ArrivalUtils'; import { easeInAnimation, emojiEaseOutAnimation } from '../Utils/Animation'; +import { getDisposableEmitter, generateDiffEmitter, Diff } from '../../Frontend/Utils/EmitterUtils'; +import { MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; export enum GameManagerEvent { PlanetUpdate = 'PlanetUpdate', @@ -1733,7 +1735,7 @@ class GameManager extends EventEmitter { planetPerlin < initPerlinMax && planetPerlin >= initPerlinMin && planetX ** 2 + planetY ** 2 < this.worldRadius ** 2 && - planetLevel === PlanetLevel.MIN && + planetLevel === MIN_PLANET_LEVEL && planetType === PlanetType.PLANET && (!planet || !planet.isInContract) // init will fail if planet has been initialized in contract already ) { @@ -1750,11 +1752,14 @@ class GameManager extends EventEmitter { } public async prospectPlanet(planetId: LocationId, bypassChecks = false) { + const planet = this.entityStore.getPlanetWithId(planetId); + if (!planet || !isLocatable(planet)) { + throw new Error("you can't prospect a planet you haven't discovered"); + } + if (!bypassChecks) { if (this.checkGameHasEnded()) return this; - const planet = this.entityStore.getPlanetWithId(planetId); - if (!planet) { throw new Error("you can't prospect a planet you haven't discovered"); } @@ -1795,9 +1800,15 @@ class GameManager extends EventEmitter { this.handleTxIntent(txIntent); - await this.contractsAPI.prospectPlanet(planetId, actionId).catch((err) => { - this.onTxIntentFail(txIntent, err); - }); + await this.contractsAPI + .prospectPlanet(planetId, actionId) + .then(() => { + const notifManager = NotificationManager.getInstance(); + notifManager.artifactProspected(planet as LocatablePlanet); + }) + .catch((err) => { + this.onTxIntentFail(txIntent, err); + }); } /** @@ -1863,6 +1874,18 @@ class GameManager extends EventEmitter { return this.contractsAPI.findArtifact(planet.location, snarkArgs, actionId); }) + .then(() => { + return this.waitForPlanet(planet.locationId, ({ current }: Diff) => { + return current.heldArtifactIds + .map(this.getArtifactWithId.bind(this)) + .find((a: Artifact) => a?.planetDiscoveredOn === planet.locationId) as Artifact; + }).then((foundArtifact) => { + if (!foundArtifact) throw new Error('Artifact not found?'); + const notifManager = NotificationManager.getInstance(); + + notifManager.artifactFound(planet as LocatablePlanet, foundArtifact); + }); + }) .catch((err) => { this.onTxIntentFail(txIntent, err); }); @@ -2755,7 +2778,7 @@ class GameManager extends EventEmitter { if (greaterRarity === undefined) { greaterRarity = toActiveArtifact.rarity; } else { - greaterRarity = Math.max(greaterRarity, toActiveArtifact.rarity); + greaterRarity = Math.max(greaterRarity, toActiveArtifact.rarity) as ArtifactRarity; } } @@ -2937,6 +2960,46 @@ class GameManager extends EventEmitter { public updateDiagnostics(updateFn: (d: Diagnostics) => void): void { updateFn(this.diagnostics); } + + /** + * Listen for changes to a planet take action, + * eg. + * waitForPlanet("yourAsteroidId", ({current}) => current.silverCap / current.silver > 90) + * .then(() => { + * // Send Silver to nearby planet + * }) + * + * @param locationId A locationId to watch for updates + * @param predicate a function that accepts a Diff and should return a truth-y value, value will be passed to promise.resolve() + * @returns a promise that will resolve with results returned from the predicate function + */ + public waitForPlanet( + locationId: LocationId, + predicate: ({ current, previous }: Diff) => T | undefined + ): Promise { + const disposableEmitter = getDisposableEmitter( + this.getPlanetMap(), + locationId, + this.getPlanetUpdated$() + ); + const diffEmitter = generateDiffEmitter(disposableEmitter); + return new Promise((resolve, reject) => { + diffEmitter.subscribe(({ current, previous }: Diff) => { + try { + const predicateResults = predicate({ current, previous }); + if (!!predicateResults) { + disposableEmitter.clear(); + diffEmitter.clear(); + resolve(predicateResults); + } + } catch (err) { + disposableEmitter.clear(); + diffEmitter.clear(); + reject(err); + } + }); + }); + } } export default GameManager; diff --git a/src/Backend/GameLogic/GameObjects.ts b/src/Backend/GameLogic/GameObjects.ts index 9fe92dfa..4407c61b 100644 --- a/src/Backend/GameLogic/GameObjects.ts +++ b/src/Backend/GameLogic/GameObjects.ts @@ -1,3 +1,4 @@ +import { ethers } from 'ethers'; import { EthAddress, LocationId, @@ -54,9 +55,9 @@ import { isUnconfirmedWithdrawSilver, } from '../Utils/TypeAssertions'; import { hasOwner } from '../Utils/Utils'; -import { updatePlanetToTime, arrive } from './ArrivalUtils'; +import { updatePlanetToTime, arrive, PlanetDiff } from './ArrivalUtils'; import { isActivated } from './ArtifactUtils'; -import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; +import { EMPTY_ADDRESS, MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; import { bonusFromHex, getBytesFromHex } from '@darkforest_eth/hexgen'; import { LayeredMap } from './LayeredMap'; import { Radii } from './ViewportEntities'; @@ -412,7 +413,7 @@ export class GameObjects { public getPlanetDetailLevel(planetId: LocationId): number | undefined { const planet = this.planets.get(planetId); if (planet) { - let detailLevel = planet.planetLevel; + let detailLevel = planet.planetLevel as number; if (hasOwner(planet)) { detailLevel += 1; } @@ -1118,6 +1119,32 @@ export class GameObjects { artifact ); } + /** + * Emit notifications based on a planet's state change + */ + private emitArrivalNotifications({ previous, current, arrival }: PlanetDiff) { + const notifManager = NotificationManager.getInstance(); + if ( + !GameObjects.planetCanUpgrade(previous) && + GameObjects.planetCanUpgrade(current) && + current.owner === this.address + ) { + notifManager.planetCanUpgrade(current); + } + if ( + previous.owner !== this.address && + previous.owner !== ethers.constants.AddressZero && + current.owner === this.address + ) { + notifManager.planetConquered(current as LocatablePlanet); + } + if (previous.owner === this.address && current.owner !== this.address) { + notifManager.planetLost(current as LocatablePlanet); + } + if (arrival.player !== this.address) { + notifManager.planetAttacked(current as LocatablePlanet); + } + } private processArrivalsForPlanet( planetId: LocationId, @@ -1138,27 +1165,26 @@ export class GameObjects { try { if (nowInSeconds - arrival.arrivalTime > 0) { // if arrival happened in the past, run this arrival - arrive( - planet, - this.getPlanetArtifacts(planet.locationId), - arrival, - this.contractConstants - ); - } else { - // otherwise, set a timer to do this arrival in the future - // and append it to arrivalsWithTimers - const applyFutureArrival = setTimeout(() => { + this.emitArrivalNotifications( arrive( planet, this.getPlanetArtifacts(planet.locationId), arrival, this.contractConstants + ) + ); + } else { + // otherwise, set a timer to do this arrival in the future + // and append it to arrivalsWithTimers + const applyFutureArrival = setTimeout(() => { + this.emitArrivalNotifications( + arrive( + planet, + this.getPlanetArtifacts(planet.locationId), + arrival, + this.contractConstants + ) ); - - const notifManager = NotificationManager.getInstance(); - if (GameObjects.planetCanUpgrade(planet) && planet.owner === this.address) { - notifManager.planetCanUpgrade(planet); - } }, arrival.arrivalTime * 1000 - Date.now()); const arrivalWithTimer = { @@ -1199,9 +1225,9 @@ export class GameObjects { const levelBigInt = getBytesFromHex(hex, 4, 7); - let ret = PlanetLevel.MIN; + let ret = MIN_PLANET_LEVEL; - for (let type = PlanetLevel.MAX; type >= PlanetLevel.MIN; type--) { + for (let type = MAX_PLANET_LEVEL; type >= MIN_PLANET_LEVEL; type--) { if (levelBigInt < bigInt(this.contractConstants.planetLevelThresholds[type])) { ret = type; break; @@ -1215,7 +1241,7 @@ export class GameObjects { ret = PlanetLevel.FIVE; } if (ret > this.contractConstants.MAX_NATURAL_PLANET_LEVEL) { - ret = this.contractConstants.MAX_NATURAL_PLANET_LEVEL; + ret = this.contractConstants.MAX_NATURAL_PLANET_LEVEL as PlanetLevel; } return ret; @@ -1266,7 +1292,7 @@ export class GameObjects { const typeByte = Number(getBytesFromHex(hex, 8, 9)); for (let i = 0; i < thresholds.length; i++) { if (typeByte >= thresholds[i]) { - return i; + return i as PlanetType; } } // this should never happen @@ -1284,7 +1310,7 @@ export class GameObjects { else if (biomebase < this.contractConstants.BIOME_THRESHOLD_2) biome += 2; else biome += 3; - return biome; + return biome as Biome; } /** diff --git a/src/Backend/GameLogic/GameUIManager.ts b/src/Backend/GameLogic/GameUIManager.ts index efb52f74..a1e805c6 100644 --- a/src/Backend/GameLogic/GameUIManager.ts +++ b/src/Backend/GameLogic/GameUIManager.ts @@ -57,13 +57,13 @@ import { import { GameObjects } from './GameObjects'; import { PerlinConfig } from '@darkforest_eth/hashing'; -export enum GameUIManagerEvent { +export const enum GameUIManagerEvent { InitializedPlayer = 'InitializedPlayer', InitializedPlayerError = 'InitializedPlayerError', } class GameUIManager extends EventEmitter { - private readonly radiusMap: Record; + private readonly radiusMap: { [PlanetLevel: number]: number }; private readonly gameManager: GameManager; private terminal: React.MutableRefObject; @@ -132,7 +132,7 @@ class GameUIManager extends EventEmitter { [PlanetLevel.SEVEN]: 729 * scaleFactor, [PlanetLevel.EIGHT]: 972 * scaleFactor, [PlanetLevel.NINE]: 1215 * scaleFactor, - }; + } as const; this.plugins = new PluginManager(gameManager); @@ -781,7 +781,7 @@ class GameUIManager extends EventEmitter { !this.getBooleanSetting(Setting.FoundArtifact) && this.getBooleanSetting(Setting.TutorialCompleted) ) { - notifManager.foundArtifact(planet); + notifManager.foundFoundry(planet); setBooleanSetting(account, Setting.FoundArtifact, true); } } diff --git a/src/Backend/GameLogic/LayeredMap.ts b/src/Backend/GameLogic/LayeredMap.ts index db9c06e3..aef347f3 100644 --- a/src/Backend/GameLogic/LayeredMap.ts +++ b/src/Backend/GameLogic/LayeredMap.ts @@ -1,6 +1,7 @@ -import { LocationId, PlanetLevel, WorldLocation } from '@darkforest_eth/types'; +import { LocationId, WorldLocation } from '@darkforest_eth/types'; import { QuadTree, Box, Point } from 'js-quadtree'; import { QuadTreeConfig } from 'js-quadtree/dist/types'; +import { MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; import { Radii } from './ViewportEntities'; /** @@ -28,7 +29,7 @@ export class LayeredMap { this.perLevelPlanetQuadtrees = new Map(); this.insertedLocations = new Set(); - for (let i = PlanetLevel.MIN; i <= PlanetLevel.MAX; i++) { + for (let i = MIN_PLANET_LEVEL; i <= MAX_PLANET_LEVEL; i++) { const config: QuadTreeConfig = { maximumDepth: i <= 3 ? 15 : 10, removeEmptyNodes: true, diff --git a/src/Backend/GameLogic/TutorialManager.ts b/src/Backend/GameLogic/TutorialManager.ts index bacc7d18..978f3d8b 100644 --- a/src/Backend/GameLogic/TutorialManager.ts +++ b/src/Backend/GameLogic/TutorialManager.ts @@ -4,11 +4,11 @@ import NotificationManager from '../../Frontend/Game/NotificationManager'; import { Setting, setBooleanSetting } from '../../Frontend/Utils/SettingsHooks'; import GameUIManager from './GameUIManager'; -export enum TutorialManagerEvent { +export const enum TutorialManagerEvent { StateChanged = 'StateChanged', } -export enum TutorialState { +export const enum TutorialState { None, HomePlanet, diff --git a/src/Backend/GameLogic/ViewportEntities.ts b/src/Backend/GameLogic/ViewportEntities.ts index 40c114f7..136dc67c 100644 --- a/src/Backend/GameLogic/ViewportEntities.ts +++ b/src/Backend/GameLogic/ViewportEntities.ts @@ -1,4 +1,5 @@ import { LocatablePlanet, LocationId, PlanetLevel, WorldCoords } from '@darkforest_eth/types'; +import { MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; import Viewport from '../../Frontend/Game/Viewport'; import { Chunk, isLocatable } from '../../_types/global/GlobalTypes'; import { planetLevelToAnimationSpeed, sinusoidalAnimation } from '../Utils/Animation'; @@ -185,7 +186,7 @@ export class ViewportEntities { private getPlanetRadii(viewport: Viewport): Map { const result = new Map(); - for (let i = PlanetLevel.MIN; i <= PlanetLevel.MAX; i++) { + for (let i = MIN_PLANET_LEVEL; i <= MAX_PLANET_LEVEL; i++) { const radiusWorld = this.uiManager.getRadiusOfPlanetLevel(i as PlanetLevel); const radiusPixels = viewport.worldToCanvasDist(radiusWorld); @@ -202,7 +203,7 @@ export class ViewportEntities { private getVisiblePlanetLevels(viewport: Viewport) { const result = []; - for (let i = 0; i <= PlanetLevel.MAX; i++) { + for (let i = 0; i <= MAX_PLANET_LEVEL; i++) { const radiusW = this.uiManager.getRadiusOfPlanetLevel(i as PlanetLevel); const radiusPx = viewport.worldToCanvasDist(radiusW); diff --git a/src/Backend/Miner/MinerManager.ts b/src/Backend/Miner/MinerManager.ts index 709df3b2..e7a0e33b 100644 --- a/src/Backend/Miner/MinerManager.ts +++ b/src/Backend/Miner/MinerManager.ts @@ -7,7 +7,7 @@ import { perlin, PerlinConfig } from '@darkforest_eth/hashing'; import { ChunkStore } from '../../_types/darkforest/api/ChunkStoreTypes'; import { getChunkKey } from './ChunkUtils'; -export enum MinerManagerEvent { +export const enum MinerManagerEvent { DiscoveredNewChunk = 'DiscoveredNewChunk', } diff --git a/src/Backend/Miner/MiningPatterns.ts b/src/Backend/Miner/MiningPatterns.ts index 2e30078e..1d1bddbc 100644 --- a/src/Backend/Miner/MiningPatterns.ts +++ b/src/Backend/Miner/MiningPatterns.ts @@ -1,7 +1,7 @@ import { Rectangle } from '../../_types/global/GlobalTypes'; import { WorldCoords } from '@darkforest_eth/types'; -export enum MiningPatternType { +export const enum MiningPatternType { Home, Target, Spiral, diff --git a/src/Backend/Network/TxExecutor.ts b/src/Backend/Network/TxExecutor.ts index 6e8c8e8b..957391b4 100644 --- a/src/Backend/Network/TxExecutor.ts +++ b/src/Backend/Network/TxExecutor.ts @@ -63,7 +63,7 @@ export class TxExecutor extends EventEmitter { * Schedules this transaction to execute once all of the transactions * ahead of it have completed. */ - public makeRequest( + public makeRequest( type: EthTxType, actionId: string, contract: Contract, diff --git a/src/Backend/Network/UtilityServerAPI.ts b/src/Backend/Network/UtilityServerAPI.ts index 7ace995a..72e7b98f 100644 --- a/src/Backend/Network/UtilityServerAPI.ts +++ b/src/Backend/Network/UtilityServerAPI.ts @@ -4,7 +4,7 @@ import { EthAddress } from '@darkforest_eth/types'; export const WEBSERVER_URL = process.env.WEBSERVER_URL as string; -export enum EmailResponse { +export const enum EmailResponse { Success, Invalid, ServerError, diff --git a/src/Backend/Procedural/ProcgenUtils.ts b/src/Backend/Procedural/ProcgenUtils.ts index 4e19d3d9..8fe255a3 100644 --- a/src/Backend/Procedural/ProcgenUtils.ts +++ b/src/Backend/Procedural/ProcgenUtils.ts @@ -16,7 +16,6 @@ import { EthAddress, LocationId, Biome, - PlanetLevel, UpgradeBranchName, ArtifactId, } from '@darkforest_eth/types'; @@ -25,7 +24,7 @@ import { HSLVec, RGBAVec, RGBVec } from '../../Frontend/Renderers/GameRenderer/E import { HatType, hatTypeFromHash } from '../../Frontend/Utils/Hats'; import tracery from './tracery'; import { baseEngModifiers } from './tracery-modifiers'; -import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; +import { EMPTY_ADDRESS, MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; import { HAT_SIZES } from '../../Frontend/Utils/constants'; export type PixelCoords = { @@ -42,32 +41,32 @@ export class ProcgenUtils { private static blurbsById = new Map(); private static blurbs2ById = new Map(); private static cosmeticByLocId = new Map(); - private static baseByBiome: Record = [ - [0, 0, 0], // UNKNOWN - [213, 100, 50], // OCEAN - [135, 96, 63], // FOREST - [82, 80, 76], // GRASSLAND - [339, 95, 70], // TUNDRA - [44, 81, 33], // SWAMP - [51, 78, 60], // DESERT - [198, 78, 77], // ICE - [0, 0, 18], // WASTELAND - [19, 100, 50], // LAVA - [280, 100, 54], // CORRUPTED - ]; - private static oceanByBiome: Record = [ - [0, 0, 0], // UNKNOWN - [213, 89, 35], // OCEAN - [193, 96, 43], // FOREST - [185, 78, 70], // GRASSLAND - [201, 95, 70], // TUNDRA - [285, 81, 33], // SWAMP - [27, 78, 60], // DESERT - [198, 90, 85], // ICE - [0, 98, 42], // WASTELAND - [12, 92, 39], // LAVA - [308, 90, 63], // CORRUPTED - ]; + private static baseByBiome: { readonly [Biome: number]: HSLVec } = { + [Biome.UNKNOWN]: [0, 0, 0], + [Biome.OCEAN]: [213, 100, 50], + [Biome.FOREST]: [135, 96, 63], + [Biome.GRASSLAND]: [82, 80, 76], + [Biome.TUNDRA]: [339, 95, 70], + [Biome.SWAMP]: [44, 81, 33], + [Biome.DESERT]: [51, 78, 60], + [Biome.ICE]: [198, 78, 77], + [Biome.WASTELAND]: [0, 0, 18], + [Biome.LAVA]: [19, 100, 50], + [Biome.CORRUPTED]: [280, 100, 54], + } as const; + private static oceanByBiome: { readonly [Biome: number]: HSLVec } = { + [Biome.UNKNOWN]: [0, 0, 0], + [Biome.OCEAN]: [213, 89, 35], + [Biome.FOREST]: [193, 96, 43], + [Biome.GRASSLAND]: [185, 78, 70], + [Biome.TUNDRA]: [201, 95, 70], + [Biome.SWAMP]: [285, 81, 33], + [Biome.DESERT]: [27, 78, 60], + [Biome.ICE]: [198, 90, 85], + [Biome.WASTELAND]: [0, 98, 42], + [Biome.LAVA]: [12, 92, 39], + [Biome.CORRUPTED]: [308, 90, 63], + } as const; private static strByBiome = new Map(); public static getBiomeRgbStr(biome: Biome): string { @@ -219,7 +218,7 @@ export class ProcgenUtils { } } - return maxIdx; + return maxIdx as UpgradeBranchName; } // returns a deterministic seeded perlin (-1, 1) for a given planet loc @@ -282,7 +281,7 @@ export class ProcgenUtils { const rand = this.planetRandom(loc); const randInt = this.planetRandomInt(loc); - for (let i = PlanetLevel.MIN; i <= PlanetLevel.MAX; i++) { + for (let i = MIN_PLANET_LEVEL; i <= MAX_PLANET_LEVEL; i++) { const blooms = (randInt() % 4) + 1; const reflect = randInt() % 2; const vel = -1 + rand() * 2; diff --git a/src/Backend/Storage/PersistentChunkStore.ts b/src/Backend/Storage/PersistentChunkStore.ts index 07e0be8e..4f51b89c 100644 --- a/src/Backend/Storage/PersistentChunkStore.ts +++ b/src/Backend/Storage/PersistentChunkStore.ts @@ -22,14 +22,14 @@ import { } from '@darkforest_eth/types'; import { DiagnosticUpdater } from '../Interfaces/DiagnosticUpdater'; -enum ObjectStore { +const enum ObjectStore { DEFAULT = 'default', BOARD = 'knownBoard', UNCONFIRMED_ETH_TXS = 'unminedEthTxs', PLUGINS = 'plugins', } -enum DBActionType { +const enum DBActionType { UPDATE, DELETE, } diff --git a/src/Backend/Storage/ReaderDataStore.ts b/src/Backend/Storage/ReaderDataStore.ts index faa70cf8..c2d63b4d 100644 --- a/src/Backend/Storage/ReaderDataStore.ts +++ b/src/Backend/Storage/ReaderDataStore.ts @@ -18,7 +18,7 @@ import EthConnection from '../Network/EthConnection'; import { getAllTwitters } from '../Network/UtilityServerAPI'; import PersistentChunkStore from './PersistentChunkStore'; -export enum SinglePlanetDataStoreEvent { +export const enum SinglePlanetDataStoreEvent { REFRESHED_PLANET = 'REFRESHED_PLANET', REFRESHED_ARTIFACT = 'REFRESHED_ARTIFACT', } @@ -173,7 +173,7 @@ class ReaderDataStore { else if (biomebase < this.contractConstants.BIOME_THRESHOLD_2) biome += 2; else biome += 3; - return biome; + return biome as Biome; } } diff --git a/src/Backend/Utils/UtilsTypes.ts b/src/Backend/Utils/UtilsTypes.ts index 39520c36..f618b4ed 100644 --- a/src/Backend/Utils/UtilsTypes.ts +++ b/src/Backend/Utils/UtilsTypes.ts @@ -1,14 +1,12 @@ -import { PlanetLevel } from '@darkforest_eth/types'; import { RGBVec, HSLVec } from '../../Frontend/Renderers/GameRenderer/EngineTypes'; import { HatType } from '../../Frontend/Utils/Hats'; -export type RuinsInfo = Record< - PlanetLevel, - { +export type RuinsInfo = { + [PlanetLevel: number]: { weights: [number, number, number, number]; props: [number, number, number, number]; - } ->; + }; +}; export interface PlanetCosmeticInfo { baseHue: number; diff --git a/src/Frontend/Components/Email.tsx b/src/Frontend/Components/Email.tsx index 47399c7f..46ae12d2 100644 --- a/src/Frontend/Components/Email.tsx +++ b/src/Frontend/Components/Email.tsx @@ -8,7 +8,7 @@ import { } from '../../Backend/Network/UtilityServerAPI'; import { Green, Red, Sub } from './Text'; -export enum EmailCTAMode { +export const enum EmailCTAMode { SUBSCRIBE, UNSUBSCRIBE, } diff --git a/src/Frontend/Components/Icons.tsx b/src/Frontend/Components/Icons.tsx index 78fd592f..a3fab742 100644 --- a/src/Frontend/Components/Icons.tsx +++ b/src/Frontend/Components/Icons.tsx @@ -19,6 +19,15 @@ const SVGWrapper = styled.span` fill: ${dfstyles.colors.text}; } } + & img { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: 100%; + height: 100%; + } `; const DefaultSVG = ({ @@ -710,3 +719,130 @@ export const StatIcon = ({ stat }: { stat: StatIdx }) => { else if (stat === StatIdx.Speed) return ; else return ; }; + +/** + Allow for tweaking the size of an icon based on the context. + Biome & Spacetype Notifications should fill the notification box + Others should be 3/4's the size and centered +*/ +interface AlertIcon { + height?: string; + width?: string; +} + +export const Quasar = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundRuins = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundSpacetimeRip = ({ height, width }: AlertIcon) => { + return ( + + ); +}; + +export const FoundSilver = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundTradingPost = ({ height, width }: AlertIcon) => { + return ( + + ); +}; + +export const FoundSpace = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundDeepSpace = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundDeadSpace = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundPirates = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundComet = ({ height, width }: AlertIcon) => { + return ; +}; + +export const ArtifactFound = ({ height, width }: AlertIcon) => { + return ; +}; +export const ArtifactProspected = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundOcean = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundForest = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundGrassland = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundTundra = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundSwamp = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundDesert = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundIce = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundWasteland = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundLava = ({ height, width }: AlertIcon) => { + return ; +}; + +export const FoundCorrupted = ({ height, width }: AlertIcon) => { + return ; +}; +export const PlanetAttacked = ({ height, width }: AlertIcon) => { + return ; +}; +export const PlanetLost = ({ height, width }: AlertIcon) => { + return ; +}; +export const PlanetConquered = ({ height, width }: AlertIcon) => { + return ; +}; +export const MetPlayer = ({ height, width }: AlertIcon) => { + return ; +}; +export const TxAccepted = ({ height, width }: AlertIcon) => { + return ; +}; +export const TxConfirmed = ({ height, width }: AlertIcon) => { + return ; +}; +export const TxInitialized = ({ height, width }: AlertIcon) => { + return ( + + ); +}; +export const TxDeclined = ({ height, width }: AlertIcon) => { + return ; +}; diff --git a/src/Frontend/Game/NotificationManager.tsx b/src/Frontend/Game/NotificationManager.tsx index 244b1de1..93bc8553 100644 --- a/src/Frontend/Game/NotificationManager.tsx +++ b/src/Frontend/Game/NotificationManager.tsx @@ -1,14 +1,62 @@ +import { + Artifact, + Biome, + EthTxStatus, + LocatablePlanet, + Planet, + SubmittedTx, + TxIntent, +} from '@darkforest_eth/types'; import EventEmitter from 'events'; import React from 'react'; -import { TxIntent, EthTxStatus, SubmittedTx, Planet, LocatablePlanet } from '@darkforest_eth/types'; import { biomeName } from '../../Backend/GameLogic/ArtifactUtils'; import { getRandomActionId } from '../../Backend/Utils/Utils'; import { Chunk, isLocatable } from '../../_types/global/GlobalTypes'; -import { EthIcon } from '../Components/Icons'; -import { CenterChunkLink, FAQ04Link, PlanetNameLink, TxLink } from '../Components/Text'; +import { + FoundSpace, + FoundDeepSpace, + FoundSwamp, + Quasar, + FoundDeadSpace, + FoundPirates, + FoundSilver, + FoundTradingPost, + FoundComet, + FoundRuins, + FoundForest, + FoundGrassland, + FoundTundra, + FoundDesert, + FoundWasteland, + FoundLava, + FoundIce, + FoundOcean, + FoundCorrupted, + PlanetAttacked, + PlanetLost, + PlanetConquered, + ArtifactFound, + ArtifactProspected, + TxInitialized, + TxAccepted, + TxConfirmed, + TxDeclined, +} from '../Components/Icons'; +import { + ArtifactTypeText, + ArtifactRarityLabelAnim, + ArtifactBiomeText, +} from '../Components/Labels/ArtifactLabels'; +import { + CenterChunkLink, + FAQ04Link, + PlanetNameLink, + TxLink, + ArtifactNameLink, +} from '../Components/Text'; import dfstyles from '../Styles/dfstyles'; -export enum NotificationType { +export const enum NotificationType { Tx, CanUpgrade, BalanceEmpty, @@ -21,12 +69,44 @@ export enum NotificationType { FoundSilverBank, FoundTradingPost, FoundComet, - FoundArtifact, + FoundFoundry, FoundBiome, + FoundBiomeOcean, + FoundBiomeForest, + FoundBiomeGrassland, + FoundBiomeTundra, + FoundBiomeSwamp, + FoundBiomeDesert, + FoundBiomeIce, + FoundBiomeWasteland, + FoundBiomeLava, + FoundBiomeCorrupted, + PlanetLost, + PlanetWon, + PlanetAttacked, + ArtifactProspected, + ArtifactFound, ReceivedPlanet, Generic, } +const BiomeNotificationMap = { + [Biome.OCEAN]: NotificationType.FoundBiomeOcean, + [Biome.FOREST]: NotificationType.FoundBiomeForest, + [Biome.GRASSLAND]: NotificationType.FoundBiomeGrassland, + [Biome.TUNDRA]: NotificationType.FoundBiomeTundra, + [Biome.SWAMP]: NotificationType.FoundBiomeSwamp, + [Biome.DESERT]: NotificationType.FoundBiomeDesert, + [Biome.ICE]: NotificationType.FoundBiomeIce, + [Biome.WASTELAND]: NotificationType.FoundBiomeWasteland, + [Biome.LAVA]: NotificationType.FoundBiomeLava, + [Biome.CORRUPTED]: NotificationType.FoundBiomeCorrupted, +}; +function getNotificationTypeFromPlanetBiome(biome: Biome): NotificationType { + if (!biome) throw new Error('Biome is a required to get a NotificationType'); + return BiomeNotificationMap[biome]; +} + export type NotificationInfo = { type: NotificationType; message: React.ReactNode; @@ -37,7 +117,7 @@ export type NotificationInfo = { txStatus?: EthTxStatus; }; -export enum NotificationManagerEvent { +export const enum NotificationManagerEvent { Notify = 'Notify', } @@ -66,9 +146,93 @@ class NotificationManager extends EventEmitter { return NotificationManager.instance; } - private getIcon(type: NotificationType) { - if (type === NotificationType.Tx) return ; - else return !; + private getIcon(type: NotificationType, txStatus?: EthTxStatus) { + switch (type) { + case NotificationType.Tx: + if (txStatus === EthTxStatus.Init) return ; + else if (txStatus === EthTxStatus.Submit) + return ; + else if (txStatus === EthTxStatus.Confirm) + return ; + else if (txStatus === EthTxStatus.Fail) + return ; + + break; + case NotificationType.FoundSilverBank: + return ; + break; + case NotificationType.FoundSpace: + return ; + break; + case NotificationType.FoundDeepSpace: + return ; + break; + case NotificationType.FoundDeadSpace: + return ; + break; + case NotificationType.FoundPirates: + return ; + break; + case NotificationType.FoundSilver: + return ; + break; + case NotificationType.FoundTradingPost: + return ; + break; + case NotificationType.FoundComet: + return ; + break; + case NotificationType.FoundFoundry: + return ; + break; + case NotificationType.FoundBiomeOcean: + return ; + break; + case NotificationType.FoundBiomeForest: + return ; + break; + case NotificationType.FoundBiomeGrassland: + return ; + break; + case NotificationType.FoundBiomeTundra: + return ; + break; + case NotificationType.FoundBiomeSwamp: + return ; + break; + case NotificationType.FoundBiomeDesert: + return ; + break; + case NotificationType.FoundBiomeIce: + return ; + break; + case NotificationType.FoundBiomeWasteland: + return ; + break; + case NotificationType.FoundBiomeLava: + return ; + break; + case NotificationType.FoundBiomeCorrupted: + return ; + break; + case NotificationType.PlanetAttacked: + return ; + break; + case NotificationType.PlanetLost: + return ; + break; + case NotificationType.PlanetWon: + return ; + break; + case NotificationType.ArtifactProspected: + return ; + break; + case NotificationType.ArtifactFound: + return ; + default: + return !; + break; + } } notify(type: NotificationType, message: React.ReactNode): void { @@ -86,8 +250,7 @@ class NotificationManager extends EventEmitter { type: NotificationType.Tx, message, id: txData.actionId, - icon: this.getIcon(NotificationType.Tx), - color: getNotifColor(NotificationType.Tx, txStatus), + icon: this.getIcon(NotificationType.Tx, txStatus), txData, txStatus, }); @@ -248,7 +411,7 @@ class NotificationManager extends EventEmitter { foundBiome(planet: LocatablePlanet): void { this.notify( - NotificationType.FoundBiome, + getNotificationTypeFromPlanetBiome(planet.biome), You have discovered the {biomeName(planet.biome)} biome!
Click to view @@ -256,9 +419,9 @@ class NotificationManager extends EventEmitter { ); } - foundArtifact(planet: LocatablePlanet): void { + foundFoundry(planet: LocatablePlanet): void { this.notify( - NotificationType.FoundArtifact, + NotificationType.FoundFoundry, You have found a planet that can produce an artifact! Finding artifacts increases your score. Also, artifacts can be used to power up your planets and moves!
@@ -266,6 +429,52 @@ class NotificationManager extends EventEmitter {
); } + artifactProspected(planet: LocatablePlanet): void { + this.notify( + NotificationType.ArtifactProspected, + + You prospected a Foundry!
+ What artifacts are waiting to be found on? Click to view +
+ ); + } + + artifactFound(planet: LocatablePlanet, artifact: Artifact): void { + this.notify( + NotificationType.ArtifactFound, + + You have found , a{' '} + {' '} + + {'!'.repeat(artifact.rarity)}
+ Click to view +
+ ); + } + planetConquered(planet: LocatablePlanet): void { + this.notify( + NotificationType.PlanetWon, + + You conquered , you're unstoppable! + + ); + } + planetLost(planet: LocatablePlanet): void { + this.notify( + NotificationType.PlanetLost, + + You lost , oh no! + + ); + } + planetAttacked(planet: LocatablePlanet): void { + this.notify( + NotificationType.PlanetAttacked, + + Your Planet has been attacked! + + ); + } planetCanUpgrade(planet: Planet): void { this.notify( diff --git a/src/Frontend/Game/WindowManager.ts b/src/Frontend/Game/WindowManager.ts index fca03a15..f2f827b0 100644 --- a/src/Frontend/Game/WindowManager.ts +++ b/src/Frontend/Game/WindowManager.ts @@ -8,7 +8,7 @@ export type MousePos = { y: number; }; -export enum WindowManagerEvent { +export const enum WindowManagerEvent { StateChanged = 'StateChanged', MiningCoordsUpdate = 'MiningCoordsUpdate', TooltipUpdated = 'TooltipUpdated', @@ -16,13 +16,13 @@ export enum WindowManagerEvent { CtrlUp = 'CtrlUp', } -export enum CursorState { +export const enum CursorState { Normal, TargetingExplorer, TargetingForces, } -export enum TooltipName { +export const enum TooltipName { None, SilverGrowth, SilverCap, diff --git a/src/Frontend/Pages/GameLandingPage.tsx b/src/Frontend/Pages/GameLandingPage.tsx index efc871f3..7c7f91ca 100644 --- a/src/Frontend/Pages/GameLandingPage.tsx +++ b/src/Frontend/Pages/GameLandingPage.tsx @@ -29,7 +29,7 @@ import { GameWindowLayout } from '../Views/GameWindowLayout'; import { Terminal, TerminalHandle } from '../Views/Terminal'; import { address } from '@darkforest_eth/serde'; -enum TerminalPromptStep { +const enum TerminalPromptStep { NONE, COMPATIBILITY_CHECKS_PASSED, DISPLAY_ACCOUNTS, @@ -51,7 +51,7 @@ enum TerminalPromptStep { ERROR, } -export enum InitRenderState { +export const enum InitRenderState { NONE, LOADING, COMPLETE, diff --git a/src/Frontend/Pages/PreviewPage.tsx b/src/Frontend/Pages/PreviewPage.tsx index eb547454..b63cbab7 100644 --- a/src/Frontend/Pages/PreviewPage.tsx +++ b/src/Frontend/Pages/PreviewPage.tsx @@ -1,7 +1,6 @@ import React, { useState, useEffect } from 'react'; import styled from 'styled-components'; import { Biome, LocatablePlanet, PlanetLevel, PlanetType, SpaceType } from '@darkforest_eth/types'; -import _ from 'lodash'; import { PlanetPreviewImage } from '../Components/PlanetPreview'; const StyledPreview = styled.div` @@ -71,7 +70,7 @@ export function PreviewPage() { return (
- {_.range(PlanetLevel.MIN, PlanetLevel.MAX + 1).map((level) => ( + {Object.values(PlanetLevel).map((level) => ( ))}
diff --git a/src/Frontend/Pages/TestArtifactImages.tsx b/src/Frontend/Pages/TestArtifactImages.tsx index 6f881d4b..0e282cc1 100644 --- a/src/Frontend/Pages/TestArtifactImages.tsx +++ b/src/Frontend/Pages/TestArtifactImages.tsx @@ -1,6 +1,5 @@ import { EMPTY_LOCATION_ID } from '@darkforest_eth/constants'; import { ArtifactType, Biome, ArtifactRarity } from '@darkforest_eth/types'; -import _ from 'lodash'; import React from 'react'; import { useEffect } from 'react'; import styled from 'styled-components'; @@ -23,6 +22,19 @@ const Row = styled.div` width: fit-content; `; +const basicArtifacts = Object.values(ArtifactType).filter( + (type) => type >= ArtifactType.Monolith && type <= ArtifactType.Pyramid +); +const relicArtifacts = Object.values(ArtifactType).filter( + (type) => type >= ArtifactType.Wormhole && type <= ArtifactType.BlackDomain +); + +const knownTypes = Object.values(ArtifactType).filter((type) => type !== ArtifactType.Unknown); +const knownBiomes = Object.values(Biome).filter((biome) => biome !== Biome.UNKNOWN); +const knownRarities = Object.values(ArtifactRarity).filter( + (rarity) => rarity !== ArtifactRarity.Unknown +); + function ArtifactPreviewer({ type, biome, @@ -68,11 +80,11 @@ export function TestArtifactImages() { return (

Artifacts

- {_.range(ArtifactType.Monolith, ArtifactType.Pyramid + 1).map((type) => ( + {basicArtifacts.map((type) => (
- {_.range(ArtifactRarity.Common, ArtifactRarity.Mythic + 1).map((rarity) => ( + {knownRarities.map((rarity) => ( - {_.range(Biome.MIN, Biome.MAX + 1).map((biome, i) => ( + {knownBiomes.map((biome, i) => ( ))}

Relics

- {_.range(ArtifactType.Wormhole, ArtifactType.BlackDomain + 1).map((type) => ( + {relicArtifacts.map((type) => ( - {_.range(ArtifactRarity.Common, ArtifactRarity.Mythic + 1).map((rarity, i) => ( - + {knownRarities.map((rarity, i) => ( + ))} ))}

Ancient

- {_.range(ArtifactType.MIN, ArtifactType.MAX + 1).map((type) => ( + {knownTypes.map((type) => ( - {_.range(ArtifactRarity.Common, ArtifactRarity.Mythic + 1).map((rarity, i) => ( + {knownRarities.map((rarity, i) => ( About - +
*/} diff --git a/src/Frontend/Panes/OnboardingPane.tsx b/src/Frontend/Panes/OnboardingPane.tsx index beaf9738..1502699f 100644 --- a/src/Frontend/Panes/OnboardingPane.tsx +++ b/src/Frontend/Panes/OnboardingPane.tsx @@ -44,7 +44,7 @@ const StyledOnboardingContent = styled.div` } `; -enum OnboardState { +const enum OnboardState { Money, Storage, Keys, diff --git a/src/Frontend/Renderers/Artifacts/ArtifactRenderer.ts b/src/Frontend/Renderers/Artifacts/ArtifactRenderer.ts index 77f0cb87..0252eb07 100644 --- a/src/Frontend/Renderers/Artifacts/ArtifactRenderer.ts +++ b/src/Frontend/Renderers/Artifacts/ArtifactRenderer.ts @@ -1,10 +1,11 @@ import { Artifact, Biome, ArtifactRarity, ArtifactType } from '@darkforest_eth/types'; import autoBind from 'auto-bind'; +import { MAX_BIOME, MIN_BIOME } from '@darkforest_eth/constants'; import { ARTIFACT_ROW_H } from '../../Styles/dfstyles'; import { SpriteRenderer } from '../GameRenderer/Entities/SpriteRenderer'; import { WebGLManager } from '../GameRenderer/WebGL/WebGLManager'; -const NUM_BIOMES = Biome.MAX; +const NUM_BIOMES = MAX_BIOME; const thumbDim = 32; const cellDim = ARTIFACT_ROW_H; @@ -59,8 +60,8 @@ export class ArtifactRenderer extends WebGLManager { private queueRarityColumn(rarity: ArtifactRarity, startX: number) { let col = 0; - for (let type: ArtifactType = 1; type <= 4; type++) { - this.queueArtifactColumn(type, rarity, startX + col * cellDim); + for (let type = 1; type <= 4; type++) { + this.queueArtifactColumn(type as ArtifactType, rarity, startX + col * cellDim); col++; } } @@ -81,7 +82,7 @@ export class ArtifactRenderer extends WebGLManager { private queueArtifactColumn(type: ArtifactType, rarity: ArtifactRarity, startX: number) { let row = 0; - for (let biome: Biome = Biome.MIN; biome <= Biome.MAX; biome++) { + for (let biome = MIN_BIOME; biome <= MAX_BIOME; biome++) { const pos = { x: startX, y: mTop + row * ARTIFACT_ROW_H }; const artifact = { planetBiome: biome, diff --git a/src/Frontend/Renderers/GameRenderer/EngineTypes.ts b/src/Frontend/Renderers/GameRenderer/EngineTypes.ts index 108b4d19..ea89a60d 100644 --- a/src/Frontend/Renderers/GameRenderer/EngineTypes.ts +++ b/src/Frontend/Renderers/GameRenderer/EngineTypes.ts @@ -1,10 +1,12 @@ import { mat4, mat3 } from 'gl-matrix'; +//eslint-disable-next-line @projectsophon/typescript-enum/no-enum export enum AttribType { Float = window.WebGL2RenderingContext && WebGL2RenderingContext['FLOAT'], UByte = window.WebGL2RenderingContext && WebGL2RenderingContext['UNSIGNED_BYTE'], } +//eslint-disable-next-line @projectsophon/typescript-enum/no-enum export enum DrawMode { Triangles = window.WebGL2RenderingContext && WebGL2RenderingContext['TRIANGLES'], Lines = window.WebGL2RenderingContext && WebGL2RenderingContext['LINES'], @@ -18,7 +20,7 @@ export type AttribProps = { name: string; }; -export enum UniformType { +export const enum UniformType { Mat4, Mat3, UByte, @@ -49,21 +51,21 @@ export type Scaling = { x: number; y: number; }; -export type HSLVec = [number, number, number]; +export type HSLVec = readonly [number, number, number]; -export enum TextAlign { +export const enum TextAlign { Left = 0, Center = 0.5, Right = 1, } -export enum TextAnchor { +export const enum TextAnchor { Top = 0, Middle = 0.5, Bottom = 1, } -export enum RenderZIndex { +export const enum RenderZIndex { Background = 0, Voyages = -1, Planets = -10, diff --git a/src/Frontend/Renderers/GameRenderer/Entities/MineRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/MineRenderer.ts index e64c2d65..a1f254f5 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/MineRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/MineRenderer.ts @@ -1,4 +1,5 @@ -import { Planet, PlanetLevel, WorldCoords } from '@darkforest_eth/types'; +import { Planet, WorldCoords } from '@darkforest_eth/types'; +import { MAX_PLANET_LEVEL } from '@darkforest_eth/constants'; import Viewport from '../../../Game/Viewport'; import { engineConsts } from '../EngineConsts'; import EngineUtils from '../EngineUtils'; @@ -34,7 +35,7 @@ export class MineRenderer { this.beltRenderer.queueBeltAtIdx(planet, centerW, radiusW, white, 0, -now * 0.3, true); if (level >= 7) this.beltRenderer.queueBeltAtIdx(planet, centerW, radiusW, white, 0, now * 0.3, true); - if (level === PlanetLevel.MAX) { + if (level === MAX_PLANET_LEVEL) { this.beltRenderer.queueBeltAtIdx(planet, centerW, radiusW, silver, 2, 0, true); } } diff --git a/src/Frontend/Renderers/GameRenderer/Entities/PerlinUtils.ts b/src/Frontend/Renderers/GameRenderer/Entities/PerlinUtils.ts index 0c5583bc..a7a3a8db 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/PerlinUtils.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/PerlinUtils.ts @@ -10,7 +10,7 @@ export type PerlinRand = ReturnType; export type GridPoint = WorldCoords & { __value: never }; -export enum PerlinOctave { +export const enum PerlinOctave { _0 = 0, _1 = 1, _2 = 2, diff --git a/src/Frontend/Renderers/GameRenderer/TextureManager.ts b/src/Frontend/Renderers/GameRenderer/TextureManager.ts index 533bb37b..dad3c2cc 100644 --- a/src/Frontend/Renderers/GameRenderer/TextureManager.ts +++ b/src/Frontend/Renderers/GameRenderer/TextureManager.ts @@ -5,6 +5,7 @@ import { isRelic, RenderedArtifact, } from '../../../Backend/GameLogic/ArtifactUtils'; +import { MIN_ARTIFACT_TYPE, MAX_ARTIFACT_TYPE, MAX_BIOME } from '@darkforest_eth/constants'; export const ARTIFACTS_URL = 'public/sprites/artifacts.png'; export const ARTIFACTS_THUMBS_URL = 'public/sprites/artifactthumbs.png'; @@ -69,9 +70,9 @@ export const EMPTY_SPRITE: SpriteRectangle = { x1: -1, y1: -1, x2: -1, y2: -1 }; export const EMPTY_SET: SpriteSet = { shiny: EMPTY_SPRITE, normal: EMPTY_SPRITE }; // we're gonna create one of these per artifact -type BiomeToSprite = Record; +type BiomeToSprite = { [Biome: number]: SpriteSet }; -type BiomeSpriteLocations = Record; +type BiomeSpriteLocations = { [ArtifactType: number]: BiomeToSprite }; function spriteRectangleFromIndex(xIdx: number, yIdx: number): SpriteRectangle { const x1 = xIdx * SPRITE_INTERVAL_X; @@ -88,20 +89,20 @@ function spriteRectangleFromIndex(xIdx: number, yIdx: number): SpriteRectangle { const biomeSpriteInfo = (): BiomeSpriteLocations => { const result: Partial = {}; - for (let type: ArtifactType = ArtifactType.MIN; type <= ArtifactType.MAX; type++) { + for (let type = MIN_ARTIFACT_TYPE; type <= MAX_ARTIFACT_TYPE; type++) { const biomeInfo: Partial = {}; if (isBasic(type)) { let yIdx = (type - 1) * 2; let xIdx = 0; - for (let biome: Biome = Biome.UNKNOWN; biome <= Biome.MAX; biome++) { - if (type === ArtifactType.Unknown || biome === Biome.UNKNOWN) { + for (let biome: Biome = Biome.UNKNOWN; biome <= MAX_BIOME; biome++) { + if (biome === Biome.UNKNOWN) { biomeInfo[biome] = EMPTY_SET; continue; } - biomeInfo[biome as Biome] = { + biomeInfo[biome] = { shiny: spriteRectangleFromIndex(xIdx, yIdx), normal: spriteRectangleFromIndex(xIdx + 1, yIdx), }; @@ -118,7 +119,7 @@ const biomeSpriteInfo = (): BiomeSpriteLocations => { const relicNo = type - ArtifactType.Wormhole; const xIdx = relicNo * 2; - for (let biome: Biome = Biome.UNKNOWN; biome <= Biome.MAX; biome++) { + for (let biome: Biome = Biome.UNKNOWN; biome <= MAX_BIOME; biome++) { biomeInfo[biome] = { shiny: spriteRectangleFromIndex(xIdx, yIdx), normal: spriteRectangleFromIndex(xIdx + 1, yIdx), @@ -134,14 +135,14 @@ const biomeSpriteInfo = (): BiomeSpriteLocations => { const biomeSpriteLocs = biomeSpriteInfo(); /* generate ancient sprite info */ -type AncientSpriteLocations = Record; +type AncientSpriteLocations = { [ArtifactType: number]: SpriteSet }; function ancientSpriteInfo(): AncientSpriteLocations { const result: Partial = {}; const normalY = 9; const shinyY = 10; - for (let type = ArtifactType.MIN; type <= ArtifactType.MAX; type++) { + for (let type = MIN_ARTIFACT_TYPE; type <= MAX_ARTIFACT_TYPE; type++) { const xIdx = type - 1; result[type] = { normal: spriteRectangleFromIndex(xIdx, normalY), diff --git a/src/Frontend/Renderers/GifRenderer.ts b/src/Frontend/Renderers/GifRenderer.ts index 83f434c9..1215ef09 100644 --- a/src/Frontend/Renderers/GifRenderer.ts +++ b/src/Frontend/Renderers/GifRenderer.ts @@ -9,7 +9,15 @@ import { artifactFileName, setForceAncient, } from '../../Backend/GameLogic/ArtifactUtils'; -import { EMPTY_LOCATION_ID } from '@darkforest_eth/constants'; +import { + EMPTY_LOCATION_ID, + MIN_ARTIFACT_TYPE, + MAX_ARTIFACT_TYPE, + MIN_ARTIFACT_RARITY, + MAX_ARTIFACT_RARITY, + MIN_BIOME, + MAX_BIOME, +} from '@darkforest_eth/constants'; import { GIF_ARTIFACT_COLOR } from '../Pages/GifMaker'; const FileSaver = require('file-saver'); @@ -139,9 +147,9 @@ export class GifRenderer extends WebGLManager { private async addBiomes(videoMode: boolean, dir: JSZip) { setForceAncient(false); - for (let type = ArtifactType.MIN; type <= ArtifactType.MAX; type++) { - for (let rarity = ArtifactRarity.MIN; rarity <= ArtifactRarity.MAX; rarity++) { - for (let biome = Biome.MIN; biome <= Biome.MAX; biome++) { + for (let type = MIN_ARTIFACT_TYPE; type <= MAX_ARTIFACT_TYPE; type++) { + for (let rarity = MIN_ARTIFACT_RARITY; rarity <= MAX_ARTIFACT_RARITY; rarity++) { + for (let biome = MIN_BIOME; biome <= MAX_BIOME; biome++) { if (videoMode) await this.addVideo(dir, type, biome, rarity, false); else this.addSprite(dir, type, biome, rarity, false); } @@ -151,10 +159,10 @@ export class GifRenderer extends WebGLManager { private async addAncient(videoMode: boolean, dir: JSZip) { setForceAncient(true); - for (let type = ArtifactType.MIN; type <= ArtifactType.MAX; type++) { - for (let rarity = ArtifactRarity.MIN; rarity <= ArtifactRarity.MAX; rarity++) { - if (videoMode) await this.addVideo(dir, type, 1, rarity, true); - else this.addSprite(dir, type, 1, rarity, true); + for (let type = MIN_ARTIFACT_TYPE; type <= MAX_ARTIFACT_TYPE; type++) { + for (let rarity = MIN_ARTIFACT_RARITY; rarity <= MAX_ARTIFACT_RARITY; rarity++) { + if (videoMode) await this.addVideo(dir, type, Biome.OCEAN, rarity, true); + else this.addSprite(dir, type, Biome.OCEAN, rarity, true); } } } diff --git a/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx b/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx index b9457254..d5ea1905 100644 --- a/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx +++ b/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx @@ -2,7 +2,7 @@ import React from 'react'; import styled from 'styled-components'; import { isLocatable, StatIdx } from '../../../_types/global/GlobalTypes'; import dfstyles from '../../Styles/dfstyles'; -import { PlanetLevel, PlanetType, Planet } from '@darkforest_eth/types'; +import { PlanetType, Planet } from '@darkforest_eth/types'; import { ProcgenUtils } from '../../../Backend/Procedural/ProcgenUtils'; import { getPlanetRank } from '../../../Backend/Utils/Utils'; import { @@ -19,7 +19,7 @@ import { } from '../../Components/Icons'; import { TooltipName } from '../../Game/WindowManager'; import { TooltipTrigger } from '../../Panes/Tooltip'; -import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; +import { EMPTY_ADDRESS, MAX_PLANET_LEVEL } from '@darkforest_eth/constants'; import { bonusFromHex } from '@darkforest_eth/hexgen'; const StyledPlanetIcons = styled.div` @@ -70,7 +70,7 @@ export function PlanetIcons({ planet }: { planet: Planet | undefined }) { )} - {planet.planetLevel === PlanetLevel.MAX && ( + {planet.planetLevel === MAX_PLANET_LEVEL && ( diff --git a/src/Frontend/Styles/Colors.tsx b/src/Frontend/Styles/Colors.tsx index 2d8273ef..e4a4a6ca 100644 --- a/src/Frontend/Styles/Colors.tsx +++ b/src/Frontend/Styles/Colors.tsx @@ -3,42 +3,42 @@ import dfstyles from './dfstyles'; /* tsx file so that we get color previews in VScode! */ -export const BiomeTextColors: Record = [ - '#000000', - '#0088ff', // OCEAN - '#46FB73', // FOREST - '#CFF391', // GRASSLAND - '#FB6A9D', // TUNDRA - '#b48812', // SWAMP - '#ffe554', // DESERT - 'hsl(198, 78%, 77%)', // ICE - '#000000', // WASTELAND - '#FF5100', // LAVA - '#bf5bf1', // CORRUPTED -]; +export const BiomeTextColors = { + [Biome.UNKNOWN]: '#000000', + [Biome.OCEAN]: '#0088ff', + [Biome.FOREST]: '#46FB73', + [Biome.GRASSLAND]: '#CFF391', + [Biome.TUNDRA]: '#FB6A9D', + [Biome.SWAMP]: '#b48812', + [Biome.DESERT]: '#ffe554', + [Biome.ICE]: 'hsl(198, 78%, 77%)', + [Biome.WASTELAND]: '#000000', + [Biome.LAVA]: '#FF5100', + [Biome.CORRUPTED]: '#bf5bf1', +} as const; -export const BiomeBackgroundColors: Record = [ - '#000000', - '#000e2d', // OCEAN - '#06251d', // FOREST - '#212617', // GRASSLAND - '#260f17', // TUNDRA - '#211b0e', // SWAMP - '#302e0e', // DESERT - '#0d212f', // ICE - '#321b1b', // WASTELAND - '#321000', // LAVA - '#1e0d26', // CORRUPTED -]; +export const BiomeBackgroundColors = { + [Biome.UNKNOWN]: '#000000', + [Biome.OCEAN]: '#000e2d', + [Biome.FOREST]: '#06251d', + [Biome.GRASSLAND]: '#212617', + [Biome.TUNDRA]: '#260f17', + [Biome.SWAMP]: '#211b0e', + [Biome.DESERT]: '#302e0e', + [Biome.ICE]: '#0d212f', + [Biome.WASTELAND]: '#321b1b', + [Biome.LAVA]: '#321000', + [Biome.CORRUPTED]: '#1e0d26', +} as const; export const ANCIENT_PURPLE = '#d23191'; export const ANCIENT_BLUE = '#b2fffc'; -export const RarityColors: Record = [ - '#000000', - dfstyles.colors.subtext, // Common - '#6b68ff', // Rare - '#c13cff', // Epic - '#f8b73e', // Legendary - '#ff44b7', // Mythic -]; +export const RarityColors = { + [ArtifactRarity.Unknown]: '#000000', + [ArtifactRarity.Common]: dfstyles.colors.subtext, + [ArtifactRarity.Rare]: '#6b68ff', + [ArtifactRarity.Epic]: '#c13cff', + [ArtifactRarity.Legendary]: '#f8b73e', + [ArtifactRarity.Mythic]: '#ff44b7', +} as const; diff --git a/src/Frontend/Styles/dfstyles.ts b/src/Frontend/Styles/dfstyles.ts index d7df2a02..52b3fab0 100644 --- a/src/Frontend/Styles/dfstyles.ts +++ b/src/Frontend/Styles/dfstyles.ts @@ -3,12 +3,12 @@ import { css } from 'styled-components'; export const ARTIFACT_ROW_H = 48; -export const SPACE_TYPE_COLORS: Record = { +export const SPACE_TYPE_COLORS = { [SpaceType.NEBULA]: 'rgb(0, 20.4, 81.6)', [SpaceType.SPACE]: 'rgb(0, 5.4, 43.35)', [SpaceType.DEEP_SPACE]: 'rgb(2.04, 0, 6.12)', [SpaceType.DEAD_SPACE]: 'rgb(37.485, 0, 36)', -}; +} as const; const dfstyles = { colors: { @@ -26,7 +26,6 @@ const dfstyles = { dfgreen: '#00DC82', dfgreendark: '#025230', dfgreenlight: '#89facc', - dfred: '#FF6492', dfyellow: '#e8e228', diff --git a/src/Frontend/Utils/BrowserChecks.ts b/src/Frontend/Utils/BrowserChecks.ts index 635b13b4..00cd877c 100644 --- a/src/Frontend/Utils/BrowserChecks.ts +++ b/src/Frontend/Utils/BrowserChecks.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; -export enum Incompatibility { +export const enum Incompatibility { NoIDB = 'no_idb', NotRopsten = 'not_ropsten', MobileOrTablet = 'mobile_or_tablet', diff --git a/src/Frontend/Utils/EmitterUtils.ts b/src/Frontend/Utils/EmitterUtils.ts index 74013c3d..ac74ea77 100644 --- a/src/Frontend/Utils/EmitterUtils.ts +++ b/src/Frontend/Utils/EmitterUtils.ts @@ -1,5 +1,6 @@ import { Artifact, EthAddress, Planet } from '@darkforest_eth/types'; import { monomitter, Monomitter } from './Monomitter'; +import _ from 'lodash'; /** * Create a monomitter to emit objects with a given id from a cached map of ids to objects. @@ -16,17 +17,45 @@ export function getObjectWithIdFromMap( const selectedObj$ = monomitter(); - const pushId = (id: Id | undefined) => { + const publishIdEvent = (id: Id | undefined) => { + // emit object associated with id selectedObj$.publish(id ? objMap.get(id) : undefined); }; objId$.subscribe((id: Id | undefined) => { - pushId(id); + // Publish event for new object + publishIdEvent(id); + //Update tracked object lastId = id; }); objUpdated$.subscribe((id: Id) => { - if (lastId && lastId === id) pushId(id); + if (lastId && lastId === id) publishIdEvent(id); + }); + + return selectedObj$; +} + +/** + * Create a monomitter to emit objects with a given id from a cached map of ids to objects. Not intended for re-use + * @param objMap the cached map of `` + * @param objId the object id to select + * @param objUpdated$ emitter which indicates when an object has been updated + */ +export function getDisposableEmitter( + objMap: Map, + objId: Id, + objUpdated$: Monomitter +): Monomitter { + const selectedObj$ = monomitter(); + + const publishIdEvent = (id: Id | undefined) => { + // emit value of new id + selectedObj$.publish(id ? objMap.get(id) : undefined); + }; + + objUpdated$.subscribe((id: Id) => { + if (objId === id) publishIdEvent(id); }); return selectedObj$; @@ -71,6 +100,34 @@ export function setObjectSyncState( } } +/** + * @param previous The previously emitted state of an object + * @param current The current emitted state of an object + */ +export interface Diff { + previous: Type; + current: Type; +} + +/** + * Wraps an existing emitter and emits an event with the current and previous values + * @param emitter an emitter announcing game objects + */ +export function generateDiffEmitter( + emitter: Monomitter +): Monomitter | undefined> { + let prevInstance: Obj | undefined; + const currPrevEmitter$ = monomitter | undefined>(); + emitter.subscribe((instance) => { + currPrevEmitter$.publish({ + current: _.cloneDeep(instance) as Obj, + previous: prevInstance ? _.cloneDeep(prevInstance) : (_.cloneDeep(instance) as Obj), + }); + prevInstance = _.cloneDeep(instance); + }); + + return currPrevEmitter$; +} /* i'm slightly worried that function literals would have to get allocated and de-allocated all the time - the below functions exist in order to prevent that */ diff --git a/src/Frontend/Utils/Hats.ts b/src/Frontend/Utils/Hats.ts index 935b4253..6005e7bd 100644 --- a/src/Frontend/Utils/Hats.ts +++ b/src/Frontend/Utils/Hats.ts @@ -95,7 +95,7 @@ const squid = { ], }; -export enum HatType { +export const enum HatType { GraduationCap = 'GraduationCap', PartyHat = 'PartyHat', Fish = 'Fish', diff --git a/src/Frontend/Utils/SettingsHooks.tsx b/src/Frontend/Utils/SettingsHooks.tsx index 99cfd786..796f1dfa 100644 --- a/src/Frontend/Utils/SettingsHooks.tsx +++ b/src/Frontend/Utils/SettingsHooks.tsx @@ -16,7 +16,7 @@ export const settingChanged$: Monomitter = monomitter(); * Each setting has a unique identifier. Each account gets to store its own local storage setting, * per instance of the dark forest contract that it's connected to. */ -export enum Setting { +export const enum Setting { OptOutMetrics = 'OptOutMetrics', AutoApproveNonPurchaseTransactions = 'AutoApproveNonPurchaseTransactions', DrawChunkBorders = 'DrawChunkBorders', @@ -40,7 +40,7 @@ export enum Setting { TutorialOpen = 'TutorialOpen', } -export enum AutoGasSetting { +export const enum AutoGasSetting { Slow = 'Slow', Average = 'Average', Fast = 'Fast', diff --git a/src/Frontend/Utils/TerminalTypes.ts b/src/Frontend/Utils/TerminalTypes.ts index d9f62c32..e29e8d7a 100644 --- a/src/Frontend/Utils/TerminalTypes.ts +++ b/src/Frontend/Utils/TerminalTypes.ts @@ -1,4 +1,4 @@ -export enum TerminalTextStyle { +export const enum TerminalTextStyle { Green, Sub, White, diff --git a/src/Frontend/Utils/UIEmitter.ts b/src/Frontend/Utils/UIEmitter.ts index d594fda3..34a85e3f 100644 --- a/src/Frontend/Utils/UIEmitter.ts +++ b/src/Frontend/Utils/UIEmitter.ts @@ -1,6 +1,6 @@ import { EventEmitter } from 'events'; -export enum UIEmitterEvent { +export const enum UIEmitterEvent { GamePlanetSelected = 'GamePlanetSelected', CenterPlanet = 'CenterPlanet', WindowResize = 'WindowResize', diff --git a/src/Frontend/Views/ModalPane.tsx b/src/Frontend/Views/ModalPane.tsx index 403778c2..ab03a419 100644 --- a/src/Frontend/Views/ModalPane.tsx +++ b/src/Frontend/Views/ModalPane.tsx @@ -19,7 +19,7 @@ export const RECOMMENDED_WIDTH = '450px'; export type ModalHook = Hook; -export enum ModalName { +export const enum ModalName { Help, PlanetDetails, Leaderboard, diff --git a/src/Frontend/Views/Notifications.tsx b/src/Frontend/Views/Notifications.tsx index 3b9088f3..42b7751e 100644 --- a/src/Frontend/Views/Notifications.tsx +++ b/src/Frontend/Views/Notifications.tsx @@ -38,7 +38,7 @@ const StyledNotification = styled.div` border-radius: 8px; border: 1px solid ${dfstyles.colors.text}; background: ${({ color }) => color || dfstyles.colors.backgroundlighter}; - + overflow: hidden; display: flex; flex-direction: row; justify-content: space-around; diff --git a/src/Frontend/Views/PlanetNotifications.tsx b/src/Frontend/Views/PlanetNotifications.tsx index 161b6474..18ff171f 100644 --- a/src/Frontend/Views/PlanetNotifications.tsx +++ b/src/Frontend/Views/PlanetNotifications.tsx @@ -17,7 +17,7 @@ import { useUIManager } from '../Utils/AppHooks'; import { GameObjects } from '../../Backend/GameLogic/GameObjects'; import { EmojiPlanetNotification } from './EmojiPlanetNotification'; -export enum PlanetNotifType { +export const enum PlanetNotifType { PlanetCanUpgrade, CanProspect, CanFindArtifact, diff --git a/src/Frontend/Views/SendResources.tsx b/src/Frontend/Views/SendResources.tsx index f179d4e4..977c18e8 100644 --- a/src/Frontend/Views/SendResources.tsx +++ b/src/Frontend/Views/SendResources.tsx @@ -25,7 +25,7 @@ const StyledRowIcon = styled.div` margin-right: 0.75em; `; -enum RowType { +const enum RowType { Energy, Silver, Artifact, diff --git a/src/_types/darkforest/api/ContractsAPITypes.ts b/src/_types/darkforest/api/ContractsAPITypes.ts index c64d65d7..c02da83a 100644 --- a/src/_types/darkforest/api/ContractsAPITypes.ts +++ b/src/_types/darkforest/api/ContractsAPITypes.ts @@ -1,14 +1,14 @@ import { ArtifactPointValues, UpgradeBranches } from '@darkforest_eth/types'; import { BigNumber as EthersBN } from 'ethers'; -export enum ZKArgIdx { +export const enum ZKArgIdx { PROOF_A, PROOF_B, PROOF_C, DATA, } -export enum InitArgIdxs { +export const enum InitArgIdxs { LOCATION_ID, PERLIN, RADIUS, @@ -19,7 +19,7 @@ export enum InitArgIdxs { PERLIN_MIRROR_Y, } -export enum MoveArgIdxs { +export const enum MoveArgIdxs { FROM_ID, TO_ID, TO_PERLIN, @@ -35,12 +35,12 @@ export enum MoveArgIdxs { ARTIFACT_SENT, } -export enum UpgradeArgIdxs { +export const enum UpgradeArgIdxs { LOCATION_ID, UPGRADE_BRANCH, } -export enum ContractEvent { +export const enum ContractEvent { PlayerInitialized = 'PlayerInitialized', ArrivalQueued = 'ArrivalQueued', PlanetUpgraded = 'PlanetUpgraded', @@ -58,7 +58,7 @@ export enum ContractEvent { ChangedGPTCreditPrice = 'ChangedCreditPrice', } -export enum ContractsAPIEvent { +export const enum ContractsAPIEvent { PlayerUpdate = 'PlayerUpdate', PlanetUpdate = 'PlanetUpdate', ArrivalQueued = 'ArrivalQueued', @@ -187,6 +187,6 @@ export type ClientMockchainData = [key in string | number]: ClientMockchainData; }; -export enum PlanetEventType { +export const enum PlanetEventType { ARRIVAL, } diff --git a/src/_types/global/GlobalTypes.ts b/src/_types/global/GlobalTypes.ts index 2f85b4a8..fa0e1240 100644 --- a/src/_types/global/GlobalTypes.ts +++ b/src/_types/global/GlobalTypes.ts @@ -40,7 +40,7 @@ export type HashConfig = { perlinMirrorY: boolean; }; -export enum StatIdx { +export const enum StatIdx { EnergyCap = 0, EnergyGro = 1, Range = 2, diff --git a/yarn.lock b/yarn.lock index 1099e58e..1dbf68b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -982,15 +982,15 @@ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== -"@eslint/eslintrc@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" - integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ== +"@eslint/eslintrc@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179" + integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg== dependencies: ajv "^6.12.4" debug "^4.1.1" espree "^7.3.0" - globals "^12.1.0" + globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" @@ -1594,6 +1594,20 @@ object-assign "^4.1.1" scheduler "^0.20.1" +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + "@iarna/toml@^2.2.5": version "2.2.5" resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" @@ -3116,6 +3130,13 @@ dependencies: debug "^4.1.1" +"@projectsophon/eslint-plugin-typescript-enum@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@projectsophon/eslint-plugin-typescript-enum/-/eslint-plugin-typescript-enum-2.1.0.tgz#0fc91e0d4a5939219fe1530ed0201f8243f0d3fe" + integrity sha512-1lnupVrxNkewCOfsNMga22jQrwGtiZvnfCMiWbvf3Vu9l+1bC3lxN0L81GD8XrztC8Va/x9jW3zRUCS3eUHviw== + dependencies: + "@typescript-eslint/experimental-utils" "^4.28.3" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -3662,6 +3683,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/json-schema@^7.0.7": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" + integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== + "@types/json-stable-stringify@^1.0.32": version "1.0.32" resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.32.tgz#121f6917c4389db3923640b2e68de5fa64dda88e" @@ -4096,17 +4122,18 @@ regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/eslint-plugin@^3.2.0": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" - integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== +"@typescript-eslint/eslint-plugin@^4.28.3": + version "4.28.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.3.tgz#36cdcd9ca6f9e5cb49b9f61b970b1976708d084b" + integrity sha512-jW8sEFu1ZeaV8xzwsfi6Vgtty2jf7/lJmQmDkDruBjYAbx5DA8JtbcMnP0rNPUG+oH5GoQBTSp+9613BzuIpYg== dependencies: - "@typescript-eslint/experimental-utils" "3.10.1" - debug "^4.1.1" + "@typescript-eslint/experimental-utils" "4.28.3" + "@typescript-eslint/scope-manager" "4.28.3" + debug "^4.3.1" functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" "@typescript-eslint/experimental-utils@2.34.0": version "2.34.0" @@ -4118,16 +4145,17 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/experimental-utils@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" - integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== +"@typescript-eslint/experimental-utils@4.28.3", "@typescript-eslint/experimental-utils@^4.28.3": + version "4.28.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.3.tgz#976f8c1191b37105fd06658ed57ddfee4be361ca" + integrity sha512-zZYl9TnrxwEPi3FbyeX0ZnE8Hp7j3OCR+ELoUfbwGHGxWnHg9+OqSmkw2MoCVpZksPCZYpQzC559Ee9pJNHTQw== dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.28.3" + "@typescript-eslint/types" "4.28.3" + "@typescript-eslint/typescript-estree" "4.28.3" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" "@typescript-eslint/parser@^2.10.0": version "2.34.0" @@ -4139,21 +4167,28 @@ "@typescript-eslint/typescript-estree" "2.34.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/parser@^3.2.0": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" - integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== +"@typescript-eslint/parser@^4.28.3": + version "4.28.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.3.tgz#95f1d475c08268edffdcb2779993c488b6434b44" + integrity sha512-ZyWEn34bJexn/JNYvLQab0Mo5e+qqQNhknxmc8azgNd4XqspVYR5oHq9O11fLwdZMRcj4by15ghSlIEq+H5ltQ== dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.10.1" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/scope-manager" "4.28.3" + "@typescript-eslint/types" "4.28.3" + "@typescript-eslint/typescript-estree" "4.28.3" + debug "^4.3.1" -"@typescript-eslint/types@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" - integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== +"@typescript-eslint/scope-manager@4.28.3": + version "4.28.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.3.tgz#c32ad4491b3726db1ba34030b59ea922c214e371" + integrity sha512-/8lMisZ5NGIzGtJB+QizQ5eX4Xd8uxedFfMBXOKuJGP0oaBBVEMbJVddQKDXyyB0bPlmt8i6bHV89KbwOelJiQ== + dependencies: + "@typescript-eslint/types" "4.28.3" + "@typescript-eslint/visitor-keys" "4.28.3" + +"@typescript-eslint/types@4.28.3": + version "4.28.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.3.tgz#8fffd436a3bada422c2c1da56060a0566a9506c7" + integrity sha512-kQFaEsQBQVtA9VGVyciyTbIg7S3WoKHNuOp/UF5RG40900KtGqfoiETWD/v0lzRXc+euVE9NXmfer9dLkUJrkA== "@typescript-eslint/typescript-estree@2.34.0", "@typescript-eslint/typescript-estree@^2.29.0": version "2.34.0" @@ -4168,26 +4203,26 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" - integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== +"@typescript-eslint/typescript-estree@4.28.3": + version "4.28.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.3.tgz#253d7088100b2a38aefe3c8dd7bd1f8232ec46fb" + integrity sha512-YAb1JED41kJsqCQt1NcnX5ZdTA93vKFCMP4lQYG6CFxd0VzDJcKttRlMrlG+1qiWAw8+zowmHU1H0OzjWJzR2w== dependencies: - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/visitor-keys" "3.10.1" - debug "^4.1.1" - glob "^7.1.6" + "@typescript-eslint/types" "4.28.3" + "@typescript-eslint/visitor-keys" "4.28.3" + debug "^4.3.1" + globby "^11.0.3" is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" + semver "^7.3.5" + tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" - integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== +"@typescript-eslint/visitor-keys@4.28.3": + version "4.28.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.3.tgz#26ac91e84b23529968361045829da80a4e5251c4" + integrity sha512-ri1OzcLnk1HH4gORmr1dllxDzzrN6goUIz/P4MHFV0YZJDCADPR3RvYNp0PW2SetKTThar6wlbFTL00hV2Q+fg== dependencies: - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/types" "4.28.3" + eslint-visitor-keys "^2.0.0" "@ungap/from-entries@^0.2.1": version "0.2.1" @@ -4526,7 +4561,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^7.0.0, ajv@^7.0.2: +ajv@^7.0.0: version "7.2.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.2.3.tgz#ca78d1cf458d7d36d1c3fa0794dd143406db5772" integrity sha512-idv5WZvKVXDqKralOImQgPM9v6WOdLNa0IY3B3doOjw/YxRGT8I+allIJ6kd7Uaj+SF1xZUSU+nPM5aDNBVtnw== @@ -4536,6 +4571,16 @@ ajv@^7.0.0, ajv@^7.0.2: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.6.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.1.tgz#ae65764bf1edde8cd861281cda5057852364a295" + integrity sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + all-node-versions@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/all-node-versions/-/all-node-versions-8.0.0.tgz#d3a4dcffe5c589775c7ddbd15b63dbcc71face14" @@ -4834,7 +4879,7 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.1.1, array-includes@^3.1.2: +array-includes@^3.1.1, array-includes@^3.1.2, array-includes@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== @@ -4867,7 +4912,7 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flatmap@^1.2.3: +array.prototype.flatmap@^1.2.3, array.prototype.flatmap@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== @@ -8199,14 +8244,6 @@ degenerator@^1.0.4: escodegen "1.x.x" esprima "3.x.x" -del-cli@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/del-cli/-/del-cli-3.0.1.tgz#2d27ff260204b5104cadeda86f78f180a4ebe89a" - integrity sha512-BLHItGr82rUbHhjMu41d+vw9Md49i81jmZSV00HdTq4t+RTHywmEht/23mNFpUl2YeLYJZJyGz4rdlMAyOxNeg== - dependencies: - del "^5.1.0" - meow "^6.1.1" - del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -8957,6 +8994,28 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.0" +es-abstract@^1.18.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" + integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.10.3" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -9073,24 +9132,29 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^6.10.0, eslint-config-prettier@^6.11.0: +eslint-config-prettier@^6.10.0: version "6.15.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" +eslint-config-prettier@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== + eslint-plugin-react-hooks@^2.3.0: version "2.5.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.1.tgz#4ef5930592588ce171abeb26f400c7fbcbc23cd0" integrity sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g== -eslint-plugin-react-hooks@^4.0.4: +eslint-plugin-react-hooks@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== -eslint-plugin-react@^7.17.0, eslint-plugin-react@^7.20.0: +eslint-plugin-react@^7.17.0: version "7.22.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== @@ -9107,6 +9171,24 @@ eslint-plugin-react@^7.17.0, eslint-plugin-react@^7.20.0: resolve "^1.18.1" string.prototype.matchall "^4.0.2" +eslint-plugin-react@^7.24.0: + version "7.24.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz#eadedfa351a6f36b490aa17f4fa9b14e842b9eb4" + integrity sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q== + dependencies: + array-includes "^3.1.3" + array.prototype.flatmap "^1.2.4" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.0.4" + object.entries "^1.1.4" + object.fromentries "^2.0.4" + object.values "^1.1.4" + prop-types "^15.7.2" + resolve "^2.0.0-next.3" + string.prototype.matchall "^4.0.5" + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -9137,6 +9219,13 @@ eslint-utils@^2.0.0, eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" @@ -9189,28 +9278,31 @@ eslint@^5.6.0: table "^5.2.3" text-table "^0.2.0" -eslint@^7.26.0: - version "7.26.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.26.0.tgz#d416fdcdcb3236cd8f282065312813f8c13982f6" - integrity sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg== +eslint@^7.30.0: + version "7.30.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.30.0.tgz#6d34ab51aaa56112fd97166226c9a97f505474f8" + integrity sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg== dependencies: "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.1" + "@eslint/eslintrc" "^0.4.2" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" + escape-string-regexp "^4.0.0" eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" esquery "^1.4.0" esutils "^2.0.2" + fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" + glob-parent "^5.1.2" globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" @@ -9219,7 +9311,7 @@ eslint@^7.26.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.21" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -9228,7 +9320,7 @@ eslint@^7.26.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^6.0.4" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -10026,7 +10118,7 @@ fake-merkle-patricia-tree@^1.0.1: dependencies: checkpoint-store "^1.1.0" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -11111,7 +11203,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: +glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -11147,7 +11239,7 @@ glob@7.1.6, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glo once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1: +glob@^7.1.1, glob@^7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -11232,13 +11324,6 @@ globals@^11.1.0, globals@^11.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - globals@^13.6.0: version "13.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.7.0.tgz#aed3bcefd80ad3ec0f0be2cf0c895110c0591795" @@ -11246,6 +11331,13 @@ globals@^13.6.0: dependencies: type-fest "^0.20.2" +globals@^13.9.0: + version "13.10.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.10.0.tgz#60ba56c3ac2ca845cfbf4faeca727ad9dd204676" + integrity sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g== + dependencies: + type-fest "^0.20.2" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -11289,6 +11381,18 @@ globby@^11.0.2: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -11672,7 +11776,7 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.0: +has-bigints@^1.0.0, has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== @@ -13027,6 +13131,14 @@ is-regex@^1.0.4, is-regex@^1.1.2: call-bind "^1.0.2" has-symbols "^1.0.1" +is-regex@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + is-regex@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" @@ -13066,6 +13178,11 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-string@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -14277,7 +14394,7 @@ lodash.lowerfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz#de3c7b12e02c6524a0059c2f6cb7c5c52655a13d" integrity sha1-3jx7EuAsZSSgBZwvbLfFxSZVoT0= -lodash.merge@^4.6.1: +lodash.merge@^4.6.1, lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== @@ -14357,6 +14474,11 @@ lodash.trimstart@^4.5.1: resolved "https://registry.yarnpkg.com/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz#8ff4dec532d82486af59573c39445914e944a7f1" integrity sha1-j/TexTLYJIavWVc8OURZFOlEp/E= +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash.union@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" @@ -14659,10 +14781,10 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-2.0.3.tgz#3551c4958c4da36897bda2a16812ef1399c8d6b0" - integrity sha512-5otztIIcJfPc2qGTN8cVtOJEjNJZ0jwa46INMagrYfk0EvqtRuEHLsEe0LrFS0/q+ZRKT0+kXK7P2T1AN5lWRA== +marked@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.3.tgz#bd017cef6431724fd4b27e0657f5ceb14bff3753" + integrity sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA== maxstache-stream@^1.0.0: version "1.0.4" @@ -14771,23 +14893,6 @@ meow@^3.3.0: redent "^1.0.0" trim-newlines "^1.0.0" -meow@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" - integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "^4.0.2" - normalize-package-data "^2.5.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" - meow@^8.0.0: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" @@ -14993,7 +15098,7 @@ minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@4.1.0, minimist-options@^4.0.2: +minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== @@ -16173,6 +16278,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-inspect@^1.10.3: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" @@ -16243,7 +16353,16 @@ object.entries@^1.1.2: es-abstract "^1.18.0-next.1" has "^1.0.3" -object.fromentries@^2.0.2: +object.entries@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" + integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +object.fromentries@^2.0.2, object.fromentries@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== @@ -16279,6 +16398,15 @@ object.values@^1.1.1: es-abstract "^1.18.0-next.2" has "^1.0.3" +object.values@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + obliterator@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" @@ -18714,7 +18842,7 @@ resolve@^1.0.0, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14. is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^2.0.0-next.1: +resolve@^2.0.0-next.1, resolve@^2.0.0-next.3: version "2.0.0-next.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== @@ -19286,7 +19414,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.8.3, shelljs@^0.8.4: +shelljs@^0.8.3: version "0.8.4" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== @@ -20075,6 +20203,20 @@ string.prototype.matchall@^4.0.2: regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" +string.prototype.matchall@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" + integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + string.prototype.trim@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd" @@ -20387,15 +20529,17 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -table@^6.0.4: - version "6.0.7" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" - integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== dependencies: - ajv "^7.0.2" - lodash "^4.17.20" + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" @@ -20980,6 +21124,11 @@ ts-node@^9.0.0: source-map-support "^0.5.17" yn "3.1.1" +ts-toolbelt@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz#50a25426cfed500d4a09bd1b3afb6f28879edfd5" + integrity sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w== + tsconfig@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" @@ -21010,7 +21159,7 @@ tsort@0.0.1: resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= -tsutils@^3.17.1: +tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== @@ -21087,11 +21236,6 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -21188,27 +21332,24 @@ typedoc-default-themes@^0.12.10: resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz#614c4222fe642657f37693ea62cad4dafeddf843" integrity sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA== -typedoc-plugin-markdown@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.8.1.tgz#4dee56d46e5aa0be884b8a59c7d7f62ac8f77b53" - integrity sha512-SzDSSJwwMq3ZHmn2MN/5U0XxwNhCiJ7pC7s3kczsT9JeRJnFgxv6xmMAQSxEx35bjoZLQ18vdSd9cXgIxhVQZQ== +typedoc-plugin-markdown@^3.10.3: + version "3.10.3" + resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.10.3.tgz#8d7f3e8d44363143cd4d032bab5db0460b0434f8" + integrity sha512-CmNfHjiCc3ttJo3IYa7te+xOLJIn+jRVloSkM4j3It2rhJTeYp6OhZocnIHYIJIIqXuttoXAbFAbfJ2v7X+nbA== dependencies: handlebars "^4.7.7" -typedoc@^0.20.36: - version "0.20.36" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.20.36.tgz#ee5523c32f566ad8283fc732aa8ea322d1a45f6a" - integrity sha512-qFU+DWMV/hifQ9ZAlTjdFO9wbUIHuUBpNXzv68ZyURAP9pInjZiO4+jCPeAzHVcaBCHER9WL/+YzzTt6ZlN/Nw== +typedoc@^0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.21.4.tgz#fced3cffdc30180db60a5dbfec9dbbb273cb5b31" + integrity sha512-slZQhvD9U0d9KacktYAyuNMMOXJRFNHy+Gd8xY2Qrqq3eTTTv3frv3N4au/cFnab9t3T5WA0Orb6QUjMc+1bDA== dependencies: - colors "^1.4.0" - fs-extra "^9.1.0" + glob "^7.1.7" handlebars "^4.7.7" - lodash "^4.17.21" lunr "^2.3.9" - marked "^2.0.3" + marked "^2.1.1" minimatch "^3.0.0" progress "^2.0.3" - shelljs "^0.8.4" shiki "^0.9.3" typedoc-default-themes "^0.12.10" @@ -21228,7 +21369,7 @@ typescript-plugin-styled-components@^1.4.4: resolved "https://registry.yarnpkg.com/typescript-plugin-styled-components/-/typescript-plugin-styled-components-1.4.4.tgz#fff26d516ff213dffe1a5627fe76f23ae3ee6ada" integrity sha512-w5S5lSpzRFM+61KNNpGtlF46DuTJTyzfWM4g6ic9m189ILEoU3sgoTNHNS2MxQhXsGtQZwAlINKG+Dwy0euwUg== -typescript@^3.7.2, typescript@^3.8.3, typescript@^3.9.7: +typescript@^3.8.3: version "3.9.9" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== @@ -21238,6 +21379,11 @@ typescript@^4.1.5: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== +typescript@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== + typescript@~4.0.2: version "4.0.7" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.7.tgz#7168032c43d2a2671c95c07812f69523c79590af" @@ -21310,6 +21456,16 @@ unbox-primitive@^1.0.0: has-symbols "^1.0.0" which-boxed-primitive "^1.0.1" +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unbzip2-stream@^1.0.9: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" @@ -22339,7 +22495,7 @@ whatwg-url@^8.4.0: tr46 "^2.0.2" webidl-conversions "^6.1.0" -which-boxed-primitive@^1.0.1: +which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== @@ -22775,7 +22931,7 @@ yargs-parser@^16.1.0: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.2, yargs-parser@^18.1.3: +yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== From a7c0bba8606b42c33f04240182a743bdab72a00d Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 15 Jul 2021 19:00:13 +0000 Subject: [PATCH 06/68] update client --- last_updated.txt | 2 +- package.json | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/last_updated.txt b/last_updated.txt index 82e5d19d..7c09e5b7 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Thu Jul 15 18:16:53 UTC 2021 +last updated: Thu Jul 15 19:00:13 UTC 2021 diff --git a/package.json b/package.json index e5feaf99..132a84fc 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { "name": "client", - "version": "6.2.14", + "version": "6.2.15", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.14", - "@darkforest_eth/contracts": "6.2.14", - "@darkforest_eth/hashing": "6.2.14", - "@darkforest_eth/hexgen": "6.2.14", - "@darkforest_eth/serde": "6.2.14", - "@darkforest_eth/snarks": "6.2.14", - "@darkforest_eth/types": "6.2.14", + "@darkforest_eth/constants": "6.2.15", + "@darkforest_eth/contracts": "6.2.15", + "@darkforest_eth/hashing": "6.2.15", + "@darkforest_eth/hexgen": "6.2.15", + "@darkforest_eth/serde": "6.2.15", + "@darkforest_eth/snarks": "6.2.15", + "@darkforest_eth/types": "6.2.15", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", From fb9b4134f5bc13b93961ee2715d6f4536bfb85aa Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 15 Jul 2021 20:03:15 +0000 Subject: [PATCH 07/68] update client --- last_updated.txt | 2 +- package.json | 16 ++++++++-------- src/Backend/GameLogic/GameObjects.ts | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/last_updated.txt b/last_updated.txt index 7c09e5b7..f8b9dc1f 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Thu Jul 15 19:00:13 UTC 2021 +last updated: Thu Jul 15 20:03:15 UTC 2021 diff --git a/package.json b/package.json index 132a84fc..b58c0234 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { "name": "client", - "version": "6.2.15", + "version": "6.2.16", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.15", - "@darkforest_eth/contracts": "6.2.15", - "@darkforest_eth/hashing": "6.2.15", - "@darkforest_eth/hexgen": "6.2.15", - "@darkforest_eth/serde": "6.2.15", - "@darkforest_eth/snarks": "6.2.15", - "@darkforest_eth/types": "6.2.15", + "@darkforest_eth/constants": "6.2.16", + "@darkforest_eth/contracts": "6.2.16", + "@darkforest_eth/hashing": "6.2.16", + "@darkforest_eth/hexgen": "6.2.16", + "@darkforest_eth/serde": "6.2.16", + "@darkforest_eth/snarks": "6.2.16", + "@darkforest_eth/types": "6.2.16", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", diff --git a/src/Backend/GameLogic/GameObjects.ts b/src/Backend/GameLogic/GameObjects.ts index 4407c61b..20022b09 100644 --- a/src/Backend/GameLogic/GameObjects.ts +++ b/src/Backend/GameLogic/GameObjects.ts @@ -1141,7 +1141,7 @@ export class GameObjects { if (previous.owner === this.address && current.owner !== this.address) { notifManager.planetLost(current as LocatablePlanet); } - if (arrival.player !== this.address) { + if (arrival.player !== this.address && current.owner === this.address) { notifManager.planetAttacked(current as LocatablePlanet); } } From bcf877ae251c72d3a5e8ac7a6689f3891d725f5c Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 15 Jul 2021 22:20:07 +0000 Subject: [PATCH 08/68] update client --- last_updated.txt | 2 +- package.json | 16 ++++++++-------- src/Backend/GameLogic/ArtifactUtils.ts | 10 +++++----- src/Backend/GameLogic/ConversationManager.tsx | 6 +++--- .../GameLogic/PaidConversationManager.tsx | 4 ++-- src/Backend/Procedural/ArtifactProcgen.ts | 4 ++-- .../Components/Labels/ArtifactLabels.tsx | 8 ++++---- .../Components/Labels/LegendaryLabel.tsx | 4 ++-- src/Frontend/Components/Labels/MythicLabel.tsx | 4 ++-- src/Frontend/Panes/ArtifactDetailsPane.tsx | 4 ++-- .../ManagePlanetArtifacts/ArtifactActions.tsx | 6 +++--- src/Frontend/Panes/PlayerArtifactsPane.tsx | 8 +++++--- src/Frontend/Views/SendResources.tsx | 9 +++++++-- 13 files changed, 46 insertions(+), 39 deletions(-) diff --git a/last_updated.txt b/last_updated.txt index f8b9dc1f..eed8eac5 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Thu Jul 15 20:03:15 UTC 2021 +last updated: Thu Jul 15 22:20:07 UTC 2021 diff --git a/package.json b/package.json index b58c0234..b303d6e2 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { "name": "client", - "version": "6.2.16", + "version": "6.2.17", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.16", - "@darkforest_eth/contracts": "6.2.16", - "@darkforest_eth/hashing": "6.2.16", - "@darkforest_eth/hexgen": "6.2.16", - "@darkforest_eth/serde": "6.2.16", - "@darkforest_eth/snarks": "6.2.16", - "@darkforest_eth/types": "6.2.16", + "@darkforest_eth/constants": "6.2.17", + "@darkforest_eth/contracts": "6.2.17", + "@darkforest_eth/hashing": "6.2.17", + "@darkforest_eth/hexgen": "6.2.17", + "@darkforest_eth/serde": "6.2.17", + "@darkforest_eth/snarks": "6.2.17", + "@darkforest_eth/types": "6.2.17", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", diff --git a/src/Backend/GameLogic/ArtifactUtils.ts b/src/Backend/GameLogic/ArtifactUtils.ts index 5b99f3b5..19e01551 100644 --- a/src/Backend/GameLogic/ArtifactUtils.ts +++ b/src/Backend/GameLogic/ArtifactUtils.ts @@ -2,12 +2,12 @@ import { Biome, BiomeNames, ArtifactRarity, - RarityNames, + ArtifactRarityNames, Planet, PlanetLevel, Artifact, ArtifactType, - ArtifactNames, + ArtifactTypeNames, ArtifactId, } from '@darkforest_eth/types'; import { ProcgenUtils } from '../Procedural/ProcgenUtils'; @@ -125,7 +125,7 @@ export const hasUnconfirmedArtifactTx = (p: Planet | undefined): boolean => export const biomeName = (biome: Biome): string => BiomeNames[biome]; -export const rarityName = (rarity: ArtifactRarity): string => RarityNames[rarity]; +export const rarityName = (rarity: ArtifactRarity): string => ArtifactRarityNames[rarity]; export const rarityNameFromArtifact = (a: Artifact): string => rarityName(a.rarity); @@ -167,8 +167,8 @@ export function artifactFileName( if (!debugProps?.skipCaching && artifactFileNamesById.has(id)) { fileName = artifactFileNamesById.get(id) || ''; } else { - const typeStr = ArtifactNames[type]; - const rarityStr = RarityNames[rarity]; + const typeStr = ArtifactTypeNames[type]; + const rarityStr = ArtifactRarityNames[rarity]; let nameStr = ''; if (debugProps) { if (debugProps.forceAncient) { diff --git a/src/Backend/GameLogic/ConversationManager.tsx b/src/Backend/GameLogic/ConversationManager.tsx index 59539d37..4ba82bea 100644 --- a/src/Backend/GameLogic/ConversationManager.tsx +++ b/src/Backend/GameLogic/ConversationManager.tsx @@ -6,8 +6,8 @@ import { ConversationArtifact, ArtifactType, ArtifactRarity, - RarityNames, - ArtifactNames, + ArtifactRarityNames, + ArtifactTypeNames, } from '@darkforest_eth/types'; import { WikiPane } from '../../Frontend/Panes/WikiPane'; import { TerminalTextStyle } from '../../Frontend/Utils/TerminalTypes'; @@ -46,7 +46,7 @@ export class ConversationManager { rarity: artifactRarity, name: 'Qora', }; - this.artifactId = `prototype-ui-${RarityNames[artifactRarity]}-${ArtifactNames[artifactType]}`; + this.artifactId = `prototype-ui-${ArtifactRarityNames[artifactRarity]}-${ArtifactTypeNames[artifactType]}`; } public async start() { diff --git a/src/Backend/GameLogic/PaidConversationManager.tsx b/src/Backend/GameLogic/PaidConversationManager.tsx index 33d5f879..8d353b35 100644 --- a/src/Backend/GameLogic/PaidConversationManager.tsx +++ b/src/Backend/GameLogic/PaidConversationManager.tsx @@ -1,6 +1,6 @@ import React from 'react'; import styled from 'styled-components'; -import { Artifact, Conversation, Message, ArtifactNames } from '@darkforest_eth/types'; +import { Artifact, Conversation, Message, ArtifactTypeNames } from '@darkforest_eth/types'; import { WikiPane } from '../../Frontend/Panes/WikiPane'; import { TerminalTextStyle } from '../../Frontend/Utils/TerminalTypes'; import { TerminalHandle } from '../../Frontend/Views/Terminal'; @@ -58,7 +58,7 @@ export class PaidConversationManager { await this.terminal.current?.getInput(); this.terminal.current?.println( `Initializing conversation with ${artifactName(this.artifact)} (${ - ArtifactNames[this.artifact.artifactType] + ArtifactTypeNames[this.artifact.artifactType] })` ); diff --git a/src/Backend/Procedural/ArtifactProcgen.ts b/src/Backend/Procedural/ArtifactProcgen.ts index 009c73c7..94fb0eaf 100644 --- a/src/Backend/Procedural/ArtifactProcgen.ts +++ b/src/Backend/Procedural/ArtifactProcgen.ts @@ -4,7 +4,7 @@ import { Artifact, Biome, ArtifactRarity, - ArtifactNames, + ArtifactTypeNames, ArtifactType, artifactNameFromArtifact, } from '@darkforest_eth/types'; @@ -13,7 +13,7 @@ import { artifactBiomeName } from '../GameLogic/ArtifactUtils'; export const artifactBiomeAndName = (artifact: Artifact | undefined): string => { if (!artifact) return ''; - return `${artifactBiomeName(artifact)} ${ArtifactNames[artifact.artifactType]}`; + return `${artifactBiomeName(artifact)} ${ArtifactTypeNames[artifact.artifactType]}`; }; export const dateMintedAt = (artifact: Artifact | undefined): string => { diff --git a/src/Frontend/Components/Labels/ArtifactLabels.tsx b/src/Frontend/Components/Labels/ArtifactLabels.tsx index 4c7ce63b..9ef89b1e 100644 --- a/src/Frontend/Components/Labels/ArtifactLabels.tsx +++ b/src/Frontend/Components/Labels/ArtifactLabels.tsx @@ -1,9 +1,9 @@ import { Artifact, - ArtifactNames, + ArtifactTypeNames, ArtifactRarity, BiomeNames, - RarityNames, + ArtifactRarityNames, } from '@darkforest_eth/types'; import React from 'react'; import styled from 'styled-components'; @@ -14,7 +14,7 @@ import { MythicLabel } from './MythicLabel'; // raw text export const ArtifactRarityText = ({ artifact }: { artifact: Artifact }) => ( - <>{RarityNames[artifact.rarity]} + <>{ArtifactRarityNames[artifact.rarity]} ); export const ArtifactBiomeText = ({ artifact }: { artifact: Artifact }) => ( @@ -22,7 +22,7 @@ export const ArtifactBiomeText = ({ artifact }: { artifact: Artifact }) => ( ); export const ArtifactTypeText = ({ artifact }: { artifact: Artifact }) => ( - <>{ArtifactNames[artifact.artifactType]} + <>{ArtifactTypeNames[artifact.artifactType]} ); // colored labels diff --git a/src/Frontend/Components/Labels/LegendaryLabel.tsx b/src/Frontend/Components/Labels/LegendaryLabel.tsx index 7bce5afa..2b6cc0a9 100644 --- a/src/Frontend/Components/Labels/LegendaryLabel.tsx +++ b/src/Frontend/Components/Labels/LegendaryLabel.tsx @@ -1,4 +1,4 @@ -import { ArtifactRarity, RarityNames } from '@darkforest_eth/types'; +import { ArtifactRarity, ArtifactRarityNames } from '@darkforest_eth/types'; import React from 'react'; import styled, { keyframes } from 'styled-components'; import { RarityColors } from '../../Styles/Colors'; @@ -27,7 +27,7 @@ const Anim = styled.span` function LegendaryLabelRaw() { return ( - {RarityNames[ArtifactRarity.Legendary].split('').map((c, i) => ( + {ArtifactRarityNames[ArtifactRarity.Legendary].split('').map((c, i) => ( {c === ' ' ? <>  : c} diff --git a/src/Frontend/Components/Labels/MythicLabel.tsx b/src/Frontend/Components/Labels/MythicLabel.tsx index a3b3e5f5..f0ec17b6 100644 --- a/src/Frontend/Components/Labels/MythicLabel.tsx +++ b/src/Frontend/Components/Labels/MythicLabel.tsx @@ -1,4 +1,4 @@ -import { ArtifactRarity, RarityNames } from '@darkforest_eth/types'; +import { ArtifactRarity, ArtifactRarityNames } from '@darkforest_eth/types'; import React from 'react'; import styled, { keyframes } from 'styled-components'; import { RarityColors } from '../../Styles/Colors'; @@ -27,7 +27,7 @@ const Anim = styled.span` function MythicLabelRaw() { return ( - {RarityNames[ArtifactRarity.Mythic].split('').map((c, i) => ( + {ArtifactRarityNames[ArtifactRarity.Mythic].split('').map((c, i) => ( {c === ' ' ? <>  : c} diff --git a/src/Frontend/Panes/ArtifactDetailsPane.tsx b/src/Frontend/Panes/ArtifactDetailsPane.tsx index cdd1dd0e..5c10ece6 100644 --- a/src/Frontend/Panes/ArtifactDetailsPane.tsx +++ b/src/Frontend/Panes/ArtifactDetailsPane.tsx @@ -1,7 +1,7 @@ import { ArtifactId, ArtifactType, - RarityNames, + ArtifactRarityNames, Upgrade, EthAddress, Artifact, @@ -319,7 +319,7 @@ function ArtifactDescription({ artifact }: { artifact: Artifact }) { const maxLevelBloomFilter = maxLevelsBloomFilter[artifact.rarity]; const wormholeShrinkLevels = [0, 2, 4, 8, 16, 32]; - const rarityName = RarityNames[artifact.rarity]; + const rarityName = ArtifactRarityNames[artifact.rarity]; const photoidRanges = [0, 2, 4, 6, 8, 10]; const photoidSpeeds = [0, 10, 20, 30, 40, 50]; diff --git a/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactActions.tsx b/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactActions.tsx index 0d55c346..94410878 100644 --- a/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactActions.tsx +++ b/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactActions.tsx @@ -1,7 +1,7 @@ import React from 'react'; import styled from 'styled-components'; import { artifactAvailableTimestamp, isActivated } from '../../../Backend/GameLogic/ArtifactUtils'; -import { Artifact, ArtifactType, RarityNames } from '@darkforest_eth/types'; +import { Artifact, ArtifactType, ArtifactRarityNames } from '@darkforest_eth/types'; import { HoverableTooltip } from '../../Components/CoreUI'; import { Hoverable, TOOLTIP_SLOW } from '../../Components/Hoverable'; import { DepositIcon, DeactivateIcon, WithdrawIcon, ActivateIcon } from '../../Components/Icons'; @@ -86,7 +86,7 @@ export function ArtifactActions({ actions.unshift({ tooltip: canHandleArtifact ? 'deposit this artifact' - : `${RarityNames[artifact.rarity]} artifacts can only be deposited into level ${ + : `${ArtifactRarityNames[artifact.rarity]} artifacts can only be deposited into level ${ artifact.rarity + 1 }+ spacetime rips`, icon: , @@ -104,7 +104,7 @@ export function ArtifactActions({ actions.unshift({ tooltip: canHandleArtifact ? 'withdraw this artifact' - : `${RarityNames[artifact.rarity]} artifacts can only be withdrawn from level ${ + : `${ArtifactRarityNames[artifact.rarity]} artifacts can only be withdrawn from level ${ artifact.rarity + 1 }+ spacetime rips`, icon: , diff --git a/src/Frontend/Panes/PlayerArtifactsPane.tsx b/src/Frontend/Panes/PlayerArtifactsPane.tsx index 0fa034ed..ae228e11 100644 --- a/src/Frontend/Panes/PlayerArtifactsPane.tsx +++ b/src/Frontend/Panes/PlayerArtifactsPane.tsx @@ -1,4 +1,4 @@ -import { Artifact, ArtifactNames } from '@darkforest_eth/types'; +import { Artifact, ArtifactTypeNames } from '@darkforest_eth/types'; import _ from 'lodash'; import React, { useState, useEffect } from 'react'; import styled from 'styled-components'; @@ -112,7 +112,7 @@ export function PlayerArtifactsPane({
); }, - (artifact: Artifact) => {ArtifactNames[artifact.artifactType]}, + (artifact: Artifact) => {ArtifactTypeNames[artifact.artifactType]}, (artifact: Artifact) => , ]; @@ -123,7 +123,9 @@ export function PlayerArtifactsPane({ planetArtifactName(right, uiManager) || '' ) || 0, (left: Artifact, right: Artifact) => - ArtifactNames[left.artifactType]?.localeCompare(ArtifactNames[right.artifactType] || '') || 0, + ArtifactTypeNames[left.artifactType]?.localeCompare( + ArtifactTypeNames[right.artifactType] || '' + ) || 0, (left: Artifact, right: Artifact) => left.rarity - right.rarity, ]; diff --git a/src/Frontend/Views/SendResources.tsx b/src/Frontend/Views/SendResources.tsx index 977c18e8..622ff31a 100644 --- a/src/Frontend/Views/SendResources.tsx +++ b/src/Frontend/Views/SendResources.tsx @@ -1,4 +1,9 @@ -import { Artifact, artifactNameFromArtifact, ArtifactNames, Planet } from '@darkforest_eth/types'; +import { + Artifact, + artifactNameFromArtifact, + ArtifactTypeNames, + Planet, +} from '@darkforest_eth/types'; import React, { Dispatch, SetStateAction, useCallback, useEffect, useRef, useState } from 'react'; import styled, { css } from 'styled-components'; import { formatNumber } from '../../Backend/Utils/Utils'; @@ -297,7 +302,7 @@ function SendRow({ <> {artifactNameFromArtifact(artifact)}{' '} - {artifact && ({ArtifactNames[artifact.artifactType]})} + {artifact && ({ArtifactTypeNames[artifact.artifactType]})} remove From 93e24f18d64ae506687e4e3a6e798ee46e84b286 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 27 Jul 2021 17:26:54 +0000 Subject: [PATCH 09/68] update client --- .prettierignore | 1 + docs/README.md | 16 +- ...GameLogic_ContractCaller.ContractCaller.md | 83 --- ...nd_GameLogic_ContractsAPI.ContractsAPI.md} | 278 ++++++---- .../Backend_GameLogic_GameManager.default.md | 283 ++++++---- ...ckend_GameLogic_GameObjects.GameObjects.md | 16 +- ...Backend_GameLogic_GameUIManager.default.md | 92 +++- ...teDownloader.InitialGameStateDownloader.md | 8 +- docs/classes/Backend_GameLogic_Lazy.Lazy.md | 72 +++ ...d_GameLogic_PluginManager.PluginManager.md | 2 +- .../Backend_Network_EthConnection.default.md | 500 ------------------ ...Backend_Network_EventLogger.EventLogger.md | 41 +- ...oncurrentQueue.ThrottledConcurrentQueue.md | 217 -------- .../Backend_Network_TxExecutor.TxExecutor.md | 181 ------- ...nd_Storage_PersistentChunkStore.default.md | 8 +- ...Backend_Storage_ReaderDataStore.default.md | 6 +- .../Backend_Utils_BlockWaiter.BlockWaiter.md | 61 --- docs/classes/Backend_Utils_Wrapper.Wrapper.md | 20 + .../classes/Frontend_Game_Viewport.default.md | 9 +- ...enderer_Entities_VoyageRenderer.default.md | 9 +- ..._GameRenderer_Overlay2DRenderer.default.md | 29 +- .../Backend_Network_EventLogger.EventType.md | 22 + ...tend_Utils_SettingsHooks.AutoGasSetting.md | 29 - .../Frontend_Utils_SettingsHooks.Setting.md | 7 + .../Frontend_Views_ModalPane.ModalName.md | 14 +- ...ialGameStateDownloader.InitialGameState.md | 7 + ...ces_DiagnosticUpdater.DiagnosticUpdater.md | 33 -- .../Backend_Network_AccountManager.Account.md | 24 + ...d_Network_TxExecutor.PendingTransaction.md | 22 - ...kend_Network_TxExecutor.QueuedTxRequest.md | 114 ---- .../Frontend_Components_Btn.BtnProps.md | 50 -- ...ntend_Panes_DiagnosticsPane.Diagnostics.md | 85 --- .../Frontend_Views_ModalPane.ModalFrame.md | 31 ++ .../Frontend_Views_ModalPane.ModalHandle.md | 49 ++ .../Backend_GameLogic_ContractCaller.md | 7 - .../modules/Backend_GameLogic_ContractsAPI.md | 22 +- docs/modules/Backend_GameLogic_Lazy.md | 33 ++ .../Backend_Interfaces_DiagnosticUpdater.md | 7 - .../modules/Backend_Network_AccountManager.md | 42 ++ docs/modules/Backend_Network_Blockchain.md | 110 ++++ docs/modules/Backend_Network_ChainAPI.md | 42 -- docs/modules/Backend_Network_EthConnection.md | 7 - docs/modules/Backend_Network_EventLogger.md | 14 + ...ackend_Network_ThrottledConcurrentQueue.md | 7 - docs/modules/Backend_Network_TxExecutor.md | 12 - .../Backend_Network_UtilityServerAPI.md | 40 +- docs/modules/Backend_Utils_BlockWaiter.md | 7 - docs/modules/Backend_Utils_Utils.md | 198 ------- docs/modules/Frontend_Components_Btn.md | 16 +- docs/modules/Frontend_Components_CoreUI.md | 187 +++++++ ...rontend_Components_GameWindowComponents.md | 10 +- .../Frontend_Components_Labels_Labels.md | 22 +- .../Frontend_Components_Labels_MythicLabel.md | 21 + ...Frontend_Components_Labels_PlanetLabels.md | 50 +- .../Frontend_Components_OpenPaneButtons.md | 104 ++++ docs/modules/Frontend_Components_Text.md | 17 - .../Frontend_Components_TextPreview.md | 14 +- docs/modules/Frontend_Game_Popups.md | 12 +- .../modules/Frontend_Pages_GameLandingPage.md | 6 +- .../Frontend_Panes_ArtifactDetailsPane.md | 33 +- docs/modules/Frontend_Panes_BroadcastPane.md | 20 +- .../modules/Frontend_Panes_DiagnosticsPane.md | 4 - docs/modules/Frontend_Panes_HatPane.md | 9 +- ..._ManagePlanetArtifacts_ArtifactListItem.md | 12 +- ...nes_ManagePlanetArtifacts_ArtifactsList.md | 14 +- ...s_ManagePlanetArtifacts_ManageArtifacts.md | 32 +- ...anetArtifacts_ManagePlanetArtifactsPane.md | 21 +- .../Frontend_Panes_PlanetContextPane.md | 7 +- .../Frontend_Panes_PlanetDetailsPane.md | 25 - .../Frontend_Panes_PlayerArtifactsPane.md | 9 +- docs/modules/Frontend_Panes_SettingsPane.md | 12 +- .../Frontend_Panes_UpgradeDetailsPane.md | 20 +- docs/modules/Frontend_Styles_colors.md | 29 - docs/modules/Frontend_Styles_dfstyles.md | 3 + ...Frontend_Styles_tailwind_config.export_.md | 3 - .../Frontend_Styles_tailwind_config.md | 25 - docs/modules/Frontend_Utils_AppHooks.md | 123 ++++- docs/modules/Frontend_Utils_EmitterHooks.md | 32 +- docs/modules/Frontend_Utils_EmitterUtils.md | 58 +- docs/modules/Frontend_Utils_KeyEmitters.md | 35 +- docs/modules/Frontend_Utils_Monomitter.md | 98 ---- docs/modules/Frontend_Utils_SettingsHooks.md | 6 +- .../Frontend_Utils_ShortcutConstants.md | 28 +- docs/modules/Frontend_Utils_constants.md | 17 +- docs/modules/Frontend_Views_ArtifactLink.md | 12 +- .../Frontend_Views_GameWindowLayout.md | 10 +- docs/modules/Frontend_Views_MenuBar.md | 37 -- docs/modules/Frontend_Views_ModalIcon.md | 200 ++++--- docs/modules/Frontend_Views_ModalPane.md | 22 +- docs/modules/Frontend_Views_PlanetCard.md | 20 + .../Frontend_Views_PlanetCardComponents.md | 66 +-- .../Frontend_Views_PlanetNotifications.md | 24 +- docs/modules/Frontend_Views_TopBar.md | 19 +- embedded_plugins/Getting-Started.ts | 8 +- embedded_plugins/Remote-Explorer.ts | 17 +- last_updated.txt | 2 +- package.json | 22 +- src/Backend/GameLogic/ArrivalUtils.ts | 14 +- src/Backend/GameLogic/ArtifactUtils.ts | 12 +- src/Backend/GameLogic/ContractCaller.ts | 50 -- src/Backend/GameLogic/ContractsAPI.ts | 466 +++++++++------- src/Backend/GameLogic/ConversationManager.tsx | 12 +- src/Backend/GameLogic/GameManager.ts | 393 ++++++++------ src/Backend/GameLogic/GameObjects.ts | 80 +-- src/Backend/GameLogic/GameUIManager.ts | 84 +-- .../GameLogic/InitialGameStateDownloader.ts | 21 +- src/Backend/GameLogic/LayeredMap.ts | 4 +- src/Backend/GameLogic/Lazy.ts | 20 + .../GameLogic/PaidConversationManager.tsx | 4 +- src/Backend/GameLogic/PluginManager.tsx | 6 +- src/Backend/GameLogic/TutorialManager.ts | 2 +- src/Backend/GameLogic/ViewportEntities.ts | 2 +- src/Backend/Interfaces/DiagnosticUpdater.ts | 15 - src/Backend/Miner/ChunkUtils.ts | 6 +- src/Backend/Miner/MinerManager.ts | 16 +- src/Backend/Miner/MiningPatterns.ts | 2 +- src/Backend/Miner/miner.worker.ts | 10 +- src/Backend/Miner/permutation.ts | 4 +- src/Backend/Network/AccountManager.ts | 87 +++ src/Backend/Network/Blockchain.ts | 85 +++ src/Backend/Network/ChainAPI.ts | 57 -- src/Backend/Network/ConversationAPI.ts | 2 +- src/Backend/Network/EthConnection.ts | 434 --------------- src/Backend/Network/EventLogger.ts | 25 +- src/Backend/Network/MessageAPI.ts | 4 +- .../Network/ThrottledConcurrentQueue.ts | 196 ------- src/Backend/Network/TxExecutor.ts | 229 -------- src/Backend/Network/UtilityServerAPI.ts | 47 +- src/Backend/Procedural/ArtifactProcgen.ts | 12 +- src/Backend/Procedural/ProcgenUtils.ts | 35 +- src/Backend/Storage/PersistentChunkStore.ts | 24 +- src/Backend/Storage/ReaderDataStore.ts | 16 +- src/Backend/Utils/BlockWaiter.ts | 21 - src/Backend/Utils/SnarkArgsHelper.ts | 42 +- src/Backend/Utils/TypeAssertions.ts | 46 +- src/Backend/Utils/Utils.ts | 131 +---- src/Backend/Utils/UtilsTypes.ts | 2 +- src/Backend/Utils/Wrapper.ts | 4 + src/Frontend/Components/AncientLabel.tsx | 4 +- src/Frontend/Components/ArtifactImage.tsx | 2 +- src/Frontend/Components/Btn.tsx | 28 +- src/Frontend/Components/CoreUI.tsx | 242 ++++++++- src/Frontend/Components/DisplayGasPrices.tsx | 2 +- src/Frontend/Components/Email.tsx | 4 +- .../Components/GameLandingPageComponents.tsx | 6 +- .../Components/GameWindowComponents.tsx | 4 +- src/Frontend/Components/IconButton.tsx | 26 +- src/Frontend/Components/Icons.tsx | 6 +- src/Frontend/Components/Input.tsx | 7 +- .../Components/Labels/ArtifactLabels.tsx | 4 +- .../Components/Labels/BiomeLabels.tsx | 2 +- src/Frontend/Components/Labels/Labels.tsx | 34 +- .../Components/Labels/MythicLabel.tsx | 8 +- .../Components/Labels/PlanetLabels.tsx | 100 ++-- .../Components/Labels/SpacetimeRipLabel.tsx | 2 +- src/Frontend/Components/OpenPaneButtons.tsx | 120 +++++ src/Frontend/Components/PlanetPreview.tsx | 10 +- src/Frontend/Components/ReadMore.tsx | 42 +- src/Frontend/Components/Text.tsx | 49 +- src/Frontend/Components/TextLoadingBar.tsx | 3 +- src/Frontend/Components/TextPreview.tsx | 62 ++- src/Frontend/EntryPoints/index.tsx | 8 +- src/Frontend/Game/ControllableCanvas.tsx | 2 +- src/Frontend/Game/NotificationManager.tsx | 40 +- src/Frontend/Game/Popups.ts | 24 +- src/Frontend/Game/Viewport.ts | 30 +- src/Frontend/Game/ViewportAnimation.ts | 2 +- src/Frontend/Game/WindowManager.ts | 2 +- src/Frontend/Pages/App.tsx | 25 +- src/Frontend/Pages/GameLandingPage.tsx | 272 +++++----- src/Frontend/Pages/GifMaker.tsx | 6 +- src/Frontend/Pages/LandingPage.tsx | 2 +- src/Frontend/Pages/PreviewPage.tsx | 4 +- src/Frontend/Pages/ShareArtifact.tsx | 2 +- src/Frontend/Pages/SharePlanet.tsx | 4 +- src/Frontend/Pages/TestArtifactImages.tsx | 5 +- src/Frontend/Pages/TxConfirmPopup.tsx | 17 +- src/Frontend/Pages/UnsubscribePage.tsx | 4 +- .../ArtifactConversationPane.tsx | 8 +- src/Frontend/Panes/ArtifactDetailsPane.tsx | 78 +-- src/Frontend/Panes/BroadcastPane.tsx | 96 ++-- src/Frontend/Panes/DiagnosticsPane.tsx | 65 ++- src/Frontend/Panes/ExplorePane.tsx | 172 +++--- src/Frontend/Panes/HatPane.tsx | 113 ++-- src/Frontend/Panes/HelpPane.tsx | 147 ++--- src/Frontend/Panes/HoverPlanetPane.tsx | 23 +- src/Frontend/Panes/LeaderboardPane.tsx | 8 +- .../ManagePlanetArtifacts/ArtifactActions.tsx | 4 +- .../ArtifactListItem.tsx | 28 +- .../ManagePlanetArtifacts/ArtifactsList.tsx | 16 +- .../Panes/ManagePlanetArtifacts/Find.tsx | 10 +- .../ManagePlanetArtifacts/ManageArtifacts.tsx | 30 +- .../ManagePlanetArtifactsPane.tsx | 70 +-- .../Panes/ManagePlanetArtifacts/Prospect.tsx | 14 +- .../Panes/ManagePlanetArtifacts/SortBy.tsx | 6 +- src/Frontend/Panes/OnboardingPane.tsx | 4 +- .../ConversationInfo.tsx | 7 +- .../PaidArtifactConversation/CurrencyView.tsx | 3 +- .../PaidArtifactConversationPane.tsx | 16 +- src/Frontend/Panes/PlanetContextPane.tsx | 148 +++--- src/Frontend/Panes/PlanetDetailsPane.tsx | 199 ------- src/Frontend/Panes/PlanetDexPane.tsx | 6 +- src/Frontend/Panes/PlayerArtifactsPane.tsx | 93 +--- src/Frontend/Panes/PlayerInfoPane.tsx | 4 +- src/Frontend/Panes/PluginEditorPane.tsx | 22 +- src/Frontend/Panes/PluginLibraryPane.tsx | 12 +- src/Frontend/Panes/SettingsPane.tsx | 172 +++--- src/Frontend/Panes/Tooltip.tsx | 7 +- src/Frontend/Panes/TooltipPanes.tsx | 4 +- src/Frontend/Panes/TutorialPane.tsx | 6 +- src/Frontend/Panes/TwitterVerifyPane.tsx | 221 ++++---- src/Frontend/Panes/UpgradeDetailsPane.tsx | 82 +-- src/Frontend/Panes/WithdrawSilverPane.tsx | 2 +- .../Renderers/Artifacts/ArtifactRenderer.ts | 4 +- .../Renderers/GameRenderer/EngineTypes.ts | 2 +- .../GameRenderer/Entities/AsteroidRenderer.ts | 4 +- .../Entities/BackgroundRenderer.ts | 6 +- .../GameRenderer/Entities/BeltRenderer.ts | 6 +- .../Entities/BlackDomainRenderer.ts | 4 +- .../GameRenderer/Entities/CircleRenderer.ts | 8 +- .../GameRenderer/Entities/LineRenderer.ts | 4 +- .../GameRenderer/Entities/MineBodyRenderer.ts | 4 +- .../GameRenderer/Entities/MineRenderer.ts | 2 +- .../GameRenderer/Entities/PerlinRenderer.ts | 8 +- .../GameRenderer/Entities/PerlinUtils.ts | 2 +- .../Entities/PlanetRenderManager.ts | 12 +- .../GameRenderer/Entities/PlanetRenderer.ts | 6 +- .../Entities/QuasarBodyRenderer.ts | 2 +- .../Entities/QuasarRayRenderer.ts | 2 +- .../GameRenderer/Entities/QuasarRenderer.ts | 2 +- .../GameRenderer/Entities/RectRenderer.ts | 6 +- .../GameRenderer/Entities/RingRenderer.ts | 4 +- .../GameRenderer/Entities/RuinsRenderer.ts | 2 +- .../Entities/SpacetimeRipRenderer.ts | 2 +- .../GameRenderer/Entities/SpriteRenderer.ts | 16 +- .../GameRenderer/Entities/TextRenderer.ts | 8 +- .../GameRenderer/Entities/VoyageRenderer.ts | 14 +- .../GameRenderer/Entities/WormholeRenderer.ts | 2 +- .../GameRenderer/Overlay2DRenderer.ts | 22 +- .../GameRenderer/Programs/AsteroidProgram.ts | 2 +- .../GameRenderer/Programs/BeltProgram.ts | 2 +- .../Programs/BlackDomainProgram.ts | 2 +- .../GameRenderer/Programs/CircleProgram.ts | 2 +- .../GameRenderer/Programs/LineProgram.ts | 2 +- .../GameRenderer/Programs/MaskProgram.ts | 2 +- .../GameRenderer/Programs/MineProgram.ts | 2 +- .../GameRenderer/Programs/PerlinProgram.ts | 4 +- .../GameRenderer/Programs/PlanetProgram.ts | 2 +- .../Programs/QuasarBodyProgram.ts | 2 +- .../GameRenderer/Programs/QuasarRayProgram.ts | 2 +- .../GameRenderer/Programs/RectProgram.ts | 2 +- .../GameRenderer/Programs/RingProgram.ts | 2 +- .../GameRenderer/Programs/RuinsProgram.ts | 2 +- .../Programs/SpacetimeRipProgram.ts | 2 +- .../GameRenderer/Programs/SpriteProgram.ts | 2 +- .../GameRenderer/Programs/TextProgram.ts | 2 +- .../Renderers/GameRenderer/Renderer.ts | 36 +- .../Renderers/GameRenderer/TextureManager.ts | 4 +- .../Renderers/GameRenderer/UIRenderer.ts | 6 +- .../GameRenderer/WebGL/GenericRenderer.ts | 10 +- src/Frontend/Renderers/GifRenderer.ts | 26 +- src/Frontend/Renderers/LandingPageCanvas.tsx | 2 +- .../PlanetscapeRenderer/PathRenderer.ts | 2 +- .../PlanetscapeRenderer/PlanetIcons.tsx | 41 +- .../PlanetscapeRenderer/PlanetScape.tsx | 8 +- .../PlanetScapeRenderer.ts | 4 +- src/Frontend/Styles/colors.js | 13 - src/Frontend/Styles/dfstyles.ts | 60 ++- src/Frontend/Styles/tailwind.config.js | 5 - src/Frontend/Utils/AppHooks.ts | 122 ++++- src/Frontend/Utils/EmitterHooks.ts | 3 +- src/Frontend/Utils/EmitterUtils.ts | 2 +- src/Frontend/Utils/Hats.ts | 2 +- src/Frontend/Utils/KeyEmitters.ts | 15 +- src/Frontend/Utils/Monomitter.ts | 54 -- src/Frontend/Utils/SettingsHooks.tsx | 53 +- src/Frontend/Utils/ShortcutConstants.ts | 22 +- src/Frontend/Utils/constants.ts | 13 +- src/Frontend/Views/ArtifactLink.tsx | 26 +- src/Frontend/Views/DarkForestTips.tsx | 50 +- src/Frontend/Views/EmojiPicker.tsx | 36 +- .../Views/EmojiPlanetNotification.tsx | 14 +- src/Frontend/Views/GameWindowLayout.tsx | 276 +++++----- src/Frontend/Views/Leaderboard.tsx | 36 +- src/Frontend/Views/MenuBar.tsx | 82 --- src/Frontend/Views/ModalIcon.tsx | 257 ++++++--- src/Frontend/Views/ModalPane.tsx | 195 +++++-- src/Frontend/Views/Notifications.tsx | 14 +- src/Frontend/Views/OwnedPluginView.tsx | 2 +- src/Frontend/Views/PlanetCard.tsx | 263 +++++---- src/Frontend/Views/PlanetCardComponents.tsx | 73 +-- src/Frontend/Views/PlanetNotifications.tsx | 82 +-- src/Frontend/Views/SendResources.tsx | 58 +- src/Frontend/Views/Share.tsx | 43 +- src/Frontend/Views/TabbedView.tsx | 8 +- src/Frontend/Views/Terminal.tsx | 4 +- src/Frontend/Views/TopBar.tsx | 260 ++------- src/Frontend/Views/UpgradePreview.tsx | 13 +- src/Frontend/Views/WithdrawSilver.tsx | 10 +- src/_types/darkforest/api/ChunkStoreTypes.ts | 2 +- src/_types/global/GlobalTypes.ts | 10 +- yarn.lock | 54 +- 302 files changed, 5778 insertions(+), 7177 deletions(-) delete mode 100644 docs/classes/Backend_GameLogic_ContractCaller.ContractCaller.md rename docs/classes/{Backend_GameLogic_ContractsAPI.default.md => Backend_GameLogic_ContractsAPI.ContractsAPI.md} (63%) create mode 100644 docs/classes/Backend_GameLogic_Lazy.Lazy.md delete mode 100644 docs/classes/Backend_Network_EthConnection.default.md delete mode 100644 docs/classes/Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md delete mode 100644 docs/classes/Backend_Network_TxExecutor.TxExecutor.md delete mode 100644 docs/classes/Backend_Utils_BlockWaiter.BlockWaiter.md create mode 100644 docs/enums/Backend_Network_EventLogger.EventType.md delete mode 100644 docs/enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md delete mode 100644 docs/interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md create mode 100644 docs/interfaces/Backend_Network_AccountManager.Account.md delete mode 100644 docs/interfaces/Backend_Network_TxExecutor.PendingTransaction.md delete mode 100644 docs/interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md delete mode 100644 docs/interfaces/Frontend_Components_Btn.BtnProps.md delete mode 100644 docs/interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md create mode 100644 docs/interfaces/Frontend_Views_ModalPane.ModalFrame.md create mode 100644 docs/interfaces/Frontend_Views_ModalPane.ModalHandle.md delete mode 100644 docs/modules/Backend_GameLogic_ContractCaller.md create mode 100644 docs/modules/Backend_GameLogic_Lazy.md delete mode 100644 docs/modules/Backend_Interfaces_DiagnosticUpdater.md create mode 100644 docs/modules/Backend_Network_AccountManager.md create mode 100644 docs/modules/Backend_Network_Blockchain.md delete mode 100644 docs/modules/Backend_Network_ChainAPI.md delete mode 100644 docs/modules/Backend_Network_EthConnection.md delete mode 100644 docs/modules/Backend_Network_ThrottledConcurrentQueue.md delete mode 100644 docs/modules/Backend_Network_TxExecutor.md delete mode 100644 docs/modules/Backend_Utils_BlockWaiter.md create mode 100644 docs/modules/Frontend_Components_OpenPaneButtons.md delete mode 100644 docs/modules/Frontend_Panes_PlanetDetailsPane.md delete mode 100644 docs/modules/Frontend_Styles_colors.md delete mode 100644 docs/modules/Frontend_Styles_tailwind_config.export_.md delete mode 100644 docs/modules/Frontend_Styles_tailwind_config.md delete mode 100644 docs/modules/Frontend_Utils_Monomitter.md delete mode 100644 docs/modules/Frontend_Views_MenuBar.md delete mode 100644 src/Backend/GameLogic/ContractCaller.ts create mode 100644 src/Backend/GameLogic/Lazy.ts delete mode 100644 src/Backend/Interfaces/DiagnosticUpdater.ts create mode 100644 src/Backend/Network/AccountManager.ts create mode 100644 src/Backend/Network/Blockchain.ts delete mode 100644 src/Backend/Network/ChainAPI.ts delete mode 100644 src/Backend/Network/EthConnection.ts delete mode 100644 src/Backend/Network/ThrottledConcurrentQueue.ts delete mode 100644 src/Backend/Network/TxExecutor.ts delete mode 100644 src/Backend/Utils/BlockWaiter.ts create mode 100644 src/Frontend/Components/OpenPaneButtons.tsx delete mode 100644 src/Frontend/Panes/PlanetDetailsPane.tsx delete mode 100644 src/Frontend/Styles/colors.js delete mode 100644 src/Frontend/Styles/tailwind.config.js delete mode 100644 src/Frontend/Utils/Monomitter.ts delete mode 100644 src/Frontend/Views/MenuBar.tsx diff --git a/.prettierignore b/.prettierignore index 50046eb2..d8fbf328 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,4 @@ embedded_plugins/dist/ public/ src/styles/font/ src/styles/icomoon/ +embedded_plugins/Remote-Explorer.ts diff --git a/docs/README.md b/docs/README.md index 5d4e7363..e97d850d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,7 +6,6 @@ - [Backend/GameLogic/ArrivalUtils](modules/Backend_GameLogic_ArrivalUtils.md) - [Backend/GameLogic/ArtifactUtils](modules/Backend_GameLogic_ArtifactUtils.md) -- [Backend/GameLogic/ContractCaller](modules/Backend_GameLogic_ContractCaller.md) - [Backend/GameLogic/ContractsAPI](modules/Backend_GameLogic_ContractsAPI.md) - [Backend/GameLogic/ConversationManager](modules/Backend_GameLogic_ConversationManager.md) - [Backend/GameLogic/GameManager](modules/Backend_GameLogic_GameManager.md) @@ -14,23 +13,21 @@ - [Backend/GameLogic/GameUIManager](modules/Backend_GameLogic_GameUIManager.md) - [Backend/GameLogic/InitialGameStateDownloader](modules/Backend_GameLogic_InitialGameStateDownloader.md) - [Backend/GameLogic/LayeredMap](modules/Backend_GameLogic_LayeredMap.md) +- [Backend/GameLogic/Lazy](modules/Backend_GameLogic_Lazy.md) - [Backend/GameLogic/PaidConversationManager](modules/Backend_GameLogic_PaidConversationManager.md) - [Backend/GameLogic/PluginManager](modules/Backend_GameLogic_PluginManager.md) - [Backend/GameLogic/TutorialManager](modules/Backend_GameLogic_TutorialManager.md) - [Backend/GameLogic/ViewportEntities](modules/Backend_GameLogic_ViewportEntities.md) -- [Backend/Interfaces/DiagnosticUpdater](modules/Backend_Interfaces_DiagnosticUpdater.md) - [Backend/Miner/ChunkUtils](modules/Backend_Miner_ChunkUtils.md) - [Backend/Miner/MinerManager](modules/Backend_Miner_MinerManager.md) - [Backend/Miner/MiningPatterns](modules/Backend_Miner_MiningPatterns.md) - [Backend/Miner/permutation](modules/Backend_Miner_permutation.md) -- [Backend/Network/ChainAPI](modules/Backend_Network_ChainAPI.md) +- [Backend/Network/AccountManager](modules/Backend_Network_AccountManager.md) +- [Backend/Network/Blockchain](modules/Backend_Network_Blockchain.md) - [Backend/Network/ConversationAPI](modules/Backend_Network_ConversationAPI.md) -- [Backend/Network/EthConnection](modules/Backend_Network_EthConnection.md) - [Backend/Network/EventLogger](modules/Backend_Network_EventLogger.md) - [Backend/Network/LeaderboardApi](modules/Backend_Network_LeaderboardApi.md) - [Backend/Network/MessageAPI](modules/Backend_Network_MessageAPI.md) -- [Backend/Network/ThrottledConcurrentQueue](modules/Backend_Network_ThrottledConcurrentQueue.md) -- [Backend/Network/TxExecutor](modules/Backend_Network_TxExecutor.md) - [Backend/Network/UtilityServerAPI](modules/Backend_Network_UtilityServerAPI.md) - [Backend/Plugins/EmbeddedPluginLoader](modules/Backend_Plugins_EmbeddedPluginLoader.md) - [Backend/Plugins/PluginProcess](modules/Backend_Plugins_PluginProcess.md) @@ -45,7 +42,6 @@ - [Backend/Storage/PersistentChunkStore](modules/Backend_Storage_PersistentChunkStore.md) - [Backend/Storage/ReaderDataStore](modules/Backend_Storage_ReaderDataStore.md) - [Backend/Utils/Animation](modules/Backend_Utils_Animation.md) -- [Backend/Utils/BlockWaiter](modules/Backend_Utils_BlockWaiter.md) - [Backend/Utils/Coordinates](modules/Backend_Utils_Coordinates.md) - [Backend/Utils/SnarkArgsHelper](modules/Backend_Utils_SnarkArgsHelper.md) - [Backend/Utils/TypeAssertions](modules/Backend_Utils_TypeAssertions.md) @@ -79,6 +75,7 @@ - [Frontend/Components/Labels/SpacetimeRipLabel](modules/Frontend_Components_Labels_SpacetimeRipLabel.md) - [Frontend/Components/Labels/WastelandLabel](modules/Frontend_Components_Labels_WastelandLabel.md) - [Frontend/Components/LoadingSpinner](modules/Frontend_Components_LoadingSpinner.md) +- [Frontend/Components/OpenPaneButtons](modules/Frontend_Components_OpenPaneButtons.md) - [Frontend/Components/PlanetPreview](modules/Frontend_Components_PlanetPreview.md) - [Frontend/Components/ReadMore](modules/Frontend_Components_ReadMore.md) - [Frontend/Components/RemoteModal](modules/Frontend_Components_RemoteModal.md) @@ -131,7 +128,6 @@ - [Frontend/Panes/PaidArtifactConversation/CurrencyView](modules/Frontend_Panes_PaidArtifactConversation_CurrencyView.md) - [Frontend/Panes/PaidArtifactConversation/PaidArtifactConversationPane](modules/Frontend_Panes_PaidArtifactConversation_PaidArtifactConversationPane.md) - [Frontend/Panes/PlanetContextPane](modules/Frontend_Panes_PlanetContextPane.md) -- [Frontend/Panes/PlanetDetailsPane](modules/Frontend_Panes_PlanetDetailsPane.md) - [Frontend/Panes/PlanetDexPane](modules/Frontend_Panes_PlanetDexPane.md) - [Frontend/Panes/PlayerArtifactsPane](modules/Frontend_Panes_PlayerArtifactsPane.md) - [Frontend/Panes/PlayerInfoPane](modules/Frontend_Panes_PlayerInfoPane.md) @@ -214,9 +210,7 @@ - [Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer](modules/Frontend_Renderers_PlanetscapeRenderer_PlanetScapeRenderer.md) - [Frontend/Styles/Colors](modules/Frontend_Styles_Colors.md) - [Frontend/Styles/Mixins](modules/Frontend_Styles_Mixins.md) -- [Frontend/Styles/colors](modules/Frontend_Styles_colors.md) - [Frontend/Styles/dfstyles](modules/Frontend_Styles_dfstyles.md) -- [Frontend/Styles/tailwind.config](modules/Frontend_Styles_tailwind_config.md) - [Frontend/Utils/AppHooks](modules/Frontend_Utils_AppHooks.md) - [Frontend/Utils/BrowserChecks](modules/Frontend_Utils_BrowserChecks.md) - [Frontend/Utils/EmitterHooks](modules/Frontend_Utils_EmitterHooks.md) @@ -224,7 +218,6 @@ - [Frontend/Utils/Hats](modules/Frontend_Utils_Hats.md) - [Frontend/Utils/Hooks](modules/Frontend_Utils_Hooks.md) - [Frontend/Utils/KeyEmitters](modules/Frontend_Utils_KeyEmitters.md) -- [Frontend/Utils/Monomitter](modules/Frontend_Utils_Monomitter.md) - [Frontend/Utils/SettingsHooks](modules/Frontend_Utils_SettingsHooks.md) - [Frontend/Utils/ShortcutConstants](modules/Frontend_Utils_ShortcutConstants.md) - [Frontend/Utils/TerminalTypes](modules/Frontend_Utils_TerminalTypes.md) @@ -240,7 +233,6 @@ - [Frontend/Views/GameWindowLayout](modules/Frontend_Views_GameWindowLayout.md) - [Frontend/Views/GenericErrorBoundary](modules/Frontend_Views_GenericErrorBoundary.md) - [Frontend/Views/Leaderboard](modules/Frontend_Views_Leaderboard.md) -- [Frontend/Views/MenuBar](modules/Frontend_Views_MenuBar.md) - [Frontend/Views/ModalIcon](modules/Frontend_Views_ModalIcon.md) - [Frontend/Views/ModalPane](modules/Frontend_Views_ModalPane.md) - [Frontend/Views/Notifications](modules/Frontend_Views_Notifications.md) diff --git a/docs/classes/Backend_GameLogic_ContractCaller.ContractCaller.md b/docs/classes/Backend_GameLogic_ContractCaller.ContractCaller.md deleted file mode 100644 index 4c1fd92e..00000000 --- a/docs/classes/Backend_GameLogic_ContractCaller.ContractCaller.md +++ /dev/null @@ -1,83 +0,0 @@ -# Class: ContractCaller - -[Backend/GameLogic/ContractCaller](../modules/Backend_GameLogic_ContractCaller.md).ContractCaller - -## Table of contents - -### Constructors - -- [constructor](Backend_GameLogic_ContractCaller.ContractCaller.md#constructor) - -### Properties - -- [callQueue](Backend_GameLogic_ContractCaller.ContractCaller.md#callqueue) -- [diagnosticsUpdater](Backend_GameLogic_ContractCaller.ContractCaller.md#diagnosticsupdater) -- [MAX_RETRIES](Backend_GameLogic_ContractCaller.ContractCaller.md#max_retries) - -### Methods - -- [makeCall](Backend_GameLogic_ContractCaller.ContractCaller.md#makecall) -- [setDiagnosticUpdater](Backend_GameLogic_ContractCaller.ContractCaller.md#setdiagnosticupdater) - -## Constructors - -### constructor - -• **new ContractCaller**() - -## Properties - -### callQueue - -• `Private` `Readonly` **callQueue**: [`ThrottledConcurrentQueue`](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md) - ---- - -### diagnosticsUpdater - -• `Private` `Optional` **diagnosticsUpdater**: [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) - ---- - -### MAX_RETRIES - -▪ `Static` `Private` `Readonly` **MAX_RETRIES**: `12` - -## Methods - -### makeCall - -▸ **makeCall**<`T`\>(`contractViewFunction`, `args?`): `Promise`<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Default value | -| :--------------------- | :----------------------- | :------------ | -| `contractViewFunction` | `ContractFunction`<`T`\> | `undefined` | -| `args` | `unknown`[] | `[]` | - -#### Returns - -`Promise`<`T`\> - ---- - -### setDiagnosticUpdater - -▸ **setDiagnosticUpdater**(`diagnosticUpdater?`): `void` - -#### Parameters - -| Name | Type | -| :------------------- | :--------------------------------------------------------------------------------------------- | -| `diagnosticUpdater?` | [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) | - -#### Returns - -`void` diff --git a/docs/classes/Backend_GameLogic_ContractsAPI.default.md b/docs/classes/Backend_GameLogic_ContractsAPI.ContractsAPI.md similarity index 63% rename from docs/classes/Backend_GameLogic_ContractsAPI.default.md rename to docs/classes/Backend_GameLogic_ContractsAPI.ContractsAPI.md index b2e9ec30..b60c44a9 100644 --- a/docs/classes/Backend_GameLogic_ContractsAPI.default.md +++ b/docs/classes/Backend_GameLogic_ContractsAPI.ContractsAPI.md @@ -1,94 +1,98 @@ -# Class: default +# Class: ContractsAPI -[Backend/GameLogic/ContractsAPI](../modules/Backend_GameLogic_ContractsAPI.md).default +[Backend/GameLogic/ContractsAPI](../modules/Backend_GameLogic_ContractsAPI.md).ContractsAPI -Roughly contains methods that map 1:1 with functions that live -in the contract. +Roughly contains methods that map 1:1 with functions that live in the contract. Responsible for +reading and writing to and from the blockchain. + +**`todo`** don't inherit from {@link EventEmitter}. instead use {@link Monomitter} ## Hierarchy - `EventEmitter` - ↳ **`default`** + ↳ **`ContractsAPI`** ## Table of contents ### Constructors -- [constructor](Backend_GameLogic_ContractsAPI.default.md#constructor) +- [constructor](Backend_GameLogic_ContractsAPI.ContractsAPI.md#constructor) ### Properties -- [contractCaller](Backend_GameLogic_ContractsAPI.default.md#contractcaller) -- [coreContract](Backend_GameLogic_ContractsAPI.default.md#corecontract) -- [diagnosticsUpdater](Backend_GameLogic_ContractsAPI.default.md#diagnosticsupdater) -- [ethConnection](Backend_GameLogic_ContractsAPI.default.md#ethconnection) -- [gettersContract](Backend_GameLogic_ContractsAPI.default.md#getterscontract) -- [gptCreditContract](Backend_GameLogic_ContractsAPI.default.md#gptcreditcontract) -- [txRequestExecutor](Backend_GameLogic_ContractsAPI.default.md#txrequestexecutor) +- [contractCaller](Backend_GameLogic_ContractsAPI.ContractsAPI.md#contractcaller) +- [ethConnection](Backend_GameLogic_ContractsAPI.ContractsAPI.md#ethconnection) +- [txExecutor](Backend_GameLogic_ContractsAPI.ContractsAPI.md#txexecutor) +- [MIN_BALANCE](Backend_GameLogic_ContractsAPI.ContractsAPI.md#min_balance) + +### Accessors + +- [coreContract](Backend_GameLogic_ContractsAPI.ContractsAPI.md#corecontract) +- [gettersContract](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getterscontract) +- [gptCreditContract](Backend_GameLogic_ContractsAPI.ContractsAPI.md#gptcreditcontract) +- [whitelistContract](Backend_GameLogic_ContractsAPI.ContractsAPI.md#whitelistcontract) ### Methods -- [activateArtifact](Backend_GameLogic_ContractsAPI.default.md#activateartifact) -- [bulkGetArtifacts](Backend_GameLogic_ContractsAPI.default.md#bulkgetartifacts) -- [bulkGetArtifactsOnPlanets](Backend_GameLogic_ContractsAPI.default.md#bulkgetartifactsonplanets) -- [bulkGetPlanets](Backend_GameLogic_ContractsAPI.default.md#bulkgetplanets) -- [buyGPTCredits](Backend_GameLogic_ContractsAPI.default.md#buygptcredits) -- [buyHat](Backend_GameLogic_ContractsAPI.default.md#buyhat) -- [deactivateArtifact](Backend_GameLogic_ContractsAPI.default.md#deactivateartifact) -- [depositArtifact](Backend_GameLogic_ContractsAPI.default.md#depositartifact) -- [destroy](Backend_GameLogic_ContractsAPI.default.md#destroy) -- [findArtifact](Backend_GameLogic_ContractsAPI.default.md#findartifact) -- [getAccount](Backend_GameLogic_ContractsAPI.default.md#getaccount) -- [getAllArrivals](Backend_GameLogic_ContractsAPI.default.md#getallarrivals) -- [getArrival](Backend_GameLogic_ContractsAPI.default.md#getarrival) -- [getArrivalsForPlanet](Backend_GameLogic_ContractsAPI.default.md#getarrivalsforplanet) -- [getArtifactById](Backend_GameLogic_ContractsAPI.default.md#getartifactbyid) -- [getBalance](Backend_GameLogic_ContractsAPI.default.md#getbalance) -- [getConstants](Backend_GameLogic_ContractsAPI.default.md#getconstants) -- [getContractAddress](Backend_GameLogic_ContractsAPI.default.md#getcontractaddress) -- [getContractBalance](Backend_GameLogic_ContractsAPI.default.md#getcontractbalance) -- [getGPTCreditBalance](Backend_GameLogic_ContractsAPI.default.md#getgptcreditbalance) -- [getGPTCreditPriceEther](Backend_GameLogic_ContractsAPI.default.md#getgptcreditpriceether) -- [getPlanetById](Backend_GameLogic_ContractsAPI.default.md#getplanetbyid) -- [getPlayerArtifacts](Backend_GameLogic_ContractsAPI.default.md#getplayerartifacts) -- [getPlayerById](Backend_GameLogic_ContractsAPI.default.md#getplayerbyid) -- [getPlayers](Backend_GameLogic_ContractsAPI.default.md#getplayers) -- [getRevealedCoordsByIdIfExists](Backend_GameLogic_ContractsAPI.default.md#getrevealedcoordsbyidifexists) -- [getRevealedPlanetsCoords](Backend_GameLogic_ContractsAPI.default.md#getrevealedplanetscoords) -- [getTokenMintEndTimestamp](Backend_GameLogic_ContractsAPI.default.md#gettokenmintendtimestamp) -- [getTouchedPlanetIds](Backend_GameLogic_ContractsAPI.default.md#gettouchedplanetids) -- [getWorldRadius](Backend_GameLogic_ContractsAPI.default.md#getworldradius) -- [initializePlayer](Backend_GameLogic_ContractsAPI.default.md#initializeplayer) -- [makeCall](Backend_GameLogic_ContractsAPI.default.md#makecall) -- [move](Backend_GameLogic_ContractsAPI.default.md#move) -- [prospectPlanet](Backend_GameLogic_ContractsAPI.default.md#prospectplanet) -- [removeEventListeners](Backend_GameLogic_ContractsAPI.default.md#removeeventlisteners) -- [reveal](Backend_GameLogic_ContractsAPI.default.md#reveal) -- [setDiagnosticUpdater](Backend_GameLogic_ContractsAPI.default.md#setdiagnosticupdater) -- [setupEventListeners](Backend_GameLogic_ContractsAPI.default.md#setupeventlisteners) -- [transferOwnership](Backend_GameLogic_ContractsAPI.default.md#transferownership) -- [upgradePlanet](Backend_GameLogic_ContractsAPI.default.md#upgradeplanet) -- [waitFor](Backend_GameLogic_ContractsAPI.default.md#waitfor) -- [withdrawArtifact](Backend_GameLogic_ContractsAPI.default.md#withdrawartifact) -- [withdrawSilver](Backend_GameLogic_ContractsAPI.default.md#withdrawsilver) -- [create](Backend_GameLogic_ContractsAPI.default.md#create) +- [activateArtifact](Backend_GameLogic_ContractsAPI.ContractsAPI.md#activateartifact) +- [afterTransaction](Backend_GameLogic_ContractsAPI.ContractsAPI.md#aftertransaction) +- [beforeTransaction](Backend_GameLogic_ContractsAPI.ContractsAPI.md#beforetransaction) +- [bulkGetArtifacts](Backend_GameLogic_ContractsAPI.ContractsAPI.md#bulkgetartifacts) +- [bulkGetArtifactsOnPlanets](Backend_GameLogic_ContractsAPI.ContractsAPI.md#bulkgetartifactsonplanets) +- [bulkGetPlanets](Backend_GameLogic_ContractsAPI.ContractsAPI.md#bulkgetplanets) +- [buyGPTCredits](Backend_GameLogic_ContractsAPI.ContractsAPI.md#buygptcredits) +- [buyHat](Backend_GameLogic_ContractsAPI.ContractsAPI.md#buyhat) +- [deactivateArtifact](Backend_GameLogic_ContractsAPI.ContractsAPI.md#deactivateartifact) +- [depositArtifact](Backend_GameLogic_ContractsAPI.ContractsAPI.md#depositartifact) +- [destroy](Backend_GameLogic_ContractsAPI.ContractsAPI.md#destroy) +- [findArtifact](Backend_GameLogic_ContractsAPI.ContractsAPI.md#findartifact) +- [getAccount](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getaccount) +- [getAllArrivals](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getallarrivals) +- [getArrival](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getarrival) +- [getArrivalsForPlanet](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getarrivalsforplanet) +- [getArtifactById](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getartifactbyid) +- [getBalance](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getbalance) +- [getConstants](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getconstants) +- [getContractAddress](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getcontractaddress) +- [getContractBalance](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getcontractbalance) +- [getGPTCreditBalance](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getgptcreditbalance) +- [getGPTCreditPriceEther](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getgptcreditpriceether) +- [getPlanetById](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getplanetbyid) +- [getPlayerArtifacts](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getplayerartifacts) +- [getPlayerById](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getplayerbyid) +- [getPlayers](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getplayers) +- [getRevealedCoordsByIdIfExists](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getrevealedcoordsbyidifexists) +- [getRevealedPlanetsCoords](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getrevealedplanetscoords) +- [getTokenMintEndTimestamp](Backend_GameLogic_ContractsAPI.ContractsAPI.md#gettokenmintendtimestamp) +- [getTouchedPlanetIds](Backend_GameLogic_ContractsAPI.ContractsAPI.md#gettouchedplanetids) +- [getWorldRadius](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getworldradius) +- [hasAccount](Backend_GameLogic_ContractsAPI.ContractsAPI.md#hasaccount) +- [initializePlayer](Backend_GameLogic_ContractsAPI.ContractsAPI.md#initializeplayer) +- [makeCall](Backend_GameLogic_ContractsAPI.ContractsAPI.md#makecall) +- [move](Backend_GameLogic_ContractsAPI.ContractsAPI.md#move) +- [prospectPlanet](Backend_GameLogic_ContractsAPI.ContractsAPI.md#prospectplanet) +- [removeEventListeners](Backend_GameLogic_ContractsAPI.ContractsAPI.md#removeeventlisteners) +- [reveal](Backend_GameLogic_ContractsAPI.ContractsAPI.md#reveal) +- [setDiagnosticUpdater](Backend_GameLogic_ContractsAPI.ContractsAPI.md#setdiagnosticupdater) +- [setupEventListeners](Backend_GameLogic_ContractsAPI.ContractsAPI.md#setupeventlisteners) +- [transferOwnership](Backend_GameLogic_ContractsAPI.ContractsAPI.md#transferownership) +- [upgradePlanet](Backend_GameLogic_ContractsAPI.ContractsAPI.md#upgradeplanet) +- [waitFor](Backend_GameLogic_ContractsAPI.ContractsAPI.md#waitfor) +- [withdrawArtifact](Backend_GameLogic_ContractsAPI.ContractsAPI.md#withdrawartifact) +- [withdrawSilver](Backend_GameLogic_ContractsAPI.ContractsAPI.md#withdrawsilver) ## Constructors ### constructor -• `Private` **new default**(`ethConnection`, `coreContract`, `gettersContract`, `gptCreditContract`, `nonce`) +• **new ContractsAPI**(`ethConnection`) #### Parameters -| Name | Type | -| :------------------ | :---------------------------------------------------- | -| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | -| `coreContract` | `DarkForestCore` | -| `gettersContract` | `DarkForestGetters` | -| `gptCreditContract` | `DarkForestGPTCredit` | -| `nonce` | `number` | +| Name | Type | +| :-------------- | :-------------- | +| `ethConnection` | `EthConnection` | #### Overrides @@ -98,43 +102,74 @@ EventEmitter.constructor ### contractCaller -• `Private` `Readonly` **contractCaller**: [`ContractCaller`](Backend_GameLogic_ContractCaller.ContractCaller.md) +• `Private` `Readonly` **contractCaller**: `ContractCaller` + +Instrumented {@link ThrottledConcurrentQueue} for blockchain reads. --- -### coreContract +### ethConnection + +• `Private` **ethConnection**: `EthConnection` -• `Private` **coreContract**: `DarkForestCore` +Our connection to the blockchain. In charge of low level networking, and also of the burner +wallet. --- -### diagnosticsUpdater +### txExecutor -• `Private` `Optional` **diagnosticsUpdater**: [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) +• `Private` `Readonly` **txExecutor**: `undefined` \| `TxExecutor` + +Instrumented {@link ThrottledConcurrentQueue} for blockchain writes. --- -### ethConnection +### MIN_BALANCE + +▪ `Static` `Private` `Readonly` **MIN_BALANCE**: `BigNumber` + +Don't allow users to submit txs if balance falls below this amount/ + +## Accessors + +### coreContract + +• `get` **coreContract**(): `DarkForestCore` + +#### Returns -• `Private` **ethConnection**: [`default`](Backend_Network_EthConnection.default.md) +`DarkForestCore` --- ### gettersContract -• `Private` **gettersContract**: `DarkForestGetters` +• `get` **gettersContract**(): `DarkForestGetters` + +#### Returns + +`DarkForestGetters` --- ### gptCreditContract -• `Private` **gptCreditContract**: `DarkForestGPTCredit` +• `get` **gptCreditContract**(): `DarkForestGPTCredit` + +#### Returns + +`DarkForestGPTCredit` --- -### txRequestExecutor +### whitelistContract + +• `get` **whitelistContract**(): `Whitelist` + +#### Returns -• `Private` `Readonly` **txRequestExecutor**: `undefined` \| [`TxExecutor`](Backend_Network_TxExecutor.TxExecutor.md) +`Whitelist` ## Methods @@ -154,6 +189,43 @@ EventEmitter.constructor --- +### afterTransaction + +▸ `Private` **afterTransaction**(`_txRequest`, `txDiagnosticInfo`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :----------------- | :------------------ | +| `_txRequest` | `QueuedTransaction` | +| `txDiagnosticInfo` | `unknown` | + +#### Returns + +`Promise`<`void`\> + +--- + +### beforeTransaction + +▸ `Private` **beforeTransaction**(`txRequest`): `Promise`<`void`\> + +This function is called by {@link TxExecutor} before each transaction. It gives the client an +opportunity to prevent a transaction from going through based on business logic or user +interaction. To prevent the queued transaction from being submitted, throw an Error. + +#### Parameters + +| Name | Type | +| :---------- | :------------------ | +| `txRequest` | `QueuedTransaction` | + +#### Returns + +`Promise`<`void`\> + +--- + ### bulkGetArtifacts ▸ **bulkGetArtifacts**(`artifactIds`, `onProgress?`): `Promise`<`Artifact`[]\> @@ -303,11 +375,11 @@ EventEmitter.constructor ### getAccount -▸ **getAccount**(): `EthAddress` +▸ **getAccount**(): `undefined` \| `EthAddress` #### Returns -`EthAddress` +`undefined` \| `EthAddress` --- @@ -378,11 +450,11 @@ EventEmitter.constructor ### getBalance -▸ **getBalance**(): `Promise`<`number`\> +▸ **getBalance**(): `Promise`<`BigNumber`\> #### Returns -`Promise`<`number`\> +`Promise`<`BigNumber`\> --- @@ -422,9 +494,9 @@ EventEmitter.constructor #### Parameters -| Name | Type | -| :-------- | :----------- | -| `address` | `EthAddress` | +| Name | Type | +| :-------- | :-------------------------- | +| `address` | `undefined` \| `EthAddress` | #### Returns @@ -460,13 +532,13 @@ EventEmitter.constructor ### getPlayerArtifacts -▸ **getPlayerArtifacts**(`playerId`, `onProgress?`): `Promise`<`Artifact`[]\> +▸ **getPlayerArtifacts**(`playerId?`, `onProgress?`): `Promise`<`Artifact`[]\> #### Parameters | Name | Type | | :------------ | :------------------------------ | -| `playerId` | `EthAddress` | +| `playerId?` | `EthAddress` | | `onProgress?` | (`percent`: `number`) => `void` | #### Returns @@ -578,6 +650,16 @@ EventEmitter.constructor --- +### hasAccount + +▸ **hasAccount**(): `boolean` + +#### Returns + +`boolean` + +--- + ### initializePlayer ▸ **initializePlayer**(`args`, `action`): `Promise`<`TransactionReceipt`\> @@ -688,9 +770,9 @@ EventEmitter.constructor #### Parameters -| Name | Type | -| :------------------- | :--------------------------------------------------------------------------------------------- | -| `diagnosticUpdater?` | [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) | +| Name | Type | +| :------------------- | :------------------ | +| `diagnosticUpdater?` | `DiagnosticUpdater` | #### Returns @@ -700,11 +782,11 @@ EventEmitter.constructor ### setupEventListeners -▸ **setupEventListeners**(): `void` +▸ **setupEventListeners**(): `Promise`<`void`\> #### Returns -`void` +`Promise`<`void`\> --- @@ -792,19 +874,3 @@ Given an unconfirmed (but submitted) transaction, emits the appropriate #### Returns `Promise`<`TransactionReceipt`\> - ---- - -### create - -▸ `Static` **create**(`ethConnection`): `Promise`<[`default`](Backend_GameLogic_ContractsAPI.default.md)\> - -#### Parameters - -| Name | Type | -| :-------------- | :---------------------------------------------------- | -| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | - -#### Returns - -`Promise`<[`default`](Backend_GameLogic_ContractsAPI.default.md)\> diff --git a/docs/classes/Backend_GameLogic_GameManager.default.md b/docs/classes/Backend_GameLogic_GameManager.default.md index 633f201d..ec8f8e48 100644 --- a/docs/classes/Backend_GameLogic_GameManager.default.md +++ b/docs/classes/Backend_GameLogic_GameManager.default.md @@ -17,11 +17,10 @@ ### Properties - [account](Backend_GameLogic_GameManager.default.md#account) -- [balance](Backend_GameLogic_GameManager.default.md#balance) -- [balanceInterval](Backend_GameLogic_GameManager.default.md#balanceinterval) - [contractConstants](Backend_GameLogic_GameManager.default.md#contractconstants) - [contractsAPI](Backend_GameLogic_GameManager.default.md#contractsapi) - [diagnostics](Backend_GameLogic_GameManager.default.md#diagnostics) +- [diagnosticsInterval](Backend_GameLogic_GameManager.default.md#diagnosticsinterval) - [endTimeSeconds](Backend_GameLogic_GameManager.default.md#endtimeseconds) - [entityStore](Backend_GameLogic_GameManager.default.md#entitystore) - [ethConnection](Backend_GameLogic_GameManager.default.md#ethconnection) @@ -31,13 +30,14 @@ - [hashRate](Backend_GameLogic_GameManager.default.md#hashrate) - [homeLocation](Backend_GameLogic_GameManager.default.md#homelocation) - [minerManager](Backend_GameLogic_GameManager.default.md#minermanager) -- [myBalance$](Backend_GameLogic_GameManager.default.md#mybalance$) - [myGPTCredits](Backend_GameLogic_GameManager.default.md#mygptcredits) - [myGPTCredits$](Backend_GameLogic_GameManager.default.md#mygptcredits$) - [persistentChunkStore](Backend_GameLogic_GameManager.default.md#persistentchunkstore) - [planetHashMimc](Backend_GameLogic_GameManager.default.md#planethashmimc) - [playerInterval](Backend_GameLogic_GameManager.default.md#playerinterval) - [players](Backend_GameLogic_GameManager.default.md#players) +- [playersUpdated$](Backend_GameLogic_GameManager.default.md#playersupdated$) +- [scoreboardInterval](Backend_GameLogic_GameManager.default.md#scoreboardinterval) - [settingsSubscription](Backend_GameLogic_GameManager.default.md#settingssubscription) - [snarkHelper](Backend_GameLogic_GameManager.default.md#snarkhelper) - [terminal](Backend_GameLogic_GameManager.default.md#terminal) @@ -105,8 +105,8 @@ - [getMyArtifactMap](Backend_GameLogic_GameManager.default.md#getmyartifactmap) - [getMyArtifacts](Backend_GameLogic_GameManager.default.md#getmyartifacts) - [getMyArtifactsUpdated$](Backend_GameLogic_GameManager.default.md#getmyartifactsupdated$) -- [getMyBalance](Backend_GameLogic_GameManager.default.md#getmybalance) -- [getMyBalanceEmitter](Backend_GameLogic_GameManager.default.md#getmybalanceemitter) +- [getMyBalance$](Backend_GameLogic_GameManager.default.md#getmybalance$) +- [getMyBalanceEth](Backend_GameLogic_GameManager.default.md#getmybalanceeth) - [getMyPlanetMap](Backend_GameLogic_GameManager.default.md#getmyplanetmap) - [getMyPlanets](Backend_GameLogic_GameManager.default.md#getmyplanets) - [getMyPlanetsUpdated$](Backend_GameLogic_GameManager.default.md#getmyplanetsupdated$) @@ -124,6 +124,7 @@ - [getPlanetsInRange](Backend_GameLogic_GameManager.default.md#getplanetsinrange) - [getPlanetsInWorldRectangle](Backend_GameLogic_GameManager.default.md#getplanetsinworldrectangle) - [getPlanetsWithIds](Backend_GameLogic_GameManager.default.md#getplanetswithids) +- [getPlayer](Backend_GameLogic_GameManager.default.md#getplayer) - [getPrivateKey](Backend_GameLogic_GameManager.default.md#getprivatekey) - [getProcgenUtils](Backend_GameLogic_GameManager.default.md#getprocgenutils) - [getRandomHomePlanetCoords](Backend_GameLogic_GameManager.default.md#getrandomhomeplanetcoords) @@ -168,6 +169,7 @@ - [onTxSubmit](Backend_GameLogic_GameManager.default.md#ontxsubmit) - [prospectPlanet](Backend_GameLogic_GameManager.default.md#prospectplanet) - [refreshMyGPTCredits](Backend_GameLogic_GameManager.default.md#refreshmygptcredits) +- [refreshScoreboard](Backend_GameLogic_GameManager.default.md#refreshscoreboard) - [refreshServerPlanetStates](Backend_GameLogic_GameManager.default.md#refreshserverplanetstates) - [refreshTwitters](Backend_GameLogic_GameManager.default.md#refreshtwitters) - [revealLocation](Backend_GameLogic_GameManager.default.md#reveallocation) @@ -175,6 +177,7 @@ - [setMinerCores](Backend_GameLogic_GameManager.default.md#setminercores) - [setMiningPattern](Backend_GameLogic_GameManager.default.md#setminingpattern) - [setPlanetEmoji](Backend_GameLogic_GameManager.default.md#setplanetemoji) +- [setPlayerTwitters](Backend_GameLogic_GameManager.default.md#setplayertwitters) - [setRadius](Backend_GameLogic_GameManager.default.md#setradius) - [setSnarkCacheSize](Backend_GameLogic_GameManager.default.md#setsnarkcachesize) - [signMessage](Backend_GameLogic_GameManager.default.md#signmessage) @@ -185,12 +188,14 @@ - [startExplore](Backend_GameLogic_GameManager.default.md#startexplore) - [stepConversation](Backend_GameLogic_GameManager.default.md#stepconversation) - [stopExplore](Backend_GameLogic_GameManager.default.md#stopexplore) +- [submitDisconnectTwitter](Backend_GameLogic_GameManager.default.md#submitdisconnecttwitter) - [submitPlanetMessage](Backend_GameLogic_GameManager.default.md#submitplanetmessage) +- [submitVerifyTwitter](Backend_GameLogic_GameManager.default.md#submitverifytwitter) - [transferOwnership](Backend_GameLogic_GameManager.default.md#transferownership) - [updateDiagnostics](Backend_GameLogic_GameManager.default.md#updatediagnostics) - [upgrade](Backend_GameLogic_GameManager.default.md#upgrade) +- [uploadDiagnostics](Backend_GameLogic_GameManager.default.md#uploaddiagnostics) - [verifyMessage](Backend_GameLogic_GameManager.default.md#verifymessage) -- [verifyTwitter](Backend_GameLogic_GameManager.default.md#verifytwitter) - [waitForPlanet](Backend_GameLogic_GameManager.default.md#waitforplanet) - [withdrawArtifact](Backend_GameLogic_GameManager.default.md#withdrawartifact) - [withdrawSilver](Backend_GameLogic_GameManager.default.md#withdrawsilver) @@ -200,7 +205,7 @@ ### constructor -• `Private` **new default**(`terminal`, `account`, `balance`, `players`, `touchedPlanets`, `allTouchedPlanetIds`, `revealedCoords`, `worldRadius`, `unprocessedArrivals`, `unprocessedPlanetArrivalIds`, `contractsAPI`, `contractConstants`, `persistentChunkStore`, `snarkHelper`, `homeLocation`, `useMockHash`, `artifacts`, `ethConnection`, `gptCreditPriceEther`, `myGPTCredits`) +• `Private` **new default**(`terminal`, `account`, `players`, `touchedPlanets`, `allTouchedPlanetIds`, `revealedCoords`, `worldRadius`, `unprocessedArrivals`, `unprocessedPlanetArrivalIds`, `contractsAPI`, `contractConstants`, `persistentChunkStore`, `snarkHelper`, `homeLocation`, `useMockHash`, `artifacts`, `ethConnection`, `gptCreditPriceEther`, `myGPTCredits`) #### Parameters @@ -208,7 +213,6 @@ | :---------------------------- | :-------------------------------------------------------------------------------------------------------------- | | `terminal` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | | `account` | `undefined` \| `EthAddress` | -| `balance` | `number` | | `players` | `Map`<`string`, `Player`\> | | `touchedPlanets` | `Map`<`LocationId`, `Planet`\> | | `allTouchedPlanetIds` | `Set`<`LocationId`\> | @@ -216,14 +220,14 @@ | `worldRadius` | `number` | | `unprocessedArrivals` | `Map`<`VoyageId`, `QueuedArrival`\> | | `unprocessedPlanetArrivalIds` | `Map`<`LocationId`, `VoyageId`[]\> | -| `contractsAPI` | [`default`](Backend_GameLogic_ContractsAPI.default.md) | +| `contractsAPI` | [`ContractsAPI`](Backend_GameLogic_ContractsAPI.ContractsAPI.md) | | `contractConstants` | [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) | | `persistentChunkStore` | [`default`](Backend_Storage_PersistentChunkStore.default.md) | | `snarkHelper` | [`default`](Backend_Utils_SnarkArgsHelper.default.md) | | `homeLocation` | `undefined` \| `WorldLocation` | | `useMockHash` | `boolean` | | `artifacts` | `Map`<`ArtifactId`, `Artifact`\> | -| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | +| `ethConnection` | `EthConnection` | | `gptCreditPriceEther` | `number` | | `myGPTCredits` | `number` | @@ -243,27 +247,6 @@ contract and view it without be able to make any moves. --- -### balance - -• `Private` **balance**: `number` - -This is kept relatively up-to-date with the balance of the player's wallet on the latest block -of whatever blockchain we're connected to. - -**`todo`** move this into a new `PlayerState` class. - ---- - -### balanceInterval - -• `Private` **balanceInterval**: `Timeout` - -Handle to an interval that periodically refreshes the player's balance. - -**`todo`** move this into a new `PlayerState` class. - ---- - ### contractConstants • `Private` `Readonly` **contractConstants**: [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) @@ -277,7 +260,7 @@ correct universe, or the time multiplier, which allows us to tune how quickly vo ### contractsAPI -• `Private` `Readonly` **contractsAPI**: [`default`](Backend_GameLogic_ContractsAPI.default.md) +• `Private` `Readonly` **contractsAPI**: [`ContractsAPI`](Backend_GameLogic_ContractsAPI.ContractsAPI.md) Allows us to make contract calls, and execute transactions. Be careful about how you use this guy. You don't want to cause your client to send an excessive amount of traffic to whatever @@ -289,19 +272,27 @@ points: - data that needs to be fetched often should be fetched in bulk. - rate limit smart contract calls (reads from the blockchain), implemented by - [ContractCaller](Backend_GameLogic_ContractCaller.ContractCaller.md) and transactions (writes to the blockchain on behalf of the player), - implemented by [TxExecutor](Backend_Network_TxExecutor.TxExecutor.md) via two separately tuned [ThrottledConcurrentQueue](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md)s. + {@link ContractCaller} and transactions (writes to the blockchain on behalf of the player), + implemented by {@link TxExecutor} via two separately tuned {@link ThrottledConcurrentQueue}s. --- ### diagnostics -• `Private` **diagnostics**: [`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) +• `Private` **diagnostics**: `Diagnostics` Diagnostic information about the game. --- +### diagnosticsInterval + +• `Private` **diagnosticsInterval**: `Timeout` + +Handle to an interval that periodically uploads diagnostic information from this client. + +--- + ### endTimeSeconds • `Private` `Readonly` **endTimeSeconds**: `number` = `1643587533` @@ -320,9 +311,9 @@ This variable contains the internal state of objects that live in the game world ### ethConnection -• `Private` `Readonly` **ethConnection**: [`default`](Backend_Network_EthConnection.default.md) +• `Private` `Readonly` **ethConnection**: `EthConnection` -An interface to the blockchain that is a little bit lower-level than {@link ContractsAPI}. It +An interface to the blockchain that is a little bit lower-level than [ContractsAPI](Backend_GameLogic_ContractsAPI.ContractsAPI.md). It allows us to do basic operations such as wait for a transaction to complete, check the player's address and balance, etc. @@ -341,7 +332,7 @@ Artifact Chat Bots. ### gptCreditPriceEtherEmitter$ -• `Private` **gptCreditPriceEtherEmitter$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +• `Private` **gptCreditPriceEtherEmitter$**: `Monomitter`<`number`\> Whenever the price of single GPT credit changes, we emit that event here. @@ -394,16 +385,6 @@ Manages the process of mining new space territory. --- -### myBalance$ - -• `Private` **myBalance$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> - -Any time the balance of the player's address changes, we publish an event here. - -**`todo`** move this into a new `PlayerState` class. - ---- - ### myGPTCredits • `Private` **myGPTCredits**: `number` @@ -416,7 +397,7 @@ The total amount of GPT credits that belong to the current player. ### myGPTCredits$ -• `Private` **myGPTCredits$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +• `Private` **myGPTCredits$**: `Monomitter`<`number`\> Whenever the amount of the GPT credits that this player owns changes, we publish an event here. @@ -484,9 +465,25 @@ and artifacts that do exist in the world. --- +### playersUpdated$ + +• `Readonly` **playersUpdated$**: `Monomitter`<`void`\> + +Whenever we refresh the players twitter accounts or scores, we publish an event here. + +--- + +### scoreboardInterval + +• `Private` **scoreboardInterval**: `Timeout` + +Handle to an interval that periodically refreshes the scoreboard from our webserver. + +--- + ### settingsSubscription -• `Private` **settingsSubscription**: `undefined` \| [`Subscription`](../modules/Frontend_Utils_Monomitter.md#subscription) +• `Private` **settingsSubscription**: `undefined` \| `Subscription` Subscription to act on setting changes @@ -884,11 +881,11 @@ Return a reference to the artifact map ### getArtifactUpdated$ -▸ **getArtifactUpdated$**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`ArtifactId`\> +▸ **getArtifactUpdated$**(): `Monomitter`<`ArtifactId`\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`ArtifactId`\> +`Monomitter`<`ArtifactId`\> --- @@ -1029,13 +1026,13 @@ of hashing. ### getDiagnostics -▸ **getDiagnostics**(): [`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) +▸ **getDiagnostics**(): `Diagnostics` Gets some diagnostic information about the game. Returns a copy, you can't modify it. #### Returns -[`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) +`Diagnostics` --- @@ -1175,11 +1172,11 @@ Gets the total amount of energy that lives on planets that the given player owns ### getEthConnection -▸ **getEthConnection**(): [`default`](Backend_Network_EthConnection.default.md) +▸ **getEthConnection**(): `EthConnection` #### Returns -[`default`](Backend_Network_EthConnection.default.md) +`EthConnection` --- @@ -1211,21 +1208,21 @@ voyages, planets, artifacts, and active wormholes, ### getGptCreditBalanceEmitter -▸ **getGptCreditBalanceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +▸ **getGptCreditBalanceEmitter**(): `Monomitter`<`number`\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +`Monomitter`<`number`\> --- ### getGptCreditPriceEmitter -▸ **getGptCreditPriceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +▸ **getGptCreditPriceEmitter**(): `Monomitter`<`number`\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +`Monomitter`<`number`\> --- @@ -1279,11 +1276,11 @@ Gets the hash of the location of your home planet. ### getIsBuyingCreditsEmitter -▸ **getIsBuyingCreditsEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> +▸ **getIsBuyingCreditsEmitter**(): `Monomitter`<`boolean`\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> +`Monomitter`<`boolean`\> --- @@ -1365,33 +1362,35 @@ gets both deposited artifacts that are on planets i own as well as artifacts i o ### getMyArtifactsUpdated$ -▸ **getMyArtifactsUpdated$**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`ArtifactId`, `Artifact`\>\> +▸ **getMyArtifactsUpdated$**(): `Monomitter`<`Map`<`ArtifactId`, `Artifact`\>\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`ArtifactId`, `Artifact`\>\> +`Monomitter`<`Map`<`ArtifactId`, `Artifact`\>\> --- -### getMyBalance +### getMyBalance$ -▸ **getMyBalance**(): `number` +▸ **getMyBalance$**(): `Monomitter`<`BigNumber`\> -Gets the balance of the account +Returns the monomitter which publishes events whenever the player's balance changes. #### Returns -`number` +`Monomitter`<`BigNumber`\> --- -### getMyBalanceEmitter +### getMyBalanceEth -▸ **getMyBalanceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +▸ **getMyBalanceEth**(): `number` + +Gets the balance of the account #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +`number` --- @@ -1421,11 +1420,11 @@ Gets a list of the planets that the player logged into this `GameManager` owns. ### getMyPlanetsUpdated$ -▸ **getMyPlanetsUpdated$**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`LocationId`, `Planet`\>\> +▸ **getMyPlanetsUpdated$**(): `Monomitter`<`Map`<`LocationId`, `Planet`\>\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`LocationId`, `Planet`\>\> +`Monomitter`<`Map`<`LocationId`, `Planet`\>\> --- @@ -1535,11 +1534,11 @@ Gets the rarity of planets in the universe ### getPlanetUpdated$ -▸ **getPlanetUpdated$**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`LocationId`\> +▸ **getPlanetUpdated$**(): `Monomitter`<`LocationId`\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`LocationId`\> +`Monomitter`<`LocationId`\> --- @@ -1648,15 +1647,34 @@ doesn't exist, no entry for that planet will be returned in the result. --- +### getPlayer + +▸ **getPlayer**(`address?`): `undefined` \| `Player` + +Gets either the given player, or if no address was provided, gets the player that is logged +this client. + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `address?` | `EthAddress` | + +#### Returns + +`undefined` \| `Player` + +--- + ### getPrivateKey -▸ **getPrivateKey**(): `string` +▸ **getPrivateKey**(): `undefined` \| `string` Gets the private key of the burner wallet used by this account. #### Returns -`string` +`undefined` \| `string` --- @@ -2160,12 +2178,21 @@ Attempts to join the game. Should not be called once you've already joined. ### loadContract -▸ **loadContract**(`contractAddress`, `contractABI`): `Promise`<`Contract`\> +▸ **loadContract**<`T`\>(`contractAddress`, `contractABI`): `Promise`<`T`\> Returns an instance of a `Contract` from the ethersjs library. This is the library we use to connect to the blockchain. For documentation about how `Contract` works, see: https://docs.ethers.io/v5/api/contract/contract/ +Also, registers your contract in the system to make calls against it and to reload it when +necessary (such as the RPC endpoint changing). + +#### Type parameters + +| Name | Type | +| :--- | :----------------------- | +| `T` | extends `Contract`<`T`\> | + #### Parameters | Name | Type | @@ -2175,7 +2202,7 @@ https://docs.ethers.io/v5/api/contract/contract/ #### Returns -`Promise`<`Contract`\> +`Promise`<`T`\> --- @@ -2326,6 +2353,16 @@ the given planet to the given planet. --- +### refreshScoreboard + +▸ `Private` **refreshScoreboard**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +--- + ### refreshServerPlanetStates ▸ **refreshServerPlanetStates**(`planetIds`): `Promise`<`void`\> @@ -2456,6 +2493,22 @@ planet was signed by the owner. --- +### setPlayerTwitters + +▸ `Private` **setPlayerTwitters**(`twitters`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :------------------------------------------------------------------------------------------------- | +| `twitters` | [`AddressTwitterMap`](../modules/_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap) | + +#### Returns + +`void` + +--- + ### setRadius ▸ `Private` **setRadius**(`worldRadius`): `void` @@ -2630,6 +2683,22 @@ Stops the miner. --- +### submitDisconnectTwitter + +▸ **submitDisconnectTwitter**(`twitter`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `twitter` | `string` | + +#### Returns + +`Promise`<`void`\> + +--- + ### submitPlanetMessage ▸ `Private` **submitPlanetMessage**(`locationId`, `type`, `body`): `Promise`<`void`\> @@ -2652,6 +2721,25 @@ just one type of message. Their implementation leaves the door open to more off- --- +### submitVerifyTwitter + +▸ **submitVerifyTwitter**(`twitter`): `Promise`<`boolean`\> + +Once you have posted the verification tweet - complete the twitter-account-linking +process by telling the Dark Forest webserver to look at that tweet. + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `twitter` | `string` | + +#### Returns + +`Promise`<`boolean`\> + +--- + ### transferOwnership ▸ **transferOwnership**(`planetId`, `newOwner`, `bypassChecks?`): [`default`](Backend_GameLogic_GameManager.default.md) @@ -2680,9 +2768,9 @@ convenient manner. #### Parameters -| Name | Type | -| :--------- | :-------------------------------------------------------------------------------------------- | -| `updateFn` | (`d`: [`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md)) => `void` | +| Name | Type | +| :--------- | :----------------------------- | +| `updateFn` | (`d`: `Diagnostics`) => `void` | #### Returns @@ -2712,37 +2800,28 @@ the upgrade. --- -### verifyMessage - -▸ `Private` **verifyMessage**(`message`): `Promise`<`boolean`\> - -Checks that a message signed by {@link GameManager#signMessage} was signed by the address that -it claims it was signed by. +### uploadDiagnostics -#### Parameters - -| Name | Type | -| :-------- | :-------------------------- | -| `message` | `SignedMessage`<`unknown`\> | +▸ `Private` **uploadDiagnostics**(): `Promise`<`void`\> #### Returns -`Promise`<`boolean`\> +`Promise`<`void`\> --- -### verifyTwitter +### verifyMessage -▸ **verifyTwitter**(`twitter`): `Promise`<`boolean`\> +▸ `Private` **verifyMessage**(`message`): `Promise`<`boolean`\> -Once you have posted the verificatoin tweet - complete the twitter-account-linking -process by telling the Dark Forest webserver to look at that tweet. +Checks that a message signed by {@link GameManager#signMessage} was signed by the address that +it claims it was signed by. #### Parameters -| Name | Type | -| :-------- | :------- | -| `twitter` | `string` | +| Name | Type | +| :-------- | :-------------------------- | +| `message` | `SignedMessage`<`unknown`\> | #### Returns @@ -2828,7 +2907,7 @@ Withdraws the artifact that is locked up on the given planet. | Name | Type | | :-------------- | :-------------------------------------------------------------------------------------------------------------- | -| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | +| `ethConnection` | `EthConnection` | | `terminal` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | #### Returns diff --git a/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md b/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md index fd0cd0c5..cb292b51 100644 --- a/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md +++ b/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md @@ -141,7 +141,7 @@ cancelled for whatever reason. ### artifactUpdated$ -• `Readonly` **artifactUpdated$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`ArtifactId`\> +• `Readonly` **artifactUpdated$**: `Monomitter`<`ArtifactId`\> Event emitter which publishes whenever an artifact has been updated. @@ -179,7 +179,7 @@ information about the world at that location. ### isBuyingCredits$ -• `Readonly` **isBuyingCredits$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> +• `Readonly` **isBuyingCredits$**: `Monomitter`<`boolean`\> Event emitter which publishes whenever the player begins and finishes (whether with a success or an error) buying gpt credits. @@ -209,7 +209,7 @@ Cached index of artifacts owned by the player. ### myArtifactsUpdated$ -• `Readonly` **myArtifactsUpdated$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`ArtifactId`, `Artifact`\>\> +• `Readonly` **myArtifactsUpdated$**: `Monomitter`<`Map`<`ArtifactId`, `Artifact`\>\> Whenever one of the player's artifacts are updated, this event emitter publishes. See [GameObjects.myPlanetsUpdated$](Backend_GameLogic_GameObjects.GameObjects.md#myplanetsupdated$) for more info. @@ -228,7 +228,7 @@ Cached index of planets owned by the player. ### myPlanetsUpdated$ -• `Readonly` **myPlanetsUpdated$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`LocationId`, `Planet`\>\> +• `Readonly` **myPlanetsUpdated$**: `Monomitter`<`Map`<`LocationId`, `Planet`\>\> Whenever a planet is updated, we publish to this event with a reference to a map from location id to planet. We need to rethink this event emitter because it currently publishes every time @@ -259,7 +259,7 @@ this planet is located, if this client happens to know the coordinates of this p ### planetUpdated$ -• `Readonly` **planetUpdated$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`LocationId`\> +• `Readonly` **planetUpdated$**: `Monomitter`<`LocationId`\> Event emitter which publishes whenever a planet is updated. @@ -668,11 +668,11 @@ time may be in the past ### getIsBuyingCreditsEmitter -▸ **getIsBuyingCreditsEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> +▸ **getIsBuyingCreditsEmitter**(): `Monomitter`<`boolean`\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> +`Monomitter`<`boolean`\> --- @@ -978,7 +978,7 @@ with their localstorage wallet. You can think of it as one of the hubs which con Inside this function, we update the relevant internal game objects to reflect that the user has requested a particular action. Additionally, we publish the appropriate events to the relevant -[Monomitter](../modules/Frontend_Utils_Monomitter.md#monomitter) instances that are stored in this class. +{@link Monomitter} instances that are stored in this class. In the case of something like prospecting for an artifact, this allows us to display a spinner text which says "Prospecting..." diff --git a/docs/classes/Backend_GameLogic_GameUIManager.default.md b/docs/classes/Backend_GameLogic_GameUIManager.default.md index 38a1332f..75eec33f 100644 --- a/docs/classes/Backend_GameLogic_GameUIManager.default.md +++ b/docs/classes/Backend_GameLogic_GameUIManager.default.md @@ -60,6 +60,7 @@ - [deactivateArtifact](Backend_GameLogic_GameUIManager.default.md#deactivateartifact) - [depositArtifact](Backend_GameLogic_GameUIManager.default.md#depositartifact) - [destroy](Backend_GameLogic_GameUIManager.default.md#destroy) +- [disconnectTwitter](Backend_GameLogic_GameUIManager.default.md#disconnecttwitter) - [discoverBiome](Backend_GameLogic_GameUIManager.default.md#discoverbiome) - [findArtifact](Backend_GameLogic_GameUIManager.default.md#findartifact) - [generateVerificationTweet](Backend_GameLogic_GameUIManager.default.md#generateverificationtweet) @@ -114,7 +115,7 @@ - [getMyArtifacts](Backend_GameLogic_GameUIManager.default.md#getmyartifacts) - [getMyArtifactsNotOnPlanet](Backend_GameLogic_GameUIManager.default.md#getmyartifactsnotonplanet) - [getMyBalance](Backend_GameLogic_GameUIManager.default.md#getmybalance) -- [getMyBalanceEmitter](Backend_GameLogic_GameUIManager.default.md#getmybalanceemitter) +- [getMyBalance$](Backend_GameLogic_GameUIManager.default.md#getmybalance$) - [getMyPlanetMap](Backend_GameLogic_GameUIManager.default.md#getmyplanetmap) - [getMyScore](Backend_GameLogic_GameUIManager.default.md#getmyscore) - [getNextBroadcastAvailableTimestamp](Backend_GameLogic_GameUIManager.default.md#getnextbroadcastavailabletimestamp) @@ -125,6 +126,7 @@ - [getPlanetWithCoords](Backend_GameLogic_GameUIManager.default.md#getplanetwithcoords) - [getPlanetWithId](Backend_GameLogic_GameUIManager.default.md#getplanetwithid) - [getPlanetsInViewport](Backend_GameLogic_GameUIManager.default.md#getplanetsinviewport) +- [getPlayer](Backend_GameLogic_GameUIManager.default.md#getplayer) - [getPluginManager](Backend_GameLogic_GameUIManager.default.md#getpluginmanager) - [getPreviousSelectedPlanet](Backend_GameLogic_GameUIManager.default.md#getpreviousselectedplanet) - [getPrivateKey](Backend_GameLogic_GameUIManager.default.md#getprivatekey) @@ -244,13 +246,13 @@ EventEmitter.constructor ### hoverPlanet$ -• `Readonly` **hoverPlanet$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `Planet`\> +• `Readonly` **hoverPlanet$**: `Monomitter`<`undefined` \| `Planet`\> --- ### hoverPlanetId$ -• `Readonly` **hoverPlanetId$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `LocationId`\> +• `Readonly` **hoverPlanetId$**: `Monomitter`<`undefined` \| `LocationId`\> --- @@ -301,7 +303,7 @@ indicates whether or not the player is currently selecting a target planet. ### myArtifacts$ -• `Readonly` **myArtifacts$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`Map`<`ArtifactId`, `Artifact`\>\> +• `Readonly` **myArtifacts$**: `Monomitter`<`Map`<`ArtifactId`, `Artifact`\>\> --- @@ -349,13 +351,13 @@ indicates whether or not the player is currently selecting a target planet. ### selectedArtifact$ -• `Readonly` **selectedArtifact$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `Artifact`\> +• `Readonly` **selectedArtifact$**: `Monomitter`<`undefined` \| `Artifact`\> --- ### selectedArtifactId$ -• `Readonly` **selectedArtifactId$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `ArtifactId`\> +• `Readonly` **selectedArtifactId$**: `Monomitter`<`undefined` \| `ArtifactId`\> --- @@ -373,13 +375,13 @@ indicates whether or not the player is currently selecting a target planet. ### selectedPlanet$ -• `Readonly` **selectedPlanet$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `Planet`\> +• `Readonly` **selectedPlanet$**: `Monomitter`<`undefined` \| `Planet`\> --- ### selectedPlanetId$ -• `Readonly` **selectedPlanetId$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`undefined` \| `LocationId`\> +• `Readonly` **selectedPlanetId$**: `Monomitter`<`undefined` \| `LocationId`\> --- @@ -607,6 +609,22 @@ indicates whether or not the player is currently selecting a target planet. --- +### disconnectTwitter + +▸ **disconnectTwitter**(`twitter`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :-------- | :------- | +| `twitter` | `string` | + +#### Returns + +`Promise`<`void`\> + +--- + ### discoverBiome ▸ **discoverBiome**(`planet`): `void` @@ -882,11 +900,11 @@ indicates whether or not the player is currently selecting a target planet. ### getDiagnostics -▸ **getDiagnostics**(): [`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) +▸ **getDiagnostics**(): `Diagnostics` #### Returns -[`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) +`Diagnostics` --- @@ -987,11 +1005,11 @@ indicates whether or not the player is currently selecting a target planet. ### getEthConnection -▸ **getEthConnection**(): [`default`](Backend_Network_EthConnection.default.md) +▸ **getEthConnection**(): `EthConnection` #### Returns -[`default`](Backend_Network_EthConnection.default.md) +`EthConnection` --- @@ -1047,21 +1065,21 @@ state in some way ### getGptCreditBalanceEmitter -▸ **getGptCreditBalanceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +▸ **getGptCreditBalanceEmitter**(): `Monomitter`<`number`\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +`Monomitter`<`number`\> --- ### getGptCreditPriceEmitter -▸ **getGptCreditPriceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +▸ **getGptCreditPriceEmitter**(): `Monomitter`<`number`\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +`Monomitter`<`number`\> --- @@ -1137,11 +1155,11 @@ state in some way ### getIsBuyingCreditsEmitter -▸ **getIsBuyingCreditsEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> +▸ **getIsBuyingCreditsEmitter**(): `Monomitter`<`boolean`\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`boolean`\> +`Monomitter`<`boolean`\> --- @@ -1276,13 +1294,13 @@ state in some way --- -### getMyBalanceEmitter +### getMyBalance$ -▸ **getMyBalanceEmitter**(): [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +▸ **getMyBalance$**(): `Monomitter`<`BigNumber`\> #### Returns -[`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> +`Monomitter`<`BigNumber`\> --- @@ -1390,9 +1408,9 @@ state in some way #### Parameters -| Name | Type | -| :--------- | :----------- | -| `planetId` | `LocationId` | +| Name | Type | +| :--------- | :-------------------------- | +| `planetId` | `undefined` \| `LocationId` | #### Returns @@ -1410,6 +1428,22 @@ state in some way --- +### getPlayer + +▸ **getPlayer**(`address?`): `undefined` \| `Player` + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `address?` | `EthAddress` | + +#### Returns + +`undefined` \| `Player` + +--- + ### getPluginManager ▸ **getPluginManager**(): [`PluginManager`](Backend_GameLogic_PluginManager.PluginManager.md) @@ -1432,11 +1466,11 @@ state in some way ### getPrivateKey -▸ **getPrivateKey**(): `string` +▸ **getPrivateKey**(): `undefined` \| `string` #### Returns -`string` +`undefined` \| `string` --- @@ -2211,9 +2245,9 @@ drill fields like this anymore. #### Parameters -| Name | Type | -| :--------- | :-------------------------------------------------------------------------------------------- | -| `updateFn` | (`d`: [`Diagnostics`](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md)) => `void` | +| Name | Type | +| :--------- | :----------------------------- | +| `updateFn` | (`d`: `Diagnostics`) => `void` | #### Returns diff --git a/docs/classes/Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md b/docs/classes/Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md index e7b3623a..3a4522f1 100644 --- a/docs/classes/Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md +++ b/docs/classes/Backend_GameLogic_InitialGameStateDownloader.InitialGameStateDownloader.md @@ -43,10 +43,10 @@ #### Parameters -| Name | Type | -| :--------------------- | :----------------------------------------------------------- | -| `contractsAPI` | [`default`](Backend_GameLogic_ContractsAPI.default.md) | -| `persistentChunkStore` | [`default`](Backend_Storage_PersistentChunkStore.default.md) | +| Name | Type | +| :--------------------- | :--------------------------------------------------------------- | +| `contractsAPI` | [`ContractsAPI`](Backend_GameLogic_ContractsAPI.ContractsAPI.md) | +| `persistentChunkStore` | [`default`](Backend_Storage_PersistentChunkStore.default.md) | #### Returns diff --git a/docs/classes/Backend_GameLogic_Lazy.Lazy.md b/docs/classes/Backend_GameLogic_Lazy.Lazy.md new file mode 100644 index 00000000..e16eee1a --- /dev/null +++ b/docs/classes/Backend_GameLogic_Lazy.Lazy.md @@ -0,0 +1,72 @@ +# Class: Lazy + +[Backend/GameLogic/Lazy](../modules/Backend_GameLogic_Lazy.md).Lazy + +## Type parameters + +| Name | +| :--- | +| `T` | + +## Table of contents + +### Constructors + +- [constructor](Backend_GameLogic_Lazy.Lazy.md#constructor) + +### Properties + +- [getPromise](Backend_GameLogic_Lazy.Lazy.md#getpromise) +- [promise](Backend_GameLogic_Lazy.Lazy.md#promise) + +### Methods + +- [get](Backend_GameLogic_Lazy.Lazy.md#get) + +## Constructors + +### constructor + +• **new Lazy**<`T`\>(`getPromise`) + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | +| :----------- | :-------------------- | +| `getPromise` | () => `Promise`<`T`\> | + +## Properties + +### getPromise + +• `Private` **getPromise**: () => `Promise`<`T`\> + +#### Type declaration + +▸ (): `Promise`<`T`\> + +##### Returns + +`Promise`<`T`\> + +--- + +### promise + +• `Private` **promise**: `undefined` \| `Promise`<`T`\> + +## Methods + +### get + +▸ **get**(): `Promise`<`T`\> + +#### Returns + +`Promise`<`T`\> diff --git a/docs/classes/Backend_GameLogic_PluginManager.PluginManager.md b/docs/classes/Backend_GameLogic_PluginManager.PluginManager.md index 7b218c33..9a81dde3 100644 --- a/docs/classes/Backend_GameLogic_PluginManager.PluginManager.md +++ b/docs/classes/Backend_GameLogic_PluginManager.PluginManager.md @@ -98,7 +98,7 @@ is added into `pluginInstances`, and that once a plugin is unloaded, its ### plugins$ -• **plugins$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<[`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[]\> +• **plugins$**: `Monomitter`<[`SerializedPlugin`](../interfaces/Backend_Plugins_SerializedPlugin.SerializedPlugin.md)[]\> Event emitter that publishes whenever the set of plugins changes. diff --git a/docs/classes/Backend_Network_EthConnection.default.md b/docs/classes/Backend_Network_EthConnection.default.md deleted file mode 100644 index b4b62739..00000000 --- a/docs/classes/Backend_Network_EthConnection.default.md +++ /dev/null @@ -1,500 +0,0 @@ -# Class: default - -[Backend/Network/EthConnection](../modules/Backend_Network_EthConnection.md).default - -Responsible for - -1. loading the contract -2. the in-memory wallet -3. connecting to the correct network - -## Hierarchy - -- `EventEmitter` - - ↳ **`default`** - -## Table of contents - -### Constructors - -- [constructor](Backend_Network_EthConnection.default.md#constructor) - -### Properties - -- [blockNumber](Backend_Network_EthConnection.default.md#blocknumber) -- [blockNumber$](Backend_Network_EthConnection.default.md#blocknumber$) -- [diagnosticsUpdater](Backend_Network_EthConnection.default.md#diagnosticsupdater) -- [gasPrices](Backend_Network_EthConnection.default.md#gasprices) -- [gasPrices$](Backend_Network_EthConnection.default.md#gasprices$) -- [knownAddresses](Backend_Network_EthConnection.default.md#knownaddresses) -- [provider](Backend_Network_EthConnection.default.md#provider) -- [rpcURL](Backend_Network_EthConnection.default.md#rpcurl) -- [signer](Backend_Network_EthConnection.default.md#signer) -- [XDAI_DEFAULT_URL](Backend_Network_EthConnection.default.md#xdai_default_url) - -### Methods - -- [addAccount](Backend_Network_EthConnection.default.md#addaccount) -- [adjustPollRateBasedOnVisibility](Backend_Network_EthConnection.default.md#adjustpollratebasedonvisibility) -- [getAddress](Backend_Network_EthConnection.default.md#getaddress) -- [getBalance](Backend_Network_EthConnection.default.md#getbalance) -- [getGasPriceGwei](Backend_Network_EthConnection.default.md#getgaspricegwei) -- [getGasPrices](Backend_Network_EthConnection.default.md#getgasprices) -- [getKnownAccounts](Backend_Network_EthConnection.default.md#getknownaccounts) -- [getNonce](Backend_Network_EthConnection.default.md#getnonce) -- [getPrivateKey](Backend_Network_EthConnection.default.md#getprivatekey) -- [getRpcEndpoint](Backend_Network_EthConnection.default.md#getrpcendpoint) -- [hasSigner](Backend_Network_EthConnection.default.md#hassigner) -- [isWhitelisted](Backend_Network_EthConnection.default.md#iswhitelisted) -- [loadContract](Backend_Network_EthConnection.default.md#loadcontract) -- [loadCoreContract](Backend_Network_EthConnection.default.md#loadcorecontract) -- [loadGPTCreditContract](Backend_Network_EthConnection.default.md#loadgptcreditcontract) -- [loadGettersContract](Backend_Network_EthConnection.default.md#loadgetterscontract) -- [loadWhitelistContract](Backend_Network_EthConnection.default.md#loadwhitelistcontract) -- [processEvents](Backend_Network_EthConnection.default.md#processevents) -- [refreshGasPrices](Backend_Network_EthConnection.default.md#refreshgasprices) -- [setAccount](Backend_Network_EthConnection.default.md#setaccount) -- [setDiagnosticUpdater](Backend_Network_EthConnection.default.md#setdiagnosticupdater) -- [setRpcEndpoint](Backend_Network_EthConnection.default.md#setrpcendpoint) -- [signMessage](Backend_Network_EthConnection.default.md#signmessage) -- [startPollingGasPrices](Backend_Network_EthConnection.default.md#startpollinggasprices) -- [subscribeToEvents](Backend_Network_EthConnection.default.md#subscribetoevents) -- [verifySignature](Backend_Network_EthConnection.default.md#verifysignature) -- [waitForTransaction](Backend_Network_EthConnection.default.md#waitfortransaction) - -## Constructors - -### constructor - -• **new default**() - -#### Overrides - -EventEmitter.constructor - -## Properties - -### blockNumber - -• `Private` **blockNumber**: `number` - ---- - -### blockNumber$ - -• `Readonly` **blockNumber$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`number`\> - ---- - -### diagnosticsUpdater - -• `Private` **diagnosticsUpdater**: `undefined` \| [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) - ---- - -### gasPrices - -• `Private` **gasPrices**: `GasPrices` - ---- - -### gasPrices$ - -• `Readonly` **gasPrices$**: [`Monomitter`](../modules/Frontend_Utils_Monomitter.md#monomitter)<`GasPrices`\> - ---- - -### knownAddresses - -• `Private` **knownAddresses**: `EthAddress`[] - ---- - -### provider - -• `Private` **provider**: `JsonRpcProvider` - ---- - -### rpcURL - -• `Private` **rpcURL**: `string` - ---- - -### signer - -• `Private` **signer**: `undefined` \| `Wallet` - ---- - -### XDAI_DEFAULT_URL - -▪ `Static` `Private` `Readonly` **XDAI_DEFAULT_URL**: `string` - -## Methods - -### addAccount - -▸ **addAccount**(`skey`): `void` - -#### Parameters - -| Name | Type | -| :----- | :------- | -| `skey` | `string` | - -#### Returns - -`void` - ---- - -### adjustPollRateBasedOnVisibility - -▸ `Private` **adjustPollRateBasedOnVisibility**(): `void` - -#### Returns - -`void` - ---- - -### getAddress - -▸ **getAddress**(): `EthAddress` - -#### Returns - -`EthAddress` - ---- - -### getBalance - -▸ **getBalance**(`address`): `Promise`<`number`\> - -#### Parameters - -| Name | Type | -| :-------- | :----------- | -| `address` | `EthAddress` | - -#### Returns - -`Promise`<`number`\> - ---- - -### getGasPriceGwei - -▸ **getGasPriceGwei**(`txType`, `gasPrices`): `number` - -Get the gas price, measured in gwei, that we should send for a given transaction type, given -the current prices for transaction speeds, and given the user's gas price setting. - -#### Parameters - -| Name | Type | -| :---------- | :---------- | -| `txType` | `EthTxType` | -| `gasPrices` | `GasPrices` | - -#### Returns - -`number` - ---- - -### getGasPrices - -▸ **getGasPrices**(): `GasPrices` - -#### Returns - -`GasPrices` - ---- - -### getKnownAccounts - -▸ **getKnownAccounts**(): `EthAddress`[] - -#### Returns - -`EthAddress`[] - ---- - -### getNonce - -▸ **getNonce**(): `Promise`<`number`\> - -#### Returns - -`Promise`<`number`\> - ---- - -### getPrivateKey - -▸ **getPrivateKey**(): `string` - -#### Returns - -`string` - ---- - -### getRpcEndpoint - -▸ **getRpcEndpoint**(): `string` - -#### Returns - -`string` - ---- - -### hasSigner - -▸ **hasSigner**(): `boolean` - -#### Returns - -`boolean` - ---- - -### isWhitelisted - -▸ **isWhitelisted**(`address`): `Promise`<`boolean`\> - -#### Parameters - -| Name | Type | -| :-------- | :----------- | -| `address` | `EthAddress` | - -#### Returns - -`Promise`<`boolean`\> - ---- - -### loadContract - -▸ **loadContract**<`C`\>(`contractAddress`, `contractABI`): `Promise`<`C`\> - -#### Type parameters - -| Name | Type | -| :--- | :----------------------- | -| `C` | extends `Contract`<`C`\> | - -#### Parameters - -| Name | Type | -| :---------------- | :------------------ | -| `contractAddress` | `string` | -| `contractABI` | `ContractInterface` | - -#### Returns - -`Promise`<`C`\> - ---- - -### loadCoreContract - -▸ **loadCoreContract**(): `Promise`<`DarkForestCore`\> - -#### Returns - -`Promise`<`DarkForestCore`\> - ---- - -### loadGPTCreditContract - -▸ **loadGPTCreditContract**(): `Promise`<`DarkForestGPTCredit`\> - -#### Returns - -`Promise`<`DarkForestGPTCredit`\> - ---- - -### loadGettersContract - -▸ **loadGettersContract**(): `Promise`<`DarkForestGetters`\> - -#### Returns - -`Promise`<`DarkForestGetters`\> - ---- - -### loadWhitelistContract - -▸ **loadWhitelistContract**(): `Promise`<`Whitelist`\> - -#### Returns - -`Promise`<`Whitelist`\> - ---- - -### processEvents - -▸ `Private` **processEvents**(`startBlock`, `endBlock`, `eventFilter`, `contract`, `handlers`): `Promise`<`void`\> - -#### Parameters - -| Name | Type | -| :------------ | :----------------------------------------------------------------------------------------------------------------- | -| `startBlock` | `number` | -| `endBlock` | `number` | -| `eventFilter` | `EventFilter` | -| `contract` | `DarkForestCore` | -| `handlers` | `Partial`<`Record`<[`ContractEvent`](../enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md), `any`\>\> | - -#### Returns - -`Promise`<`void`\> - ---- - -### refreshGasPrices - -▸ `Private` **refreshGasPrices**(): `Promise`<`void`\> - -#### Returns - -`Promise`<`void`\> - ---- - -### setAccount - -▸ **setAccount**(`address`): `void` - -#### Parameters - -| Name | Type | -| :-------- | :----------- | -| `address` | `EthAddress` | - -#### Returns - -`void` - ---- - -### setDiagnosticUpdater - -▸ **setDiagnosticUpdater**(`diagnosticUpdater?`): `void` - -#### Parameters - -| Name | Type | -| :------------------- | :--------------------------------------------------------------------------------------------- | -| `diagnosticUpdater?` | [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) | - -#### Returns - -`void` - ---- - -### setRpcEndpoint - -▸ **setRpcEndpoint**(`url`): `Promise`<`void`\> - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `url` | `string` | - -#### Returns - -`Promise`<`void`\> - ---- - -### signMessage - -▸ **signMessage**(`message`): `Promise`<`string`\> - -#### Parameters - -| Name | Type | -| :-------- | :------- | -| `message` | `string` | - -#### Returns - -`Promise`<`string`\> - ---- - -### startPollingGasPrices - -▸ `Private` **startPollingGasPrices**(): `void` - -#### Returns - -`void` - ---- - -### subscribeToEvents - -▸ **subscribeToEvents**(`contract`, `handlers`): `void` - -#### Parameters - -| Name | Type | -| :--------- | :----------------------------------------------------------------------------------------------------------------- | -| `contract` | `DarkForestCore` | -| `handlers` | `Partial`<`Record`<[`ContractEvent`](../enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md), `any`\>\> | - -#### Returns - -`void` - ---- - -### verifySignature - -▸ **verifySignature**(`message`, `signature`, `address`): `boolean` - -#### Parameters - -| Name | Type | -| :---------- | :----------- | -| `message` | `string` | -| `signature` | `string` | -| `address` | `EthAddress` | - -#### Returns - -`boolean` - ---- - -### waitForTransaction - -▸ **waitForTransaction**(`txHash`): `Promise`<`TransactionReceipt`\> - -#### Parameters - -| Name | Type | -| :------- | :------- | -| `txHash` | `string` | - -#### Returns - -`Promise`<`TransactionReceipt`\> diff --git a/docs/classes/Backend_Network_EventLogger.EventLogger.md b/docs/classes/Backend_Network_EventLogger.EventLogger.md index 8746eda6..a244e5dc 100644 --- a/docs/classes/Backend_Network_EventLogger.EventLogger.md +++ b/docs/classes/Backend_Network_EventLogger.EventLogger.md @@ -8,15 +8,10 @@ - [constructor](Backend_Network_EventLogger.EventLogger.md#constructor) -### Properties - -- [instance](Backend_Network_EventLogger.EventLogger.md#instance) - ### Methods - [logEvent](Backend_Network_EventLogger.EventLogger.md#logevent) - [augmentEvent](Backend_Network_EventLogger.EventLogger.md#augmentevent) -- [getInstance](Backend_Network_EventLogger.EventLogger.md#getinstance) ## Constructors @@ -24,23 +19,18 @@ • **new EventLogger**() -## Properties - -### instance - -▪ `Static` `Private` **instance**: [`EventLogger`](Backend_Network_EventLogger.EventLogger.md) - ## Methods ### logEvent -▸ **logEvent**(`event`): `void` +▸ **logEvent**(`eventType`, `event`): `void` #### Parameters -| Name | Type | -| :------ | :-------- | -| `event` | `unknown` | +| Name | Type | +| :---------- | :--------------------------------------------------------------- | +| `eventType` | [`EventType`](../enums/Backend_Network_EventLogger.EventType.md) | +| `event` | `unknown` | #### Returns @@ -50,24 +40,19 @@ ### augmentEvent -▸ `Static` **augmentEvent**(`event`): `Object` +▸ `Static` `Private` **augmentEvent**(`event`, `eventType`): `Object` #### Parameters -| Name | Type | -| :------ | :-------- | -| `event` | `unknown` | +| Name | Type | +| :---------- | :--------------------------------------------------------------- | +| `event` | `unknown` | +| `eventType` | [`EventType`](../enums/Backend_Network_EventLogger.EventType.md) | #### Returns `Object` ---- - -### getInstance - -▸ `Static` **getInstance**(): [`EventLogger`](Backend_Network_EventLogger.EventLogger.md) - -#### Returns - -[`EventLogger`](Backend_Network_EventLogger.EventLogger.md) +| Name | Type | +| :-------------- | :--------------------------------------------------------------- | +| `df_event_type` | [`EventType`](../enums/Backend_Network_EventLogger.EventType.md) | diff --git a/docs/classes/Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md b/docs/classes/Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md deleted file mode 100644 index 35cb0ed2..00000000 --- a/docs/classes/Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md +++ /dev/null @@ -1,217 +0,0 @@ -# Class: ThrottledConcurrentQueue - -[Backend/Network/ThrottledConcurrentQueue](../modules/Backend_Network_ThrottledConcurrentQueue.md).ThrottledConcurrentQueue - -A queue that executes promises with a max throughput, and optionally max -concurrency. - -## Table of contents - -### Constructors - -- [constructor](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#constructor) - -### Properties - -- [concurrency](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#concurrency) -- [executionTimeout](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#executiontimeout) -- [executionTimestamps](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#executiontimestamps) -- [invocationIntervalMs](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#invocationintervalms) -- [maxConcurrency](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#maxconcurrency) -- [taskQueue](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#taskqueue) - -### Methods - -- [add](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#add) -- [concurrencyQuotaRemaining](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#concurrencyquotaremaining) -- [deleteOutdatedExecutionTimestamps](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#deleteoutdatedexecutiontimestamps) -- [executeNextTasks](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#executenexttasks) -- [next](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#next) -- [nextPossibleExecution](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#nextpossibleexecution) -- [size](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#size) -- [throttleQuotaRemaining](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#throttlequotaremaining) - -## Constructors - -### constructor - -• **new ThrottledConcurrentQueue**(`maxInvocationsPerIntervalMs`, `invocationIntervalMs`, `maxConcurrency?`) - -#### Parameters - -| Name | Type | -| :---------------------------- | :------- | -| `maxInvocationsPerIntervalMs` | `number` | -| `invocationIntervalMs` | `number` | -| `maxConcurrency` | `number` | - -## Properties - -### concurrency - -• `Private` **concurrency**: `number` = `0` - -Amount of tasks being executed right now. - ---- - -### executionTimeout - -• `Private` **executionTimeout**: `Timeout` - -When we schedule an attempt at executing another task in the future, -we don't want to schedule it more than once. Therefore, we keep track -of this scheduled attempt. - ---- - -### executionTimestamps - -• `Private` **executionTimestamps**: `default`<`number`\> - -Each time a task is executed, record the start of its execution time. -Execution timestamps are removed when they become outdated. Used for -keeping the amount of executions under the throttle limit. - ---- - -### invocationIntervalMs - -• `Private` `Readonly` **invocationIntervalMs**: `number` - -The interval during which we only allow a certain maximum amount of tasks -to be executed. - ---- - -### maxConcurrency - -• `Private` `Readonly` **maxConcurrency**: `number` - -Maximum amount of tasks that can be executing at the same time. - ---- - -### taskQueue - -• `Private` **taskQueue**: `QueuedTask`<`unknown`\>[] = `[]` - -Queue of tasks to execute. Added to the front, popped off the back. - -## Methods - -### add - -▸ **add**<`T`\>(`generator`): `Promise`<`T`\> - -Adds a task to be executed at some point in the future. Returns a promise -that resolves when the task finishes successfully, and rejects when there -is an error. - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Description | -| :---------- | :-------------------- | :------------------------------------------------------ | -| `generator` | () => `Promise`<`T`\> | a function that returns a promise representing the task | - -#### Returns - -`Promise`<`T`\> - ---- - -### concurrencyQuotaRemaining - -▸ `Private` **concurrencyQuotaRemaining**(): `number` - -At this moment, how many more tasks we could execute without exceeding the -concurrency quota. - -#### Returns - -`number` - ---- - -### deleteOutdatedExecutionTimestamps - -▸ `Private` **deleteOutdatedExecutionTimestamps**(): `void` - -Removes all task execution timestamps that are older than [[this.invocationIntervalMs]], -because those invocations have no bearing on whether or not we can execute another task. - -#### Returns - -`void` - ---- - -### executeNextTasks - -▸ `Private` **executeNextTasks**(): `Promise`<`void`\> - -Runs tasks until it's at either the throttle or concurrency limit. If there are more -tasks to be executed after that, schedules itself to execute again at the soonest -possible moment. - -#### Returns - -`Promise`<`void`\> - ---- - -### next - -▸ `Private` **next**(): `Promise`<`void`\> - -If there is a next task to execute, executes it. Records the time of execution in -[executionTimestamps](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md#executiontimestamps). Increments and decrements concurrency counter. Neither throttles -nor limits concurrency. - -#### Returns - -`Promise`<`void`\> - ---- - -### nextPossibleExecution - -▸ `Private` **nextPossibleExecution**(): `undefined` \| `number` - -Returns the soonest possible time from now we could execute another task without going -over the throttle limit. - -#### Returns - -`undefined` \| `number` - ---- - -### size - -▸ **size**(): `number` - -Returns the amount of queued items, not including the ones that are being executed at this moment. - -#### Returns - -`number` - ---- - -### throttleQuotaRemaining - -▸ `Private` **throttleQuotaRemaining**(): `number` - -At this moment, how many more tasks we could execute without exceeding the -throttle quota. - -#### Returns - -`number` diff --git a/docs/classes/Backend_Network_TxExecutor.TxExecutor.md b/docs/classes/Backend_Network_TxExecutor.TxExecutor.md deleted file mode 100644 index f50b3678..00000000 --- a/docs/classes/Backend_Network_TxExecutor.TxExecutor.md +++ /dev/null @@ -1,181 +0,0 @@ -# Class: TxExecutor - -[Backend/Network/TxExecutor](../modules/Backend_Network_TxExecutor.md).TxExecutor - -## Hierarchy - -- `EventEmitter` - - ↳ **`TxExecutor`** - -## Table of contents - -### Constructors - -- [constructor](Backend_Network_TxExecutor.TxExecutor.md#constructor) - -### Properties - -- [diagnosticsUpdater](Backend_Network_TxExecutor.TxExecutor.md#diagnosticsupdater) -- [eth](Backend_Network_TxExecutor.TxExecutor.md#eth) -- [lastTransaction](Backend_Network_TxExecutor.TxExecutor.md#lasttransaction) -- [nonce](Backend_Network_TxExecutor.TxExecutor.md#nonce) -- [txQueue](Backend_Network_TxExecutor.TxExecutor.md#txqueue) -- [MIN_BALANCE_ETH](Backend_Network_TxExecutor.TxExecutor.md#min_balance_eth) -- [NONCE_STALE_AFTER_MS](Backend_Network_TxExecutor.TxExecutor.md#nonce_stale_after_ms) -- [TX_SUBMIT_TIMEOUT](Backend_Network_TxExecutor.TxExecutor.md#tx_submit_timeout) - -### Methods - -- [checkBalance](Backend_Network_TxExecutor.TxExecutor.md#checkbalance) -- [execute](Backend_Network_TxExecutor.TxExecutor.md#execute) -- [makeRequest](Backend_Network_TxExecutor.TxExecutor.md#makerequest) -- [maybeUpdateNonce](Backend_Network_TxExecutor.TxExecutor.md#maybeupdatenonce) -- [setDiagnosticUpdater](Backend_Network_TxExecutor.TxExecutor.md#setdiagnosticupdater) - -## Constructors - -### constructor - -• **new TxExecutor**(`ethConnection`, `nonce`) - -#### Parameters - -| Name | Type | -| :-------------- | :---------------------------------------------------- | -| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | -| `nonce` | `number` | - -#### Overrides - -EventEmitter.constructor - -## Properties - -### diagnosticsUpdater - -• `Private` `Optional` **diagnosticsUpdater**: [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) - ---- - -### eth - -• `Private` **eth**: [`default`](Backend_Network_EthConnection.default.md) - ---- - -### lastTransaction - -• `Private` **lastTransaction**: `number` - ---- - -### nonce - -• `Private` **nonce**: `number` - ---- - -### txQueue - -• `Private` **txQueue**: [`ThrottledConcurrentQueue`](Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md) - ---- - -### MIN_BALANCE_ETH - -▪ `Static` `Private` `Readonly` **MIN_BALANCE_ETH**: `0.002` - -don't allow users to submit txs if balance falls below - ---- - -### NONCE_STALE_AFTER_MS - -▪ `Static` `Private` `Readonly` **NONCE_STALE_AFTER_MS**: `number` - -we refresh the nonce if it hasn't been updated in this amount of time - ---- - -### TX_SUBMIT_TIMEOUT - -▪ `Static` `Private` `Readonly` **TX_SUBMIT_TIMEOUT**: `30000` - -tx is considered to have errored if haven't successfully -submitted to mempool within 30s - -## Methods - -### checkBalance - -▸ `Private` **checkBalance**(): `Promise`<`void`\> - -#### Returns - -`Promise`<`void`\> - ---- - -### execute - -▸ `Private` **execute**(`txRequest`): `Promise`<`void`\> - -#### Parameters - -| Name | Type | -| :---------- | :------------------------------------------------------------------------------- | -| `txRequest` | [`QueuedTxRequest`](../interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md) | - -#### Returns - -`Promise`<`void`\> - ---- - -### makeRequest - -▸ **makeRequest**(`type`, `actionId`, `contract`, `args`, `overrides?`): [`PendingTransaction`](../interfaces/Backend_Network_TxExecutor.PendingTransaction.md) - -Schedules this transaction to execute once all of the transactions -ahead of it have completed. - -#### Parameters - -| Name | Type | -| :---------- | :------------------- | -| `type` | `EthTxType` | -| `actionId` | `string` | -| `contract` | `Contract` | -| `args` | `unknown`[] | -| `overrides` | `TransactionRequest` | - -#### Returns - -[`PendingTransaction`](../interfaces/Backend_Network_TxExecutor.PendingTransaction.md) - ---- - -### maybeUpdateNonce - -▸ `Private` **maybeUpdateNonce**(): `Promise`<`void`\> - -#### Returns - -`Promise`<`void`\> - ---- - -### setDiagnosticUpdater - -▸ **setDiagnosticUpdater**(`diagnosticUpdater?`): `void` - -#### Parameters - -| Name | Type | -| :------------------- | :--------------------------------------------------------------------------------------------- | -| `diagnosticUpdater?` | [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) | - -#### Returns - -`void` diff --git a/docs/classes/Backend_Storage_PersistentChunkStore.default.md b/docs/classes/Backend_Storage_PersistentChunkStore.default.md index c4e0bd4b..33f81243 100644 --- a/docs/classes/Backend_Storage_PersistentChunkStore.default.md +++ b/docs/classes/Backend_Storage_PersistentChunkStore.default.md @@ -95,7 +95,7 @@ ### diagnosticUpdater -• `Private` `Optional` **diagnosticUpdater**: [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) +• `Private` `Optional` **diagnosticUpdater**: `DiagnosticUpdater` --- @@ -503,9 +503,9 @@ indexed db. #### Parameters -| Name | Type | -| :------------------- | :--------------------------------------------------------------------------------------------- | -| `diagnosticUpdater?` | [`DiagnosticUpdater`](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) | +| Name | Type | +| :------------------- | :------------------ | +| `diagnosticUpdater?` | `DiagnosticUpdater` | #### Returns diff --git a/docs/classes/Backend_Storage_ReaderDataStore.default.md b/docs/classes/Backend_Storage_ReaderDataStore.default.md index 950c89bd..f262a658 100644 --- a/docs/classes/Backend_Storage_ReaderDataStore.default.md +++ b/docs/classes/Backend_Storage_ReaderDataStore.default.md @@ -45,7 +45,7 @@ particular user. | `viewer` | `undefined` \| `EthAddress` | | `addressTwitterMap` | [`AddressTwitterMap`](../modules/_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap) | | `contractConstants` | [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) | -| `contractsAPI` | [`default`](Backend_GameLogic_ContractsAPI.default.md) | +| `contractsAPI` | [`ContractsAPI`](Backend_GameLogic_ContractsAPI.ContractsAPI.md) | | `persistentChunkStore` | `undefined` \| [`default`](Backend_Storage_PersistentChunkStore.default.md) | ## Properties @@ -64,7 +64,7 @@ particular user. ### contractsAPI -• `Private` `Readonly` **contractsAPI**: [`default`](Backend_GameLogic_ContractsAPI.default.md) +• `Private` `Readonly` **contractsAPI**: [`ContractsAPI`](Backend_GameLogic_ContractsAPI.ContractsAPI.md) --- @@ -205,7 +205,7 @@ particular user. | Name | Type | | :-------------- | :-------------------------------------------------------------------------------------------------------------- | | `terminal` | `MutableRefObject`<`undefined` \| [`TerminalHandle`](../interfaces/Frontend_Views_Terminal.TerminalHandle.md)\> | -| `ethConnection` | [`default`](Backend_Network_EthConnection.default.md) | +| `ethConnection` | `EthConnection` | | `viewer` | `undefined` \| `EthAddress` | #### Returns diff --git a/docs/classes/Backend_Utils_BlockWaiter.BlockWaiter.md b/docs/classes/Backend_Utils_BlockWaiter.BlockWaiter.md deleted file mode 100644 index 73527da6..00000000 --- a/docs/classes/Backend_Utils_BlockWaiter.BlockWaiter.md +++ /dev/null @@ -1,61 +0,0 @@ -# Class: BlockWaiter - -[Backend/Utils/BlockWaiter](../modules/Backend_Utils_BlockWaiter.md).BlockWaiter - -You can schedule a function to be executed {@code waitThisLong} in the future. If you -schedule again, the previously scheduled function will not be executed. - -## Table of contents - -### Constructors - -- [constructor](Backend_Utils_BlockWaiter.BlockWaiter.md#constructor) - -### Properties - -- [timeout](Backend_Utils_BlockWaiter.BlockWaiter.md#timeout) -- [waitThisLong](Backend_Utils_BlockWaiter.BlockWaiter.md#waitthislong) - -### Methods - -- [schedule](Backend_Utils_BlockWaiter.BlockWaiter.md#schedule) - -## Constructors - -### constructor - -• **new BlockWaiter**(`waitThisLong`) - -#### Parameters - -| Name | Type | -| :------------- | :------- | -| `waitThisLong` | `number` | - -## Properties - -### timeout - -• `Private` `Optional` **timeout**: `Timeout` - ---- - -### waitThisLong - -• `Private` **waitThisLong**: `number` - -## Methods - -### schedule - -▸ **schedule**(`func`): `void` - -#### Parameters - -| Name | Type | -| :----- | :----------- | -| `func` | () => `void` | - -#### Returns - -`void` diff --git a/docs/classes/Backend_Utils_Wrapper.Wrapper.md b/docs/classes/Backend_Utils_Wrapper.Wrapper.md index f0997381..eef13521 100644 --- a/docs/classes/Backend_Utils_Wrapper.Wrapper.md +++ b/docs/classes/Backend_Utils_Wrapper.Wrapper.md @@ -22,6 +22,10 @@ just wrap it in a new {@code Wrapper}, which will force a rerender. - [value](Backend_Utils_Wrapper.Wrapper.md#value) +### Methods + +- [or](Backend_Utils_Wrapper.Wrapper.md#or) + ## Constructors ### constructor @@ -45,3 +49,19 @@ just wrap it in a new {@code Wrapper}, which will force a rerender. ### value • `Readonly` **value**: `T` + +## Methods + +### or + +▸ **or**(`wrapper`): [`Wrapper`](Backend_Utils_Wrapper.Wrapper.md)<`T`\> + +#### Parameters + +| Name | Type | +| :-------- | :-------------------------------------------------- | +| `wrapper` | [`Wrapper`](Backend_Utils_Wrapper.Wrapper.md)<`T`\> | + +#### Returns + +[`Wrapper`](Backend_Utils_Wrapper.Wrapper.md)<`T`\> diff --git a/docs/classes/Frontend_Game_Viewport.default.md b/docs/classes/Frontend_Game_Viewport.default.md index e005f8dc..ea9116c0 100644 --- a/docs/classes/Frontend_Game_Viewport.default.md +++ b/docs/classes/Frontend_Game_Viewport.default.md @@ -816,13 +816,14 @@ ### zoomPlanet -▸ **zoomPlanet**(`planet`): `void` +▸ **zoomPlanet**(`planet?`, `radii?`): `void` #### Parameters -| Name | Type | -| :------- | :---------------------- | -| `planet` | `undefined` \| `Planet` | +| Name | Type | +| :-------- | :------- | +| `planet?` | `Planet` | +| `radii?` | `number` | #### Returns diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md index 670324dd..74cfb460 100644 --- a/docs/classes/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_VoyageRenderer.default.md @@ -40,13 +40,14 @@ ### drawFleet -▸ **drawFleet**(`voyage`): `void` +▸ **drawFleet**(`voyage`, `_player`): `void` #### Parameters -| Name | Type | -| :------- | :-------------- | -| `voyage` | `QueuedArrival` | +| Name | Type | +| :-------- | :---------------------- | +| `voyage` | `QueuedArrival` | +| `_player` | `undefined` \| `Player` | #### Returns diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md index 29889e44..28fd984c 100644 --- a/docs/classes/Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md +++ b/docs/classes/Frontend_Renderers_GameRenderer_Overlay2DRenderer.default.md @@ -168,23 +168,24 @@ ### drawHat -▸ **drawHat**(`hatType`, `pathHeight`, `pathWidth`, `center`, `width`, `height`, `radius`, `rotation`, `fill1?`, `fill2?`, `hoverCoords?`): `void` +▸ **drawHat**(`hatType`, `pathHeight`, `pathWidth`, `center`, `width`, `height`, `radius`, `rotation`, `hoveringPlanet`, `fill1?`, `fill2?`, `hoverCoords?`): `void` #### Parameters -| Name | Type | Default value | -| :------------ | :--------------------------------------------------- | :------------ | -| `hatType` | [`HatType`](../enums/Frontend_Utils_Hats.HatType.md) | `undefined` | -| `pathHeight` | `number` | `undefined` | -| `pathWidth` | `number` | `undefined` | -| `center` | `WorldCoords` | `undefined` | -| `width` | `number` | `undefined` | -| `height` | `number` | `undefined` | -| `radius` | `number` | `undefined` | -| `rotation` | `number` | `undefined` | -| `fill1` | `string` \| `CanvasPattern` | `'white'` | -| `fill2` | `string` \| `CanvasPattern` | `'red'` | -| `hoverCoords` | `null` \| `WorldCoords` | `null` | +| Name | Type | Default value | +| :--------------- | :--------------------------------------------------- | :------------ | +| `hatType` | [`HatType`](../enums/Frontend_Utils_Hats.HatType.md) | `undefined` | +| `pathHeight` | `number` | `undefined` | +| `pathWidth` | `number` | `undefined` | +| `center` | `WorldCoords` | `undefined` | +| `width` | `number` | `undefined` | +| `height` | `number` | `undefined` | +| `radius` | `number` | `undefined` | +| `rotation` | `number` | `undefined` | +| `hoveringPlanet` | `boolean` | `undefined` | +| `fill1` | `string` \| `CanvasPattern` | `'white'` | +| `fill2` | `string` \| `CanvasPattern` | `'red'` | +| `hoverCoords` | `null` \| `WorldCoords` | `null` | #### Returns diff --git a/docs/enums/Backend_Network_EventLogger.EventType.md b/docs/enums/Backend_Network_EventLogger.EventType.md new file mode 100644 index 00000000..998d3a50 --- /dev/null +++ b/docs/enums/Backend_Network_EventLogger.EventType.md @@ -0,0 +1,22 @@ +# Enumeration: EventType + +[Backend/Network/EventLogger](../modules/Backend_Network_EventLogger.md).EventType + +## Table of contents + +### Enumeration members + +- [Diagnostics](Backend_Network_EventLogger.EventType.md#diagnostics) +- [Transaction](Backend_Network_EventLogger.EventType.md#transaction) + +## Enumeration members + +### Diagnostics + +• **Diagnostics** = `"diagnostics"` + +--- + +### Transaction + +• **Transaction** = `"transaction"` diff --git a/docs/enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md b/docs/enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md deleted file mode 100644 index 781ed446..00000000 --- a/docs/enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md +++ /dev/null @@ -1,29 +0,0 @@ -# Enumeration: AutoGasSetting - -[Frontend/Utils/SettingsHooks](../modules/Frontend_Utils_SettingsHooks.md).AutoGasSetting - -## Table of contents - -### Enumeration members - -- [Average](Frontend_Utils_SettingsHooks.AutoGasSetting.md#average) -- [Fast](Frontend_Utils_SettingsHooks.AutoGasSetting.md#fast) -- [Slow](Frontend_Utils_SettingsHooks.AutoGasSetting.md#slow) - -## Enumeration members - -### Average - -• **Average** = `"Average"` - ---- - -### Fast - -• **Fast** = `"Fast"` - ---- - -### Slow - -• **Slow** = `"Slow"` diff --git a/docs/enums/Frontend_Utils_SettingsHooks.Setting.md b/docs/enums/Frontend_Utils_SettingsHooks.Setting.md index 216be6e4..69aa8c7d 100644 --- a/docs/enums/Frontend_Utils_SettingsHooks.Setting.md +++ b/docs/enums/Frontend_Utils_SettingsHooks.Setting.md @@ -22,6 +22,7 @@ per instance of the dark forest contract that it's connected to. - [GasFeeGwei](Frontend_Utils_SettingsHooks.Setting.md#gasfeegwei) - [HasAcceptedPluginRisk](Frontend_Utils_SettingsHooks.Setting.md#hasacceptedpluginrisk) - [HighPerformanceRendering](Frontend_Utils_SettingsHooks.Setting.md#highperformancerendering) +- [IsMining](Frontend_Utils_SettingsHooks.Setting.md#ismining) - [MiningCores](Frontend_Utils_SettingsHooks.Setting.md#miningcores) - [MoveNotifications](Frontend_Utils_SettingsHooks.Setting.md#movenotifications) - [NewPlayer](Frontend_Utils_SettingsHooks.Setting.md#newplayer) @@ -110,6 +111,12 @@ per instance of the dark forest contract that it's connected to. --- +### IsMining + +• **IsMining** = `"IsMining"` + +--- + ### MiningCores • **MiningCores** = `"MiningCores"` diff --git a/docs/enums/Frontend_Views_ModalPane.ModalName.md b/docs/enums/Frontend_Views_ModalPane.ModalName.md index a64cd49e..defce042 100644 --- a/docs/enums/Frontend_Views_ModalPane.ModalName.md +++ b/docs/enums/Frontend_Views_ModalPane.ModalName.md @@ -8,6 +8,7 @@ - [ArtifactConversation](Frontend_Views_ModalPane.ModalName.md#artifactconversation) - [ArtifactDetails](Frontend_Views_ModalPane.ModalName.md#artifactdetails) +- [Broadcast](Frontend_Views_ModalPane.ModalName.md#broadcast) - [Hats](Frontend_Views_ModalPane.ModalName.md#hats) - [Help](Frontend_Views_ModalPane.ModalName.md#help) - [Leaderboard](Frontend_Views_ModalPane.ModalName.md#leaderboard) @@ -20,7 +21,6 @@ - [Plugins](Frontend_Views_ModalPane.ModalName.md#plugins) - [Private](Frontend_Views_ModalPane.ModalName.md#private) - [Settings](Frontend_Views_ModalPane.ModalName.md#settings) -- [TwitterBroadcast](Frontend_Views_ModalPane.ModalName.md#twitterbroadcast) - [TwitterVerify](Frontend_Views_ModalPane.ModalName.md#twitterverify) - [UpgradeDetails](Frontend_Views_ModalPane.ModalName.md#upgradedetails) - [WithdrawSilver](Frontend_Views_ModalPane.ModalName.md#withdrawsilver) @@ -40,6 +40,12 @@ --- +### Broadcast + +• **Broadcast** = `6` + +--- + ### Hats • **Hats** = `7` @@ -112,12 +118,6 @@ --- -### TwitterBroadcast - -• **TwitterBroadcast** = `6` - ---- - ### TwitterVerify • **TwitterVerify** = `5` diff --git a/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md b/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md index 7b7ddfe5..a9ee1550 100644 --- a/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md +++ b/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md @@ -22,6 +22,7 @@ - [players](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#players) - [revealedCoordsMap](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#revealedcoordsmap) - [touchedAndLocatedPlanets](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#touchedandlocatedplanets) +- [twitters](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#twitters) - [worldRadius](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#worldradius) ## Properties @@ -122,6 +123,12 @@ --- +### twitters + +• **twitters**: [`AddressTwitterMap`](../modules/_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap) + +--- + ### worldRadius • **worldRadius**: `number` diff --git a/docs/interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md b/docs/interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md deleted file mode 100644 index d94b37ce..00000000 --- a/docs/interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md +++ /dev/null @@ -1,33 +0,0 @@ -# Interface: DiagnosticUpdater - -[Backend/Interfaces/DiagnosticUpdater](../modules/Backend_Interfaces_DiagnosticUpdater.md).DiagnosticUpdater - -Various parts of our codebase need to be able to self-report diagnostics. To enable them to do -so, you must provide them with an object that conforms to this interface. Currently, the only -implementation of this function is `GameManager`. However, in the future, we might want to stream -a sample of these diagnostic updates to our backend, so that we can analyze performance, catch -bugs, etc. - -## Table of contents - -### Methods - -- [updateDiagnostics](Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md#updatediagnostics) - -## Methods - -### updateDiagnostics - -▸ **updateDiagnostics**(`updateFn`): `void` - -Updates the diagnostics using the provided updater function. - -#### Parameters - -| Name | Type | -| :--------- | :------------------------------------------------------------------------------ | -| `updateFn` | (`d`: [`Diagnostics`](Frontend_Panes_DiagnosticsPane.Diagnostics.md)) => `void` | - -#### Returns - -`void` diff --git a/docs/interfaces/Backend_Network_AccountManager.Account.md b/docs/interfaces/Backend_Network_AccountManager.Account.md new file mode 100644 index 00000000..7513776e --- /dev/null +++ b/docs/interfaces/Backend_Network_AccountManager.Account.md @@ -0,0 +1,24 @@ +# Interface: Account + +[Backend/Network/AccountManager](../modules/Backend_Network_AccountManager.md).Account + +Represents an account with which the user plays the game. + +## Table of contents + +### Properties + +- [address](Backend_Network_AccountManager.Account.md#address) +- [privateKey](Backend_Network_AccountManager.Account.md#privatekey) + +## Properties + +### address + +• **address**: `EthAddress` + +--- + +### privateKey + +• **privateKey**: `string` diff --git a/docs/interfaces/Backend_Network_TxExecutor.PendingTransaction.md b/docs/interfaces/Backend_Network_TxExecutor.PendingTransaction.md deleted file mode 100644 index 4a7fc8c9..00000000 --- a/docs/interfaces/Backend_Network_TxExecutor.PendingTransaction.md +++ /dev/null @@ -1,22 +0,0 @@ -# Interface: PendingTransaction - -[Backend/Network/TxExecutor](../modules/Backend_Network_TxExecutor.md).PendingTransaction - -## Table of contents - -### Properties - -- [confirmed](Backend_Network_TxExecutor.PendingTransaction.md#confirmed) -- [submitted](Backend_Network_TxExecutor.PendingTransaction.md#submitted) - -## Properties - -### confirmed - -• **confirmed**: `Promise`<`TransactionReceipt`\> - ---- - -### submitted - -• **submitted**: `Promise`<`TransactionResponse`\> diff --git a/docs/interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md b/docs/interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md deleted file mode 100644 index dd05027f..00000000 --- a/docs/interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md +++ /dev/null @@ -1,114 +0,0 @@ -# Interface: QueuedTxRequest - -[Backend/Network/TxExecutor](../modules/Backend_Network_TxExecutor.md).QueuedTxRequest - -## Table of contents - -### Properties - -- [actionId](Backend_Network_TxExecutor.QueuedTxRequest.md#actionid) -- [args](Backend_Network_TxExecutor.QueuedTxRequest.md#args) -- [contract](Backend_Network_TxExecutor.QueuedTxRequest.md#contract) -- [overrides](Backend_Network_TxExecutor.QueuedTxRequest.md#overrides) -- [type](Backend_Network_TxExecutor.QueuedTxRequest.md#type) - -### Methods - -- [onReceiptError](Backend_Network_TxExecutor.QueuedTxRequest.md#onreceipterror) -- [onSubmissionError](Backend_Network_TxExecutor.QueuedTxRequest.md#onsubmissionerror) -- [onTransactionReceipt](Backend_Network_TxExecutor.QueuedTxRequest.md#ontransactionreceipt) -- [onTransactionResponse](Backend_Network_TxExecutor.QueuedTxRequest.md#ontransactionresponse) - -## Properties - -### actionId - -• **actionId**: `string` - ---- - -### args - -• **args**: `unknown`[] - ---- - -### contract - -• **contract**: `Contract` - ---- - -### overrides - -• **overrides**: `TransactionRequest` - ---- - -### type - -• **type**: `EthTxType` - -## Methods - -### onReceiptError - -▸ **onReceiptError**(`e`): `void` - -#### Parameters - -| Name | Type | -| :--- | :------ | -| `e` | `Error` | - -#### Returns - -`void` - ---- - -### onSubmissionError - -▸ **onSubmissionError**(`e`): `void` - -#### Parameters - -| Name | Type | -| :--- | :------ | -| `e` | `Error` | - -#### Returns - -`void` - ---- - -### onTransactionReceipt - -▸ **onTransactionReceipt**(`e`): `void` - -#### Parameters - -| Name | Type | -| :--- | :------------------- | -| `e` | `TransactionReceipt` | - -#### Returns - -`void` - ---- - -### onTransactionResponse - -▸ **onTransactionResponse**(`e`): `void` - -#### Parameters - -| Name | Type | -| :--- | :-------------------- | -| `e` | `TransactionResponse` | - -#### Returns - -`void` diff --git a/docs/interfaces/Frontend_Components_Btn.BtnProps.md b/docs/interfaces/Frontend_Components_Btn.BtnProps.md deleted file mode 100644 index ea7fcd45..00000000 --- a/docs/interfaces/Frontend_Components_Btn.BtnProps.md +++ /dev/null @@ -1,50 +0,0 @@ -# Interface: BtnProps - -[Frontend/Components/Btn](../modules/Frontend_Components_Btn.md).BtnProps - -## Table of contents - -### Properties - -- [borderColor](Frontend_Components_Btn.BtnProps.md#bordercolor) -- [color](Frontend_Components_Btn.BtnProps.md#color) -- [disabled](Frontend_Components_Btn.BtnProps.md#disabled) -- [noBorder](Frontend_Components_Btn.BtnProps.md#noborder) -- [textColor](Frontend_Components_Btn.BtnProps.md#textcolor) -- [wide](Frontend_Components_Btn.BtnProps.md#wide) - -## Properties - -### borderColor - -• `Optional` **borderColor**: `string` - ---- - -### color - -• `Optional` **color**: `string` - ---- - -### disabled - -• `Optional` **disabled**: `boolean` - ---- - -### noBorder - -• `Optional` **noBorder**: `boolean` - ---- - -### textColor - -• `Optional` **textColor**: `string` - ---- - -### wide - -• `Optional` **wide**: `boolean` diff --git a/docs/interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md b/docs/interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md deleted file mode 100644 index 70d96341..00000000 --- a/docs/interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md +++ /dev/null @@ -1,85 +0,0 @@ -# Interface: Diagnostics - -[Frontend/Panes/DiagnosticsPane](../modules/Frontend_Panes_DiagnosticsPane.md).Diagnostics - -## Table of contents - -### Properties - -- [callsInQueue](Frontend_Panes_DiagnosticsPane.Diagnostics.md#callsinqueue) -- [chunkUpdates](Frontend_Panes_DiagnosticsPane.Diagnostics.md#chunkupdates) -- [fps](Frontend_Panes_DiagnosticsPane.Diagnostics.md#fps) -- [gasPrices](Frontend_Panes_DiagnosticsPane.Diagnostics.md#gasprices) -- [totalCalls](Frontend_Panes_DiagnosticsPane.Diagnostics.md#totalcalls) -- [totalChunks](Frontend_Panes_DiagnosticsPane.Diagnostics.md#totalchunks) -- [totalPlanets](Frontend_Panes_DiagnosticsPane.Diagnostics.md#totalplanets) -- [totalTransactions](Frontend_Panes_DiagnosticsPane.Diagnostics.md#totaltransactions) -- [transactionsInQueue](Frontend_Panes_DiagnosticsPane.Diagnostics.md#transactionsinqueue) -- [visibleChunks](Frontend_Panes_DiagnosticsPane.Diagnostics.md#visiblechunks) -- [visiblePlanets](Frontend_Panes_DiagnosticsPane.Diagnostics.md#visibleplanets) - -## Properties - -### callsInQueue - -• **callsInQueue**: `number` - ---- - -### chunkUpdates - -• **chunkUpdates**: `number` - ---- - -### fps - -• **fps**: `number` - ---- - -### gasPrices - -• `Optional` **gasPrices**: `GasPrices` - ---- - -### totalCalls - -• **totalCalls**: `number` - ---- - -### totalChunks - -• **totalChunks**: `number` - ---- - -### totalPlanets - -• **totalPlanets**: `number` - ---- - -### totalTransactions - -• **totalTransactions**: `number` - ---- - -### transactionsInQueue - -• **transactionsInQueue**: `number` - ---- - -### visibleChunks - -• **visibleChunks**: `number` - ---- - -### visiblePlanets - -• **visiblePlanets**: `number` diff --git a/docs/interfaces/Frontend_Views_ModalPane.ModalFrame.md b/docs/interfaces/Frontend_Views_ModalPane.ModalFrame.md new file mode 100644 index 00000000..43b522d7 --- /dev/null +++ b/docs/interfaces/Frontend_Views_ModalPane.ModalFrame.md @@ -0,0 +1,31 @@ +# Interface: ModalFrame + +[Frontend/Views/ModalPane](../modules/Frontend_Views_ModalPane.md).ModalFrame + +A modal has a {@code content}, and also optionally many {@link ModalFrames} pushed on top of it. + +## Table of contents + +### Properties + +- [element](Frontend_Views_ModalPane.ModalFrame.md#element) +- [helpContent](Frontend_Views_ModalPane.ModalFrame.md#helpcontent) +- [title](Frontend_Views_ModalPane.ModalFrame.md#title) + +## Properties + +### element + +• **element**: `ReactElement`<`any`, `string` \| `JSXElementConstructor`<`any`\>\> + +--- + +### helpContent + +• `Optional` **helpContent**: `ReactElement`<`any`, `string` \| `JSXElementConstructor`<`any`\>\> + +--- + +### title + +• **title**: `string` diff --git a/docs/interfaces/Frontend_Views_ModalPane.ModalHandle.md b/docs/interfaces/Frontend_Views_ModalPane.ModalHandle.md new file mode 100644 index 00000000..1c413ec3 --- /dev/null +++ b/docs/interfaces/Frontend_Views_ModalPane.ModalHandle.md @@ -0,0 +1,49 @@ +# Interface: ModalHandle + +[Frontend/Views/ModalPane](../modules/Frontend_Views_ModalPane.md).ModalHandle + +**`todo`** Add things like open, close, set position, etc. Get rid of {@code ModalHook}. + +## Table of contents + +### Methods + +- [pop](Frontend_Views_ModalPane.ModalHandle.md#pop) +- [popAll](Frontend_Views_ModalPane.ModalHandle.md#popall) +- [push](Frontend_Views_ModalPane.ModalHandle.md#push) + +## Methods + +### pop + +▸ **pop**(): `void` + +#### Returns + +`void` + +--- + +### popAll + +▸ **popAll**(): `void` + +#### Returns + +`void` + +--- + +### push + +▸ **push**(`frame`): `void` + +#### Parameters + +| Name | Type | +| :------ | :----------------------------------------------------- | +| `frame` | [`ModalFrame`](Frontend_Views_ModalPane.ModalFrame.md) | + +#### Returns + +`void` diff --git a/docs/modules/Backend_GameLogic_ContractCaller.md b/docs/modules/Backend_GameLogic_ContractCaller.md deleted file mode 100644 index 92addc03..00000000 --- a/docs/modules/Backend_GameLogic_ContractCaller.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/GameLogic/ContractCaller - -## Table of contents - -### Classes - -- [ContractCaller](../classes/Backend_GameLogic_ContractCaller.ContractCaller.md) diff --git a/docs/modules/Backend_GameLogic_ContractsAPI.md b/docs/modules/Backend_GameLogic_ContractsAPI.md index cd593f20..e4b35d10 100644 --- a/docs/modules/Backend_GameLogic_ContractsAPI.md +++ b/docs/modules/Backend_GameLogic_ContractsAPI.md @@ -4,4 +4,24 @@ ### Classes -- [default](../classes/Backend_GameLogic_ContractsAPI.default.md) +- [ContractsAPI](../classes/Backend_GameLogic_ContractsAPI.ContractsAPI.md) + +### Functions + +- [makeContractsAPI](Backend_GameLogic_ContractsAPI.md#makecontractsapi) + +## Functions + +### makeContractsAPI + +▸ **makeContractsAPI**(`ethConnection`): `Promise`<[`ContractsAPI`](../classes/Backend_GameLogic_ContractsAPI.ContractsAPI.md)\> + +#### Parameters + +| Name | Type | +| :-------------- | :-------------- | +| `ethConnection` | `EthConnection` | + +#### Returns + +`Promise`<[`ContractsAPI`](../classes/Backend_GameLogic_ContractsAPI.ContractsAPI.md)\> diff --git a/docs/modules/Backend_GameLogic_Lazy.md b/docs/modules/Backend_GameLogic_Lazy.md new file mode 100644 index 00000000..c94631f3 --- /dev/null +++ b/docs/modules/Backend_GameLogic_Lazy.md @@ -0,0 +1,33 @@ +# Module: Backend/GameLogic/Lazy + +## Table of contents + +### Classes + +- [Lazy](../classes/Backend_GameLogic_Lazy.Lazy.md) + +### Functions + +- [lazy](Backend_GameLogic_Lazy.md#lazy) + +## Functions + +### lazy + +▸ **lazy**<`T`\>(`getPromise`): [`Lazy`](../classes/Backend_GameLogic_Lazy.Lazy.md)<`T`\> + +#### Type parameters + +| Name | +| :--- | +| `T` | + +#### Parameters + +| Name | Type | +| :----------- | :-------------------- | +| `getPromise` | () => `Promise`<`T`\> | + +#### Returns + +[`Lazy`](../classes/Backend_GameLogic_Lazy.Lazy.md)<`T`\> diff --git a/docs/modules/Backend_Interfaces_DiagnosticUpdater.md b/docs/modules/Backend_Interfaces_DiagnosticUpdater.md deleted file mode 100644 index 0d474b73..00000000 --- a/docs/modules/Backend_Interfaces_DiagnosticUpdater.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/Interfaces/DiagnosticUpdater - -## Table of contents - -### Interfaces - -- [DiagnosticUpdater](../interfaces/Backend_Interfaces_DiagnosticUpdater.DiagnosticUpdater.md) diff --git a/docs/modules/Backend_Network_AccountManager.md b/docs/modules/Backend_Network_AccountManager.md new file mode 100644 index 00000000..db8cb089 --- /dev/null +++ b/docs/modules/Backend_Network_AccountManager.md @@ -0,0 +1,42 @@ +# Module: Backend/Network/AccountManager + +## Table of contents + +### Interfaces + +- [Account](../interfaces/Backend_Network_AccountManager.Account.md) + +### Functions + +- [addAccount](Backend_Network_AccountManager.md#addaccount) +- [getAccounts](Backend_Network_AccountManager.md#getaccounts) + +## Functions + +### addAccount + +▸ **addAccount**(`privateKey`): `void` + +Adds the given account, and saves it to localstorage. + +#### Parameters + +| Name | Type | +| :----------- | :------- | +| `privateKey` | `string` | + +#### Returns + +`void` + +--- + +### getAccounts + +▸ **getAccounts**(): [`Account`](../interfaces/Backend_Network_AccountManager.Account.md)[] + +Returns the list of accounts that are logged into the game. + +#### Returns + +[`Account`](../interfaces/Backend_Network_AccountManager.Account.md)[] diff --git a/docs/modules/Backend_Network_Blockchain.md b/docs/modules/Backend_Network_Blockchain.md new file mode 100644 index 00000000..ee5778b4 --- /dev/null +++ b/docs/modules/Backend_Network_Blockchain.md @@ -0,0 +1,110 @@ +# Module: Backend/Network/Blockchain + +## Table of contents + +### Functions + +- [getEthConnection](Backend_Network_Blockchain.md#getethconnection) +- [loadCoreContract](Backend_Network_Blockchain.md#loadcorecontract) +- [loadGettersContract](Backend_Network_Blockchain.md#loadgetterscontract) +- [loadGptCreditContract](Backend_Network_Blockchain.md#loadgptcreditcontract) +- [loadWhitelistContract](Backend_Network_Blockchain.md#loadwhitelistcontract) + +## Functions + +### getEthConnection + +▸ **getEthConnection**(): `Promise`<`EthConnection`\> + +#### Returns + +`Promise`<`EthConnection`\> + +--- + +### loadCoreContract + +▸ **loadCoreContract**(`address`, `provider`, `signer?`): `Promise`<`DarkForestCore`\> + +Loads the Core game contract, which is responsible for updating the state of the game. + +**`see`** https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestCore.sol + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------- | +| `address` | `string` | +| `provider` | `providers.JsonRpcProvider` | +| `signer?` | `Wallet` | + +#### Returns + +`Promise`<`DarkForestCore`\> + +--- + +### loadGettersContract + +▸ **loadGettersContract**(`address`, `provider`, `signer?`): `Promise`<`DarkForestGetters`\> + +Loads the Getters contract, which contains utility view functions which get game objects +from the blockchain in bulk. + +**`see`** https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestGetters.sol + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------- | +| `address` | `string` | +| `provider` | `providers.JsonRpcProvider` | +| `signer?` | `Wallet` | + +#### Returns + +`Promise`<`DarkForestGetters`\> + +--- + +### loadGptCreditContract + +▸ **loadGptCreditContract**(`address`, `provider`, `signer?`): `Promise`<`DarkForestGPTCredit`\> + +Loads ths GPT Credit contract, which players can pay to talk to artifacts. + +**`see`** https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestGPTCredit.sol + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------- | +| `address` | `string` | +| `provider` | `providers.JsonRpcProvider` | +| `signer?` | `Wallet` | + +#### Returns + +`Promise`<`DarkForestGPTCredit`\> + +--- + +### loadWhitelistContract + +▸ **loadWhitelistContract**(`address`, `provider`, `signer?`): `Promise`<`Whitelist`\> + +Loads the Whitelist contract, which keeps track of which players are allowed to play the game. + +**`see`** https://github.com/darkforest-eth/eth/blob/master/contracts/Whitelist.sol + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------- | +| `address` | `string` | +| `provider` | `providers.JsonRpcProvider` | +| `signer?` | `Wallet` | + +#### Returns + +`Promise`<`Whitelist`\> diff --git a/docs/modules/Backend_Network_ChainAPI.md b/docs/modules/Backend_Network_ChainAPI.md deleted file mode 100644 index 2457910a..00000000 --- a/docs/modules/Backend_Network_ChainAPI.md +++ /dev/null @@ -1,42 +0,0 @@ -# Module: Backend/Network/ChainAPI - -## Table of contents - -### Variables - -- [DEFAULT_GAS_PRICES](Backend_Network_ChainAPI.md#default_gas_prices) -- [MAX_AUTO_GAS_PRICE_GWEI](Backend_Network_ChainAPI.md#max_auto_gas_price_gwei) - -### Functions - -- [getAutoGasPrices](Backend_Network_ChainAPI.md#getautogasprices) - -## Variables - -### DEFAULT_GAS_PRICES - -• `Const` **DEFAULT_GAS_PRICES**: `Readonly`<`GasPrices`\> - -In case of errors, these are the default gas prices. - ---- - -### MAX_AUTO_GAS_PRICE_GWEI - -• `Const` **MAX_AUTO_GAS_PRICE_GWEI**: `15` - -In case xDai's auto-price is something ridiculous, we don't want our players to insta run out of -money. - -## Functions - -### getAutoGasPrices - -▸ **getAutoGasPrices**(): `Promise`<`GasPrices`\> - -Gets the current gas prices from xDai's price oracle. If the oracle is broken, return some sane -defaults. - -#### Returns - -`Promise`<`GasPrices`\> diff --git a/docs/modules/Backend_Network_EthConnection.md b/docs/modules/Backend_Network_EthConnection.md deleted file mode 100644 index 45b60973..00000000 --- a/docs/modules/Backend_Network_EthConnection.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/Network/EthConnection - -## Table of contents - -### Classes - -- [default](../classes/Backend_Network_EthConnection.default.md) diff --git a/docs/modules/Backend_Network_EventLogger.md b/docs/modules/Backend_Network_EventLogger.md index e7543f77..116237f1 100644 --- a/docs/modules/Backend_Network_EventLogger.md +++ b/docs/modules/Backend_Network_EventLogger.md @@ -2,6 +2,20 @@ ## Table of contents +### Enumerations + +- [EventType](../enums/Backend_Network_EventLogger.EventType.md) + ### Classes - [EventLogger](../classes/Backend_Network_EventLogger.EventLogger.md) + +### Variables + +- [eventLogger](Backend_Network_EventLogger.md#eventlogger) + +## Variables + +### eventLogger + +• `Const` **eventLogger**: [`EventLogger`](../classes/Backend_Network_EventLogger.EventLogger.md) diff --git a/docs/modules/Backend_Network_ThrottledConcurrentQueue.md b/docs/modules/Backend_Network_ThrottledConcurrentQueue.md deleted file mode 100644 index 2a22602b..00000000 --- a/docs/modules/Backend_Network_ThrottledConcurrentQueue.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/Network/ThrottledConcurrentQueue - -## Table of contents - -### Classes - -- [ThrottledConcurrentQueue](../classes/Backend_Network_ThrottledConcurrentQueue.ThrottledConcurrentQueue.md) diff --git a/docs/modules/Backend_Network_TxExecutor.md b/docs/modules/Backend_Network_TxExecutor.md deleted file mode 100644 index 5b42fa5a..00000000 --- a/docs/modules/Backend_Network_TxExecutor.md +++ /dev/null @@ -1,12 +0,0 @@ -# Module: Backend/Network/TxExecutor - -## Table of contents - -### Classes - -- [TxExecutor](../classes/Backend_Network_TxExecutor.TxExecutor.md) - -### Interfaces - -- [PendingTransaction](../interfaces/Backend_Network_TxExecutor.PendingTransaction.md) -- [QueuedTxRequest](../interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md) diff --git a/docs/modules/Backend_Network_UtilityServerAPI.md b/docs/modules/Backend_Network_UtilityServerAPI.md index 4bffb19d..a57c7b72 100644 --- a/docs/modules/Backend_Network_UtilityServerAPI.md +++ b/docs/modules/Backend_Network_UtilityServerAPI.md @@ -12,12 +12,14 @@ ### Functions +- [disconnectTwitter](Backend_Network_UtilityServerAPI.md#disconnecttwitter) - [getAllTwitters](Backend_Network_UtilityServerAPI.md#getalltwitters) - [requestDevFaucet](Backend_Network_UtilityServerAPI.md#requestdevfaucet) - [submitInterestedEmail](Backend_Network_UtilityServerAPI.md#submitinterestedemail) - [submitPlayerEmail](Backend_Network_UtilityServerAPI.md#submitplayeremail) - [submitUnsubscribeEmail](Backend_Network_UtilityServerAPI.md#submitunsubscribeemail) - [submitWhitelistKey](Backend_Network_UtilityServerAPI.md#submitwhitelistkey) +- [tryGetAllTwitters](Backend_Network_UtilityServerAPI.md#trygetalltwitters) - [verifyTwitterHandle](Backend_Network_UtilityServerAPI.md#verifytwitterhandle) ## Variables @@ -28,6 +30,22 @@ ## Functions +### disconnectTwitter + +▸ `Const` **disconnectTwitter**(`disconnectMessage`): `Promise`<`boolean`\> + +#### Parameters + +| Name | Type | +| :------------------ | :------------------------- | +| `disconnectMessage` | `SignedMessage`<`Object`\> | + +#### Returns + +`Promise`<`boolean`\> + +--- + ### getAllTwitters ▸ `Const` **getAllTwitters**(): `Promise`<[`AddressTwitterMap`](_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap)\> @@ -120,16 +138,28 @@ --- +### tryGetAllTwitters + +▸ `Const` **tryGetAllTwitters**(): `Promise`<[`AddressTwitterMap`](_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap)\> + +Swallows all errors. Either loads the address to twitter map from the webserver in 5 seconds, or +returan empty map. + +#### Returns + +`Promise`<[`AddressTwitterMap`](_types_darkforest_api_UtilityServerAPITypes.md#addresstwittermap)\> + +--- + ### verifyTwitterHandle -▸ `Const` **verifyTwitterHandle**(`twitter`, `address`): `Promise`<`boolean`\> +▸ `Const` **verifyTwitterHandle**(`verifyMessage`): `Promise`<`boolean`\> #### Parameters -| Name | Type | -| :-------- | :----------- | -| `twitter` | `string` | -| `address` | `EthAddress` | +| Name | Type | +| :-------------- | :------------------------- | +| `verifyMessage` | `SignedMessage`<`Object`\> | #### Returns diff --git a/docs/modules/Backend_Utils_BlockWaiter.md b/docs/modules/Backend_Utils_BlockWaiter.md deleted file mode 100644 index 4afce9a5..00000000 --- a/docs/modules/Backend_Utils_BlockWaiter.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module: Backend/Utils/BlockWaiter - -## Table of contents - -### Classes - -- [BlockWaiter](../classes/Backend_Utils_BlockWaiter.BlockWaiter.md) diff --git a/docs/modules/Backend_Utils_Utils.md b/docs/modules/Backend_Utils_Utils.md index 6eb4530b..b4b96581 100644 --- a/docs/modules/Backend_Utils_Utils.md +++ b/docs/modules/Backend_Utils_Utils.md @@ -2,22 +2,14 @@ ## Table of contents -### Type aliases - -- [RetryErrorHandler](Backend_Utils_Utils.md#retryerrorhandler) - ### Variables - [ONE_DAY](Backend_Utils_Utils.md#one_day) ### Functions -- [aggregateBulkGetter](Backend_Utils_Utils.md#aggregatebulkgetter) -- [callWithRetry](Backend_Utils_Utils.md#callwithretry) -- [deferred](Backend_Utils_Utils.md#deferred) - [formatNumber](Backend_Utils_Utils.md#formatnumber) - [getFormatProp](Backend_Utils_Utils.md#getformatprop) -- [getGasSettingGwei](Backend_Utils_Utils.md#getgassettinggwei) - [getOwnerColor](Backend_Utils_Utils.md#getownercolor) - [getPlanetMaxRank](Backend_Utils_Utils.md#getplanetmaxrank) - [getPlanetRank](Backend_Utils_Utils.md#getplanetrank) @@ -30,34 +22,9 @@ - [hexifyBigIntNestedArray](Backend_Utils_Utils.md#hexifybigintnestedarray) - [hslStr](Backend_Utils_Utils.md#hslstr) - [isFullRank](Backend_Utils_Utils.md#isfullrank) -- [neverResolves](Backend_Utils_Utils.md#neverresolves) -- [rejectAfter](Backend_Utils_Utils.md#rejectafter) -- [sleep](Backend_Utils_Utils.md#sleep) -- [timeoutAfter](Backend_Utils_Utils.md#timeoutafter) - [titleCase](Backend_Utils_Utils.md#titlecase) - [upgradeName](Backend_Utils_Utils.md#upgradename) -## Type aliases - -### RetryErrorHandler - -Ƭ **RetryErrorHandler**: (`i`: `number`, `e`: `Error`) => `void` - -#### Type declaration - -▸ (`i`, `e`): `void` - -##### Parameters - -| Name | Type | -| :--- | :------- | -| `i` | `number` | -| `e` | `Error` | - -##### Returns - -`void` - ## Variables ### ONE_DAY @@ -66,74 +33,6 @@ ## Functions -### aggregateBulkGetter - -▸ `Const` **aggregateBulkGetter**<`T`\>(`logTag`, `total`, `querySize`, `getterFn`, `onProgress?`): `Promise`<`T`[]\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :------------ | :-------------------------------------------------------------- | -| `logTag` | `string` | -| `total` | `number` | -| `querySize` | `number` | -| `getterFn` | (`startIdx`: `number`, `endIdx`: `number`) => `Promise`<`T`[]\> | -| `onProgress?` | (`fractionCompleted`: `number`) => `void` | - -#### Returns - -`Promise`<`T`[]\> - ---- - -### callWithRetry - -▸ `Const` **callWithRetry**<`T`\>(`fn`, `args?`, `onError?`, `maxRetries?`, `retryInterval?`): `Promise`<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Default value | -| :-------------- | :-------------------------------------------------------------- | :------------ | -| `fn` | (...`args`: `unknown`[]) => `Promise`<`T`\> | `undefined` | -| `args` | `unknown`[] | `[]` | -| `onError?` | [`RetryErrorHandler`](Backend_Utils_Utils.md#retryerrorhandler) | `undefined` | -| `maxRetries` | `number` | `10` | -| `retryInterval` | `number` | `1000` | - -#### Returns - -`Promise`<`T`\> - ---- - -### deferred - -▸ **deferred**<`T`\>(): [(`t`: `T`) => `void`, (`t`: `Error`) => `void`, `Promise`<`T`\>] - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Returns - -[(`t`: `T`) => `void`, (`t`: `Error`) => `void`, `Promise`<`T`\>] - ---- - ### formatNumber ▸ `Const` **formatNumber**(`num`, `smallDec?`): `string` @@ -168,23 +67,6 @@ --- -### getGasSettingGwei - -▸ **getGasSettingGwei**(`setting`, `gasPrices`): `number` \| `undefined` - -#### Parameters - -| Name | Type | -| :---------- | :-------------------------------------------------------------------------- | -| `setting` | [`AutoGasSetting`](../enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md) | -| `gasPrices` | `GasPrices` | - -#### Returns - -`number` \| `undefined` - ---- - ### getOwnerColor ▸ `Const` **getOwnerColor**(`planet`): `string` @@ -374,86 +256,6 @@ --- -### neverResolves - -▸ **neverResolves**(): `Promise`<`void`\> - -#### Returns - -`Promise`<`void`\> - ---- - -### rejectAfter - -▸ **rejectAfter**<`T`\>(`ms`, `msg`): `Promise`<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :---- | :------- | -| `ms` | `number` | -| `msg` | `string` | - -#### Returns - -`Promise`<`T`\> - ---- - -### sleep - -▸ **sleep**<`T`\>(`timeout`, `returns?`): `Promise`<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :--------- | :------- | -| `timeout` | `number` | -| `returns?` | `T` | - -#### Returns - -`Promise`<`T`\> - ---- - -### timeoutAfter - -▸ `Const` **timeoutAfter**<`T`\>(`promise`, `ms`, `timeoutMsg`): `Promise`<`T`\> - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | -| :----------- | :-------------- | -| `promise` | `Promise`<`T`\> | -| `ms` | `number` | -| `timeoutMsg` | `string` | - -#### Returns - -`Promise`<`T`\> - ---- - ### titleCase ▸ `Const` **titleCase**(`title`): `string` diff --git a/docs/modules/Frontend_Components_Btn.md b/docs/modules/Frontend_Components_Btn.md index 8b88c12f..2aef5aba 100644 --- a/docs/modules/Frontend_Components_Btn.md +++ b/docs/modules/Frontend_Components_Btn.md @@ -2,14 +2,20 @@ ## Table of contents -### Interfaces +### Type aliases -- [BtnProps](../interfaces/Frontend_Components_Btn.BtnProps.md) +- [BtnProps](Frontend_Components_Btn.md#btnprops) ### Functions - [Btn](Frontend_Components_Btn.md#btn) +## Type aliases + +### BtnProps + +Ƭ **BtnProps**: { `borderColor?`: `string` ; `color?`: `string` ; `disabled?`: `boolean` ; `forceActive?`: `boolean` ; `noBorder?`: `boolean` ; `textColor?`: `string` ; `wide?`: `boolean` } & `React.HTMLAttributes`<`HTMLSpanElement`\> + ## Functions ### Btn @@ -18,9 +24,9 @@ #### Parameters -| Name | Type | -| :------ | :----------------------------------------------------------------------------------------------------------- | -| `props` | [`BtnProps`](../interfaces/Frontend_Components_Btn.BtnProps.md) & `React.HTMLAttributes`<`HTMLSpanElement`\> | +| Name | Type | +| :------ | :------------------------------------------------ | +| `props` | [`BtnProps`](Frontend_Components_Btn.md#btnprops) | #### Returns diff --git a/docs/modules/Frontend_Components_CoreUI.md b/docs/modules/Frontend_Components_CoreUI.md index 8cb9329e..5fbab002 100644 --- a/docs/modules/Frontend_Components_CoreUI.md +++ b/docs/modules/Frontend_Components_CoreUI.md @@ -4,23 +4,58 @@ ### Variables +- [BorderlessPane](Frontend_Components_CoreUI.md#borderlesspane) +- [Bottom](Frontend_Components_CoreUI.md#bottom) - [CenterBackgroundSubtext](Frontend_Components_CoreUI.md#centerbackgroundsubtext) - [CenterRow](Frontend_Components_CoreUI.md#centerrow) +- [Display](Frontend_Components_CoreUI.md#display) +- [DontShrink](Frontend_Components_CoreUI.md#dontshrink) +- [EmSpacer](Frontend_Components_CoreUI.md#emspacer) +- [Emphasized](Frontend_Components_CoreUI.md#emphasized) +- [Expand](Frontend_Components_CoreUI.md#expand) +- [FloatRight](Frontend_Components_CoreUI.md#floatright) +- [FullHeight](Frontend_Components_CoreUI.md#fullheight) +- [FullWidth](Frontend_Components_CoreUI.md#fullwidth) +- [HeaderText](Frontend_Components_CoreUI.md#headertext) - [Hidden](Frontend_Components_CoreUI.md#hidden) +- [HorizontalFlex](Frontend_Components_CoreUI.md#horizontalflex) +- [HoverLink](Frontend_Components_CoreUI.md#hoverlink) - [HoverableTooltip](Frontend_Components_CoreUI.md#hoverabletooltip) +- [InlineBlock](Frontend_Components_CoreUI.md#inlineblock) - [MaxWidth](Frontend_Components_CoreUI.md#maxwidth) +- [Padded](Frontend_Components_CoreUI.md#padded) +- [PaddedRecommendedModalWidth](Frontend_Components_CoreUI.md#paddedrecommendedmodalwidth) - [PluginElements](Frontend_Components_CoreUI.md#pluginelements) +- [RecommendedModalWidth](Frontend_Components_CoreUI.md#recommendedmodalwidth) +- [Section](Frontend_Components_CoreUI.md#section) +- [SectionHeader](Frontend_Components_CoreUI.md#sectionheader) - [Select](Frontend_Components_CoreUI.md#select) - [Spacer](Frontend_Components_CoreUI.md#spacer) +- [TextButton](Frontend_Components_CoreUI.md#textbutton) - [Truncate](Frontend_Components_CoreUI.md#truncate) - [Underline](Frontend_Components_CoreUI.md#underline) +- [VerticalFlex](Frontend_Components_CoreUI.md#verticalflex) ### Functions +- [Link](Frontend_Components_CoreUI.md#link) - [SelectFrom](Frontend_Components_CoreUI.md#selectfrom) +- [VerticalSplit](Frontend_Components_CoreUI.md#verticalsplit) ## Variables +### BorderlessPane + +• `Const` **BorderlessPane**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### Bottom + +• `Const` **Bottom**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + ### CenterBackgroundSubtext • `Const` **CenterBackgroundSubtext**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> @@ -37,24 +72,108 @@ be displayed. Think of it as a placeholder. --- +### Display + +• `Const` **Display**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### DontShrink + +• `Const` **DontShrink**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### EmSpacer + +• `Const` **EmSpacer**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### Emphasized + +• `Const` **Emphasized**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + +### Expand + +• `Const` **Expand**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### FloatRight + +• `Const` **FloatRight**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### FullHeight + +• `Const` **FullHeight**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### FullWidth + +• `Const` **FullWidth**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### HeaderText + +• `Const` **HeaderText**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + ### Hidden • `Const` **Hidden**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> --- +### HorizontalFlex + +• `Const` **HorizontalFlex**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### HoverLink + +• `Const` **HoverLink**: `StyledComponent`<`"a"`, `any`, `Object`, `never`\> + +--- + ### HoverableTooltip • `Const` **HoverableTooltip**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> --- +### InlineBlock + +• `Const` **InlineBlock**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + ### MaxWidth • `Const` **MaxWidth**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> --- +### Padded + +• `Const` **Padded**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### PaddedRecommendedModalWidth + +• `Const` **PaddedRecommendedModalWidth**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + ### PluginElements • `Const` **PluginElements**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> @@ -67,6 +186,24 @@ way to do this. --- +### RecommendedModalWidth + +• `Const` **RecommendedModalWidth**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### Section + +• `Const` **Section**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + +### SectionHeader + +• `Const` **SectionHeader**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + ### Select • `Const` **Select**: `StyledComponent`<`"select"`, `any`, `Object`, `never`\> @@ -79,6 +216,12 @@ way to do this. --- +### TextButton + +• `Const` **TextButton**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + ### Truncate • `Const` **Truncate**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> @@ -89,8 +232,34 @@ way to do this. • `Const` **Underline**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> +--- + +### VerticalFlex + +• `Const` **VerticalFlex**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + ## Functions +### Link + +▸ **Link**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :-------------------------------- | :---------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | +| `__namedParameters.color?` | `string` | +| `__namedParameters.openInNewTab?` | `boolean` | +| `__namedParameters.to` | `string` | + +#### Returns + +`Element` + +--- + ### SelectFrom ▸ **SelectFrom**(`__namedParameters`): `Element` @@ -107,8 +276,26 @@ given string values. | `__namedParameters.style?` | `React.CSSProperties` | | `__namedParameters.value` | `string` | | `__namedParameters.values` | `string`[] | +| `__namedParameters.wide?` | `boolean` | | `__namedParameters.setValue` | | #### Returns `Element` + +--- + +### VerticalSplit + +▸ `Const` **VerticalSplit**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | [`ReactNode`, `ReactNode`] | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_GameWindowComponents.md b/docs/modules/Frontend_Components_GameWindowComponents.md index ee6eab32..b55fc366 100644 --- a/docs/modules/Frontend_Components_GameWindowComponents.md +++ b/docs/modules/Frontend_Components_GameWindowComponents.md @@ -23,11 +23,11 @@ #### Type declaration -| Name | Type | -| :------------- | :---------------- | -| `children` | `React.ReactNode` | -| `headerItems?` | `React.ReactNode` | -| `title` | `string` | +| Name | Type | +| :------------- | :---------------------------------------------------- | +| `children` | `React.ReactNode` | +| `headerItems?` | `React.ReactNode` | +| `title` | `string` \| (`small`: `boolean`) => `React.ReactNode` | ## Variables diff --git a/docs/modules/Frontend_Components_Labels_Labels.md b/docs/modules/Frontend_Components_Labels_Labels.md index 957d322c..5d7ab2ec 100644 --- a/docs/modules/Frontend_Components_Labels_Labels.md +++ b/docs/modules/Frontend_Components_Labels_Labels.md @@ -5,19 +5,31 @@ ### Functions - [AccountLabel](Frontend_Components_Labels_Labels.md#accountlabel) +- [TwitterLink](Frontend_Components_Labels_Labels.md#twitterlink) ## Functions ### AccountLabel -▸ **AccountLabel**(`__namedParameters`): `Element` +▸ **AccountLabel**(): `Element` + +#### Returns + +`Element` + +--- + +### TwitterLink + +▸ **TwitterLink**(`__namedParameters`): `Element` #### Parameters -| Name | Type | -| :-------------------------- | :-------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.account` | `EthAddress` \| `undefined` | +| Name | Type | +| :-------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | +| `__namedParameters.twitter` | `string` | #### Returns diff --git a/docs/modules/Frontend_Components_Labels_MythicLabel.md b/docs/modules/Frontend_Components_Labels_MythicLabel.md index 723fd7b0..ab613c43 100644 --- a/docs/modules/Frontend_Components_Labels_MythicLabel.md +++ b/docs/modules/Frontend_Components_Labels_MythicLabel.md @@ -6,8 +6,29 @@ - [MythicLabel](Frontend_Components_Labels_MythicLabel.md#mythiclabel) +### Functions + +- [MythicLabelText](Frontend_Components_Labels_MythicLabel.md#mythiclabeltext) + ## Variables ### MythicLabel • `Const` **MythicLabel**: `MemoExoticComponent`<`fn`\> + +## Functions + +### MythicLabelText + +▸ **MythicLabelText**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :----------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.text` | `string` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_Labels_PlanetLabels.md b/docs/modules/Frontend_Components_Labels_PlanetLabels.md index bdd2211d..51d20f83 100644 --- a/docs/modules/Frontend_Components_Labels_PlanetLabels.md +++ b/docs/modules/Frontend_Components_Labels_PlanetLabels.md @@ -12,8 +12,10 @@ - [LevelRankTextEm](Frontend_Components_Labels_PlanetLabels.md#levelranktextem) - [PlanetBiomeTypeLabelAnim](Frontend_Components_Labels_PlanetLabels.md#planetbiometypelabelanim) - [PlanetEnergyLabel](Frontend_Components_Labels_PlanetLabels.md#planetenergylabel) +- [PlanetLevel](Frontend_Components_Labels_PlanetLabels.md#planetlevel) - [PlanetLevelText](Frontend_Components_Labels_PlanetLabels.md#planetleveltext) - [PlanetOwnerLabel](Frontend_Components_Labels_PlanetLabels.md#planetownerlabel) +- [PlanetRank](Frontend_Components_Labels_PlanetLabels.md#planetrank) - [PlanetRankText](Frontend_Components_Labels_PlanetLabels.md#planetranktext) - [PlanetSilverLabel](Frontend_Components_Labels_PlanetLabels.md#planetsilverlabel) - [PlanetTypeLabelAnim](Frontend_Components_Labels_PlanetLabels.md#planettypelabelanim) @@ -164,6 +166,23 @@ --- +### PlanetLevel + +▸ `Const` **PlanetLevel**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | + +#### Returns + +`Element` + +--- + ### PlanetLevelText ▸ `Const` **PlanetLevelText**(`__namedParameters`): `Element` @@ -185,14 +204,33 @@ ▸ **PlanetOwnerLabel**(`__namedParameters`): `Element` +Either 'yours' in green text, + #### Parameters -| Name | Type | -| :----------------------------- | :---------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.color?` | `boolean` | -| `__namedParameters.planet` | `Planet` \| `undefined` | -| `__namedParameters.showYours?` | `boolean` | +| Name | Type | +| :---------------------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.abbreviateOwnAddress?` | `boolean` | +| `__namedParameters.colorWithOwnerColor?` | `boolean` | +| `__namedParameters.planet` | `Planet` \| `undefined` | + +#### Returns + +`Element` + +--- + +### PlanetRank + +▸ `Const` **PlanetRank**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :---------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | `undefined` \| `Planet` | #### Returns diff --git a/docs/modules/Frontend_Components_OpenPaneButtons.md b/docs/modules/Frontend_Components_OpenPaneButtons.md new file mode 100644 index 00000000..d8daeeb8 --- /dev/null +++ b/docs/modules/Frontend_Components_OpenPaneButtons.md @@ -0,0 +1,104 @@ +# Module: Frontend/Components/OpenPaneButtons + +## Table of contents + +### Functions + +- [OpenBroadcastPaneButton](Frontend_Components_OpenPaneButtons.md#openbroadcastpanebutton) +- [OpenHatPaneButton](Frontend_Components_OpenPaneButtons.md#openhatpanebutton) +- [OpenManagePlanetArtifactsButton](Frontend_Components_OpenPaneButtons.md#openmanageplanetartifactsbutton) +- [OpenPaneButton](Frontend_Components_OpenPaneButtons.md#openpanebutton) +- [OpenUpgradeDetailsPaneButton](Frontend_Components_OpenPaneButtons.md#openupgradedetailspanebutton) + +## Functions + +### OpenBroadcastPaneButton + +▸ **OpenBroadcastPaneButton**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planetId` | `LocationId` \| `undefined` | + +#### Returns + +`Element` + +--- + +### OpenHatPaneButton + +▸ **OpenHatPaneButton**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planetId` | `LocationId` \| `undefined` | + +#### Returns + +`Element` + +--- + +### OpenManagePlanetArtifactsButton + +▸ **OpenManagePlanetArtifactsButton**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planetId` | `LocationId` \| `undefined` | + +#### Returns + +`Element` + +--- + +### OpenPaneButton + +▸ **OpenPaneButton**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.element` | `React.ReactElement` | +| `__namedParameters.helpContent?` | `React.ReactElement` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.title` | `string` | + +#### Returns + +`Element` + +--- + +### OpenUpgradeDetailsPaneButton + +▸ **OpenUpgradeDetailsPaneButton**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planetId` | `LocationId` \| `undefined` | + +#### Returns + +`Element` diff --git a/docs/modules/Frontend_Components_Text.md b/docs/modules/Frontend_Components_Text.md index cb5d00db..52fad457 100644 --- a/docs/modules/Frontend_Components_Text.md +++ b/docs/modules/Frontend_Components_Text.md @@ -31,7 +31,6 @@ - [FAQ04Link](Frontend_Components_Text.md#faq04link) - [FakeLine](Frontend_Components_Text.md#fakeline) - [Header](Frontend_Components_Text.md#header) -- [Link](Frontend_Components_Text.md#link) - [LongDash](Frontend_Components_Text.md#longdash) - [PlanetNameLink](Frontend_Components_Text.md#planetnamelink) - [Space](Frontend_Components_Text.md#space) @@ -263,22 +262,6 @@ --- -### Link - -▸ **Link**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :------------------ | :---------- | -| `__namedParameters` | `LinkProps` | - -#### Returns - -`Element` - ---- - ### LongDash ▸ `Const` **LongDash**(): `Element` diff --git a/docs/modules/Frontend_Components_TextPreview.md b/docs/modules/Frontend_Components_TextPreview.md index 9d6fd177..318a770b 100644 --- a/docs/modules/Frontend_Components_TextPreview.md +++ b/docs/modules/Frontend_Components_TextPreview.md @@ -14,13 +14,13 @@ #### Parameters -| Name | Type | -| :------------------------------------ | :------- | -| `__namedParameters` | `Object` | -| `__namedParameters.focusedWidthPx?` | `number` | -| `__namedParameters.maxLength?` | `number` | -| `__namedParameters.text` | `string` | -| `__namedParameters.unFocusedWidthPx?` | `number` | +| Name | Type | +| :---------------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.focusedWidth?` | `string` | +| `__namedParameters.maxLength?` | `number` | +| `__namedParameters.text?` | `string` | +| `__namedParameters.unFocusedWidth?` | `string` | #### Returns diff --git a/docs/modules/Frontend_Game_Popups.md b/docs/modules/Frontend_Game_Popups.md index d9bb30e8..a76c1b7e 100644 --- a/docs/modules/Frontend_Game_Popups.md +++ b/docs/modules/Frontend_Game_Popups.md @@ -14,12 +14,12 @@ #### Parameters -| Name | Type | -| :-------------- | :------------------------------------------------------------------------------- | -| `ethConnection` | [`default`](../classes/Backend_Network_EthConnection.default.md) | -| `txRequest` | [`QueuedTxRequest`](../interfaces/Backend_Network_TxExecutor.QueuedTxRequest.md) | -| `from` | `EthAddress` | -| `gasFeeGwei` | `number` | +| Name | Type | +| :-------------- | :------------------ | +| `ethConnection` | `EthConnection` | +| `txRequest` | `QueuedTransaction` | +| `from` | `EthAddress` | +| `gasFeeGwei` | `EthersBN` | #### Returns diff --git a/docs/modules/Frontend_Pages_GameLandingPage.md b/docs/modules/Frontend_Pages_GameLandingPage.md index 81e80132..e7b6e611 100644 --- a/docs/modules/Frontend_Pages_GameLandingPage.md +++ b/docs/modules/Frontend_Pages_GameLandingPage.md @@ -8,13 +8,13 @@ ### Functions -- [default](Frontend_Pages_GameLandingPage.md#default) +- [GameLandingPage](Frontend_Pages_GameLandingPage.md#gamelandingpage) ## Functions -### default +### GameLandingPage -▸ **default**(): `Element` +▸ **GameLandingPage**(): `Element` #### Returns diff --git a/docs/modules/Frontend_Panes_ArtifactDetailsPane.md b/docs/modules/Frontend_Panes_ArtifactDetailsPane.md index 091f3c9c..10ff9228 100644 --- a/docs/modules/Frontend_Panes_ArtifactDetailsPane.md +++ b/docs/modules/Frontend_Panes_ArtifactDetailsPane.md @@ -5,6 +5,7 @@ ### Functions - [ArtifactDetailsBody](Frontend_Panes_ArtifactDetailsPane.md#artifactdetailsbody) +- [ArtifactDetailsHelpContent](Frontend_Panes_ArtifactDetailsPane.md#artifactdetailshelpcontent) - [ArtifactDetailsPane](Frontend_Panes_ArtifactDetailsPane.md#artifactdetailspane) - [UpgradeStatInfo](Frontend_Panes_ArtifactDetailsPane.md#upgradestatinfo) @@ -16,12 +17,12 @@ #### Parameters -| Name | Type | -| :---------------------------------------------- | :------------------------------------------------------------------------------------------------ | -| `__namedParameters` | `Object` | -| `__namedParameters.artifactWrapper` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Artifact` \| `undefined`\> | -| `__namedParameters.contractConstants` | [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) | -| `__namedParameters.openConversationForArtifact` | | +| Name | Type | +| :------------------------------------ | :------------------------------------------------------------------------------------------------ | +| `__namedParameters` | `Object` | +| `__namedParameters.artifactId` | `ArtifactId` | +| `__namedParameters.contractConstants` | [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | #### Returns @@ -29,17 +30,27 @@ --- +### ArtifactDetailsHelpContent + +▸ **ArtifactDetailsHelpContent**(): `Element` + +#### Returns + +`Element` + +--- + ### ArtifactDetailsPane ▸ **ArtifactDetailsPane**(`__namedParameters`): `Element` #### Parameters -| Name | Type | -| :---------------------------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.openConversationForArtifact` | | +| Name | Type | +| :----------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifactId` | `ArtifactId` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | #### Returns diff --git a/docs/modules/Frontend_Panes_BroadcastPane.md b/docs/modules/Frontend_Panes_BroadcastPane.md index 3c0afc05..83904177 100644 --- a/docs/modules/Frontend_Panes_BroadcastPane.md +++ b/docs/modules/Frontend_Panes_BroadcastPane.md @@ -5,6 +5,7 @@ ### Functions - [BroadcastPane](Frontend_Panes_BroadcastPane.md#broadcastpane) +- [BroadcastPaneHelpContent](Frontend_Panes_BroadcastPane.md#broadcastpanehelpcontent) ## Functions @@ -14,10 +15,21 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :--------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planetId` | `LocationId` \| `undefined` | + +#### Returns + +`Element` + +--- + +### BroadcastPaneHelpContent + +▸ **BroadcastPaneHelpContent**(): `Element` #### Returns diff --git a/docs/modules/Frontend_Panes_DiagnosticsPane.md b/docs/modules/Frontend_Panes_DiagnosticsPane.md index 5ca8c8a5..bbdf9daf 100644 --- a/docs/modules/Frontend_Panes_DiagnosticsPane.md +++ b/docs/modules/Frontend_Panes_DiagnosticsPane.md @@ -2,10 +2,6 @@ ## Table of contents -### Interfaces - -- [Diagnostics](../interfaces/Frontend_Panes_DiagnosticsPane.Diagnostics.md) - ### Functions - [DiagnosticsPane](Frontend_Panes_DiagnosticsPane.md#diagnosticspane) diff --git a/docs/modules/Frontend_Panes_HatPane.md b/docs/modules/Frontend_Panes_HatPane.md index 79d1bbbf..8f8320a8 100644 --- a/docs/modules/Frontend_Panes_HatPane.md +++ b/docs/modules/Frontend_Panes_HatPane.md @@ -14,10 +14,11 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :---------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planetId?` | `LocationId` | #### Returns diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactListItem.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactListItem.md index 41ca72e7..875e8f2c 100644 --- a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactListItem.md +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactListItem.md @@ -14,12 +14,12 @@ #### Parameters -| Name | Type | -| :-------------------------------------- | :------------------------ | -| `__namedParameters` | `Object` | -| `__namedParameters.artifact` | `Artifact` \| `undefined` | -| `__namedParameters.actions` | | -| `__namedParameters.openArtifactDetails` | | +| Name | Type | +| :--------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` \| `undefined` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.actions` | | #### Returns diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactsList.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactsList.md index 7a06541b..7776704f 100644 --- a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactsList.md +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ArtifactsList.md @@ -14,13 +14,13 @@ #### Parameters -| Name | Type | -| :-------------------------------------- | :----------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.artifacts` | (`Artifact` \| `undefined`)[] | -| `__namedParameters.sortBy` | keyof `Upgrade` \| `undefined` | -| `__namedParameters.actions` | | -| `__namedParameters.openArtifactDetails` | | +| Name | Type | +| :---------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifacts` | (`Artifact` \| `undefined`)[] | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.sortBy` | keyof `Upgrade` \| `undefined` | +| `__namedParameters.actions` | | #### Returns diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManageArtifacts.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManageArtifacts.md index 4fc5b397..bd33938b 100644 --- a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManageArtifacts.md +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManageArtifacts.md @@ -14,22 +14,22 @@ #### Parameters -| Name | Type | -| :--------------------------------------- | :---------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.artifactsInInventory` | `Artifact`[] | -| `__namedParameters.artifactsOnPlanet` | (`Artifact` \| `undefined`)[] | -| `__namedParameters.currentBlockNumber` | `number` \| `undefined` | -| `__namedParameters.planet` | `LocatablePlanet` | -| `__namedParameters.playerAddress` | `string` | -| `__namedParameters.roundOver` | `boolean` | -| `__namedParameters.activate` | | -| `__namedParameters.deactivate` | | -| `__namedParameters.deposit` | | -| `__namedParameters.find` | | -| `__namedParameters.openArtifactDetails` | | -| `__namedParameters.prospect` | | -| `__namedParameters.withdraw` | | +| Name | Type | +| :--------------------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifactsInInventory` | `Artifact`[] | +| `__namedParameters.artifactsOnPlanet` | (`Artifact` \| `undefined`)[] | +| `__namedParameters.currentBlockNumber` | `number` \| `undefined` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planet` | `LocatablePlanet` | +| `__namedParameters.playerAddress` | `string` | +| `__namedParameters.roundOver` | `boolean` | +| `__namedParameters.activate` | | +| `__namedParameters.deactivate` | | +| `__namedParameters.deposit` | | +| `__namedParameters.find` | | +| `__namedParameters.prospect` | | +| `__namedParameters.withdraw` | | #### Returns diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md index 848cfa47..be4edc01 100644 --- a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md @@ -4,10 +4,21 @@ ### Functions +- [ManagePlanetArtifactsHelpContent](Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md#manageplanetartifactshelpcontent) - [ManagePlanetArtifactsPane](Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md#manageplanetartifactspane) ## Functions +### ManagePlanetArtifactsHelpContent + +▸ **ManagePlanetArtifactsHelpContent**(): `Element` + +#### Returns + +`Element` + +--- + ### ManagePlanetArtifactsPane ▸ **ManagePlanetArtifactsPane**(`__namedParameters`): `Element` @@ -18,11 +29,11 @@ activating, and deactivating artifacts. #### Parameters -| Name | Type | -| :----------------------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.setArtifactDetailsOpen` | | +| Name | Type | +| :--------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planetId` | `LocationId` \| `undefined` | #### Returns diff --git a/docs/modules/Frontend_Panes_PlanetContextPane.md b/docs/modules/Frontend_Panes_PlanetContextPane.md index f471ddde..59cfc51f 100644 --- a/docs/modules/Frontend_Panes_PlanetContextPane.md +++ b/docs/modules/Frontend_Panes_PlanetContextPane.md @@ -14,9 +14,10 @@ #### Parameters -| Name | Type | -| :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------- | -| `__namedParameters` | { `hook`: [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) } & [`PlanetNotifHooks`](Frontend_Views_PlanetNotifications.md#planetnotifhooks) | +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | #### Returns diff --git a/docs/modules/Frontend_Panes_PlanetDetailsPane.md b/docs/modules/Frontend_Panes_PlanetDetailsPane.md deleted file mode 100644 index 7bda6a0f..00000000 --- a/docs/modules/Frontend_Panes_PlanetDetailsPane.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Panes/PlanetDetailsPane - -## Table of contents - -### Functions - -- [PlanetDetailsPane](Frontend_Panes_PlanetDetailsPane.md#planetdetailspane) - -## Functions - -### PlanetDetailsPane - -▸ **PlanetDetailsPane**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :-------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hatHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | - -#### Returns - -`Element` diff --git a/docs/modules/Frontend_Panes_PlayerArtifactsPane.md b/docs/modules/Frontend_Panes_PlayerArtifactsPane.md index 4d5ed30e..e229a3f3 100644 --- a/docs/modules/Frontend_Panes_PlayerArtifactsPane.md +++ b/docs/modules/Frontend_Panes_PlayerArtifactsPane.md @@ -14,11 +14,10 @@ #### Parameters -| Name | Type | -| :-------------------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.artifactDetailsHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :----------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | #### Returns diff --git a/docs/modules/Frontend_Panes_SettingsPane.md b/docs/modules/Frontend_Panes_SettingsPane.md index 1cb8ffb6..7ee8123b 100644 --- a/docs/modules/Frontend_Panes_SettingsPane.md +++ b/docs/modules/Frontend_Panes_SettingsPane.md @@ -14,12 +14,12 @@ #### Parameters -| Name | Type | -| :-------------------------------- | :--------------------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.ethConnection` | [`default`](../classes/Backend_Network_EthConnection.default.md) | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.privateHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :-------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.ethConnection` | `EthConnection` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.privateHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | #### Returns diff --git a/docs/modules/Frontend_Panes_UpgradeDetailsPane.md b/docs/modules/Frontend_Panes_UpgradeDetailsPane.md index 10fc1acb..c3564953 100644 --- a/docs/modules/Frontend_Panes_UpgradeDetailsPane.md +++ b/docs/modules/Frontend_Panes_UpgradeDetailsPane.md @@ -5,6 +5,7 @@ ### Functions - [UpgradeDetailsPane](Frontend_Panes_UpgradeDetailsPane.md#upgradedetailspane) +- [UpgradeDetailsPaneHelpContent](Frontend_Panes_UpgradeDetailsPane.md#upgradedetailspanehelpcontent) ## Functions @@ -14,10 +15,21 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :--------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planetId` | `LocationId` \| `undefined` | + +#### Returns + +`Element` + +--- + +### UpgradeDetailsPaneHelpContent + +▸ **UpgradeDetailsPaneHelpContent**(): `Element` #### Returns diff --git a/docs/modules/Frontend_Styles_colors.md b/docs/modules/Frontend_Styles_colors.md deleted file mode 100644 index 41d90199..00000000 --- a/docs/modules/Frontend_Styles_colors.md +++ /dev/null @@ -1,29 +0,0 @@ -# Module: Frontend/Styles/colors - -## Table of contents - -### Properties - -- [default](Frontend_Styles_colors.md#default) - -## Properties - -### default - -• **default**: `Object` - -#### Type declaration - -| Name | Type | -| :--------- | :------- | -| `black` | `string` | -| `gray-100` | `string` | -| `gray-200` | `string` | -| `gray-300` | `string` | -| `gray-400` | `string` | -| `gray-500` | `string` | -| `gray-600` | `string` | -| `gray-700` | `string` | -| `gray-800` | `string` | -| `gray-900` | `string` | -| `white` | `string` | diff --git a/docs/modules/Frontend_Styles_dfstyles.md b/docs/modules/Frontend_Styles_dfstyles.md index 5cb1190a..ef865cb5 100644 --- a/docs/modules/Frontend_Styles_dfstyles.md +++ b/docs/modules/Frontend_Styles_dfstyles.md @@ -38,10 +38,13 @@ | `colors.backgroundlight` | `string` | | `colors.backgroundlighter` | `string` | | `colors.blueBackground` | `string` | +| `colors.border` | `string` | +| `colors.darkBorder` | `string` | | `colors.dfblue` | `string` | | `colors.dfgreen` | `string` | | `colors.dfgreendark` | `string` | | `colors.dfgreenlight` | `string` | +| `colors.dfpurple` | `string` | | `colors.dfred` | `string` | | `colors.dfyellow` | `string` | | `colors.icons` | `Object` | diff --git a/docs/modules/Frontend_Styles_tailwind_config.export_.md b/docs/modules/Frontend_Styles_tailwind_config.export_.md deleted file mode 100644 index 488eb20f..00000000 --- a/docs/modules/Frontend_Styles_tailwind_config.export_.md +++ /dev/null @@ -1,3 +0,0 @@ -# Namespace: export= - -[Frontend/Styles/tailwind.config](Frontend_Styles_tailwind_config.md).export= diff --git a/docs/modules/Frontend_Styles_tailwind_config.md b/docs/modules/Frontend_Styles_tailwind_config.md deleted file mode 100644 index adaa4a5f..00000000 --- a/docs/modules/Frontend_Styles_tailwind_config.md +++ /dev/null @@ -1,25 +0,0 @@ -# Module: Frontend/Styles/tailwind.config - -## Table of contents - -### Namespaces - -- [export=](Frontend_Styles_tailwind_config.export_.md) - -### Properties - -- [export=](Frontend_Styles_tailwind_config.md#export=) - -## Properties - -### export= - -• **export=**: `Object` - -#### Type declaration - -| Name | Type | -| :--------- | :-------- | -| `plugins` | `never`[] | -| `theme` | `Object` | -| `variants` | `Object` | diff --git a/docs/modules/Frontend_Utils_AppHooks.md b/docs/modules/Frontend_Utils_AppHooks.md index 8d178ced..4d526fa7 100644 --- a/docs/modules/Frontend_Utils_AppHooks.md +++ b/docs/modules/Frontend_Utils_AppHooks.md @@ -11,16 +11,21 @@ - [useAccount](Frontend_Utils_AppHooks.md#useaccount) - [useActiveArtifact](Frontend_Utils_AppHooks.md#useactiveartifact) +- [useArtifact](Frontend_Utils_AppHooks.md#useartifact) - [useControlDown](Frontend_Utils_AppHooks.md#usecontroldown) - [useHoverPlanet](Frontend_Utils_AppHooks.md#usehoverplanet) - [useLeaderboard](Frontend_Utils_AppHooks.md#useleaderboard) - [useMyArtifacts](Frontend_Utils_AppHooks.md#usemyartifacts) +- [useMyArtifactsList](Frontend_Utils_AppHooks.md#usemyartifactslist) +- [usePlanet](Frontend_Utils_AppHooks.md#useplanet) - [usePlanetArtifacts](Frontend_Utils_AppHooks.md#useplanetartifacts) - [usePlanetInactiveArtifacts](Frontend_Utils_AppHooks.md#useplanetinactiveartifacts) +- [usePlayer](Frontend_Utils_AppHooks.md#useplayer) +- [usePopAllOnSelectedPlanetChanged](Frontend_Utils_AppHooks.md#usepopallonselectedplanetchanged) - [useSelectedArtifact](Frontend_Utils_AppHooks.md#useselectedartifact) - [useSelectedPlanet](Frontend_Utils_AppHooks.md#useselectedplanet) +- [useSelectedPlanetId](Frontend_Utils_AppHooks.md#useselectedplanetid) - [useTopLevelDiv](Frontend_Utils_AppHooks.md#usetopleveldiv) -- [useTwitter](Frontend_Utils_AppHooks.md#usetwitter) - [useUIManager](Frontend_Utils_AppHooks.md#useuimanager) ## Variables @@ -72,6 +77,23 @@ Get the currently used account on the client. --- +### useArtifact + +▸ **useArtifact**(`uiManager`, `artifactId`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`undefined` \| `Artifact`\> + +#### Parameters + +| Name | Type | +| :----------- | :----------------------------------------------------------------- | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | +| `artifactId` | `ArtifactId` | + +#### Returns + +[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`undefined` \| `Artifact`\> + +--- + ### useControlDown ▸ **useControlDown**(): `boolean` @@ -127,7 +149,23 @@ Loads the leaderboard ### useMyArtifacts -▸ **useMyArtifacts**(`uiManager`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Map`<`ArtifactId`, `Artifact`\> \| `undefined`\> +▸ **useMyArtifacts**(`uiManager`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Artifact`[]\> + +#### Parameters + +| Name | Type | +| :---------- | :----------------------------------------------------------------- | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | + +#### Returns + +[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Artifact`[]\> + +--- + +### useMyArtifactsList + +▸ **useMyArtifactsList**(`uiManager`): `Artifact`[] #### Parameters @@ -137,7 +175,24 @@ Loads the leaderboard #### Returns -[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Map`<`ArtifactId`, `Artifact`\> \| `undefined`\> +`Artifact`[] + +--- + +### usePlanet + +▸ **usePlanet**(`uiManager`, `locationId`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> + +#### Parameters + +| Name | Type | +| :----------- | :----------------------------------------------------------------- | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | +| `locationId` | `LocationId` \| `undefined` | + +#### Returns + +[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> --- @@ -175,6 +230,42 @@ Loads the leaderboard --- +### usePlayer + +▸ **usePlayer**(`uiManager`, `ethAddress?`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Player` \| `undefined`\> + +Hook which gets you the player, and updates whenever that player's twitter or score changes. + +#### Parameters + +| Name | Type | +| :------------ | :----------------------------------------------------------------- | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | +| `ethAddress?` | `EthAddress` | + +#### Returns + +[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Player` \| `undefined`\> + +--- + +### usePopAllOnSelectedPlanetChanged + +▸ **usePopAllOnSelectedPlanetChanged**(`modal`, `startingId`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :--------------------------------------------------------------------- | +| `modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `startingId` | `LocationId` \| `undefined` | + +#### Returns + +`void` + +--- + ### useSelectedArtifact ▸ **useSelectedArtifact**(`uiManager`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Artifact` \| `undefined`\> @@ -211,30 +302,30 @@ Create a subscription to the currently selected planet. --- -### useTopLevelDiv +### useSelectedPlanetId -▸ **useTopLevelDiv**(): `HTMLDivElement` +▸ **useSelectedPlanetId**(`uiManager`, `defaultId?`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`undefined` \| `LocationId`\> -#### Returns +#### Parameters -`HTMLDivElement` +| Name | Type | +| :----------- | :----------------------------------------------------------------- | +| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | +| `defaultId?` | `LocationId` | ---- +#### Returns -### useTwitter +[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`undefined` \| `LocationId`\> -▸ **useTwitter**(`account`, `uiManager`): `string` \| `undefined` +--- -#### Parameters +### useTopLevelDiv -| Name | Type | -| :---------- | :----------------------------------------------------------------- | -| `account` | `EthAddress` \| `undefined` | -| `uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | +▸ **useTopLevelDiv**(): `HTMLDivElement` #### Returns -`string` \| `undefined` +`HTMLDivElement` --- diff --git a/docs/modules/Frontend_Utils_EmitterHooks.md b/docs/modules/Frontend_Utils_EmitterHooks.md index 6704fb34..6cb13e72 100644 --- a/docs/modules/Frontend_Utils_EmitterHooks.md +++ b/docs/modules/Frontend_Utils_EmitterHooks.md @@ -25,10 +25,10 @@ Execute something on emitter callback #### Parameters -| Name | Type | Description | -| :--------- | :------------------------------------------------------------ | :--------------------------- | -| `emitter` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`T`\> | `Monomitter` to subscribe to | -| `callback` | [`Callback`](Frontend_Utils_Monomitter.md#callback)<`T`\> | callback to subscribe | +| Name | Type | Description | +| :--------- | :----------------- | :--------------------------- | +| `emitter` | `Monomitter`<`T`\> | `Monomitter` to subscribe to | +| `callback` | `Callback`<`T`\> | callback to subscribe | #### Returns @@ -50,10 +50,10 @@ Use returned value from an emitter #### Parameters -| Name | Type | Description | -| :----------- | :------------------------------------------------------------ | :--------------------------- | -| `emitter` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`T`\> | `Monomitter` to subscribe to | -| `initialVal` | `T` | initial state value | +| Name | Type | Description | +| :----------- | :----------------- | :--------------------------- | +| `emitter` | `Monomitter`<`T`\> | `Monomitter` to subscribe to | +| `initialVal` | `T` | initial state value | #### Returns @@ -69,10 +69,10 @@ Return a bool indicating if a key is pressed #### Parameters -| Name | Type | Description | -| :--------- | :------------------------------------------------------------------------ | :----------------- | -| `keydown$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`KeyboardEvent`\> | keydown monomitter | -| `keyup$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`KeyboardEvent`\> | keyup monomitter | +| Name | Type | Description | +| :--------- | :----------------------------- | :----------------- | +| `keydown$` | `Monomitter`<`KeyboardEvent`\> | keydown monomitter | +| `keyup$` | `Monomitter`<`KeyboardEvent`\> | keyup monomitter | #### Returns @@ -94,10 +94,10 @@ Use returned value from an emitter, and clone the reference - used to force an u #### Parameters -| Name | Type | Description | -| :----------- | :--------------------------------------------------------------------------- | :--------------------------- | -| `emitter` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`T` \| `undefined`\> | `Monomitter` to subscribe to | -| `initialVal` | `T` \| `undefined` | initial state value | +| Name | Type | Description | +| :----------- | :-------------------------------- | :--------------------------- | +| `emitter` | `Monomitter`<`T` \| `undefined`\> | `Monomitter` to subscribe to | +| `initialVal` | `T` \| `undefined` | initial state value | #### Returns diff --git a/docs/modules/Frontend_Utils_EmitterUtils.md b/docs/modules/Frontend_Utils_EmitterUtils.md index 5c756422..5d63b12d 100644 --- a/docs/modules/Frontend_Utils_EmitterUtils.md +++ b/docs/modules/Frontend_Utils_EmitterUtils.md @@ -21,7 +21,7 @@ ### generateDiffEmitter -▸ **generateDiffEmitter**<`Obj`\>(`emitter`): [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<[`Diff`](../interfaces/Frontend_Utils_EmitterUtils.Diff.md)<`Obj`\> \| `undefined`\> +▸ **generateDiffEmitter**<`Obj`\>(`emitter`): `Monomitter`<[`Diff`](../interfaces/Frontend_Utils_EmitterUtils.Diff.md)<`Obj`\> \| `undefined`\> Wraps an existing emitter and emits an event with the current and previous values @@ -33,13 +33,13 @@ Wraps an existing emitter and emits an event with the current and previous value #### Parameters -| Name | Type | Description | -| :-------- | :----------------------------------------------------------------------------- | :--------------------------------- | -| `emitter` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Obj` \| `undefined`\> | an emitter announcing game objects | +| Name | Type | Description | +| :-------- | :---------------------------------- | :--------------------------------- | +| `emitter` | `Monomitter`<`Obj` \| `undefined`\> | an emitter announcing game objects | #### Returns -[`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<[`Diff`](../interfaces/Frontend_Utils_EmitterUtils.Diff.md)<`Obj`\> \| `undefined`\> +`Monomitter`<[`Diff`](../interfaces/Frontend_Utils_EmitterUtils.Diff.md)<`Obj`\> \| `undefined`\> --- @@ -77,7 +77,7 @@ Wraps an existing emitter and emits an event with the current and previous value ### getDisposableEmitter -▸ **getDisposableEmitter**<`Obj`, `Id`\>(`objMap`, `objId`, `objUpdated$`): [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Obj` \| `undefined`\> +▸ **getDisposableEmitter**<`Obj`, `Id`\>(`objMap`, `objId`, `objUpdated$`): `Monomitter`<`Obj` \| `undefined`\> Create a monomitter to emit objects with a given id from a cached map of ids to objects. Not intended for re-use @@ -90,21 +90,21 @@ Create a monomitter to emit objects with a given id from a cached map of ids to #### Parameters -| Name | Type | Description | -| :------------ | :------------------------------------------------------------- | :------------------------------------------------------ | -| `objMap` | `Map`<`Id`, `Obj`\> | the cached map of `` | -| `objId` | `Id` | the object id to select | -| `objUpdated$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Id`\> | emitter which indicates when an object has been updated | +| Name | Type | Description | +| :------------ | :------------------ | :------------------------------------------------------ | +| `objMap` | `Map`<`Id`, `Obj`\> | the cached map of `` | +| `objId` | `Id` | the object id to select | +| `objUpdated$` | `Monomitter`<`Id`\> | emitter which indicates when an object has been updated | #### Returns -[`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Obj` \| `undefined`\> +`Monomitter`<`Obj` \| `undefined`\> --- ### getObjectWithIdFromMap -▸ **getObjectWithIdFromMap**<`Obj`, `Id`\>(`objMap`, `objId$`, `objUpdated$`): [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Obj` \| `undefined`\> +▸ **getObjectWithIdFromMap**<`Obj`, `Id`\>(`objMap`, `objId$`, `objUpdated$`): `Monomitter`<`Obj` \| `undefined`\> Create a monomitter to emit objects with a given id from a cached map of ids to objects. @@ -117,15 +117,15 @@ Create a monomitter to emit objects with a given id from a cached map of ids to #### Parameters -| Name | Type | Description | -| :------------ | :---------------------------------------------------------------------------- | :------------------------------------------------------ | -| `objMap` | `Map`<`Id`, `Obj`\> | the cached map of `` | -| `objId$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Id` \| `undefined`\> | the object id to select | -| `objUpdated$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Id`\> | emitter which indicates when an object has been updated | +| Name | Type | Description | +| :------------ | :--------------------------------- | :------------------------------------------------------ | +| `objMap` | `Map`<`Id`, `Obj`\> | the cached map of `` | +| `objId$` | `Monomitter`<`Id` \| `undefined`\> | the object id to select | +| `objUpdated$` | `Monomitter`<`Id`\> | emitter which indicates when an object has been updated | #### Returns -[`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Obj` \| `undefined`\> +`Monomitter`<`Obj` \| `undefined`\> --- @@ -178,16 +178,16 @@ of our owned objects, and also emits a message that the object was updated. #### Parameters -| Name | Type | Description | -| :------------------ | :---------------------------------------------------------------------------- | :---------------------------------------------- | -| `objectMap` | `Map`<`Id`, `Obj`\> | map that caches known objects | -| `myObjectMap` | `Map`<`Id`, `Obj`\> | map that caches known objects owned by the user | -| `address` | `EthAddress` \| `undefined` | the user's account address | -| `objUpdated$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Id`\> | emitter for announcing object updates | -| `myObjListUpdated$` | [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`Map`<`Id`, `Obj`\>\> | - | -| `getId` | (`o`: `Obj`) => `Id` | - | -| `getOwner` | (`o`: `Obj`) => `EthAddress` | - | -| `obj` | `Obj` | the object we want to cache | +| Name | Type | Description | +| :------------------ | :--------------------------------- | :---------------------------------------------- | +| `objectMap` | `Map`<`Id`, `Obj`\> | map that caches known objects | +| `myObjectMap` | `Map`<`Id`, `Obj`\> | map that caches known objects owned by the user | +| `address` | `EthAddress` \| `undefined` | the user's account address | +| `objUpdated$` | `Monomitter`<`Id`\> | emitter for announcing object updates | +| `myObjListUpdated$` | `Monomitter`<`Map`<`Id`, `Obj`\>\> | - | +| `getId` | (`o`: `Obj`) => `Id` | - | +| `getOwner` | (`o`: `Obj`) => `EthAddress` | - | +| `obj` | `Obj` | the object we want to cache | #### Returns diff --git a/docs/modules/Frontend_Utils_KeyEmitters.md b/docs/modules/Frontend_Utils_KeyEmitters.md index 88152312..2a121b34 100644 --- a/docs/modules/Frontend_Utils_KeyEmitters.md +++ b/docs/modules/Frontend_Utils_KeyEmitters.md @@ -7,28 +7,55 @@ - [ctrlDown$](Frontend_Utils_KeyEmitters.md#ctrldown$) - [ctrlUp$](Frontend_Utils_KeyEmitters.md#ctrlup$) - [escapeDown$](Frontend_Utils_KeyEmitters.md#escapedown$) +- [keyDown$](Frontend_Utils_KeyEmitters.md#keydown$) - [keyUp$](Frontend_Utils_KeyEmitters.md#keyup$) +### Functions + +- [useIsDown](Frontend_Utils_KeyEmitters.md#useisdown) + ## Variables ### ctrlDown$ -• `Const` **ctrlDown$**: [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`KeyboardEvent`\> +• `Const` **ctrlDown$**: `Monomitter`<`KeyboardEvent`\> --- ### ctrlUp$ -• `Const` **ctrlUp$**: [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`KeyboardEvent`\> +• `Const` **ctrlUp$**: `Monomitter`<`KeyboardEvent`\> --- ### escapeDown$ -• `Const` **escapeDown$**: [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`KeyboardEvent`\> +• `Const` **escapeDown$**: `Monomitter`<`KeyboardEvent`\> + +--- + +### keyDown$ + +• `Const` **keyDown$**: `Monomitter`<[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`string`\>\> --- ### keyUp$ -• `Const` **keyUp$**: [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`string`\>\> +• `Const` **keyUp$**: `Monomitter`<[`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`string`\>\> + +## Functions + +### useIsDown + +▸ **useIsDown**(`key?`): `boolean` + +#### Parameters + +| Name | Type | +| :----- | :------- | +| `key?` | `string` | + +#### Returns + +`boolean` diff --git a/docs/modules/Frontend_Utils_Monomitter.md b/docs/modules/Frontend_Utils_Monomitter.md deleted file mode 100644 index 6515f466..00000000 --- a/docs/modules/Frontend_Utils_Monomitter.md +++ /dev/null @@ -1,98 +0,0 @@ -# Module: Frontend/Utils/Monomitter - -## Table of contents - -### Type aliases - -- [Callback](Frontend_Utils_Monomitter.md#callback) -- [Monomitter](Frontend_Utils_Monomitter.md#monomitter) -- [Subscription](Frontend_Utils_Monomitter.md#subscription) - -### Functions - -- [monomitter](Frontend_Utils_Monomitter.md#monomitter) - -## Type aliases - -### Callback - -Ƭ **Callback**<`T`\>: (`o`: `T`) => `void` - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Type declaration - -▸ (`o`): `void` - -Typed single pub / sub pattern, inspired by: -https://github.com/loilo/monomitter/blob/master/monomitter.mjs - -##### Parameters - -| Name | Type | -| :--- | :--- | -| `o` | `T` | - -##### Returns - -`void` - ---- - -### Monomitter - -Ƭ **Monomitter**<`T`\>: `Object` - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Type declaration - -| Name | Type | -| :---------- | :------------------------------------------------------------------------------------------------------------------------------- | -| `clear` | () => `void` | -| `publish` | (`o`: `T`) => `void` | -| `subscribe` | (`cb`: [`Callback`](Frontend_Utils_Monomitter.md#callback)<`T`\>) => [`Subscription`](Frontend_Utils_Monomitter.md#subscription) | - ---- - -### Subscription - -Ƭ **Subscription**: `Object` - -#### Type declaration - -| Name | Type | -| :------------ | :----------- | -| `unsubscribe` | () => `void` | - -## Functions - -### monomitter - -▸ **monomitter**<`T`\>(`emitLatestOnSubscribe?`): [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`T`\> - -Constructs a new event emitter, whose purpose is to emit values of the given type. - -#### Type parameters - -| Name | -| :--- | -| `T` | - -#### Parameters - -| Name | Type | Default value | Description | -| :---------------------- | :-------- | :------------ | :----------------------------------------------------------------------------------------------- | -| `emitLatestOnSubscribe` | `boolean` | `false` | if this is true, upon subscription immediately emit the most recently set value, if there is one | - -#### Returns - -[`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<`T`\> diff --git a/docs/modules/Frontend_Utils_SettingsHooks.md b/docs/modules/Frontend_Utils_SettingsHooks.md index b2b99f09..3a86645d 100644 --- a/docs/modules/Frontend_Utils_SettingsHooks.md +++ b/docs/modules/Frontend_Utils_SettingsHooks.md @@ -4,7 +4,6 @@ ### Enumerations -- [AutoGasSetting](../enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md) - [Setting](../enums/Frontend_Utils_SettingsHooks.Setting.md) ### Variables @@ -31,13 +30,13 @@ ### ALL_AUTO_GAS_SETTINGS -• `Const` **ALL_AUTO_GAS_SETTINGS**: [`AutoGasSetting`](../enums/Frontend_Utils_SettingsHooks.AutoGasSetting.md)[] +• `Const` **ALL_AUTO_GAS_SETTINGS**: `AutoGasSetting`[] --- ### settingChanged$ -• `Const` **settingChanged$**: [`Monomitter`](Frontend_Utils_Monomitter.md#monomitter)<[`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md)\> +• `Const` **settingChanged$**: `Monomitter`<[`Setting`](../enums/Frontend_Utils_SettingsHooks.Setting.md)\> Whenever a setting changes, we publish the setting's name to this event emitter. @@ -84,6 +83,7 @@ several options. | `__namedParameters.style?` | `React.CSSProperties` | | `__namedParameters.uiManager` | [`default`](../classes/Backend_GameLogic_GameUIManager.default.md) | | `__namedParameters.values` | `string`[] | +| `__namedParameters.wide?` | `boolean` | #### Returns diff --git a/docs/modules/Frontend_Utils_ShortcutConstants.md b/docs/modules/Frontend_Utils_ShortcutConstants.md index 2f746760..07ab1d51 100644 --- a/docs/modules/Frontend_Utils_ShortcutConstants.md +++ b/docs/modules/Frontend_Utils_ShortcutConstants.md @@ -9,10 +9,13 @@ - [TOGGLE_DIAGNOSTICS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_diagnostics_pane) - [TOGGLE_HAT_PANE](Frontend_Utils_ShortcutConstants.md#toggle_hat_pane) - [TOGGLE_PLANET_ARTIFACTS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_planet_artifacts_pane) -- [TOGGLE_PLANET_DETAILS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_planet_details_pane) - [TOGGLE_PLANET_DEX_PANE](Frontend_Utils_ShortcutConstants.md#toggle_planet_dex_pane) - [TOGGLE_UPGRADES_PANE](Frontend_Utils_ShortcutConstants.md#toggle_upgrades_pane) +### Functions + +- [useSubscribeToShortcut](Frontend_Utils_ShortcutConstants.md#usesubscribetoshortcut) + ## Variables ### TOGGLE_ARTIFACTS_DEX_PANE @@ -45,12 +48,6 @@ --- -### TOGGLE_PLANET_DETAILS_PANE - -• `Const` **TOGGLE_PLANET_DETAILS_PANE**: `"d"` - ---- - ### TOGGLE_PLANET_DEX_PANE • `Const` **TOGGLE_PLANET_DEX_PANE**: `"q"` @@ -60,3 +57,20 @@ ### TOGGLE_UPGRADES_PANE • `Const` **TOGGLE_UPGRADES_PANE**: `"u"` + +## Functions + +### useSubscribeToShortcut + +▸ **useSubscribeToShortcut**(`key`, `callback`): `void` + +#### Parameters + +| Name | Type | +| :--------- | :---------------------- | +| `key` | `string` \| `undefined` | +| `callback` | () => `void` | + +#### Returns + +`void` diff --git a/docs/modules/Frontend_Utils_constants.md b/docs/modules/Frontend_Utils_constants.md index 534df6d3..244f010e 100644 --- a/docs/modules/Frontend_Utils_constants.md +++ b/docs/modules/Frontend_Utils_constants.md @@ -8,21 +8,13 @@ ### Variables -- [BLOCK_EXPLORER_URL](Frontend_Utils_constants.md#block_explorer_url) - [HAT_SIZES](Frontend_Utils_constants.md#hat_sizes) - [LOCATION_ID_UB](Frontend_Utils_constants.md#location_id_ub) - [MAX_CHUNK_SIZE](Frontend_Utils_constants.md#max_chunk_size) - [MIN_CHUNK_SIZE](Frontend_Utils_constants.md#min_chunk_size) -- [XDAI_CHAIN_ID](Frontend_Utils_constants.md#xdai_chain_id) ## Variables -### BLOCK_EXPLORER_URL - -• `Const` **BLOCK_EXPLORER_URL**: `"https://blockscout.com/poa/xdai"` - ---- - ### HAT_SIZES • `Const` **HAT_SIZES**: `string`[] @@ -49,10 +41,9 @@ the algorithms implemented in {@link ChunkUtils}. ### MIN_CHUNK_SIZE -• `Const` **MIN_CHUNK_SIZE**: `16` - ---- +• `Const` **MIN_CHUNK_SIZE**: `256` -### XDAI_CHAIN_ID +To code reviewer, make sure this does not change! -• `Const` **XDAI_CHAIN_ID**: `100` +To developer, increase this number to a large power of two. This, in combination with setting +`DISABLE_ZK_CHECKS` in darkforest.toml, will make you mine the map at ULTRA SPEED! diff --git a/docs/modules/Frontend_Views_ArtifactLink.md b/docs/modules/Frontend_Views_ArtifactLink.md index c57826ec..f2dbd06e 100644 --- a/docs/modules/Frontend_Views_ArtifactLink.md +++ b/docs/modules/Frontend_Views_ArtifactLink.md @@ -14,12 +14,12 @@ #### Parameters -| Name | Type | -| :--------------------------------- | :---------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.artifact` | `Artifact` | -| `__namedParameters.children` | `React.ReactNode` | -| `__namedParameters.setDetailsOpen` | | +| Name | Type | +| :--------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.artifact` | `Artifact` | +| `__namedParameters.children` | `React.ReactNode` \| `React.ReactNode`[] | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | #### Returns diff --git a/docs/modules/Frontend_Views_GameWindowLayout.md b/docs/modules/Frontend_Views_GameWindowLayout.md index e6ec43cb..c9b04cd0 100644 --- a/docs/modules/Frontend_Views_GameWindowLayout.md +++ b/docs/modules/Frontend_Views_GameWindowLayout.md @@ -10,7 +10,15 @@ ### GameWindowLayout -▸ **GameWindowLayout**(): `Element` +▸ **GameWindowLayout**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------------- | :-------- | +| `__namedParameters` | `Object` | +| `__namedParameters.terminalVisible` | `boolean` | +| `__namedParameters.setTerminalVisible` | | #### Returns diff --git a/docs/modules/Frontend_Views_MenuBar.md b/docs/modules/Frontend_Views_MenuBar.md deleted file mode 100644 index e1a9db0c..00000000 --- a/docs/modules/Frontend_Views_MenuBar.md +++ /dev/null @@ -1,37 +0,0 @@ -# Module: Frontend/Views/MenuBar - -## Table of contents - -### Variables - -- [MenuBar](Frontend_Views_MenuBar.md#menubar) - -### Functions - -- [MenuBarSection](Frontend_Views_MenuBar.md#menubarsection) - -## Variables - -### MenuBar - -• `Const` **MenuBar**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - -Left bar (with all the modal icons) - -## Functions - -### MenuBarSection - -▸ **MenuBarSection**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :------------------------------- | :---------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.children` | `React.ReactNode` | -| `__namedParameters.collapsible?` | `boolean` | - -#### Returns - -`Element` diff --git a/docs/modules/Frontend_Views_ModalIcon.md b/docs/modules/Frontend_Views_ModalIcon.md index 1ae0ccfc..83e62cbf 100644 --- a/docs/modules/Frontend_Views_ModalIcon.md +++ b/docs/modules/Frontend_Views_ModalIcon.md @@ -4,6 +4,7 @@ ### Functions +- [BroadcastPlanetIcon](Frontend_Views_ModalIcon.md#broadcastplaneticon) - [ModalAccountIcon](Frontend_Views_ModalIcon.md#modalaccounticon) - [ModalArtifactIcon](Frontend_Views_ModalIcon.md#modalartifacticon) - [ModalArtifactsConversationIcon](Frontend_Views_ModalIcon.md#modalartifactsconversationicon) @@ -16,7 +17,6 @@ - [ModalPlanetDexIcon](Frontend_Views_ModalIcon.md#modalplanetdexicon) - [ModalPluginIcon](Frontend_Views_ModalIcon.md#modalpluginicon) - [ModalSettingsIcon](Frontend_Views_ModalIcon.md#modalsettingsicon) -- [ModalTwitterBroadcastIcon](Frontend_Views_ModalIcon.md#modaltwitterbroadcasticon) - [ModalTwitterVerifyIcon](Frontend_Views_ModalIcon.md#modaltwitterverifyicon) - [ModalUpgradeDetailsIcon](Frontend_Views_ModalIcon.md#modalupgradedetailsicon) - [ModalWithdrawIcon](Frontend_Views_ModalIcon.md#modalwithdrawicon) @@ -24,16 +24,37 @@ ## Functions +### BroadcastPlanetIcon + +▸ **BroadcastPlanetIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | + +#### Returns + +`Element` + +--- + ### ModalAccountIcon ▸ **ModalAccountIcon**(`__namedParameters`): `Element` #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -47,10 +68,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -64,10 +87,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -81,10 +106,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -98,10 +125,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -115,11 +144,13 @@ #### Parameters -| Name | Type | -| :------------------------ | :------------------------------------------------------------ | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.modal` | [`ModalName`](../enums/Frontend_Views_ModalPane.ModalName.md) | +| Name | Type | +| :------------------------- | :------------------------------------------------------------ | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.modal` | [`ModalName`](../enums/Frontend_Views_ModalPane.ModalName.md) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -133,10 +164,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -150,10 +183,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -167,10 +202,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -184,10 +221,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -201,10 +240,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -218,27 +259,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | - -#### Returns - -`Element` - ---- - -### ModalTwitterBroadcastIcon - -▸ **ModalTwitterBroadcastIcon**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -252,10 +278,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -269,10 +297,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -286,10 +316,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -303,10 +335,12 @@ #### Parameters -| Name | Type | -| :----------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| Name | Type | +| :------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns diff --git a/docs/modules/Frontend_Views_ModalPane.md b/docs/modules/Frontend_Views_ModalPane.md index 3862b61a..bf289971 100644 --- a/docs/modules/Frontend_Views_ModalPane.md +++ b/docs/modules/Frontend_Views_ModalPane.md @@ -6,13 +6,15 @@ - [ModalName](../enums/Frontend_Views_ModalPane.ModalName.md) -### Type aliases +### Interfaces -- [ModalHook](Frontend_Views_ModalPane.md#modalhook) +- [ModalFrame](../interfaces/Frontend_Views_ModalPane.ModalFrame.md) +- [ModalHandle](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) -### Variables +### Type aliases -- [RECOMMENDED_WIDTH](Frontend_Views_ModalPane.md#recommended_width) +- [ModalHook](Frontend_Views_ModalPane.md#modalhook) +- [ModalProps](Frontend_Views_ModalPane.md#modalprops) ### Functions @@ -24,11 +26,11 @@ Ƭ **ModalHook**: [`Hook`](_types_global_GlobalTypes.md#hook)<`boolean`\> -## Variables +--- -### RECOMMENDED_WIDTH +### ModalProps -• `Const` **RECOMMENDED_WIDTH**: `"450px"` +Ƭ **ModalProps**: [`PaneProps`](Frontend_Components_GameWindowComponents.md#paneprops) & { `backgroundColor?`: `string` ; `borderColor?`: `string` ; `hideClose?`: `boolean` ; `hook`: [`Hook`](_types_global_GlobalTypes.md#hook)<`boolean`\> ; `initialPosition?`: { `x`: `number` ; `y`: `number` } ; `name?`: [`ModalName`](../enums/Frontend_Views_ModalPane.ModalName.md) ; `noPadding?`: `boolean` ; `style?`: `React.CSSProperties` ; `title`: `string` \| `React.ReactNode` ; `titlebarColor?`: `string` ; `width?`: `string` ; `helpContent?`: () => `ReactNode` } ## Functions @@ -38,9 +40,9 @@ #### Parameters -| Name | Type | -| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `__namedParameters` | [`PaneProps`](Frontend_Components_GameWindowComponents.md#paneprops) & { `backgroundColor?`: `string` ; `borderColor?`: `string` ; `hideClose?`: `boolean` ; `hook`: [`Hook`](_types_global_GlobalTypes.md#hook)<`boolean`\> ; `name?`: [`ModalName`](../enums/Frontend_Views_ModalPane.ModalName.md) ; `noPadding?`: `boolean` ; `style?`: `React.CSSProperties` ; `titlebarColor?`: `string` ; `width?`: `string` ; `helpContent?`: () => `ReactNode` } | +| Name | Type | +| :------------------ | :----------------------------------------------------- | +| `__namedParameters` | [`ModalProps`](Frontend_Views_ModalPane.md#modalprops) | #### Returns diff --git a/docs/modules/Frontend_Views_PlanetCard.md b/docs/modules/Frontend_Views_PlanetCard.md index fa84b366..a01f8053 100644 --- a/docs/modules/Frontend_Views_PlanetCard.md +++ b/docs/modules/Frontend_Views_PlanetCard.md @@ -5,6 +5,7 @@ ### Functions - [PlanetCard](Frontend_Views_PlanetCard.md#planetcard) +- [PlanetCardTitle](Frontend_Views_PlanetCard.md#planetcardtitle) ## Functions @@ -20,6 +21,25 @@ Preview basic planet information - used in `PlanetContextPane` and `HoverPlanetP | :-------------------------------- | :--------------------------------------------------------------------------------- | | `__namedParameters` | `Object` | | `__namedParameters.planetWrapper` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | +| `__namedParameters.standalone?` | `boolean` | + +#### Returns + +`Element` + +--- + +### PlanetCardTitle + +▸ **PlanetCardTitle**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :--------------------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.planet` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | +| `__namedParameters.small?` | `boolean` | #### Returns diff --git a/docs/modules/Frontend_Views_PlanetCardComponents.md b/docs/modules/Frontend_Views_PlanetCardComponents.md index 4f992854..973eb6c9 100644 --- a/docs/modules/Frontend_Views_PlanetCardComponents.md +++ b/docs/modules/Frontend_Views_PlanetCardComponents.md @@ -4,20 +4,12 @@ ### Variables -- [ArtifactSection](Frontend_Views_PlanetCardComponents.md#artifactsection) -- [BigStatCell](Frontend_Views_PlanetCardComponents.md#bigstatcell) - [DestroyedMarker](Frontend_Views_PlanetCardComponents.md#destroyedmarker) -- [IconsWrapper](Frontend_Views_PlanetCardComponents.md#iconswrapper) - [PlanetTag](Frontend_Views_PlanetCardComponents.md#planettag) -- [PreviewSection](Frontend_Views_PlanetCardComponents.md#previewsection) -- [Small](Frontend_Views_PlanetCardComponents.md#small) - [StatCell](Frontend_Views_PlanetCardComponents.md#statcell) +- [StatContainer](Frontend_Views_PlanetCardComponents.md#statcontainer) - [StatRow](Frontend_Views_PlanetCardComponents.md#statrow) -- [StatSection](Frontend_Views_PlanetCardComponents.md#statsection) -- [StyledPlanetCard](Frontend_Views_PlanetCardComponents.md#styledplanetcard) -- [StyledStatIcon](Frontend_Views_PlanetCardComponents.md#styledstaticon) - [TitleBar](Frontend_Views_PlanetCardComponents.md#titlebar) -- [TopRow](Frontend_Views_PlanetCardComponents.md#toprow) ### Functions @@ -27,75 +19,33 @@ ## Variables -### ArtifactSection - -• `Const` **ArtifactSection**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ---- - -### BigStatCell - -• `Const` **BigStatCell**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ---- - ### DestroyedMarker • `Const` **DestroyedMarker**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> --- -### IconsWrapper - -• `Const` **IconsWrapper**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ---- - ### PlanetTag • `Const` **PlanetTag**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> --- -### PreviewSection - -• `Const` **PreviewSection**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ---- - -### Small - -• `Const` **Small**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ---- - ### StatCell • `Const` **StatCell**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> --- -### StatRow - -• `Const` **StatRow**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ---- - -### StatSection - -• `Const` **StatSection**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ---- - -### StyledPlanetCard +### StatContainer -• `Const` **StyledPlanetCard**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> +• `Const` **StatContainer**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> --- -### StyledStatIcon +### StatRow -• `Const` **StyledStatIcon**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> +• `Const` **StatRow**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> --- @@ -103,12 +53,6 @@ • `Const` **TitleBar**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> ---- - -### TopRow - -• `Const` **TopRow**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ## Functions ### PCStatIcon diff --git a/docs/modules/Frontend_Views_PlanetNotifications.md b/docs/modules/Frontend_Views_PlanetNotifications.md index b04949b7..f8841b59 100644 --- a/docs/modules/Frontend_Views_PlanetNotifications.md +++ b/docs/modules/Frontend_Views_PlanetNotifications.md @@ -6,27 +6,11 @@ - [PlanetNotifType](../enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md) -### Type aliases - -- [PlanetNotifHooks](Frontend_Views_PlanetNotifications.md#planetnotifhooks) - ### Functions - [PlanetNotifications](Frontend_Views_PlanetNotifications.md#planetnotifications) - [getNotifsForPlanet](Frontend_Views_PlanetNotifications.md#getnotifsforplanet) -## Type aliases - -### PlanetNotifHooks - -Ƭ **PlanetNotifHooks**: `Object` - -#### Type declaration - -| Name | Type | -| :--------------- | :--------------------------------------------------- | -| `upgradeDetHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | - ## Functions ### PlanetNotifications @@ -35,9 +19,11 @@ #### Parameters -| Name | Type | -| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `__namedParameters` | { `notifs`: [`PlanetNotifType`](../enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md)[] ; `wrapper`: [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> } & [`PlanetNotifHooks`](Frontend_Views_PlanetNotifications.md#planetnotifhooks) | +| Name | Type | +| :------------------------- | :------------------------------------------------------------------------------------ | +| `__namedParameters` | `Object` | +| `__namedParameters.notifs` | [`PlanetNotifType`](../enums/Frontend_Views_PlanetNotifications.PlanetNotifType.md)[] | +| `__namedParameters.planet` | [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> | #### Returns diff --git a/docs/modules/Frontend_Views_TopBar.md b/docs/modules/Frontend_Views_TopBar.md index 62c601ec..a0128960 100644 --- a/docs/modules/Frontend_Views_TopBar.md +++ b/docs/modules/Frontend_Views_TopBar.md @@ -2,25 +2,22 @@ ## Table of contents -### Variables - -- [TOP_BAR_HEIGHT](Frontend_Views_TopBar.md#top_bar_height) - ### Functions - [TopBar](Frontend_Views_TopBar.md#topbar) -## Variables - -### TOP_BAR_HEIGHT - -• `Const` **TOP_BAR_HEIGHT**: `"2.5em"` - ## Functions ### TopBar -▸ **TopBar**(): `Element` +▸ **TopBar**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------------ | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.twitterVerifyHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | #### Returns diff --git a/embedded_plugins/Getting-Started.ts b/embedded_plugins/Getting-Started.ts index 91a9c9b6..58970f10 100644 --- a/embedded_plugins/Getting-Started.ts +++ b/embedded_plugins/Getting-Started.ts @@ -1,11 +1,9 @@ /** * Hi there! * - * Looks like you've found the new Dark Forest plugins system. + * Looks like you've found the Dark Forest plugins system. * Read through this script to learn how to write plugins! - */ - -/** + * * Most importantly, you have access these globals: * 1. df - Just like the df object in your console. * 2. ui - For interacting with the game's user interface. @@ -21,7 +19,7 @@ console.log(df, ui); import confetti from 'https://cdn.skypack.dev/canvas-confetti'; /** - * A plugin is a Class with render and destory methods. + * A plugin is a Class with render and destroy methods. * Other than that, you are free to do whatever, so be careful! */ class Readme implements DFPlugin { diff --git a/embedded_plugins/Remote-Explorer.ts b/embedded_plugins/Remote-Explorer.ts index d3fc92eb..de7cdc5c 100644 --- a/embedded_plugins/Remote-Explorer.ts +++ b/embedded_plugins/Remote-Explorer.ts @@ -1,18 +1,16 @@ -import type { Chunk, MinerWorkerMessage } from '../src/_types/global/GlobalTypes'; -import type WebpackWorker from 'worker-loader!*'; -import type MinerManager from '../src/Backend/Miner/MinerManager'; import type { WorldCoords } from '@darkforest_eth/types'; - +//@ts-ignore +import { locationIdFromDecStr } from 'https://cdn.skypack.dev/@darkforest_eth/serde'; import { html, render, - useState, useEffect, - useLayoutEffect, + useState, //@ts-ignore } from 'https://unpkg.com/htm/preact/standalone.module.js'; -//@ts-ignore -import { locationIdFromDecStr } from 'https://cdn.skypack.dev/@darkforest_eth/serde'; +import type WebpackWorker from 'worker-loader!*'; +import type MinerManager from '../src/Backend/Miner/MinerManager'; +import type { Chunk, MinerWorkerMessage } from '../src/_types/global/GlobalTypes'; type ExtendedMinerManager = MinerManager & { url: string; @@ -147,8 +145,7 @@ function MinerUI({ }) { const [hashRate, setHashRate] = useState(0); - // No idea why useEffect doesn't run - useLayoutEffect(() => { + useEffect(() => { const calcHash = (chunk: Chunk, miningTimeMillis: number) => { df.addNewChunk(chunk); const hashRate = chunk.chunkFootprint.sideLength ** 2 / (miningTimeMillis / 1000); diff --git a/last_updated.txt b/last_updated.txt index eed8eac5..0107ca2f 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Thu Jul 15 22:20:07 UTC 2021 +last updated: Tue Jul 27 17:26:53 UTC 2021 diff --git a/package.json b/package.json index b303d6e2..42eef08a 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,19 @@ { "name": "client", - "version": "6.2.17", + "version": "6.2.0-staging-jul-27-2021.0", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.17", - "@darkforest_eth/contracts": "6.2.17", - "@darkforest_eth/hashing": "6.2.17", - "@darkforest_eth/hexgen": "6.2.17", - "@darkforest_eth/serde": "6.2.17", - "@darkforest_eth/snarks": "6.2.17", - "@darkforest_eth/types": "6.2.17", + "@darkforest_eth/constants": "6.2.0-staging-jul-27-2021.0", + "@darkforest_eth/contracts": "6.2.0-staging-jul-27-2021.0", + "@darkforest_eth/events": "6.2.0-staging-jul-27-2021.0", + "@darkforest_eth/hashing": "6.2.0-staging-jul-27-2021.0", + "@darkforest_eth/hexgen": "6.2.0-staging-jul-27-2021.0", + "@darkforest_eth/network": "6.2.0-staging-jul-27-2021.0", + "@darkforest_eth/serde": "6.2.0-staging-jul-27-2021.0", + "@darkforest_eth/snarks": "6.2.0-staging-jul-27-2021.0", + "@darkforest_eth/types": "6.2.0-staging-jul-27-2021.0", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", @@ -19,6 +21,7 @@ "bad-words": "^3.0.4", "big-integer": "^1.6.48", "canvas-confetti": "^1.4.0", + "color": "^3.0.2", "email-validator": "^2.0.4", "emoji-picker-react": "^3.4.8", "ethers": "^5.0.7", @@ -30,7 +33,7 @@ "js-quadtree": "^3.3.5", "json-stable-stringify": "^1.0.1", "lodash": "^4.17.15", - "mnemonist": "^0.38.1", + "p-defer": "^3.0.0", "preact": "^10.5.13", "prismjs": "^1.22.0", "react": "^16.9.0", @@ -78,6 +81,7 @@ }, "devDependencies": { "@babel/preset-react": "^7.8.3", + "@types/color": "^3.0.2", "@types/json-stable-stringify": "^1.0.32", "@types/lodash": "^4.14.160", "@types/prismjs": "^1.16.2", diff --git a/src/Backend/GameLogic/ArrivalUtils.ts b/src/Backend/GameLogic/ArrivalUtils.ts index 92c8858d..4b13dd95 100644 --- a/src/Backend/GameLogic/ArrivalUtils.ts +++ b/src/Backend/GameLogic/ArrivalUtils.ts @@ -1,19 +1,19 @@ import { CONTRACT_PRECISION } from '@darkforest_eth/constants'; -import { hasOwner } from '../Utils/Utils'; -import _ from 'lodash'; import { Artifact, ArtifactType, - QueuedArrival, - Planet, - Upgrade, - PlanetType, EmojiFlagBody, + Planet, PlanetMessage, + PlanetType, + QueuedArrival, + Upgrade, } from '@darkforest_eth/types'; -import { isActivated } from './ArtifactUtils'; +import _ from 'lodash'; import { ContractConstants } from '../../_types/darkforest/api/ContractsAPITypes'; import { isEmojiFlagMessage } from '../../_types/global/GlobalTypes'; +import { hasOwner } from '../Utils/Utils'; +import { isActivated } from './ArtifactUtils'; // TODO: planet class, cmon, let's go export const blocksLeftToProspectExpiration = ( diff --git a/src/Backend/GameLogic/ArtifactUtils.ts b/src/Backend/GameLogic/ArtifactUtils.ts index 19e01551..47fd043e 100644 --- a/src/Backend/GameLogic/ArtifactUtils.ts +++ b/src/Backend/GameLogic/ArtifactUtils.ts @@ -1,14 +1,14 @@ import { - Biome, - BiomeNames, + Artifact, + ArtifactId, ArtifactRarity, ArtifactRarityNames, - Planet, - PlanetLevel, - Artifact, ArtifactType, ArtifactTypeNames, - ArtifactId, + Biome, + BiomeNames, + Planet, + PlanetLevel, } from '@darkforest_eth/types'; import { ProcgenUtils } from '../Procedural/ProcgenUtils'; diff --git a/src/Backend/GameLogic/ContractCaller.ts b/src/Backend/GameLogic/ContractCaller.ts deleted file mode 100644 index e09d74e9..00000000 --- a/src/Backend/GameLogic/ContractCaller.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { ContractFunction } from 'ethers'; -import { DiagnosticUpdater } from '../Interfaces/DiagnosticUpdater'; -import { ThrottledConcurrentQueue } from '../Network/ThrottledConcurrentQueue'; -import { sleep } from '../Utils/Utils'; - -export class ContractCaller { - private diagnosticsUpdater?: DiagnosticUpdater; - private static readonly MAX_RETRIES = 12; - private readonly callQueue = new ThrottledConcurrentQueue(10, 1000, 20); - - public async makeCall( - contractViewFunction: ContractFunction, - args: unknown[] = [] - ): Promise { - for (let i = 0; i < ContractCaller.MAX_RETRIES; i++) { - try { - const callPromise = this.callQueue.add(() => { - this.diagnosticsUpdater?.updateDiagnostics((d) => { - d.totalCalls++; - }); - return contractViewFunction(...args); - }); - - this.diagnosticsUpdater?.updateDiagnostics((d) => { - d.callsInQueue = this.callQueue.size(); - }); - - const callResult = await callPromise; - - this.diagnosticsUpdater?.updateDiagnostics((d) => { - d.callsInQueue = this.callQueue.size(); - }); - - return callResult; - } catch (e) { - await sleep(1000 * 2 ** i + Math.random() * 100); - } finally { - this.diagnosticsUpdater?.updateDiagnostics((d) => { - d.totalCalls++; - }); - } - } - - throw new Error('failed to call contract'); - } - - public setDiagnosticUpdater(diagnosticUpdater?: DiagnosticUpdater) { - this.diagnosticsUpdater = diagnosticUpdater; - } -} diff --git a/src/Backend/GameLogic/ContractsAPI.ts b/src/Backend/GameLogic/ContractsAPI.ts index f45c772c..766c9394 100644 --- a/src/Backend/GameLogic/ContractsAPI.ts +++ b/src/Backend/GameLogic/ContractsAPI.ts @@ -1,136 +1,192 @@ -import { EventEmitter } from 'events'; -import { providers, utils, Event, BigNumber as EthersBN, ContractFunction, ethers } from 'ethers'; -import _ from 'lodash'; -import { - ContractConstants, - MoveArgs, - ZKArgIdx, - MoveArgIdxs, - ContractEvent, - ContractsAPIEvent, - UpgradeArgs, - UpgradeArgIdxs, - DepositArtifactArgs, - WithdrawArtifactArgs, - PlanetTypeWeightsBySpaceType, -} from '../../_types/darkforest/api/ContractsAPITypes'; -import { - Player, - EthAddress, - LocationId, - ArtifactId, - RevealedCoords, - WorldLocation, - Artifact, - Planet, - QueuedArrival, - UnconfirmedInit, - EthTxType, - SubmittedTx, - SubmittedInit, - SubmittedUpgrade, - SubmittedMove, - SubmittedBuyHat, - SubmittedPlanetTransfer, - SubmittedFindArtifact, - SubmittedDepositArtifact, - SubmittedWithdrawArtifact, - UnconfirmedDepositArtifact, - UnconfirmedWithdrawArtifact, - SubmittedProspectPlanet, - UnconfirmedActivateArtifact, - SubmittedActivateArtifact, - SubmittedDeactivateArtifact, - UnconfirmedDeactivateArtifact, - SubmittedReveal, - UnconfirmedReveal, - SubmittedBuyGPTCredits, - SubmittedWithdrawSilver, - UnconfirmedWithdrawSilver, - VoyageId, -} from '@darkforest_eth/types'; -import { aggregateBulkGetter } from '../Utils/Utils'; -import bigInt from 'big-integer'; -import { TxExecutor } from '../Network/TxExecutor'; -import EthConnection from '../Network/EthConnection'; +import { CONTRACT_PRECISION, EMPTY_LOCATION_ID } from '@darkforest_eth/constants'; import { + CORE_CONTRACT_ADDRESS, + GETTERS_CONTRACT_ADDRESS, + GPT_CREDIT_CONTRACT_ADDRESS, + WHITELIST_CONTRACT_ADDRESS, +} from '@darkforest_eth/contracts'; +import type { DarkForestCore, DarkForestGetters, DarkForestGPTCredit, + Whitelist, } from '@darkforest_eth/contracts/typechain'; +import { + aggregateBulkGetter, + ContractCaller, + EthConnection, + ethToWei, + QueuedTransaction, + TxExecutor, +} from '@darkforest_eth/network'; import { address, artifactIdFromEthersBN, artifactIdToDecStr, - locationIdFromEthersBN, - locationIdToDecStr, - locationIdFromDecStr, decodeArrival, decodeArtifact, - decodeUpgradeBranches, + decodeArtifactPointValues, decodePlanet, decodePlanetDefaults, - decodeRevealedCoords, decodePlayer, - decodeArtifactPointValues, + decodeRevealedCoords, + decodeUpgradeBranches, + locationIdFromDecStr, + locationIdFromEthersBN, + locationIdToDecStr, } from '@darkforest_eth/serde'; -import { EMPTY_LOCATION_ID, CONTRACT_PRECISION } from '@darkforest_eth/constants'; import type { - RevealSnarkContractCallArgs, + BiomebaseSnarkContractCallArgs, InitSnarkContractCallArgs, MoveSnarkContractCallArgs, - BiomebaseSnarkContractCallArgs, + RevealSnarkContractCallArgs, } from '@darkforest_eth/snarks'; -import { ContractCaller } from './ContractCaller'; -import { DiagnosticUpdater } from '../Interfaces/DiagnosticUpdater'; +import { + Artifact, + ArtifactId, + ContractMethodName, + DiagnosticUpdater, + EthAddress, + LocationId, + Planet, + Player, + QueuedArrival, + RevealedCoords, + SubmittedActivateArtifact, + SubmittedBuyGPTCredits, + SubmittedBuyHat, + SubmittedDeactivateArtifact, + SubmittedDepositArtifact, + SubmittedFindArtifact, + SubmittedInit, + SubmittedMove, + SubmittedPlanetTransfer, + SubmittedProspectPlanet, + SubmittedReveal, + SubmittedTx, + SubmittedUpgrade, + SubmittedWithdrawArtifact, + SubmittedWithdrawSilver, + UnconfirmedActivateArtifact, + UnconfirmedDeactivateArtifact, + UnconfirmedDepositArtifact, + UnconfirmedInit, + UnconfirmedReveal, + UnconfirmedWithdrawArtifact, + UnconfirmedWithdrawSilver, + VoyageId, + WorldLocation, +} from '@darkforest_eth/types'; +import bigInt from 'big-integer'; +import { BigNumber as EthersBN, ContractFunction, ethers, Event, providers, utils } from 'ethers'; +import { EventEmitter } from 'events'; +import _ from 'lodash'; +import NotificationManager from '../../Frontend/Game/NotificationManager'; +import { openConfirmationWindowForTransaction } from '../../Frontend/Game/Popups'; +import { getSetting, Setting } from '../../Frontend/Utils/SettingsHooks'; +import { + ContractConstants, + ContractEvent, + ContractsAPIEvent, + DepositArtifactArgs, + MoveArgIdxs, + MoveArgs, + PlanetTypeWeightsBySpaceType, + UpgradeArgIdxs, + UpgradeArgs, + WithdrawArtifactArgs, + ZKArgIdx, +} from '../../_types/darkforest/api/ContractsAPITypes'; +import { + loadCoreContract, + loadGettersContract, + loadGptCreditContract, + loadWhitelistContract, +} from '../Network/Blockchain'; +import { eventLogger, EventType } from '../Network/EventLogger'; /** - * Roughly contains methods that map 1:1 with functions that live - * in the contract. + * Roughly contains methods that map 1:1 with functions that live in the contract. Responsible for + * reading and writing to and from the blockchain. + * + * @todo don't inherit from {@link EventEmitter}. instead use {@link Monomitter} */ -class ContractsAPI extends EventEmitter { +export class ContractsAPI extends EventEmitter { + /** + * Don't allow users to submit txs if balance falls below this amount/ + */ + private static readonly MIN_BALANCE = ethToWei(0.002); + + /** + * Instrumented {@link ThrottledConcurrentQueue} for blockchain reads. + */ private readonly contractCaller: ContractCaller; - private readonly txRequestExecutor: TxExecutor | undefined; - private diagnosticsUpdater?: DiagnosticUpdater; + /** + * Instrumented {@link ThrottledConcurrentQueue} for blockchain writes. + */ + private readonly txExecutor: TxExecutor | undefined; + + /** + * Our connection to the blockchain. In charge of low level networking, and also of the burner + * wallet. + */ private ethConnection: EthConnection; - private coreContract: DarkForestCore; - private gettersContract: DarkForestGetters; - private gptCreditContract: DarkForestGPTCredit; - - private constructor( - ethConnection: EthConnection, - coreContract: DarkForestCore, - gettersContract: DarkForestGetters, - gptCreditContract: DarkForestGPTCredit, - nonce: number - ) { + + get coreContract() { + return this.ethConnection.getContract(CORE_CONTRACT_ADDRESS); + } + + get gettersContract() { + return this.ethConnection.getContract(GETTERS_CONTRACT_ADDRESS); + } + + get whitelistContract() { + return this.ethConnection.getContract(WHITELIST_CONTRACT_ADDRESS); + } + + get gptCreditContract() { + return this.ethConnection.getContract(GPT_CREDIT_CONTRACT_ADDRESS); + } + + public constructor(ethConnection: EthConnection) { super(); this.contractCaller = new ContractCaller(); - this.coreContract = coreContract; - this.gettersContract = gettersContract; - this.gptCreditContract = gptCreditContract; - this.txRequestExecutor = new TxExecutor(ethConnection, nonce); this.ethConnection = ethConnection; + this.txExecutor = new TxExecutor( + ethConnection, + () => getSetting(this.ethConnection.getAddress(), Setting.GasFeeGwei), + this.beforeTransaction.bind(this), + this.afterTransaction.bind(this) + ); + + this.setupEventListeners(); } - static async create(ethConnection: EthConnection): Promise { - let nonce = 0; - try { - nonce = await ethConnection.getNonce(); - } catch (e) { - console.error('WARNING: creating TxExecutor with no account/signer'); + /** + * This function is called by {@link TxExecutor} before each transaction. It gives the client an + * opportunity to prevent a transaction from going through based on business logic or user + * interaction. To prevent the queued transaction from being submitted, throw an Error. + */ + private async beforeTransaction(txRequest: QueuedTransaction): Promise { + const address = this.ethConnection.getAddress(); + if (!address) throw new Error("can't send a transaction, no signer"); + + const balance = await this.ethConnection.loadBalance(address); + + if (balance.lt(ContractsAPI.MIN_BALANCE)) { + const notifsManager = NotificationManager.getInstance(); + notifsManager.balanceEmpty(); + throw new Error('xDAI balance too low!'); } - const contractsAPI: ContractsAPI = new ContractsAPI( - ethConnection, - await ethConnection.loadCoreContract(), - await ethConnection.loadGettersContract(), - await ethConnection.loadGPTCreditContract(), - nonce - ); + const gasFeeGwei = EthersBN.from(txRequest.overrides.gasPrice || '1000000000'); + + await openConfirmationWindowForTransaction(this.ethConnection, txRequest, address, gasFeeGwei); + } - return contractsAPI; + private async afterTransaction(_txRequest: QueuedTransaction, txDiagnosticInfo: unknown) { + eventLogger.logEvent(EventType.Transaction, txDiagnosticInfo); } public destroy(): void { @@ -141,8 +197,31 @@ class ContractsAPI extends EventEmitter { return this.contractCaller.makeCall(contractViewFunction, args); } - public setupEventListeners(): void { - this.ethConnection.subscribeToEvents(this.coreContract, { + public async setupEventListeners(): Promise { + const { coreContract, gptCreditContract } = this; + + const filter = { + address: coreContract.address, + topics: [ + [ + coreContract.filters.ArrivalQueued(null, null, null, null, null).topics, + coreContract.filters.ArtifactActivated(null, null, null).topics, + coreContract.filters.ArtifactDeactivated(null, null, null).topics, + coreContract.filters.ArtifactDeposited(null, null, null).topics, + coreContract.filters.ArtifactFound(null, null, null).topics, + coreContract.filters.ArtifactWithdrawn(null, null, null).topics, + coreContract.filters.LocationRevealed(null, null).topics, + coreContract.filters.PlanetHatBought(null, null, null).topics, + coreContract.filters.PlanetProspected(null, null).topics, + coreContract.filters.PlanetSilverWithdrawn(null, null, null).topics, + coreContract.filters.PlanetTransferred(null, null, null).topics, + coreContract.filters.PlanetUpgraded(null, null, null, null).topics, + coreContract.filters.PlayerInitialized(null, null).topics, + ].map((topicsOrUndefined) => (topicsOrUndefined || [])[0]), + ] as Array>, + }; + + const eventHandlers = { [ContractEvent.ArtifactFound]: ( _playerAddr: string, rawArtifactId: EthersBN, @@ -257,9 +336,11 @@ class ContractsAPI extends EventEmitter { this.emit(ContractsAPIEvent.PlanetUpdate, locationIdFromEthersBN(location)); this.emit(ContractsAPIEvent.PlayerUpdate, address(player)); }, - }); + }; + + this.ethConnection.subscribeToContractEvents(coreContract, eventHandlers, filter); - this.gptCreditContract.on( + gptCreditContract.on( ContractEvent.ChangedGPTCreditPrice, async (newPrice: EthersBN, _: Event) => { this.emit( @@ -268,26 +349,24 @@ class ContractsAPI extends EventEmitter { ); } ); - - this.ethConnection.on('ChangedRPCEndpoint', async () => { - this.coreContract = await this.ethConnection.loadCoreContract(); - }); } public removeEventListeners(): void { - this.coreContract.removeAllListeners(ContractEvent.PlayerInitialized); - this.coreContract.removeAllListeners(ContractEvent.ArrivalQueued); - this.coreContract.removeAllListeners(ContractEvent.PlanetUpgraded); - this.coreContract.removeAllListeners(ContractEvent.PlanetHatBought); - this.coreContract.removeAllListeners(ContractEvent.PlanetTransferred); - this.coreContract.removeAllListeners(ContractEvent.ArtifactFound); - this.coreContract.removeAllListeners(ContractEvent.ArtifactDeposited); - this.coreContract.removeAllListeners(ContractEvent.ArtifactWithdrawn); - this.coreContract.removeAllListeners(ContractEvent.ArtifactActivated); - this.coreContract.removeAllListeners(ContractEvent.ArtifactDeactivated); - this.coreContract.removeAllListeners(ContractEvent.LocationRevealed); - this.coreContract.removeAllListeners(ContractEvent.PlanetSilverWithdrawn); - this.gptCreditContract.removeAllListeners(ContractEvent.ChangedGPTCreditPrice); + const { coreContract, gptCreditContract } = this; + + coreContract.removeAllListeners(ContractEvent.PlayerInitialized); + coreContract.removeAllListeners(ContractEvent.ArrivalQueued); + coreContract.removeAllListeners(ContractEvent.PlanetUpgraded); + coreContract.removeAllListeners(ContractEvent.PlanetHatBought); + coreContract.removeAllListeners(ContractEvent.PlanetTransferred); + coreContract.removeAllListeners(ContractEvent.ArtifactFound); + coreContract.removeAllListeners(ContractEvent.ArtifactDeposited); + coreContract.removeAllListeners(ContractEvent.ArtifactWithdrawn); + coreContract.removeAllListeners(ContractEvent.ArtifactActivated); + coreContract.removeAllListeners(ContractEvent.ArtifactDeactivated); + coreContract.removeAllListeners(ContractEvent.LocationRevealed); + coreContract.removeAllListeners(ContractEvent.PlanetSilverWithdrawn); + gptCreditContract.removeAllListeners(ContractEvent.ChangedGPTCreditPrice); } public getContractAddress(): EthAddress { @@ -316,14 +395,14 @@ class ContractsAPI extends EventEmitter { args: RevealSnarkContractCallArgs, action: UnconfirmedReveal ): Promise { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } - const tx = this.txRequestExecutor.makeRequest( - EthTxType.REVEAL_LOCATION, + const tx = this.txExecutor.queueTransaction( action.actionId, this.coreContract, + ContractMethodName.REVEAL_LOCATION, args ); const unminedRevealTx: SubmittedReveal = { @@ -339,13 +418,13 @@ class ContractsAPI extends EventEmitter { args: InitSnarkContractCallArgs, action: UnconfirmedInit ): Promise { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } - const tx = this.txRequestExecutor.makeRequest( - EthTxType.INIT, + const tx = this.txExecutor.queueTransaction( action.actionId, this.coreContract, + ContractMethodName.INIT, args ); @@ -363,19 +442,19 @@ class ContractsAPI extends EventEmitter { newOwner: EthAddress, actionId: string ): Promise { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } - const tx = this.txRequestExecutor.makeRequest( - EthTxType.PLANET_TRANSFER, + const tx = this.txExecutor.queueTransaction( actionId, this.coreContract, + ContractMethodName.PLANET_TRANSFER, [locationIdToDecStr(planetId), newOwner] ); const unminedTransferTx: SubmittedPlanetTransfer = { actionId, - type: EthTxType.PLANET_TRANSFER, + methodName: ContractMethodName.PLANET_TRANSFER, txHash: (await tx.submitted).hash, sentAtTimestamp: Math.floor(Date.now() / 1000), planetId, @@ -388,19 +467,19 @@ class ContractsAPI extends EventEmitter { // throws if tx initialization fails // otherwise, returns a promise of a submtited (unmined) tx receipt async upgradePlanet(args: UpgradeArgs, actionId: string): Promise { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } - const tx = this.txRequestExecutor.makeRequest( - EthTxType.UPGRADE, + const tx = this.txExecutor.queueTransaction( actionId, this.coreContract, + ContractMethodName.UPGRADE, args ); const unminedUpgradeTx: SubmittedUpgrade = { actionId, - type: EthTxType.UPGRADE, + methodName: ContractMethodName.UPGRADE, txHash: (await tx.submitted).hash, sentAtTimestamp: Math.floor(Date.now() / 1000), locationId: locationIdFromDecStr(args[UpgradeArgIdxs.LOCATION_ID]), @@ -411,22 +490,22 @@ class ContractsAPI extends EventEmitter { } async prospectPlanet(planetId: LocationId, actionId: string) { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } const args = [locationIdToDecStr(planetId)]; - const tx = this.txRequestExecutor.makeRequest( - EthTxType.PROSPECT_PLANET, + const tx = this.txExecutor.queueTransaction( actionId, this.coreContract, + ContractMethodName.PROSPECT_PLANET, args ); const unminedFindArtifact: SubmittedProspectPlanet = { actionId, - type: EthTxType.PROSPECT_PLANET, + methodName: ContractMethodName.PROSPECT_PLANET, txHash: (await tx.submitted).hash, sentAtTimestamp: Math.floor(Date.now() / 1000), planetId, @@ -442,19 +521,19 @@ class ContractsAPI extends EventEmitter { biomeSnarkArgs: BiomebaseSnarkContractCallArgs, actionId: string ): Promise { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } - const tx = this.txRequestExecutor.makeRequest( - EthTxType.FIND_ARTIFACT, + const tx = this.txExecutor.queueTransaction( actionId, this.coreContract, + ContractMethodName.FIND_ARTIFACT, biomeSnarkArgs ); const unminedFindArtifact: SubmittedFindArtifact = { actionId, - type: EthTxType.FIND_ARTIFACT, + methodName: ContractMethodName.FIND_ARTIFACT, txHash: (await tx.submitted).hash, sentAtTimestamp: Math.floor(Date.now() / 1000), planetId: location.hash, @@ -464,7 +543,7 @@ class ContractsAPI extends EventEmitter { } async depositArtifact(action: UnconfirmedDepositArtifact): Promise { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } const args: DepositArtifactArgs = [ @@ -472,10 +551,10 @@ class ContractsAPI extends EventEmitter { artifactIdToDecStr(action.artifactId), ]; - const tx = this.txRequestExecutor.makeRequest( - EthTxType.DEPOSIT_ARTIFACT, + const tx = this.txExecutor.queueTransaction( action.actionId, this.coreContract, + ContractMethodName.DEPOSIT_ARTIFACT, args ); @@ -493,7 +572,7 @@ class ContractsAPI extends EventEmitter { async withdrawArtifact( action: UnconfirmedWithdrawArtifact ): Promise { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } const args: WithdrawArtifactArgs = [ @@ -501,10 +580,10 @@ class ContractsAPI extends EventEmitter { artifactIdToDecStr(action.artifactId), ]; - const tx = this.txRequestExecutor.makeRequest( - EthTxType.WITHDRAW_ARTIFACT, + const tx = this.txExecutor.queueTransaction( action.actionId, this.coreContract, + ContractMethodName.WITHDRAW_ARTIFACT, args ); @@ -518,7 +597,7 @@ class ContractsAPI extends EventEmitter { } async activateArtifact(action: UnconfirmedActivateArtifact) { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } @@ -528,10 +607,10 @@ class ContractsAPI extends EventEmitter { action.wormholeTo ? locationIdToDecStr(action.wormholeTo) : '0', ]; - const tx = this.txRequestExecutor.makeRequest( - EthTxType.ACTIVATE_ARTIFACT, + const tx = this.txExecutor.queueTransaction( action.actionId, this.coreContract, + ContractMethodName.ACTIVATE_ARTIFACT, args ); @@ -545,16 +624,16 @@ class ContractsAPI extends EventEmitter { } async deactivateArtifact(action: UnconfirmedDeactivateArtifact) { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } const args = [locationIdToDecStr(action.locationId)]; - const tx = this.txRequestExecutor.makeRequest( - EthTxType.DEACTIVATE_ARTIFACT, + const tx = this.txExecutor.queueTransaction( action.actionId, this.coreContract, + ContractMethodName.DEACTIVATE_ARTIFACT, args ); @@ -576,7 +655,7 @@ class ContractsAPI extends EventEmitter { silverMoved: number, artifactMoved?: ArtifactId ): Promise { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } const args = [ @@ -595,10 +674,10 @@ class ContractsAPI extends EventEmitter { args[ZKArgIdx.DATA][MoveArgIdxs.ARTIFACT_SENT] = artifactIdToDecStr(artifactMoved); } - const tx = this.txRequestExecutor.makeRequest( - EthTxType.MOVE, + const tx = this.txExecutor.queueTransaction( actionId, this.coreContract, + ContractMethodName.MOVE, args ); @@ -607,7 +686,7 @@ class ContractsAPI extends EventEmitter { const unminedMoveTx: SubmittedMove = { actionId, - type: EthTxType.MOVE, + methodName: ContractMethodName.MOVE, txHash: (await tx.submitted).hash, sentAtTimestamp: Math.floor(Date.now() / 1000), from: locationIdFromDecStr(args[ZKArgIdx.DATA][MoveArgIdxs.FROM_ID]), @@ -622,7 +701,7 @@ class ContractsAPI extends EventEmitter { } async buyHat(planetIdDecStr: string, currentHatLevel: number, actionId: string) { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } const overrides: providers.TransactionRequest = { @@ -632,17 +711,17 @@ class ContractsAPI extends EventEmitter { .toString(), }; - const tx = this.txRequestExecutor.makeRequest( - EthTxType.BUY_HAT, + const tx = this.txExecutor.queueTransaction( actionId, this.coreContract, + ContractMethodName.BUY_HAT, [planetIdDecStr], overrides ); const unminedBuyHatTx: SubmittedBuyHat = { actionId, - type: EthTxType.BUY_HAT, + methodName: ContractMethodName.BUY_HAT, txHash: (await tx.submitted).hash, sentAtTimestamp: Math.floor(Date.now() / 1000), locationId: locationIdFromDecStr(planetIdDecStr), @@ -652,15 +731,15 @@ class ContractsAPI extends EventEmitter { } async withdrawSilver(action: UnconfirmedWithdrawSilver): Promise { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } const args = [locationIdToDecStr(action.locationId), action.amount * CONTRACT_PRECISION]; - const tx = this.txRequestExecutor.makeRequest( - EthTxType.WITHDRAW_SILVER, + const tx = this.txExecutor.queueTransaction( action.actionId, this.coreContract, + ContractMethodName.WITHDRAW_SILVER, args ); const unminedWithdrawSilverTx: SubmittedWithdrawSilver = { @@ -673,28 +752,27 @@ class ContractsAPI extends EventEmitter { } async buyGPTCredits(amount: number, actionId: string) { - if (!this.txRequestExecutor) { + if (!this.txExecutor) { throw new Error('no signer, cannot execute tx'); } const costPerCreditStr = ( await this.makeCall(this.gptCreditContract.creditPrice) ).toString(); const overrides: providers.TransactionRequest = { - gasLimit: 500000, value: bigInt(costPerCreditStr).multiply(amount).toString(), }; - const tx = this.txRequestExecutor.makeRequest( - EthTxType.BUY_GPT_CREDITS, + const tx = this.txExecutor.queueTransaction( actionId, this.gptCreditContract, + ContractMethodName.BUY_GPT_CREDITS, [amount], overrides ); const unminedBuyGPTCreditsTx: SubmittedBuyGPTCredits = { actionId, - type: EthTxType.BUY_GPT_CREDITS, + methodName: ContractMethodName.BUY_GPT_CREDITS, txHash: (await tx.submitted).hash, sentAtTimestamp: Math.floor(Date.now() / 1000), amount, @@ -712,7 +790,9 @@ class ContractsAPI extends EventEmitter { return parseFloat(costPerCredit); } - public async getGPTCreditBalance(address: EthAddress): Promise { + public async getGPTCreditBalance(address: EthAddress | undefined): Promise { + if (address === undefined) return 0; + const gptCreditsBalance = await this.makeCall(this.gptCreditContract.credits, [ address, ]); @@ -818,7 +898,6 @@ class ContractsAPI extends EventEmitter { ).toNumber(); const players = await aggregateBulkGetter( - 'players', nPlayers, 200, async (start, end) => @@ -877,7 +956,6 @@ class ContractsAPI extends EventEmitter { onProgress?: (fractionCompleted: number) => void ): Promise { const arrivalsUnflattened = await aggregateBulkGetter( - 'arrivals', planetsToLoad.length, 200, async (start, end) => { @@ -902,7 +980,6 @@ class ContractsAPI extends EventEmitter { ).toNumber(); const planetIds = await aggregateBulkGetter( - 'planetids', nPlanets - startingAt, 1000, async (start, end) => @@ -937,7 +1014,6 @@ class ContractsAPI extends EventEmitter { ).toNumber(); const rawRevealedPlanetIds = await aggregateBulkGetter( - 'revealed-planetids', nRevealedPlanets - startingAt, 500, async (start, end) => @@ -949,7 +1025,6 @@ class ContractsAPI extends EventEmitter { ); const rawRevealedCoords = await aggregateBulkGetter( - 'revealed-coords', rawRevealedPlanetIds.length, 500, async (start, end) => @@ -968,7 +1043,6 @@ class ContractsAPI extends EventEmitter { onProgressMetadata?: (fractionCompleted: number) => void ): Promise> { const rawPlanets = await aggregateBulkGetter( - 'planets', toLoadPlanets.length, 200, async (start, end) => @@ -979,7 +1053,6 @@ class ContractsAPI extends EventEmitter { ); const rawPlanetsExtendedInfo = await aggregateBulkGetter( - 'planets-extended-info', toLoadPlanets.length, 200, async (start, end) => @@ -1029,7 +1102,6 @@ class ContractsAPI extends EventEmitter { onProgress?: (fractionCompleted: number) => void ): Promise { const rawArtifacts = await aggregateBulkGetter( - 'planet-artifacts', locationIds.length, 200, async (start, end) => @@ -1049,7 +1121,6 @@ class ContractsAPI extends EventEmitter { onProgress?: (fractionCompleted: number) => void ): Promise { const rawArtifacts = await aggregateBulkGetter( - 'artifacts', artifactIds.length, 200, async (start, end) => @@ -1065,29 +1136,48 @@ class ContractsAPI extends EventEmitter { } public async getPlayerArtifacts( - playerId: EthAddress, + playerId?: EthAddress, onProgress?: (percent: number) => void ): Promise { + if (playerId === undefined) return []; + const myArtifactIds = ( await this.makeCall(this.gettersContract.getPlayerArtifactIds, [playerId]) ).map(artifactIdFromEthersBN); return this.bulkGetArtifacts(myArtifactIds, onProgress); } - public getAccount() { + public hasAccount(): boolean { + return this.ethConnection.hasSigner(); + } + + public getAccount(): EthAddress | undefined { return this.ethConnection.getAddress(); } - public getBalance() { - return this.ethConnection.getBalance(this.getAccount()); + public async getBalance(): Promise { + const address = this.getAccount(); + + if (!address) { + return EthersBN.from(0); + } + + return this.ethConnection.loadBalance(address); } public setDiagnosticUpdater(diagnosticUpdater?: DiagnosticUpdater) { - this.diagnosticsUpdater = diagnosticUpdater; this.contractCaller.setDiagnosticUpdater(diagnosticUpdater); - this.txRequestExecutor?.setDiagnosticUpdater(diagnosticUpdater); + this.txExecutor?.setDiagnosticUpdater(diagnosticUpdater); this.ethConnection.setDiagnosticUpdater(diagnosticUpdater); } } -export default ContractsAPI; +export async function makeContractsAPI(ethConnection: EthConnection): Promise { + // Could turn this into an array and iterate, but I like the explicitness + await ethConnection.loadContract(CORE_CONTRACT_ADDRESS, loadCoreContract); + await ethConnection.loadContract(GETTERS_CONTRACT_ADDRESS, loadGettersContract); + await ethConnection.loadContract(WHITELIST_CONTRACT_ADDRESS, loadWhitelistContract); + await ethConnection.loadContract(GPT_CREDIT_CONTRACT_ADDRESS, loadGptCreditContract); + + return new ContractsAPI(ethConnection); +} diff --git a/src/Backend/GameLogic/ConversationManager.tsx b/src/Backend/GameLogic/ConversationManager.tsx index 4ba82bea..e3179f75 100644 --- a/src/Backend/GameLogic/ConversationManager.tsx +++ b/src/Backend/GameLogic/ConversationManager.tsx @@ -1,14 +1,14 @@ -import React from 'react'; -import styled from 'styled-components'; import { - Conversation, - Message, - ConversationArtifact, - ArtifactType, ArtifactRarity, ArtifactRarityNames, + ArtifactType, ArtifactTypeNames, + Conversation, + ConversationArtifact, + Message, } from '@darkforest_eth/types'; +import React from 'react'; +import styled from 'styled-components'; import { WikiPane } from '../../Frontend/Panes/WikiPane'; import { TerminalTextStyle } from '../../Frontend/Utils/TerminalTypes'; import { TerminalHandle } from '../../Frontend/Views/Terminal'; diff --git a/src/Backend/GameLogic/GameManager.ts b/src/Backend/GameLogic/GameManager.ts index 41a0a7af..4dcc6be8 100644 --- a/src/Backend/GameLogic/GameManager.ts +++ b/src/Backend/GameLogic/GameManager.ts @@ -1,114 +1,126 @@ -import { EventEmitter } from 'events'; -import { BigInteger } from 'big-integer'; -import { - Chunk, - Rectangle, - isLocatable, - HashConfig, - Wormhole, - RevealCountdownInfo, -} from '../../_types/global/GlobalTypes'; -import PersistentChunkStore from '../Storage/PersistentChunkStore'; -import ContractsAPI from './ContractsAPI'; -import MinerManager, { HomePlanetMinerChunkStore, MinerManagerEvent } from '../Miner/MinerManager'; -import _ from 'lodash'; -import { - ContractConstants, - ContractsAPIEvent, - UpgradeArgs, -} from '../../_types/darkforest/api/ContractsAPITypes'; +import { BLOCK_EXPLORER_URL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; +import { monomitter, Monomitter, Subscription } from '@darkforest_eth/events'; import { fakeHash, mimcHash, perlin } from '@darkforest_eth/hashing'; -import { GameObjects } from './GameObjects'; -import { getRandomActionId, hexifyBigIntNestedArray } from '../Utils/Utils'; -import { Contract, ContractInterface } from 'ethers'; import { - isUnconfirmedInit, - isUnconfirmedMove, - isUnconfirmedUpgrade, - isUnconfirmedBuyHat, - isUnconfirmedFindArtifact, - isUnconfirmedDepositArtifact, - isUnconfirmedWithdrawArtifact, - isUnconfirmedProspectPlanet, - isUnconfirmedDeactivateArtifact, - isUnconfirmedActivateArtifact, - isUnconfirmedReveal, - isUnconfirmedBuyGPTCredits, - isUnconfirmedWithdrawSilver, -} from '../Utils/TypeAssertions'; + createContract, + EthConnection, + ThrottledConcurrentQueue, + verifySignature, + weiToEth, +} from '@darkforest_eth/network'; +import { locationIdFromBigInt, locationIdToDecStr } from '@darkforest_eth/serde'; import { - EthAddress, - Player, + Artifact, ArtifactId, - VoyageId, - LocationId, - WorldLocation, - WorldCoords, + ArtifactRarity, + ArtifactType, + ContractMethodName, Conversation, + Diagnostics, + EthAddress, + LocatablePlanet, + LocationId, + Planet, PlanetLevel, + PlanetMessageType, PlanetType, - SpaceType, + Player, QueuedArrival, - Upgrade, - Planet, - Artifact, - UnconfirmedUpgrade, - EthTxType, - TxIntent, - UnconfirmedMove, + RevealedCoords, + RevealedLocation, + SignedMessage, + SpaceType, SubmittedTx, + TxIntent, + UnconfirmedActivateArtifact, + UnconfirmedBuyGPTCredits, + UnconfirmedDeactivateArtifact, + UnconfirmedDepositArtifact, + UnconfirmedFindArtifact, UnconfirmedInit, + UnconfirmedMove, UnconfirmedPlanetTransfer, - UnconfirmedFindArtifact, - UnconfirmedDepositArtifact, - UnconfirmedWithdrawArtifact, UnconfirmedProspectPlanet, - UnconfirmedActivateArtifact, - UnconfirmedDeactivateArtifact, UnconfirmedReveal, - UnconfirmedBuyGPTCredits, + UnconfirmedUpgrade, + UnconfirmedWithdrawArtifact, UnconfirmedWithdrawSilver, - ArtifactType, - ArtifactRarity, - RevealedCoords, - LocatablePlanet, - RevealedLocation, - PlanetMessageType, - SignedMessage, + Upgrade, + VoyageId, + WorldCoords, + WorldLocation, } from '@darkforest_eth/types'; +import { BigInteger } from 'big-integer'; +import { BigNumber, Contract, ContractInterface } from 'ethers'; +import { EventEmitter } from 'events'; +import stringify from 'json-stable-stringify'; import NotificationManager from '../../Frontend/Game/NotificationManager'; import { MIN_CHUNK_SIZE } from '../../Frontend/Utils/constants'; -import { monomitter, Monomitter, Subscription } from '../../Frontend/Utils/Monomitter'; +import { Diff, generateDiffEmitter, getDisposableEmitter } from '../../Frontend/Utils/EmitterUtils'; +import { + getBooleanSetting, + getNumberSetting, + pollSetting, + setBooleanSetting, + setSetting, + Setting, + settingChanged$, +} from '../../Frontend/Utils/SettingsHooks'; import { TerminalTextStyle } from '../../Frontend/Utils/TerminalTypes'; import UIEmitter from '../../Frontend/Utils/UIEmitter'; import { TerminalHandle } from '../../Frontend/Views/Terminal'; +import { + ContractConstants, + ContractsAPIEvent, + UpgradeArgs, +} from '../../_types/darkforest/api/ContractsAPITypes'; +import { AddressTwitterMap } from '../../_types/darkforest/api/UtilityServerAPITypes'; +import { + Chunk, + HashConfig, + isLocatable, + Rectangle, + RevealCountdownInfo, + Wormhole, +} from '../../_types/global/GlobalTypes'; +import MinerManager, { HomePlanetMinerChunkStore, MinerManagerEvent } from '../Miner/MinerManager'; import { MiningPattern, SpiralPattern, SwissCheesePattern } from '../Miner/MiningPatterns'; -import EthConnection from '../Network/EthConnection'; -import { ThrottledConcurrentQueue } from '../Network/ThrottledConcurrentQueue'; -import { getAllTwitters, verifyTwitterHandle } from '../Network/UtilityServerAPI'; +import { getConversation, startConversation, stepConversation } from '../Network/ConversationAPI'; +import { eventLogger, EventType } from '../Network/EventLogger'; +import { loadLeaderboard } from '../Network/LeaderboardApi'; +import { addMessage, deleteMessages, getMessagesOnPlanets } from '../Network/MessageAPI'; +import { + disconnectTwitter, + getAllTwitters, + verifyTwitterHandle, +} from '../Network/UtilityServerAPI'; import { SerializedPlugin } from '../Plugins/SerializedPlugin'; import { ProcgenUtils } from '../Procedural/ProcgenUtils'; +import PersistentChunkStore from '../Storage/PersistentChunkStore'; +import { easeInAnimation, emojiEaseOutAnimation } from '../Utils/Animation'; import SnarkArgsHelper from '../Utils/SnarkArgsHelper'; +import { + isUnconfirmedActivateArtifact, + isUnconfirmedBuyGPTCredits, + isUnconfirmedBuyHat, + isUnconfirmedDeactivateArtifact, + isUnconfirmedDepositArtifact, + isUnconfirmedFindArtifact, + isUnconfirmedInit, + isUnconfirmedMove, + isUnconfirmedProspectPlanet, + isUnconfirmedReveal, + isUnconfirmedUpgrade, + isUnconfirmedWithdrawArtifact, + isUnconfirmedWithdrawSilver, +} from '../Utils/TypeAssertions'; +import { getRandomActionId, hexifyBigIntNestedArray } from '../Utils/Utils'; +import { getEmojiMessage } from './ArrivalUtils'; import { isActivated } from './ArtifactUtils'; -import stringify from 'json-stable-stringify'; -import { getConversation, startConversation, stepConversation } from '../Network/ConversationAPI'; -import { address, locationIdToDecStr, locationIdFromBigInt } from '@darkforest_eth/serde'; +import { ContractsAPI, makeContractsAPI } from './ContractsAPI'; +import { GameObjects } from './GameObjects'; import { InitialGameStateDownloader } from './InitialGameStateDownloader'; import { Radii } from './ViewportEntities'; -import { BLOCK_EXPLORER_URL } from '../../Frontend/Utils/constants'; -import { Diagnostics } from '../../Frontend/Panes/DiagnosticsPane'; -import { - pollSetting, - setSetting, - Setting, - settingChanged$, - getNumberSetting, -} from '../../Frontend/Utils/SettingsHooks'; -import { addMessage, deleteMessages, getMessagesOnPlanets } from '../Network/MessageAPI'; -import { getEmojiMessage } from './ArrivalUtils'; -import { easeInAnimation, emojiEaseOutAnimation } from '../Utils/Animation'; -import { getDisposableEmitter, generateDiffEmitter, Diff } from '../../Frontend/Utils/EmitterUtils'; -import { MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; export enum GameManagerEvent { PlanetUpdate = 'PlanetUpdate', @@ -222,26 +234,14 @@ class GameManager extends EventEmitter { private readonly planetHashMimc: (...inputs: number[]) => BigInteger; /** - * This is kept relatively up-to-date with the balance of the player's wallet on the latest block - * of whatever blockchain we're connected to. - * - * @todo move this into a new `PlayerState` class. - */ - private balance: number; - - /** - * Any time the balance of the player's address changes, we publish an event here. - * - * @todo move this into a new `PlayerState` class. + * Whenever we refresh the players twitter accounts or scores, we publish an event here. */ - private myBalance$: Monomitter; + public readonly playersUpdated$: Monomitter; /** - * Handle to an interval that periodically refreshes the player's balance. - * - * @todo move this into a new `PlayerState` class. + * Handle to an interval that periodically uploads diagnostic information from this client. */ - private balanceInterval: ReturnType; + private diagnosticsInterval: ReturnType; /** * Handle to an interval that periodically refreshes some information about the player from the @@ -251,6 +251,11 @@ class GameManager extends EventEmitter { */ private playerInterval: ReturnType; + /** + * Handle to an interval that periodically refreshes the scoreboard from our webserver. + */ + private scoreboardInterval: ReturnType; + /** * Manages the process of mining new space territory. */ @@ -328,7 +333,6 @@ class GameManager extends EventEmitter { private constructor( terminal: React.MutableRefObject, account: EthAddress | undefined, - balance: number, players: Map, touchedPlanets: Map, allTouchedPlanetIds: Set, @@ -350,6 +354,7 @@ class GameManager extends EventEmitter { super(); this.diagnostics = { + rpcUrl: 'unknown', totalPlanets: 0, visiblePlanets: 0, visibleChunks: 0, @@ -364,9 +369,6 @@ class GameManager extends EventEmitter { this.terminal = terminal; this.account = account; - this.balance = balance; - this.myBalance$ = monomitter(true); - this.myBalance$.publish(balance); this.players = players; this.worldRadius = worldRadius; this.gptCreditPriceEther = gptCreditPriceEther; @@ -374,6 +376,7 @@ class GameManager extends EventEmitter { this.gptCreditPriceEtherEmitter$ = monomitter(true); this.myGPTCredits = myGPTCredits; this.myGPTCredits$.publish(myGPTCredits); + this.playersUpdated$ = monomitter(); this.gptCreditPriceEtherEmitter$.publish(gptCreditPriceEther); this.hashConfig = { @@ -423,14 +426,8 @@ class GameManager extends EventEmitter { this.ethConnection = ethConnection; - this.balanceInterval = setInterval(() => { - if (this.account) { - ethConnection.getBalance(this.account).then((balance) => { - this.balance = balance; - this.myBalance$.publish(balance); - }); - } - }, 1000); + this.diagnosticsInterval = setInterval(this.uploadDiagnostics.bind(this), 10_000); + this.scoreboardInterval = setInterval(this.refreshScoreboard.bind(this), 10_000); this.playerInterval = setInterval(() => { if (this.account) { @@ -450,6 +447,22 @@ class GameManager extends EventEmitter { }); } + private async uploadDiagnostics() { + eventLogger.logEvent(EventType.Diagnostics, this.diagnostics); + } + + private async refreshScoreboard() { + const leaderboard = await loadLeaderboard(); + for (const entry of leaderboard.entries) { + const player = this.players.get(entry.ethAddress); + if (player) { + player.score = entry.score; + } + } + + this.playersUpdated$.publish(); + } + public getEthConnection() { return this.ethConnection; } @@ -462,8 +475,8 @@ class GameManager extends EventEmitter { } this.contractsAPI.destroy(); this.persistentChunkStore.destroy(); - clearInterval(this.balanceInterval); clearInterval(this.playerInterval); + clearInterval(this.diagnosticsInterval); this.settingsSubscription?.unsubscribe(); } @@ -476,21 +489,28 @@ class GameManager extends EventEmitter { } const account = ethConnection.getAddress(); + + if (!account) { + throw new Error('no account on eth connection'); + } + const gameStateDownloader = new InitialGameStateDownloader(terminal.current); - const contractsAPI = await ContractsAPI.create(ethConnection); + const contractsAPI = await makeContractsAPI(ethConnection); terminal.current?.println('Loading game data from disk...'); const persistentChunkStore = await PersistentChunkStore.create(account); - terminal.current?.println( - 'Downloading data from Ethereum blockchain... (the contract is very big. this may take a while)' - ); + terminal.current?.println('Downloading data from Ethereum blockchain...'); + terminal.current?.println('(the contract is very big. this may take a while)'); terminal.current?.newline(); const initialState = await gameStateDownloader.download(contractsAPI, persistentChunkStore); const possibleHomes = await persistentChunkStore.getHomeLocations(); + terminal.current?.println(''); + terminal.current?.println('Building Index...'); + await persistentChunkStore.saveTouchedPlanetIds(initialState.allTouchedPlanetIds); await persistentChunkStore.saveRevealedCoords(initialState.allRevealedCoords); @@ -543,7 +563,6 @@ class GameManager extends EventEmitter { const gameManager = new GameManager( terminal, account, - initialState.balance, initialState.players, initialState.touchedAndLocatedPlanets, new Set(Array.from(initialState.allTouchedPlanetIds)), @@ -563,6 +582,8 @@ class GameManager extends EventEmitter { initialState.myGPTCredits ); + gameManager.setPlayerTwitters(initialState.twitters); + pollSetting(gameManager.getAccount(), Setting.AutoApproveNonPurchaseTransactions); persistentChunkStore.setDiagnosticUpdater(gameManager); @@ -825,10 +846,7 @@ class GameManager extends EventEmitter { } private onTxSubmit(unminedTx: SubmittedTx): void { - this.terminal.current?.print( - `[TX SUBMIT] ${unminedTx.type} transaction (`, - TerminalTextStyle.Blue - ); + this.terminal.current?.print(`${unminedTx.methodName} transaction (`, TerminalTextStyle.Blue); this.terminal.current?.printLink( `${unminedTx.txHash.slice(0, 6)}`, () => { @@ -836,16 +854,13 @@ class GameManager extends EventEmitter { }, TerminalTextStyle.White ); - this.terminal.current?.println(`) submitted to blockchain.`, TerminalTextStyle.Blue); + this.terminal.current?.println(`) submitted`, TerminalTextStyle.Blue); NotificationManager.getInstance().txSubmit(unminedTx); } private onTxConfirmed(unminedTx: SubmittedTx) { - this.terminal.current?.print( - `[TX CONFIRM] ${unminedTx.type} transaction (`, - TerminalTextStyle.Green - ); + this.terminal.current?.print(`${unminedTx.methodName} transaction (`, TerminalTextStyle.Green); this.terminal.current?.printLink( `${unminedTx.txHash.slice(0, 6)}`, () => { @@ -853,16 +868,13 @@ class GameManager extends EventEmitter { }, TerminalTextStyle.White ); - this.terminal.current?.println(`) confirmed.`, TerminalTextStyle.Green); + this.terminal.current?.println(`) confirmed`, TerminalTextStyle.Green); NotificationManager.getInstance().txConfirm(unminedTx); } private onTxReverted(unminedTx: SubmittedTx) { - this.terminal.current?.print( - `[TX ERROR] ${unminedTx.type} transaction (`, - TerminalTextStyle.Red - ); + this.terminal.current?.print(`${unminedTx.methodName} transaction (`, TerminalTextStyle.Red); this.terminal.current?.printLink( `${unminedTx.txHash.slice(0, 6)}`, () => { @@ -870,7 +882,7 @@ class GameManager extends EventEmitter { }, TerminalTextStyle.White ); - this.terminal.current?.println(`) reverted. Please try again.`, TerminalTextStyle.Red); + this.terminal.current?.println(`) reverted`, TerminalTextStyle.Red); NotificationManager.getInstance().txRevert(unminedTx); } @@ -979,6 +991,20 @@ class GameManager extends EventEmitter { return Array.from(this.players.values()); } + /** + * Gets either the given player, or if no address was provided, gets the player that is logged + * this client. + */ + public getPlayer(address?: EthAddress): Player | undefined { + address = address || this.account; + + if (!address) { + return undefined; + } + + return this.players.get(address); + } + /** * Gets all the map chunks that this client is aware of. Chunks may have come from * mining, or from importing map data. @@ -1095,7 +1121,10 @@ class GameManager extends EventEmitter { } ); - this.minerManager.startExplore(); + const isMining = getBooleanSetting(this.account, Setting.IsMining); + if (isMining) { + this.minerManager.startExplore(); + } } /** @@ -1319,20 +1348,23 @@ class GameManager extends EventEmitter { /** * Gets the private key of the burner wallet used by this account. */ - getPrivateKey(): string { + getPrivateKey(): string | undefined { return this.ethConnection.getPrivateKey(); } /** * Gets the balance of the account */ - getMyBalance(): number { + getMyBalanceEth(): number { if (!this.account) return 0; - return this.balance; + return weiToEth(this.ethConnection.getMyBalance() || BigNumber.from('0')); } - getMyBalanceEmitter(): Monomitter { - return this.myBalance$; + /** + * Returns the monomitter which publishes events whenever the player's balance changes. + */ + getMyBalance$(): Monomitter { + return this.ethConnection.myBalance$; } /** @@ -1418,6 +1450,7 @@ class GameManager extends EventEmitter { */ startExplore(): void { if (this.minerManager) { + setBooleanSetting(this.account, Setting.IsMining, true); this.minerManager.startExplore(); } } @@ -1427,6 +1460,7 @@ class GameManager extends EventEmitter { */ stopExplore(): void { if (this.minerManager) { + setBooleanSetting(this.account, Setting.IsMining, false); this.hashRate = 0; this.minerManager.stopExplore(); } @@ -1441,22 +1475,25 @@ class GameManager extends EventEmitter { } private async refreshTwitters(): Promise { - // get twitter handles const addressTwitters = await getAllTwitters(); - for (const key of Object.keys(addressTwitters)) { - const addr = address(key); - const player = this.players.get(addr); - if (player) player.twitter = addressTwitters[addr]; + this.setPlayerTwitters(addressTwitters); + } + + private setPlayerTwitters(twitters: AddressTwitterMap): void { + for (const [address, player] of this.players.entries()) { + const newPlayerTwitter = twitters[address]; + player.twitter = newPlayerTwitter; } + this.playersUpdated$.publish(); } /** - * Once you have posted the verificatoin tweet - complete the twitter-account-linking + * Once you have posted the verification tweet - complete the twitter-account-linking * process by telling the Dark Forest webserver to look at that tweet. */ - async verifyTwitter(twitter: string): Promise { + async submitVerifyTwitter(twitter: string): Promise { if (!this.account) return Promise.resolve(false); - const success = await verifyTwitterHandle(twitter, this.account); + const success = await verifyTwitterHandle(await this.signMessage({ twitter })); await this.refreshTwitters(); return success; } @@ -1528,7 +1565,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent: UnconfirmedReveal = { actionId, - type: EthTxType.REVEAL_LOCATION, + methodName: ContractMethodName.REVEAL_LOCATION, locationId: planetId, location: planet.location, }; @@ -1575,7 +1612,7 @@ class GameManager extends EventEmitter { actionId = getRandomActionId(); txIntent = { actionId, - type: EthTxType.INIT, + methodName: ContractMethodName.INIT, locationId: h, location: loc, }; @@ -1794,7 +1831,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent: UnconfirmedProspectPlanet = { actionId, - type: EthTxType.PROSPECT_PLANET, + methodName: ContractMethodName.PROSPECT_PLANET, planetId: planetId, }; @@ -1853,7 +1890,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent: UnconfirmedFindArtifact = { actionId, - type: EthTxType.FIND_ARTIFACT, + methodName: ContractMethodName.FIND_ARTIFACT, planetId, }; @@ -1916,7 +1953,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent: UnconfirmedDepositArtifact = { actionId, - type: EthTxType.DEPOSIT_ARTIFACT, + methodName: ContractMethodName.DEPOSIT_ARTIFACT, locationId, artifactId, }; @@ -1965,7 +2002,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent: UnconfirmedWithdrawArtifact = { actionId, - type: EthTxType.WITHDRAW_ARTIFACT, + methodName: ContractMethodName.WITHDRAW_ARTIFACT, locationId, artifactId, }; @@ -2007,7 +2044,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent: UnconfirmedActivateArtifact = { actionId, - type: EthTxType.ACTIVATE_ARTIFACT, + methodName: ContractMethodName.ACTIVATE_ARTIFACT, locationId, artifactId, wormholeTo, @@ -2034,7 +2071,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent: UnconfirmedDeactivateArtifact = { actionId, - type: EthTxType.DEACTIVATE_ARTIFACT, + methodName: ContractMethodName.DEACTIVATE_ARTIFACT, locationId, artifactId, }; @@ -2077,7 +2114,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent: UnconfirmedWithdrawSilver = { actionId, - type: EthTxType.WITHDRAW_SILVER, + methodName: ContractMethodName.WITHDRAW_SILVER, locationId, amount, }; @@ -2179,6 +2216,11 @@ class GameManager extends EventEmitter { await this.refreshServerPlanetStates([locationId]); } + public async submitDisconnectTwitter(twitter: string) { + await disconnectTwitter(await this.signMessage({ twitter })); + await this.refreshTwitters(); + } + /** * The planet emoji feature is built on top of a more general 'Planet Message' system, which * allows players to upload pieces of data called 'Message's to planets that they own. Emojis are @@ -2247,11 +2289,7 @@ class GameManager extends EventEmitter { private async verifyMessage(message: SignedMessage): Promise { const preSigned = JSON.stringify(message.message); - return this.ethConnection.verifySignature( - preSigned, - message.signature as string, - message.sender as EthAddress - ); + return verifySignature(preSigned, message.signature as string, message.sender as EthAddress); } /** @@ -2310,7 +2348,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent: UnconfirmedMove = { actionId, - type: EthTxType.MOVE, + methodName: ContractMethodName.MOVE, from: oldLocation.hash, to: newLocation.hash, forces: shipsMoved, @@ -2368,7 +2406,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent = { actionId, - type: EthTxType.UPGRADE, + methodName: ContractMethodName.UPGRADE, locationId: planetId, upgradeBranch: branch, }; @@ -2408,13 +2446,13 @@ class GameManager extends EventEmitter { localStorage.setItem(`${this.getAccount()?.toLowerCase()}-hatPlanet`, planetId); localStorage.setItem( `${this.getAccount()?.toLowerCase()}-hatLevel`, - (planet.hatLevel + 1).toString() + planet.hatLevel.toString() ); const actionId = getRandomActionId(); const txIntent = { actionId, - type: EthTxType.BUY_HAT, + methodName: ContractMethodName.BUY_HAT, locationId: planetId, }; this.handleTxIntent(txIntent); @@ -2451,7 +2489,7 @@ class GameManager extends EventEmitter { const actionId = getRandomActionId(); const txIntent: UnconfirmedPlanetTransfer = { actionId, - type: EthTxType.PLANET_TRANSFER, + methodName: ContractMethodName.PLANET_TRANSFER, planetId, newOwner, }; @@ -2466,9 +2504,9 @@ class GameManager extends EventEmitter { buyGPTCredits(amount: number) { if (this.checkGameHasEnded()) return this; - const cost = this.gptCreditPriceEther * amount; + const costEth = this.gptCreditPriceEther * amount; - if (cost > this.balance) { + if (costEth > this.getMyBalanceEth()) { throw new Error('not enough balance to buy credits!'); } if (this.entityStore.getUnconfirmedBuyGPTCredits()) { @@ -2479,12 +2517,15 @@ class GameManager extends EventEmitter { `${this.getAccount()?.toLowerCase()}-buyGPTCreditAmount`, amount.toString() ); - localStorage.setItem(`${this.getAccount()?.toLowerCase()}-buyGPTCreditCost`, cost.toString()); + localStorage.setItem( + `${this.getAccount()?.toLowerCase()}-buyGPTCreditCost`, + costEth.toString() + ); const actionId = getRandomActionId(); const txIntent: UnconfirmedBuyGPTCredits = { actionId, - type: EthTxType.BUY_GPT_CREDITS, + methodName: ContractMethodName.BUY_GPT_CREDITS, amount, }; this.handleTxIntent(txIntent); @@ -2932,9 +2973,17 @@ class GameManager extends EventEmitter { * Returns an instance of a `Contract` from the ethersjs library. This is the library we use to * connect to the blockchain. For documentation about how `Contract` works, see: * https://docs.ethers.io/v5/api/contract/contract/ + * + * Also, registers your contract in the system to make calls against it and to reload it when + * necessary (such as the RPC endpoint changing). */ - public loadContract(contractAddress: string, contractABI: ContractInterface): Promise { - return this.ethConnection.loadContract(contractAddress, contractABI); + public loadContract( + contractAddress: string, + contractABI: ContractInterface + ): Promise { + return this.ethConnection.loadContract(contractAddress, async (address, provider, signer) => + createContract(address, contractABI, provider, signer) + ); } /** diff --git a/src/Backend/GameLogic/GameObjects.ts b/src/Backend/GameLogic/GameObjects.ts index 20022b09..49467990 100644 --- a/src/Backend/GameLogic/GameObjects.ts +++ b/src/Backend/GameLogic/GameObjects.ts @@ -1,64 +1,64 @@ -import { ethers } from 'ethers'; +import { EMPTY_ADDRESS, MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; +import { Monomitter, monomitter } from '@darkforest_eth/events'; +import { bonusFromHex, getBytesFromHex } from '@darkforest_eth/hexgen'; import { + ArrivalWithTimer, + Artifact, + ArtifactId, + ArtifactType, + Biome, EthAddress, + LocatablePlanet, LocationId, - ArtifactId, - VoyageId, Planet, - LocatablePlanet, - Artifact, - WorldCoords, - WorldLocation, PlanetLevel, - ArtifactType, - SpaceType, - Biome, PlanetType, QueuedArrival, - ArrivalWithTimer, - UnconfirmedMove, - UnconfirmedUpgrade, + RevealedLocation, + SpaceType, + TxIntent, + UnconfirmedActivateArtifact, + UnconfirmedBuyGPTCredits, UnconfirmedBuyHat, + UnconfirmedMove, UnconfirmedPlanetTransfer, - UnconfirmedActivateArtifact, - TxIntent, UnconfirmedReveal, - UnconfirmedBuyGPTCredits, - RevealedLocation, + UnconfirmedUpgrade, + VoyageId, + WorldCoords, + WorldLocation, } from '@darkforest_eth/types'; import autoBind from 'auto-bind'; import bigInt from 'big-integer'; +import { ethers } from 'ethers'; import NotificationManager from '../../Frontend/Game/NotificationManager'; import { - setObjectSyncState, - getPlanetId, - getPlanetOwner, getArtifactId, getArtifactOwner, + getPlanetId, + getPlanetOwner, + setObjectSyncState, } from '../../Frontend/Utils/EmitterUtils'; -import { Monomitter, monomitter } from '../../Frontend/Utils/Monomitter'; import { ContractConstants } from '../../_types/darkforest/api/ContractsAPITypes'; -import { Wormhole, isLocatable, Chunk } from '../../_types/global/GlobalTypes'; +import { Chunk, isLocatable, Wormhole } from '../../_types/global/GlobalTypes'; import { - isUnconfirmedMove, - isUnconfirmedUpgrade, - isUnconfirmedBuyHat, - isUnconfirmedTransfer, - isUnconfirmedProspectPlanet, - isUnconfirmedFindArtifact, - isUnconfirmedDepositArtifact, - isUnconfirmedWithdrawArtifact, isUnconfirmedActivateArtifact, + isUnconfirmedBuyGPTCredits, + isUnconfirmedBuyHat, isUnconfirmedDeactivateArtifact, + isUnconfirmedDepositArtifact, + isUnconfirmedFindArtifact, + isUnconfirmedMove, + isUnconfirmedProspectPlanet, isUnconfirmedReveal, - isUnconfirmedBuyGPTCredits, + isUnconfirmedTransfer, + isUnconfirmedUpgrade, + isUnconfirmedWithdrawArtifact, isUnconfirmedWithdrawSilver, } from '../Utils/TypeAssertions'; import { hasOwner } from '../Utils/Utils'; -import { updatePlanetToTime, arrive, PlanetDiff } from './ArrivalUtils'; +import { arrive, PlanetDiff, updatePlanetToTime } from './ArrivalUtils'; import { isActivated } from './ArtifactUtils'; -import { EMPTY_ADDRESS, MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; -import { bonusFromHex, getBytesFromHex } from '@darkforest_eth/hexgen'; import { LayeredMap } from './LayeredMap'; import { Radii } from './ViewportEntities'; @@ -1388,12 +1388,12 @@ export class GameObjects { silCap *= 2; } - let barbarians = + let pirates = (energyCap * this.contractConstants.defaultBarbarianPercentage[planetLevel]) / 100; - // increase barbarians - if (spaceType === SpaceType.DEAD_SPACE) barbarians *= 20; - else if (spaceType === SpaceType.DEEP_SPACE) barbarians *= 10; - else if (spaceType === SpaceType.SPACE) barbarians *= 4; + // increase pirates + if (spaceType === SpaceType.DEAD_SPACE) pirates *= 20; + else if (spaceType === SpaceType.DEEP_SPACE) pirates *= 10; + else if (spaceType === SpaceType.SPACE) pirates *= 4; const silver = planetType === PlanetType.SILVER_MINE ? silCap / 2 : 0; @@ -1425,7 +1425,7 @@ export class GameObjects { speed, defense, - energy: barbarians, + energy: pirates, silver, lastUpdated: Math.floor(Date.now() / 1000), diff --git a/src/Backend/GameLogic/GameUIManager.ts b/src/Backend/GameLogic/GameUIManager.ts index a1e805c6..9a44f981 100644 --- a/src/Backend/GameLogic/GameUIManager.ts +++ b/src/Backend/GameLogic/GameUIManager.ts @@ -1,61 +1,62 @@ +import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; +import { Monomitter, monomitter } from '@darkforest_eth/events'; +import { PerlinConfig } from '@darkforest_eth/hashing'; +import { planetHasBonus } from '@darkforest_eth/hexgen'; +import { EthConnection } from '@darkforest_eth/network'; import { - LocationId, + Artifact, ArtifactId, + Biome, + Conversation, + Diagnostics, EthAddress, - Player, - Artifact, - Planet, LocatablePlanet, + LocationId, + Planet, PlanetLevel, - UpgradeBranchName, - WorldLocation, - WorldCoords, - Biome, - SpaceType, PlanetType, + Player, QueuedArrival, - Upgrade, - Conversation, + SpaceType, + UnconfirmedActivateArtifact, UnconfirmedMove, UnconfirmedUpgrade, - UnconfirmedActivateArtifact, + Upgrade, + UpgradeBranchName, + WorldCoords, + WorldLocation, } from '@darkforest_eth/types'; import autoBind from 'auto-bind'; +import { BigNumber } from 'ethers'; import EventEmitter from 'events'; +import deferred from 'p-defer'; import NotificationManager from '../../Frontend/Game/NotificationManager'; import Viewport from '../../Frontend/Game/Viewport'; import { getObjectWithIdFromMap } from '../../Frontend/Utils/EmitterUtils'; -import { Monomitter, monomitter } from '../../Frontend/Utils/Monomitter'; +import { + getBooleanSetting, + getSetting, + setBooleanSetting, + Setting, +} from '../../Frontend/Utils/SettingsHooks'; import UIEmitter, { UIEmitterEvent } from '../../Frontend/Utils/UIEmitter'; import { TerminalHandle } from '../../Frontend/Views/Terminal'; import { ContractConstants } from '../../_types/darkforest/api/ContractsAPITypes'; import { Chunk, - Rectangle, + HashConfig, isLocatable, + Rectangle, Wormhole, - HashConfig, } from '../../_types/global/GlobalTypes'; import { MiningPattern } from '../Miner/MiningPatterns'; -import EthConnection from '../Network/EthConnection'; import { coordsEqual } from '../Utils/Coordinates'; -import { deferred } from '../Utils/Utils'; import { biomeName } from './ArtifactUtils'; import GameManager, { GameManagerEvent } from './GameManager'; +import { GameObjects } from './GameObjects'; import { PluginManager } from './PluginManager'; import TutorialManager, { TutorialState } from './TutorialManager'; -import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; -import { planetHasBonus } from '@darkforest_eth/hexgen'; import { ViewportEntities } from './ViewportEntities'; -import { Diagnostics } from '../../Frontend/Panes/DiagnosticsPane'; -import { - getBooleanSetting, - getSetting, - Setting, - setBooleanSetting, -} from '../../Frontend/Utils/SettingsHooks'; -import { GameObjects } from './GameObjects'; -import { PerlinConfig } from '@darkforest_eth/hashing'; export const enum GameUIManagerEvent { InitializedPlayer = 'InitializedPlayer', @@ -136,7 +137,7 @@ class GameUIManager extends EventEmitter { this.plugins = new PluginManager(gameManager); - this.selectedPlanetId$ = monomitter(); + this.selectedPlanetId$ = monomitter(true); this.selectedPlanet$ = getObjectWithIdFromMap( this.getPlanetMap(), this.selectedPlanetId$, @@ -282,23 +283,27 @@ class GameUIManager extends EventEmitter { } public verifyTwitter(twitter: string): Promise { - return this.gameManager.verifyTwitter(twitter); + return this.gameManager.submitVerifyTwitter(twitter); + } + + public disconnectTwitter(twitter: string) { + return this.gameManager.submitDisconnectTwitter(twitter); } public getPluginManager(): PluginManager { return this.plugins; } - public getPrivateKey(): string { + public getPrivateKey(): string | undefined { return this.gameManager.getPrivateKey(); } public getMyBalance(): number { - return this.gameManager.getMyBalance(); + return this.gameManager.getMyBalanceEth(); } - public getMyBalanceEmitter(): Monomitter { - return this.gameManager.getMyBalanceEmitter(); + public getMyBalance$(): Monomitter { + return this.gameManager.getMyBalance$(); } public findArtifact(planetId: LocationId) { @@ -367,11 +372,11 @@ class GameUIManager extends EventEmitter { this.mouseDownOverCoords = planet.location.coords; this.mouseDownOverPlanet = planet; - const [resolve, _reject, resultPromise] = deferred(); + const { resolve, promise } = deferred(); this.onChooseTargetPlanet = resolve; - return resultPromise; + return promise; } public revealLocation(locationId: LocationId) { @@ -452,6 +457,7 @@ class GameUIManager extends EventEmitter { this.setSelectedPlanet(mouseUpOverPlanet); this.selectedCoords = mouseUpOverCoords; this.terminal.current?.println(`Selected: ${mouseUpOverPlanet.locationId}`); + this.terminal.current?.println(``); } else if (mouseDownPlanet && mouseDownPlanet.owner === this.gameManager.getAccount()) { // move initiated if enough forces const from = mouseDownPlanet; @@ -888,7 +894,7 @@ class GameUIManager extends EventEmitter { return this.getMyArtifacts().filter((a) => !a.onPlanetId); } - public getPlanetWithId(planetId: LocationId): Planet | undefined { + public getPlanetWithId(planetId: LocationId | undefined): Planet | undefined { return this.gameManager.getPlanetWithId(planetId); } @@ -896,6 +902,10 @@ class GameUIManager extends EventEmitter { return this.gameManager.getMyScore(); } + public getPlayer(address?: EthAddress): Player | undefined { + return this.gameManager.getPlayer(address); + } + public getArtifactWithId(artifactId: ArtifactId): Artifact | undefined { return this.gameManager.getArtifactWithId(artifactId); } diff --git a/src/Backend/GameLogic/InitialGameStateDownloader.ts b/src/Backend/GameLogic/InitialGameStateDownloader.ts index 866e5f51..f751775a 100644 --- a/src/Backend/GameLogic/InitialGameStateDownloader.ts +++ b/src/Backend/GameLogic/InitialGameStateDownloader.ts @@ -1,12 +1,13 @@ +import { weiToEth } from '@darkforest_eth/network'; import { - VoyageId, - QueuedArrival, - LocationId, - ArtifactId, Artifact, + ArtifactId, + LocationId, + Planet, Player, + QueuedArrival, RevealedCoords, - Planet, + VoyageId, } from '@darkforest_eth/types'; import _ from 'lodash'; import React from 'react'; @@ -14,8 +15,10 @@ import { LoadingBarHandle } from '../../Frontend/Components/TextLoadingBar'; import { MakeDarkForestTips } from '../../Frontend/Views/DarkForestTips'; import { TerminalHandle } from '../../Frontend/Views/Terminal'; import { ContractConstants } from '../../_types/darkforest/api/ContractsAPITypes'; +import { AddressTwitterMap } from '../../_types/darkforest/api/UtilityServerAPITypes'; +import { tryGetAllTwitters } from '../Network/UtilityServerAPI'; import PersistentChunkStore from '../Storage/PersistentChunkStore'; -import ContractsAPI from './ContractsAPI'; +import { ContractsAPI } from './ContractsAPI'; export interface InitialGameState { contractConstants: ContractConstants; @@ -35,6 +38,7 @@ export interface InitialGameState { revealedCoordsMap: Map; planetVoyageIdMap: Map; arrivals: Map; + twitters: AddressTwitterMap; } export class InitialGameStateDownloader { @@ -166,6 +170,8 @@ export class InitialGameStateDownloader { yourArtifactsLoadingBar ); + const twitters = await tryGetAllTwitters(); + return { contractConstants: await contractConstants, players: await players, @@ -180,10 +186,11 @@ export class InitialGameStateDownloader { myArtifacts: await myArtifacts, heldArtifacts: await heldArtifacts, loadedPlanets: planetsToLoad, - balance: await balance, + balance: weiToEth(await balance), revealedCoordsMap, planetVoyageIdMap, arrivals, + twitters, }; } } diff --git a/src/Backend/GameLogic/LayeredMap.ts b/src/Backend/GameLogic/LayeredMap.ts index aef347f3..15e71665 100644 --- a/src/Backend/GameLogic/LayeredMap.ts +++ b/src/Backend/GameLogic/LayeredMap.ts @@ -1,7 +1,7 @@ +import { MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; import { LocationId, WorldLocation } from '@darkforest_eth/types'; -import { QuadTree, Box, Point } from 'js-quadtree'; +import { Box, Point, QuadTree } from 'js-quadtree'; import { QuadTreeConfig } from 'js-quadtree/dist/types'; -import { MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; import { Radii } from './ViewportEntities'; /** diff --git a/src/Backend/GameLogic/Lazy.ts b/src/Backend/GameLogic/Lazy.ts new file mode 100644 index 00000000..a7839e91 --- /dev/null +++ b/src/Backend/GameLogic/Lazy.ts @@ -0,0 +1,20 @@ +export class Lazy { + private getPromise: () => Promise; + private promise: Promise | undefined; + + public constructor(getPromise: () => Promise) { + this.getPromise = getPromise; + } + + public get() { + if (this.promise === undefined) { + this.promise = this.getPromise(); + } + + return this.promise; + } +} + +export function lazy(getPromise: () => Promise) { + return new Lazy(getPromise); +} diff --git a/src/Backend/GameLogic/PaidConversationManager.tsx b/src/Backend/GameLogic/PaidConversationManager.tsx index 8d353b35..7bd960c4 100644 --- a/src/Backend/GameLogic/PaidConversationManager.tsx +++ b/src/Backend/GameLogic/PaidConversationManager.tsx @@ -1,11 +1,11 @@ +import { Artifact, ArtifactTypeNames, Conversation, Message } from '@darkforest_eth/types'; import React from 'react'; import styled from 'styled-components'; -import { Artifact, Conversation, Message, ArtifactTypeNames } from '@darkforest_eth/types'; import { WikiPane } from '../../Frontend/Panes/WikiPane'; import { TerminalTextStyle } from '../../Frontend/Utils/TerminalTypes'; import { TerminalHandle } from '../../Frontend/Views/Terminal'; -import GameUIManager from './GameUIManager'; import { artifactName } from '../Procedural/ArtifactProcgen'; +import GameUIManager from './GameUIManager'; const BadwordsFilter = require('bad-words'); const filter = new BadwordsFilter(); diff --git a/src/Backend/GameLogic/PluginManager.tsx b/src/Backend/GameLogic/PluginManager.tsx index f21f1117..e05319ee 100644 --- a/src/Backend/GameLogic/PluginManager.tsx +++ b/src/Backend/GameLogic/PluginManager.tsx @@ -1,7 +1,7 @@ -import { Monomitter, monomitter } from '../../Frontend/Utils/Monomitter'; -import { getEmbeddedPlugins, EmbeddedPlugin } from '../Plugins/EmbeddedPluginLoader'; +import { Monomitter, monomitter } from '@darkforest_eth/events'; +import { EmbeddedPlugin, getEmbeddedPlugins } from '../Plugins/EmbeddedPluginLoader'; import { PluginProcess } from '../Plugins/PluginProcess'; -import { SerializedPlugin, PluginId } from '../Plugins/SerializedPlugin'; +import { PluginId, SerializedPlugin } from '../Plugins/SerializedPlugin'; import GameManager from './GameManager'; /** diff --git a/src/Backend/GameLogic/TutorialManager.ts b/src/Backend/GameLogic/TutorialManager.ts index 978f3d8b..87203c18 100644 --- a/src/Backend/GameLogic/TutorialManager.ts +++ b/src/Backend/GameLogic/TutorialManager.ts @@ -1,7 +1,7 @@ import { EthAddress } from '@darkforest_eth/types'; import { EventEmitter } from 'events'; import NotificationManager from '../../Frontend/Game/NotificationManager'; -import { Setting, setBooleanSetting } from '../../Frontend/Utils/SettingsHooks'; +import { setBooleanSetting, Setting } from '../../Frontend/Utils/SettingsHooks'; import GameUIManager from './GameUIManager'; export const enum TutorialManagerEvent { diff --git a/src/Backend/GameLogic/ViewportEntities.ts b/src/Backend/GameLogic/ViewportEntities.ts index 136dc67c..8fc245f6 100644 --- a/src/Backend/GameLogic/ViewportEntities.ts +++ b/src/Backend/GameLogic/ViewportEntities.ts @@ -1,5 +1,5 @@ -import { LocatablePlanet, LocationId, PlanetLevel, WorldCoords } from '@darkforest_eth/types'; import { MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; +import { LocatablePlanet, LocationId, PlanetLevel, WorldCoords } from '@darkforest_eth/types'; import Viewport from '../../Frontend/Game/Viewport'; import { Chunk, isLocatable } from '../../_types/global/GlobalTypes'; import { planetLevelToAnimationSpeed, sinusoidalAnimation } from '../Utils/Animation'; diff --git a/src/Backend/Interfaces/DiagnosticUpdater.ts b/src/Backend/Interfaces/DiagnosticUpdater.ts deleted file mode 100644 index 9306dd8b..00000000 --- a/src/Backend/Interfaces/DiagnosticUpdater.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Diagnostics } from '../../Frontend/Panes/DiagnosticsPane'; - -/** - * Various parts of our codebase need to be able to self-report diagnostics. To enable them to do - * so, you must provide them with an object that conforms to this interface. Currently, the only - * implementation of this function is `GameManager`. However, in the future, we might want to stream - * a sample of these diagnostic updates to our backend, so that we can analyze performance, catch - * bugs, etc. - */ -export interface DiagnosticUpdater { - /** - * Updates the diagnostics using the provided updater function. - */ - updateDiagnostics: (updateFn: (d: Diagnostics) => void) => void; -} diff --git a/src/Backend/Miner/ChunkUtils.ts b/src/Backend/Miner/ChunkUtils.ts index fb3ec1ef..e00d9226 100644 --- a/src/Backend/Miner/ChunkUtils.ts +++ b/src/Backend/Miner/ChunkUtils.ts @@ -1,6 +1,6 @@ -import { BucketId, PersistedChunk, ChunkId } from '../../_types/darkforest/api/ChunkStoreTypes'; -import { Rectangle, Chunk } from '../../_types/global/GlobalTypes'; -import { WorldLocation, WorldCoords } from '@darkforest_eth/types'; +import { WorldCoords, WorldLocation } from '@darkforest_eth/types'; +import { BucketId, ChunkId, PersistedChunk } from '../../_types/darkforest/api/ChunkStoreTypes'; +import { Chunk, Rectangle } from '../../_types/global/GlobalTypes'; /** * Deterministically assigns a bucket ID to a rectangle, based on its position and size in the diff --git a/src/Backend/Miner/MinerManager.ts b/src/Backend/Miner/MinerManager.ts index e7a0e33b..54889ad9 100644 --- a/src/Backend/Miner/MinerManager.ts +++ b/src/Backend/Miner/MinerManager.ts @@ -1,11 +1,11 @@ -import { Chunk, Rectangle, MinerWorkerMessage, HashConfig } from '../../_types/global/GlobalTypes'; -import Worker from 'worker-loader!./miner.worker'; +import { perlin, PerlinConfig } from '@darkforest_eth/hashing'; import { EventEmitter } from 'events'; import _ from 'lodash'; -import { MiningPattern } from './MiningPatterns'; -import { perlin, PerlinConfig } from '@darkforest_eth/hashing'; +import Worker from 'worker-loader!./miner.worker'; import { ChunkStore } from '../../_types/darkforest/api/ChunkStoreTypes'; +import { Chunk, HashConfig, MinerWorkerMessage, Rectangle } from '../../_types/global/GlobalTypes'; import { getChunkKey } from './ChunkUtils'; +import { MiningPattern } from './MiningPatterns'; export const enum MinerManagerEvent { DiscoveredNewChunk = 'DiscoveredNewChunk', @@ -185,7 +185,9 @@ class MinerManager extends EventEmitter { } public setCores(nCores: number): void { + const wasMining = this.isMining(); this.stopExplore(); + this.workers.map((x) => x.terminate()); this.workers = []; @@ -194,8 +196,12 @@ class MinerManager extends EventEmitter { } else { this.cores = nCores; } + _.range(this.cores).forEach((i) => this.initWorker(i)); - this.startExplore(); + + if (wasMining) { + this.startExplore(); + } } public startExplore(): void { diff --git a/src/Backend/Miner/MiningPatterns.ts b/src/Backend/Miner/MiningPatterns.ts index 1d1bddbc..e05898b2 100644 --- a/src/Backend/Miner/MiningPatterns.ts +++ b/src/Backend/Miner/MiningPatterns.ts @@ -1,5 +1,5 @@ -import { Rectangle } from '../../_types/global/GlobalTypes'; import { WorldCoords } from '@darkforest_eth/types'; +import { Rectangle } from '../../_types/global/GlobalTypes'; export const enum MiningPatternType { Home, diff --git a/src/Backend/Miner/miner.worker.ts b/src/Backend/Miner/miner.worker.ts index ec463763..b51e520b 100644 --- a/src/Backend/Miner/miner.worker.ts +++ b/src/Backend/Miner/miner.worker.ts @@ -1,11 +1,11 @@ -import { mimcHash, PerlinConfig, perlin } from '@darkforest_eth/hashing'; -import { LOCATION_ID_UB } from '../../Frontend/Utils/constants'; -import { Rectangle, Chunk, MinerWorkerMessage } from '../../_types/global/GlobalTypes'; +import { mimcHash, perlin, PerlinConfig } from '@darkforest_eth/hashing'; +import { locationIdFromBigInt } from '@darkforest_eth/serde'; +import { WorldLocation } from '@darkforest_eth/types'; import * as bigInt from 'big-integer'; import { BigInteger } from 'big-integer'; +import { LOCATION_ID_UB } from '../../Frontend/Utils/constants'; +import { Chunk, MinerWorkerMessage, Rectangle } from '../../_types/global/GlobalTypes'; import { getPlanetLocations } from './permutation'; -import { WorldLocation } from '@darkforest_eth/types'; -import { locationIdFromBigInt } from '@darkforest_eth/serde'; /* eslint-disable @typescript-eslint/no-explicit-any */ const ctx: Worker = self as any; diff --git a/src/Backend/Miner/permutation.ts b/src/Backend/Miner/permutation.ts index a6b31f04..9bb5b58c 100644 --- a/src/Backend/Miner/permutation.ts +++ b/src/Backend/Miner/permutation.ts @@ -1,7 +1,7 @@ -import { Rectangle } from '../../_types/global/GlobalTypes'; import { fakeHash, perlin, seededRandom } from '@darkforest_eth/hashing'; -import { WorldLocation, WorldCoords } from '@darkforest_eth/types'; import { locationIdFromBigInt } from '@darkforest_eth/serde'; +import { WorldCoords, WorldLocation } from '@darkforest_eth/types'; +import { Rectangle } from '../../_types/global/GlobalTypes'; type IdxWithRand = { idx: number; diff --git a/src/Backend/Network/AccountManager.ts b/src/Backend/Network/AccountManager.ts new file mode 100644 index 00000000..34c3eeba --- /dev/null +++ b/src/Backend/Network/AccountManager.ts @@ -0,0 +1,87 @@ +import { address } from '@darkforest_eth/serde'; +import { EthAddress } from '@darkforest_eth/types'; +import { utils } from 'ethers'; +import stringify from 'json-stable-stringify'; + +/** + * Represents an account with which the user plays the game. + */ +export interface Account { + address: EthAddress; + privateKey: string; +} + +/** + * This is the key in local storage in which we keep an array of all the public addresses of the + * accounts that have been imported/generated into this client. + */ +const ADDRESS_LOCAL_STORAGE_KEY = 'KNOWN_ADDRESSES'; + +/** + * In-memory representation of all the accounts in this client. + */ +const accounts: Account[] = load(); + +/** + * Store all of the accounts in local storage. + */ +function save() { + localStorage.setItem( + ADDRESS_LOCAL_STORAGE_KEY, + stringify(accounts.map((account) => account.address)) + ); + + for (const account of accounts) { + localStorage.setItem(`skey-${account.address}`, account.privateKey); + } +} + +/** + * Load all of the accounts from local storage. + */ +function load(): Account[] { + const knownAddresses: EthAddress[] = []; + const accounts: Account[] = []; + + // first we load the public addresses + const serializedAddresses = localStorage.getItem(ADDRESS_LOCAL_STORAGE_KEY); + if (serializedAddresses !== null) { + const addresses = JSON.parse(serializedAddresses) as string[]; + for (const addressStr of addresses) { + knownAddresses.push(address(addressStr)); + } + } + + // then we load the private keys + for (const addy of knownAddresses) { + const skey = localStorage.getItem(`skey-${addy}`); + + if (skey !== null) { + accounts.push({ + address: addy, + privateKey: skey, + }); + } + } + + return accounts; +} + +/** + * Returns the list of accounts that are logged into the game. + */ +export function getAccounts(): Account[] { + return [...accounts]; +} + +/** + * Adds the given account, and saves it to localstorage. + */ +export function addAccount(privateKey: string) { + accounts.push({ + address: address(utils.computeAddress(privateKey)), + privateKey, + }); + + save(); +} diff --git a/src/Backend/Network/Blockchain.ts b/src/Backend/Network/Blockchain.ts new file mode 100644 index 00000000..45972941 --- /dev/null +++ b/src/Backend/Network/Blockchain.ts @@ -0,0 +1,85 @@ +// These are loaded as URL paths by a webpack loader +import coreContractAbiUrl from '@darkforest_eth/contracts/abis/DarkForestCore.json'; +import gettersContractAbiUrl from '@darkforest_eth/contracts/abis/DarkForestGetters.json'; +import gptCreditContractAbiUrl from '@darkforest_eth/contracts/abis/DarkForestGPTCredit.json'; +import whitelistContractAbiUrl from '@darkforest_eth/contracts/abis/Whitelist.json'; +import type { + DarkForestCore, + DarkForestGetters, + DarkForestGPTCredit, + Whitelist, +} from '@darkforest_eth/contracts/typechain'; +import { createContract, createEthConnection, EthConnection } from '@darkforest_eth/network'; +import type { providers, Wallet } from 'ethers'; + +/** + * Loads the Core game contract, which is responsible for updating the state of the game. + * @see https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestCore.sol + */ +export async function loadCoreContract( + address: string, + provider: providers.JsonRpcProvider, + signer?: Wallet +): Promise { + const coreContractAbi = await fetch(coreContractAbiUrl).then((r) => r.json()); + + return createContract(address, coreContractAbi, provider, signer); +} + +/** + * Loads the Getters contract, which contains utility view functions which get game objects + * from the blockchain in bulk. + * @see https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestGetters.sol + */ +export async function loadGettersContract( + address: string, + provider: providers.JsonRpcProvider, + signer?: Wallet +): Promise { + const gettersContractAbi = await fetch(gettersContractAbiUrl).then((r) => r.json()); + + return createContract(address, gettersContractAbi, provider, signer); +} + +/** + * Loads the Whitelist contract, which keeps track of which players are allowed to play the game. + * @see https://github.com/darkforest-eth/eth/blob/master/contracts/Whitelist.sol + */ +export async function loadWhitelistContract( + address: string, + provider: providers.JsonRpcProvider, + signer?: Wallet +): Promise { + const whitelistContractAbi = await fetch(whitelistContractAbiUrl).then((r) => r.json()); + + return createContract(address, whitelistContractAbi, provider, signer); +} + +/** + * Loads ths GPT Credit contract, which players can pay to talk to artifacts. + * @see https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestGPTCredit.sol + */ +export async function loadGptCreditContract( + address: string, + provider: providers.JsonRpcProvider, + signer?: Wallet +): Promise { + const gptCreditContractAbi = await fetch(gptCreditContractAbiUrl).then((r) => r.json()); + + return createContract(address, gptCreditContractAbi, provider, signer); +} + +export function getEthConnection(): Promise { + const isProd = process.env.NODE_ENV === 'production'; + const defaultUrl = process.env.DEFAULT_RPC as string; + + let url: string; + + if (isProd) { + url = localStorage.getItem('XDAI_RPC_ENDPOINT_v5') || defaultUrl; + } else { + url = 'http://localhost:8545'; + } + + return createEthConnection(url); +} diff --git a/src/Backend/Network/ChainAPI.ts b/src/Backend/Network/ChainAPI.ts deleted file mode 100644 index 0801fd4d..00000000 --- a/src/Backend/Network/ChainAPI.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { GasPrices } from '@darkforest_eth/types'; - -const GAS_PRICE_API = 'https://blockscout.com/xdai/mainnet/api/v1/gas-price-oracle'; - -/** - * In case of errors, these are the default gas prices. - */ -export const DEFAULT_GAS_PRICES: Readonly = Object.freeze({ - slow: 1, - average: 3, - fast: 10, -}); - -/** - * In case xDai's auto-price is something ridiculous, we don't want our players to insta run out of - * money. - */ -export const MAX_AUTO_GAS_PRICE_GWEI = 15; - -/** - * Gets the current gas prices from xDai's price oracle. If the oracle is broken, return some sane - * defaults. - */ -export async function getAutoGasPrices(): Promise { - try { - const res = await fetch(GAS_PRICE_API, { - method: 'GET', - }); - - const prices = (await res.json()) as GasPrices; - cleanGasPrices(prices); - return prices; - } catch (e) { - return DEFAULT_GAS_PRICES; - } -} - -/** - * In case xDai gives us a malformed response, clean it up with some default gas prices. - */ -function cleanGasPrices(gasPrices: GasPrices): void { - if (typeof gasPrices.fast !== 'number') { - gasPrices.fast = DEFAULT_GAS_PRICES.fast; - } - - if (typeof gasPrices.average !== 'number') { - gasPrices.average = DEFAULT_GAS_PRICES.average; - } - - if (typeof gasPrices.slow !== 'number') { - gasPrices.slow = DEFAULT_GAS_PRICES.slow; - } - - gasPrices.fast = Math.max(1, Math.min(MAX_AUTO_GAS_PRICE_GWEI, gasPrices.fast)); - gasPrices.average = Math.max(1, Math.min(MAX_AUTO_GAS_PRICE_GWEI, gasPrices.average)); - gasPrices.slow = Math.max(1, Math.min(MAX_AUTO_GAS_PRICE_GWEI, gasPrices.slow)); -} diff --git a/src/Backend/Network/ConversationAPI.ts b/src/Backend/Network/ConversationAPI.ts index 087720d9..befd62c1 100644 --- a/src/Backend/Network/ConversationAPI.ts +++ b/src/Backend/Network/ConversationAPI.ts @@ -1,4 +1,4 @@ -import { ConversationArtifact, Conversation, EthAddress, ArtifactId } from '@darkforest_eth/types'; +import { ArtifactId, Conversation, ConversationArtifact, EthAddress } from '@darkforest_eth/types'; const CONVERSATION_API_HOST = process.env.CONVERSATION_API_HOST as string; diff --git a/src/Backend/Network/EthConnection.ts b/src/Backend/Network/EthConnection.ts deleted file mode 100644 index 485d782c..00000000 --- a/src/Backend/Network/EthConnection.ts +++ /dev/null @@ -1,434 +0,0 @@ -import { - GETTERS_CONTRACT_ADDRESS, - CORE_CONTRACT_ADDRESS, - WHITELIST_CONTRACT_ADDRESS, - GPT_CREDIT_CONTRACT_ADDRESS, -} from '@darkforest_eth/contracts'; -import { JsonRpcProvider, TransactionReceipt } from '@ethersproject/providers'; -import { - Wallet, - providers, - ContractInterface, - Contract, - utils, - BigNumber, - EventFilter, - ethers, -} from 'ethers'; -import EventEmitter from 'events'; -import stringify from 'json-stable-stringify'; -import { XDAI_CHAIN_ID } from '../../Frontend/Utils/constants'; -import { Monomitter, monomitter } from '../../Frontend/Utils/Monomitter'; -import { EthAddress, EthTxType, GasPrices } from '@darkforest_eth/types'; -import { callWithRetry, getGasSettingGwei, sleep } from '../Utils/Utils'; -import type { - DarkForestCore, - DarkForestGetters, - DarkForestGPTCredit, - Whitelist, -} from '@darkforest_eth/contracts/typechain'; -import { address } from '@darkforest_eth/serde'; -import coreContractAbiPath from '@darkforest_eth/contracts/abis/DarkForestCore.json'; -import gettersContractAbiPath from '@darkforest_eth/contracts/abis/DarkForestGetters.json'; -import whitelistContractAbiPath from '@darkforest_eth/contracts/abis/Whitelist.json'; -import gptCreditContractAbiPath from '@darkforest_eth/contracts/abis/DarkForestGPTCredit.json'; -import { ContractEvent } from '../../_types/darkforest/api/ContractsAPITypes'; -import { BlockWaiter } from '../Utils/BlockWaiter'; -import { DEFAULT_GAS_PRICES, getAutoGasPrices } from './ChainAPI'; -import { DiagnosticUpdater } from '../Interfaces/DiagnosticUpdater'; -import { getSetting, Setting, AutoGasSetting } from '../../Frontend/Utils/SettingsHooks'; - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -function toJSON(x: Response) { - return x.json(); -} - -/** - * Responsible for - * 1) loading the contract - * 2) the in-memory wallet - * 3) connecting to the correct network - */ -class EthConnection extends EventEmitter { - private static readonly XDAI_DEFAULT_URL = process.env.DEFAULT_RPC as string; - - public readonly blockNumber$: Monomitter; - public readonly gasPrices$: Monomitter; - - private diagnosticsUpdater: DiagnosticUpdater | undefined; - private knownAddresses: EthAddress[]; - private blockNumber: number; - private provider: JsonRpcProvider; - private signer: Wallet | undefined; - private rpcURL: string; - private gasPrices: GasPrices = DEFAULT_GAS_PRICES; - - public constructor() { - super(); - - let url: string; - // TODO: Provide own env variable for this feature - const isProd = process.env.NODE_ENV === 'production'; - - if (isProd) { - url = localStorage.getItem('XDAI_RPC_ENDPOINT_v5') || EthConnection.XDAI_DEFAULT_URL; - } else { - url = 'http://localhost:8545'; - } - - this.setRpcEndpoint(url); - this.knownAddresses = []; - const knownAddressesStr = localStorage.getItem('KNOWN_ADDRESSES'); - if (knownAddressesStr) { - const addrStrs = JSON.parse(knownAddressesStr) as string[]; - for (const addrStr of addrStrs) { - this.knownAddresses.push(address(addrStr)); - } - } - - this.blockNumber$ = monomitter(true); - this.adjustPollRateBasedOnVisibility(); - this.startPollingGasPrices(); - this.gasPrices$ = monomitter(); - } - - private async refreshGasPrices() { - this.gasPrices = await getAutoGasPrices(); - this.gasPrices$.publish(this.gasPrices); - this.diagnosticsUpdater?.updateDiagnostics((d) => (d.gasPrices = this.gasPrices)); - } - - private startPollingGasPrices() { - this.refreshGasPrices(); - setInterval(() => { - this.refreshGasPrices(); - }, 1000 * 10); - } - - public getGasPrices(): GasPrices { - return { ...this.gasPrices }; - } - - /** - * Get the gas price, measured in gwei, that we should send for a given transaction type, given - * the current prices for transaction speeds, and given the user's gas price setting. - */ - public getGasPriceGwei(txType: EthTxType, gasPrices: GasPrices): number { - // all init transactions should be fast, regardless of user setting. it's important that this - // transaction actually happens. - if (txType === EthTxType.INIT) { - return gasPrices.fast; - } - - // either a `AutoGasSetting` or a stringified number - const gasPriceSetting = getSetting(this.getAddress(), Setting.GasFeeGwei); - - // if `userSetting` represents an 'auto' choice, return that choice's current price - const autoPrice = getGasSettingGwei(gasPriceSetting as AutoGasSetting, gasPrices); - if (autoPrice !== undefined) { - return autoPrice; - } - - // if `userSetting` is not an auto choice, it is a string representing the user's - // preferred gas price, measured in gwei. - const parsedSetting = parseFloat(gasPriceSetting); - if (!isNaN(parsedSetting)) { - return parsedSetting; - } - - // if the setting has become corrupted, just return an average gas price - return gasPrices.average; - } - - private adjustPollRateBasedOnVisibility() { - document.addEventListener('visibilitychange', () => { - // If it is 0, then we are websocket - if (this.provider.pollingInterval === 0) { - return; - } - if (document.hidden) { - this.provider.pollingInterval = 1000 * 60; - } else { - this.provider.pollingInterval = 1000 * 8; - } - }); - } - - public getRpcEndpoint(): string { - return this.rpcURL; - } - - public hasSigner(): boolean { - return !!this.signer; - } - - public subscribeToEvents( - contract: DarkForestCore, - // map from contract event to function. using type 'any' here to satisfy typescript - each of - // the functions has a different type signature. - handlers: Partial> - ) { - const filter = { - address: contract.address, - topics: [ - [ - contract.filters.ArrivalQueued(null, null, null, null, null).topics, - contract.filters.ArtifactActivated(null, null, null).topics, - contract.filters.ArtifactDeactivated(null, null, null).topics, - contract.filters.ArtifactDeposited(null, null, null).topics, - contract.filters.ArtifactFound(null, null, null).topics, - contract.filters.ArtifactWithdrawn(null, null, null).topics, - contract.filters.LocationRevealed(null, null).topics, - contract.filters.PlanetHatBought(null, null, null).topics, - contract.filters.PlanetProspected(null, null).topics, - contract.filters.PlanetSilverWithdrawn(null, null, null).topics, - contract.filters.PlanetTransferred(null, null, null).topics, - contract.filters.PlanetUpgraded(null, null, null, null).topics, - contract.filters.PlayerInitialized(null, null).topics, - ].map((topicsOrUndefined) => (topicsOrUndefined || [])[0]), - ] as Array>, - }; - - const blockWaiter = new BlockWaiter(1000); - - this.provider.on('block', async (latestBlockNumber: number) => { - if (this.blockNumber === undefined) { - this.blockNumber = latestBlockNumber; - } - - blockWaiter.schedule(() => { - const previousBlockNumber = this.blockNumber; - this.blockNumber = latestBlockNumber; - this.blockNumber$.publish(latestBlockNumber); - - console.log(`processing events for ${latestBlockNumber - previousBlockNumber} blocks`); - - this.processEvents( - Math.min(previousBlockNumber + 1, latestBlockNumber), - latestBlockNumber, - filter, - contract, - handlers - ); - }); - }); - } - - private async processEvents( - startBlock: number, - endBlock: number, - eventFilter: EventFilter, - contract: DarkForestCore, - handlers: Partial> - ) { - const logs = await this.provider.getLogs({ - fromBlock: startBlock, // inclusive - toBlock: endBlock, // inclusive - ...eventFilter, - }); - - logs.forEach((log) => { - const parsedData = contract.interface.parseLog(log); - const handler = handlers[parsedData.name as ContractEvent]; - if (handler !== undefined) { - handler(...parsedData.args); - } - }); - } - - public async setRpcEndpoint(url: string): Promise { - try { - this.rpcURL = url; - let newProvider: JsonRpcProvider | undefined; - if (this.rpcURL.startsWith('wss://')) { - newProvider = new providers.WebSocketProvider(this.rpcURL); - } else { - newProvider = new providers.StaticJsonRpcProvider(this.rpcURL); - newProvider.pollingInterval = 8000; - } - /** - * this.provider needs to get set to nonnull value immediately (synchronously) - * otherwise other classes which call loadContract() immediately on app load might - * load a contract without a provider. - * if there ends up being an error with the RPC URL, we emit event and reload contract into ContractsAPI - * This is hacky / bad practice and this whole getInstance() pattern should get refactored - * but for now it is what it is ¯\_(ツ)_/¯ - */ - this.provider = newProvider; - // TODO: Provide own env variable for this feature - if (process.env.NODE_ENV === 'production') { - if ((await newProvider.getNetwork()).chainId !== XDAI_CHAIN_ID) { - throw new Error('not a valid xDAI RPC URL'); - } - } - if (this.signer) { - this.signer = new Wallet(this.signer.privateKey, this.provider); - } else { - this.signer = undefined; - } - localStorage.setItem('XDAI_RPC_ENDPOINT_v5', this.rpcURL); - this.emit('ChangedRPCEndpoint'); - } catch (e) { - console.error(`error setting rpc endpoint: ${e}`); - this.setRpcEndpoint(EthConnection.XDAI_DEFAULT_URL); - this.emit('ChangedRPCEndpoint'); - return; - } - } - - public async loadContract( - contractAddress: string, - contractABI: ContractInterface - ): Promise { - if (this.signer) { - return new Contract(contractAddress, contractABI, this.signer) as C; - } else { - console.log('WARNING: loading contract from provider (no signer)'); - return new Contract(contractAddress, contractABI, this.provider) as C; - } - } - - public async loadGettersContract(): Promise { - const abi = await fetch(gettersContractAbiPath).then(toJSON); - - return this.loadContract(GETTERS_CONTRACT_ADDRESS, abi); - } - - public async loadCoreContract(): Promise { - const abi = await fetch(coreContractAbiPath).then(toJSON); - - return this.loadContract(CORE_CONTRACT_ADDRESS, abi); - } - - public async loadWhitelistContract(): Promise { - const abi = await fetch(whitelistContractAbiPath).then(toJSON); - - return this.loadContract(WHITELIST_CONTRACT_ADDRESS, abi); - } - - public async loadGPTCreditContract(): Promise { - const abi = await fetch(gptCreditContractAbiPath).then(toJSON); - - return this.loadContract(GPT_CREDIT_CONTRACT_ADDRESS, abi); - } - - // TODO: This should be moved to ContractReader once we split ContractsAPI out - // it's here because we need access to this function before GameManager - // (and therefore ContractsAPI) is loaded in GameLandingPage.tsx - public async isWhitelisted(address: EthAddress): Promise { - const whitelist = await this.loadWhitelistContract(); - return callWithRetry(whitelist.isWhitelisted, [address], () => {}, 3); - } - - public getAddress(): EthAddress { - if (!this.signer) { - throw new Error('account not selected yet'); - } - return address(this.signer.address); - } - - public getNonce(): Promise { - // throws if no account has been set yet - if (!this.signer) { - throw new Error('account not selected yet'); - } - - return callWithRetry(this.provider.getTransactionCount.bind(this.provider), [ - this.signer.address, - ]); - } - - public setAccount(address: EthAddress): void { - const skey = localStorage.getItem(`skey-${address}`); - if (skey) { - this.signer = new Wallet(skey, this.provider); - } else { - throw new Error('private key for address not found'); - } - } - - public addAccount(skey: string): void { - // throws if invalid secret key - const addr = address(utils.computeAddress(skey)); - localStorage.setItem(`skey-${addr}`, skey); - this.knownAddresses.push(addr); - localStorage.setItem('KNOWN_ADDRESSES', stringify(this.knownAddresses)); - } - - public getKnownAccounts(): EthAddress[] { - return this.knownAddresses; - } - - public async signMessage(message: string): Promise { - if (!this.signer) { - throw new Error('no signer yet'); - } - - return this.signer.signMessage(message); - } - - public verifySignature(message: string, signature: string, address: EthAddress): boolean { - return ethers.utils.verifyMessage(message, signature).toLowerCase() === address; - } - - public async getBalance(address: EthAddress): Promise { - const balanceWeiBN = await callWithRetry( - this.provider.getBalance.bind(this.provider), - [address] - ); - - return parseFloat(utils.formatEther(balanceWeiBN)); - } - - public getPrivateKey(): string { - if (!this.signer) { - throw new Error('no signer yet'); - } - return this.signer.privateKey; - } - - public async waitForTransaction(txHash: string): Promise { - return new Promise(async (resolve) => { - let receipt = undefined; - let tries = 0; - - // waitForTransaction tends to hang on xDAI. but if we have a txHash - // the tx WILL get confirmed (or reverted) eventually, so for sure - // just keep retrying - while (!receipt) { - console.log(`[wait-tx] WAITING ON tx hash: ${txHash} tries ${tries}`); - - receipt = await Promise.race([ - sleep(30 * 1000, undefined), - this.provider.getTransactionReceipt(txHash).catch((e) => { - console.error(`[wait-tx] TIMED OUT tx hash: ${txHash} tries ${tries} error:`, e); - return undefined; - }), - ]); - - if (receipt) { - console.log(`[wait-tx] FINISHED tx hash: ${txHash} tries ${tries}`); - resolve(receipt); - return; - } - - // exponential backoff, in seconds: - // 5 * (1, 1, 2, 3, 4, 6, 9, 13, 19, 29, 43, 65 ...) - // But never more than a minute - const sleepTime = Math.min(5000 * 1.5 ** tries, 60000); - console.log( - `[wait-tx] SLEEPING tx hash: ${txHash} tries ${tries} sleeping for: ${sleepTime} ` - ); - await sleep(sleepTime); - tries += 1; - } - }); - } - - public setDiagnosticUpdater(diagnosticUpdater?: DiagnosticUpdater) { - this.diagnosticsUpdater = diagnosticUpdater; - } -} - -export default EthConnection; diff --git a/src/Backend/Network/EventLogger.ts b/src/Backend/Network/EventLogger.ts index 9ebea7e4..489876a4 100644 --- a/src/Backend/Network/EventLogger.ts +++ b/src/Backend/Network/EventLogger.ts @@ -1,27 +1,24 @@ import { WEBSERVER_URL } from './UtilityServerAPI'; -export class EventLogger { - private static instance: EventLogger; - - public static getInstance(): EventLogger { - if (!EventLogger.instance) { - EventLogger.instance = new EventLogger(); - } - - return EventLogger.instance; - } +export const enum EventType { + Transaction = 'transaction', + Diagnostics = 'diagnostics', +} - static augmentEvent(event: unknown) { - return Object.assign(event, {}); +export class EventLogger { + private static augmentEvent(event: unknown, eventType: EventType) { + return Object.assign(event, { df_event_type: eventType }); } - logEvent(event: unknown) { + logEvent(eventType: EventType, event: unknown) { fetch(`${WEBSERVER_URL}/event`, { method: 'POST', - body: JSON.stringify(EventLogger.augmentEvent(event)), + body: JSON.stringify(EventLogger.augmentEvent(event, eventType)), headers: { 'Content-Type': 'application/json', }, }).catch((err) => console.log(err)); } } + +export const eventLogger = new EventLogger(); diff --git a/src/Backend/Network/MessageAPI.ts b/src/Backend/Network/MessageAPI.ts index 9c2fe05c..886a4abf 100644 --- a/src/Backend/Network/MessageAPI.ts +++ b/src/Backend/Network/MessageAPI.ts @@ -1,8 +1,8 @@ import { - PlanetMessageResponse, + DeleteMessagesRequest, PlanetMessageRequest, + PlanetMessageResponse, PostMessageRequest, - DeleteMessagesRequest, SignedMessage, } from '@darkforest_eth/types'; diff --git a/src/Backend/Network/ThrottledConcurrentQueue.ts b/src/Backend/Network/ThrottledConcurrentQueue.ts deleted file mode 100644 index fdff6121..00000000 --- a/src/Backend/Network/ThrottledConcurrentQueue.ts +++ /dev/null @@ -1,196 +0,0 @@ -import CircularBuffer from 'mnemonist/circular-buffer'; -import { deferred } from '../Utils/Utils'; - -interface QueuedTask { - resolve: (t: T) => void; - reject: (e?: Error) => void; - generator: () => Promise; -} - -/** - * A queue that executes promises with a max throughput, and optionally max - * concurrency. - */ -export class ThrottledConcurrentQueue { - /** - * The interval during which we only allow a certain maximum amount of tasks - * to be executed. - */ - private readonly invocationIntervalMs: number; - - /** - * Maximum amount of tasks that can be executing at the same time. - */ - private readonly maxConcurrency: number; - - /** - * Queue of tasks to execute. Added to the front, popped off the back. - */ - private taskQueue: Array> = []; - - /** - * Each time a task is executed, record the start of its execution time. - * Execution timestamps are removed when they become outdated. Used for - * keeping the amount of executions under the throttle limit. - */ - private executionTimestamps: CircularBuffer; - - /** - * Amount of tasks being executed right now. - */ - private concurrency = 0; - - /** - * When we schedule an attempt at executing another task in the future, - * we don't want to schedule it more than once. Therefore, we keep track - * of this scheduled attempt. - */ - private executionTimeout: ReturnType; - - public constructor( - maxInvocationsPerIntervalMs: number, - invocationIntervalMs: number, - maxConcurrency = Number.POSITIVE_INFINITY - ) { - if (maxInvocationsPerIntervalMs <= 0) { - throw new Error('must allow at least one invocation per interval'); - } - - if (invocationIntervalMs <= 0) { - throw new Error('invocation interval must be positive'); - } - - if (maxConcurrency <= 0) { - throw new Error('max concurrency must be positive'); - } - - this.invocationIntervalMs = invocationIntervalMs; - this.maxConcurrency = maxConcurrency; - this.executionTimestamps = new CircularBuffer(Array, maxInvocationsPerIntervalMs); - } - - /** - * Adds a task to be executed at some point in the future. Returns a promise - * that resolves when the task finishes successfully, and rejects when there - * is an error. - * - * @param generator a function that returns a promise representing the task - */ - public add(generator: () => Promise): Promise { - const [resolve, reject, promise] = deferred(); - - this.taskQueue.unshift({ - resolve, - reject, - generator, - }); - - setTimeout(() => { - this.executeNextTasks(); - }, 0); - - return promise; - } - - /** - * Returns the amount of queued items, not including the ones that are being executed at this moment. - */ - public size() { - return this.taskQueue.length; - } - - /** - * Runs tasks until it's at either the throttle or concurrency limit. If there are more - * tasks to be executed after that, schedules itself to execute again at the soonest - * possible moment. - */ - private async executeNextTasks(): Promise { - this.deleteOutdatedExecutionTimestamps(); - - const tasksToExecute = Math.min( - this.throttleQuotaRemaining(), - this.concurrencyQuotaRemaining(), - this.taskQueue.length - ); - - for (let i = 0; i < tasksToExecute; i++) { - this.next().then(this.executeNextTasks.bind(this)); - } - - const nextPossibleExecution = this.nextPossibleExecution(); - - if (this.taskQueue.length > 0 && nextPossibleExecution) { - clearTimeout(this.executionTimeout); - this.executionTimeout = setTimeout(this.executeNextTasks.bind(this), nextPossibleExecution); - } - } - - /** - * Returns the soonest possible time from now we could execute another task without going - * over the throttle limit. - */ - private nextPossibleExecution(): number | undefined { - const oldestExecution = this.executionTimestamps.peekFirst(); - - if (!oldestExecution || this.concurrencyQuotaRemaining() === 0) { - return undefined; - } - - return Date.now() - oldestExecution + this.invocationIntervalMs; - } - - /** - * At this moment, how many more tasks we could execute without exceeding the - * concurrency quota. - */ - private concurrencyQuotaRemaining(): number { - return this.maxConcurrency - this.concurrency; - } - - /** - * At this moment, how many more tasks we could execute without exceeding the - * throttle quota. - */ - private throttleQuotaRemaining(): number { - return this.executionTimestamps.capacity - this.executionTimestamps.size; - } - - /** - * Removes all task execution timestamps that are older than [[this.invocationIntervalMs]], - * because those invocations have no bearing on whether or not we can execute another task. - */ - private deleteOutdatedExecutionTimestamps() { - const now = Date.now(); - - let oldestInvocation = this.executionTimestamps.peekFirst(); - - while (oldestInvocation && oldestInvocation < now - this.invocationIntervalMs) { - this.executionTimestamps.shift(); - oldestInvocation = this.executionTimestamps.peekFirst(); - } - } - - /** - * If there is a next task to execute, executes it. Records the time of execution in - * [[executionTimestamps]]. Increments and decrements concurrency counter. Neither throttles - * nor limits concurrency. - */ - private async next(): Promise { - const task = this.taskQueue.pop(); - - if (!task) { - return; - } - - this.executionTimestamps.push(Date.now()); - this.concurrency++; - - try { - task.resolve(await task.generator()); - } catch (e) { - task.reject(e); - } - - this.concurrency--; - } -} diff --git a/src/Backend/Network/TxExecutor.ts b/src/Backend/Network/TxExecutor.ts deleted file mode 100644 index 957391b4..00000000 --- a/src/Backend/Network/TxExecutor.ts +++ /dev/null @@ -1,229 +0,0 @@ -import { EventEmitter } from 'events'; -import { Contract, providers, BigNumber as EthersBN } from 'ethers'; -import { EthTxType, TxTypeToEthFunctionName } from '@darkforest_eth/types'; -import EthConnection from './EthConnection'; -import { deferred, timeoutAfter } from '../Utils/Utils'; -import { ThrottledConcurrentQueue } from './ThrottledConcurrentQueue'; -import { EventLogger } from './EventLogger'; -import NotificationManager from '../../Frontend/Game/NotificationManager'; -import { openConfirmationWindowForTransaction } from '../../Frontend/Game/Popups'; -import { DiagnosticUpdater } from '../Interfaces/DiagnosticUpdater'; - -export interface QueuedTxRequest { - onSubmissionError: (e: Error) => void; - onReceiptError: (e: Error) => void; - onTransactionResponse: (e: providers.TransactionResponse) => void; - onTransactionReceipt: (e: providers.TransactionReceipt) => void; - - type: EthTxType; - actionId: string; - contract: Contract; - args: unknown[]; - overrides: providers.TransactionRequest; -} - -export interface PendingTransaction { - submitted: Promise; - confirmed: Promise; -} - -export class TxExecutor extends EventEmitter { - /** - * tx is considered to have errored if haven't successfully - * submitted to mempool within 30s - */ - private static readonly TX_SUBMIT_TIMEOUT = 30000; - - /** - * we refresh the nonce if it hasn't been updated in this amount of time - */ - private static readonly NONCE_STALE_AFTER_MS = 1000 * 45; - - /** - * don't allow users to submit txs if balance falls below - */ - private static readonly MIN_BALANCE_ETH = 0.002; - - private txQueue: ThrottledConcurrentQueue; - private lastTransaction: number; - private nonce: number; - private eth: EthConnection; - private diagnosticsUpdater?: DiagnosticUpdater; - - constructor(ethConnection: EthConnection, nonce: number) { - super(); - - this.txQueue = new ThrottledConcurrentQueue(3, 1000, 1); - this.nonce = nonce; - this.lastTransaction = Date.now(); - this.eth = ethConnection; - } - - /** - * Schedules this transaction to execute once all of the transactions - * ahead of it have completed. - */ - public makeRequest( - type: EthTxType, - actionId: string, - contract: Contract, - args: unknown[], - overrides: providers.TransactionRequest = { - gasPrice: undefined, - gasLimit: 2000000, - } - ): PendingTransaction { - this.diagnosticsUpdater?.updateDiagnostics((d) => { - d.transactionsInQueue++; - }); - - const [txResponse, rejectTxResponse, submittedPromise] = - deferred(); - const [txReceipt, rejectTxReceipt, receiptPromise] = deferred(); - - if (overrides.gasPrice === undefined) { - overrides.gasPrice = EthersBN.from('1000000000').mul( - this.eth.getGasPriceGwei(type, this.eth.getGasPrices()) - ); - } - - this.txQueue.add(() => { - this.diagnosticsUpdater?.updateDiagnostics((d) => { - d.transactionsInQueue--; - }); - - return this.execute({ - type, - actionId, - contract, - args, - overrides, - onSubmissionError: rejectTxResponse, - onReceiptError: rejectTxReceipt, - onTransactionResponse: txResponse, - onTransactionReceipt: txReceipt, - }); - }); - - return { - submitted: submittedPromise, - confirmed: receiptPromise, - }; - } - - private async maybeUpdateNonce() { - if (Date.now() - this.lastTransaction > TxExecutor.NONCE_STALE_AFTER_MS) { - this.nonce = await this.eth.getNonce(); - } - } - - private async checkBalance() { - const balance = await this.eth.getBalance(this.eth.getAddress()); - - if (balance < TxExecutor.MIN_BALANCE_ETH) { - const notifsManager = NotificationManager.getInstance(); - notifsManager.balanceEmpty(); - throw new Error('xDAI balance too low!'); - } - } - - private execute = async (txRequest: QueuedTxRequest) => { - let time_called: number | undefined = undefined; - let error: Error | undefined = undefined; - let time_submitted: number | undefined = undefined; - let time_confirmed: number | undefined = undefined; - let time_errored: number | undefined = undefined; - let tx_hash: string | undefined = undefined; - - const time_exec_called = Date.now(); - - try { - const gasFeeGwei = EthersBN.from(txRequest.overrides.gasPrice || '1000000000') - .div('1000000000') - .toNumber(); - - await this.checkBalance(); - await this.maybeUpdateNonce(); - await openConfirmationWindowForTransaction( - this.eth, - txRequest, - this.eth.getAddress(), - gasFeeGwei - ); - - time_called = Date.now(); - const methodName = TxTypeToEthFunctionName[txRequest.type]; - const submitted = await timeoutAfter( - txRequest.contract[methodName](...txRequest.args, { - ...txRequest.overrides, - nonce: this.nonce, - }), - TxExecutor.TX_SUBMIT_TIMEOUT, - `tx request ${txRequest.actionId} failed to submit: timed out}` - ); - time_submitted = Date.now(); - tx_hash = submitted.hash; - this.nonce += 1; - this.lastTransaction = time_submitted; - txRequest.onTransactionResponse(submitted); - - const confirmed = await this.eth.waitForTransaction(submitted.hash); - time_confirmed = Date.now(); - txRequest.onTransactionReceipt(confirmed); - - if (confirmed.status !== 1) { - time_errored = time_confirmed; - error = new Error('transaction reverted'); - } - } catch (e) { - console.error(e); - time_errored = Date.now(); - error = e; - if (!time_submitted) { - txRequest.onSubmissionError(e); - } else { - txRequest.onReceiptError(e); - } - } finally { - this.diagnosticsUpdater?.updateDiagnostics((d) => { - d.totalTransactions++; - }); - } - - /* eslint-disable @typescript-eslint/no-explicit-any */ - const logEvent: any = { - tx_type: txRequest.type, - time_exec_called, - tx_hash, - }; - - if (time_called && time_submitted) { - logEvent.wait_submit = time_submitted - time_called; - if (time_confirmed) { - logEvent.wait_confirm = time_confirmed - time_called; - } - } - - if (error && time_errored) { - logEvent.error = error.message || JSON.stringify(error); - logEvent.wait_error = time_errored - time_exec_called; - - try { - if ((error as any).body) { - logEvent.parsed_error = String.fromCharCode.apply(null, (error as any).body || []); - } - } catch (e) {} - } - - logEvent.rpc_endpoint = this.eth.getRpcEndpoint(); - logEvent.user_address = this.eth.getAddress(); - - if (localStorage.getItem(`optout-metrics-${logEvent.user_address}`) !== 'true') { - EventLogger.getInstance().logEvent(logEvent); - } - }; - - public setDiagnosticUpdater(diagnosticUpdater?: DiagnosticUpdater) { - this.diagnosticsUpdater = diagnosticUpdater; - } -} diff --git a/src/Backend/Network/UtilityServerAPI.ts b/src/Backend/Network/UtilityServerAPI.ts index 72e7b98f..dd6e392a 100644 --- a/src/Backend/Network/UtilityServerAPI.ts +++ b/src/Backend/Network/UtilityServerAPI.ts @@ -1,6 +1,7 @@ +import { timeoutAfter } from '@darkforest_eth/network'; +import { EthAddress, SignedMessage } from '@darkforest_eth/types'; import * as EmailValidator from 'email-validator'; import { AddressTwitterMap } from '../../_types/darkforest/api/UtilityServerAPITypes'; -import { EthAddress } from '@darkforest_eth/types'; export const WEBSERVER_URL = process.env.WEBSERVER_URL as string; @@ -105,6 +106,17 @@ export const requestDevFaucet = async (address: EthAddress): Promise => } }; +/** + * Swallows all errors. Either loads the address to twitter map from the webserver in 5 seconds, or + * returan empty map. + */ +export const tryGetAllTwitters = async (): Promise => { + try { + return await timeoutAfter(getAllTwitters(), 1000 * 5, "couldn't get twitter map"); + } catch (e) {} + return {}; +}; + export const getAllTwitters = async (): Promise => { try { const twitterMap: AddressTwitterMap = await fetch(`${WEBSERVER_URL}/twitter/all-twitters`).then( @@ -112,31 +124,48 @@ export const getAllTwitters = async (): Promise => { ); return twitterMap; } catch (e) { - console.log('Error getting twitter handles.'); - console.error(e); return {}; } }; export const verifyTwitterHandle = async ( - twitter: string, - address: EthAddress + verifyMessage: SignedMessage<{ twitter: string }> ): Promise => { try { - const { success } = await fetch(`${WEBSERVER_URL}/twitter/verify-twitter`, { + const res = await fetch(`${WEBSERVER_URL}/twitter/verify-twitter`, { method: 'POST', body: JSON.stringify({ - twitter, - address, + verifyMessage, }), headers: { 'Content-Type': 'application/json', }, }).then((x) => x.json()); - return success; + return res.success; } catch (e) { console.error(`error when verifying twitter handle: ${e}`); return false; } }; + +export const disconnectTwitter = async ( + disconnectMessage: SignedMessage<{ twitter: string }> +): Promise => { + try { + const res = await fetch(`${WEBSERVER_URL}/twitter/disconnect`, { + method: 'POST', + body: JSON.stringify({ + disconnectMessage, + }), + headers: { + 'Content-Type': 'application/json', + }, + }).then((x) => x.json()); + + return res.success; + } catch (e) { + console.error(`error when disconnecting twitter handle: ${e}`); + return false; + } +}; diff --git a/src/Backend/Procedural/ArtifactProcgen.ts b/src/Backend/Procedural/ArtifactProcgen.ts index 94fb0eaf..2e0df036 100644 --- a/src/Backend/Procedural/ArtifactProcgen.ts +++ b/src/Backend/Procedural/ArtifactProcgen.ts @@ -1,14 +1,14 @@ +import { EMPTY_ADDRESS, EMPTY_LOCATION_ID } from '@darkforest_eth/constants'; import { - ArtifactId, - LocationId, Artifact, - Biome, + ArtifactId, + artifactNameFromArtifact, ArtifactRarity, - ArtifactTypeNames, ArtifactType, - artifactNameFromArtifact, + ArtifactTypeNames, + Biome, + LocationId, } from '@darkforest_eth/types'; -import { EMPTY_LOCATION_ID, EMPTY_ADDRESS } from '@darkforest_eth/constants'; import { artifactBiomeName } from '../GameLogic/ArtifactUtils'; export const artifactBiomeAndName = (artifact: Artifact | undefined): string => { diff --git a/src/Backend/Procedural/ProcgenUtils.ts b/src/Backend/Procedural/ProcgenUtils.ts index 8fe255a3..3ae3b43c 100644 --- a/src/Backend/Procedural/ProcgenUtils.ts +++ b/src/Backend/Procedural/ProcgenUtils.ts @@ -1,31 +1,30 @@ -import { isLocatable } from '../../_types/global/GlobalTypes'; +import { EMPTY_ADDRESS, MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; +import { seededRandom } from '@darkforest_eth/hashing'; +import { + ArtifactId, + Biome, + EthAddress, + LocationId, + Planet, + UpgradeBranchName, +} from '@darkforest_eth/types'; import * as bigInt from 'big-integer'; -import { PlanetCosmeticInfo, RuinsInfo } from '../Utils/UtilsTypes'; +import { HSLVec, RGBAVec, RGBVec } from '../../Frontend/Renderers/GameRenderer/EngineTypes'; +import { HAT_SIZES } from '../../Frontend/Utils/constants'; +import { HatType, hatTypeFromHash } from '../../Frontend/Utils/Hats'; +import { isLocatable } from '../../_types/global/GlobalTypes'; import { getPlanetRank, titleCase } from '../Utils/Utils'; -import _ from 'lodash'; +import { PlanetCosmeticInfo, RuinsInfo } from '../Utils/UtilsTypes'; import Noise from './Noise'; import { + blurb2grammar, + blurbGrammar, planetNameWords, planetTagAdj, planetTagNoun, - blurb2grammar, - blurbGrammar, } from './ProcgenConsts'; -import { - Planet, - EthAddress, - LocationId, - Biome, - UpgradeBranchName, - ArtifactId, -} from '@darkforest_eth/types'; -import { seededRandom } from '@darkforest_eth/hashing'; -import { HSLVec, RGBAVec, RGBVec } from '../../Frontend/Renderers/GameRenderer/EngineTypes'; -import { HatType, hatTypeFromHash } from '../../Frontend/Utils/Hats'; import tracery from './tracery'; import { baseEngModifiers } from './tracery-modifiers'; -import { EMPTY_ADDRESS, MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; -import { HAT_SIZES } from '../../Frontend/Utils/constants'; export type PixelCoords = { x: number; diff --git a/src/Backend/Storage/PersistentChunkStore.ts b/src/Backend/Storage/PersistentChunkStore.ts index 4f51b89c..882f41bf 100644 --- a/src/Backend/Storage/PersistentChunkStore.ts +++ b/src/Backend/Storage/PersistentChunkStore.ts @@ -1,4 +1,12 @@ import { CORE_CONTRACT_ADDRESS } from '@darkforest_eth/contracts'; +import { + DiagnosticUpdater, + EthAddress, + LocationId, + RevealedCoords, + SubmittedTx, + WorldLocation, +} from '@darkforest_eth/types'; import { IDBPDatabase, openDB } from 'idb'; import stringify from 'json-stable-stringify'; import _ from 'lodash'; @@ -6,21 +14,13 @@ import { MAX_CHUNK_SIZE } from '../../Frontend/Utils/constants'; import { ChunkId, ChunkStore, PersistedChunk } from '../../_types/darkforest/api/ChunkStoreTypes'; import { Chunk, Rectangle } from '../../_types/global/GlobalTypes'; import { - toPersistedChunk, - toExploredChunk, - getChunkOfSideLengthContainingPoint, - getChunkKey, addToChunkMap, + getChunkKey, + getChunkOfSideLengthContainingPoint, + toExploredChunk, + toPersistedChunk, } from '../Miner/ChunkUtils'; import { SerializedPlugin } from '../Plugins/SerializedPlugin'; -import { - EthAddress, - LocationId, - SubmittedTx, - WorldLocation, - RevealedCoords, -} from '@darkforest_eth/types'; -import { DiagnosticUpdater } from '../Interfaces/DiagnosticUpdater'; const enum ObjectStore { DEFAULT = 'default', diff --git a/src/Backend/Storage/ReaderDataStore.ts b/src/Backend/Storage/ReaderDataStore.ts index c2d63b4d..9dd43cf7 100644 --- a/src/Backend/Storage/ReaderDataStore.ts +++ b/src/Backend/Storage/ReaderDataStore.ts @@ -1,20 +1,20 @@ +import { EthConnection } from '@darkforest_eth/network'; import { - EthAddress, - SpaceType, + ArtifactId, Biome, - Planet, + EthAddress, LocatablePlanet, - WorldLocation, LocationId, - ArtifactId, + Planet, + SpaceType, + WorldLocation, } from '@darkforest_eth/types'; import { TerminalHandle } from '../../Frontend/Views/Terminal'; import { ContractConstants } from '../../_types/darkforest/api/ContractsAPITypes'; import { AddressTwitterMap } from '../../_types/darkforest/api/UtilityServerAPITypes'; import { isLocatable } from '../../_types/global/GlobalTypes'; import { arrive, updatePlanetToTime } from '../GameLogic/ArrivalUtils'; -import ContractsAPI from '../GameLogic/ContractsAPI'; -import EthConnection from '../Network/EthConnection'; +import { ContractsAPI, makeContractsAPI } from '../GameLogic/ContractsAPI'; import { getAllTwitters } from '../Network/UtilityServerAPI'; import PersistentChunkStore from './PersistentChunkStore'; @@ -59,7 +59,7 @@ class ReaderDataStore { ethConnection: EthConnection, viewer: EthAddress | undefined ): Promise { - const contractsAPI = await ContractsAPI.create(ethConnection); + const contractsAPI = await makeContractsAPI(ethConnection); const addressTwitterMap = await getAllTwitters(); const contractConstants = await contractsAPI.getConstants(); const persistentChunkStore = viewer && (await PersistentChunkStore.create(viewer)); diff --git a/src/Backend/Utils/BlockWaiter.ts b/src/Backend/Utils/BlockWaiter.ts deleted file mode 100644 index 68e2a951..00000000 --- a/src/Backend/Utils/BlockWaiter.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * You can schedule a function to be executed {@code waitThisLong} in the future. If you - * schedule again, the previously scheduled function will not be executed. - */ -export class BlockWaiter { - private timeout?: ReturnType; - private waitThisLong: number; - - public constructor(waitThisLong: number) { - this.waitThisLong = waitThisLong; - } - - public schedule(func: () => void) { - if (this.timeout !== undefined) { - clearTimeout(this.timeout); - this.timeout = undefined; - } - - this.timeout = setTimeout(func, this.waitThisLong); - } -} diff --git a/src/Backend/Utils/SnarkArgsHelper.ts b/src/Backend/Utils/SnarkArgsHelper.ts index 5a3a49d3..e32ce52b 100644 --- a/src/Backend/Utils/SnarkArgsHelper.ts +++ b/src/Backend/Utils/SnarkArgsHelper.ts @@ -1,39 +1,39 @@ -import FastQueue from 'fastq'; -import { BigInteger } from 'big-integer'; -import * as bigInt from 'big-integer'; import { - PerlinConfig, + fakeHash, mimcHash, modPBigInt, - fakeHash, - perlin, modPBigIntNative, + perlin, + PerlinConfig, } from '@darkforest_eth/hashing'; -import { LRUMap } from 'mnemonist'; -import { TerminalTextStyle } from '../../Frontend/Utils/TerminalTypes'; -import { TerminalHandle } from '../../Frontend/Views/Terminal'; -import { HashConfig } from '../../_types/global/GlobalTypes'; import { - SnarkJSProofAndSignals, + BiomebaseSnarkContractCallArgs, + BiomebaseSnarkInput, buildContractCallArgs, fakeProof, - RevealSnarkInput, - RevealSnarkContractCallArgs, - InitSnarkInput, InitSnarkContractCallArgs, - MoveSnarkInput, + InitSnarkInput, MoveSnarkContractCallArgs, - BiomebaseSnarkInput, - BiomebaseSnarkContractCallArgs, + MoveSnarkInput, + RevealSnarkContractCallArgs, + RevealSnarkInput, + SnarkJSProofAndSignals, } from '@darkforest_eth/snarks'; -import revealCircuitPath from '@darkforest_eth/snarks/reveal.wasm'; -import revealZkeyPath from '@darkforest_eth/snarks/reveal.zkey'; +import biomebaseCircuitPath from '@darkforest_eth/snarks/biomebase.wasm'; +import biomebaseZkeyPath from '@darkforest_eth/snarks/biomebase.zkey'; import initCircuitPath from '@darkforest_eth/snarks/init.wasm'; import initZkeyPath from '@darkforest_eth/snarks/init.zkey'; import moveCircuitPath from '@darkforest_eth/snarks/move.wasm'; import moveZkeyPath from '@darkforest_eth/snarks/move.zkey'; -import biomebaseCircuitPath from '@darkforest_eth/snarks/biomebase.wasm'; -import biomebaseZkeyPath from '@darkforest_eth/snarks/biomebase.zkey'; +import revealCircuitPath from '@darkforest_eth/snarks/reveal.wasm'; +import revealZkeyPath from '@darkforest_eth/snarks/reveal.zkey'; +import * as bigInt from 'big-integer'; +import { BigInteger } from 'big-integer'; +import FastQueue from 'fastq'; +import { LRUMap } from 'mnemonist'; +import { TerminalTextStyle } from '../../Frontend/Utils/TerminalTypes'; +import { TerminalHandle } from '../../Frontend/Views/Terminal'; +import { HashConfig } from '../../_types/global/GlobalTypes'; type ZKPTask = { taskId: number; diff --git a/src/Backend/Utils/TypeAssertions.ts b/src/Backend/Utils/TypeAssertions.ts index a9376c34..5ee5720c 100644 --- a/src/Backend/Utils/TypeAssertions.ts +++ b/src/Backend/Utils/TypeAssertions.ts @@ -1,88 +1,88 @@ import { + ContractMethodName, TxIntent, + UnconfirmedActivateArtifact, + UnconfirmedBuyGPTCredits, + UnconfirmedBuyHat, + UnconfirmedDeactivateArtifact, + UnconfirmedDepositArtifact, + UnconfirmedFindArtifact, UnconfirmedInit, - EthTxType, UnconfirmedMove, - UnconfirmedUpgrade, - UnconfirmedBuyHat, UnconfirmedPlanetTransfer, - UnconfirmedFindArtifact, - UnconfirmedDepositArtifact, - UnconfirmedWithdrawArtifact, UnconfirmedProspectPlanet, - UnconfirmedActivateArtifact, - UnconfirmedDeactivateArtifact, UnconfirmedReveal, - UnconfirmedBuyGPTCredits, + UnconfirmedUpgrade, + UnconfirmedWithdrawArtifact, UnconfirmedWithdrawSilver, } from '@darkforest_eth/types'; export function isUnconfirmedReveal(txIntent: TxIntent): txIntent is UnconfirmedReveal { - return txIntent.type === EthTxType.REVEAL_LOCATION; + return txIntent.methodName === ContractMethodName.REVEAL_LOCATION; } export function isUnconfirmedInit(txIntent: TxIntent): txIntent is UnconfirmedInit { - return txIntent.type === EthTxType.INIT; + return txIntent.methodName === ContractMethodName.INIT; } export function isUnconfirmedMove(txIntent: TxIntent): txIntent is UnconfirmedMove { - return txIntent.type === EthTxType.MOVE; + return txIntent.methodName === ContractMethodName.MOVE; } export function isUnconfirmedUpgrade(txIntent: TxIntent): txIntent is UnconfirmedUpgrade { - return txIntent.type === EthTxType.UPGRADE; + return txIntent.methodName === ContractMethodName.UPGRADE; } export function isUnconfirmedBuyHat(txIntent: TxIntent): txIntent is UnconfirmedBuyHat { - return txIntent.type === EthTxType.BUY_HAT; + return txIntent.methodName === ContractMethodName.BUY_HAT; } export function isUnconfirmedTransfer(txIntent: TxIntent): txIntent is UnconfirmedPlanetTransfer { - return txIntent.type === EthTxType.PLANET_TRANSFER; + return txIntent.methodName === ContractMethodName.PLANET_TRANSFER; } export function isUnconfirmedFindArtifact(txIntent: TxIntent): txIntent is UnconfirmedFindArtifact { - return txIntent.type === EthTxType.FIND_ARTIFACT; + return txIntent.methodName === ContractMethodName.FIND_ARTIFACT; } export function isUnconfirmedDepositArtifact( txIntent: TxIntent ): txIntent is UnconfirmedDepositArtifact { - return txIntent.type === EthTxType.DEPOSIT_ARTIFACT; + return txIntent.methodName === ContractMethodName.DEPOSIT_ARTIFACT; } export function isUnconfirmedWithdrawArtifact( txIntent: TxIntent ): txIntent is UnconfirmedWithdrawArtifact { - return txIntent.type === EthTxType.WITHDRAW_ARTIFACT; + return txIntent.methodName === ContractMethodName.WITHDRAW_ARTIFACT; } export function isUnconfirmedProspectPlanet( txIntent: TxIntent ): txIntent is UnconfirmedProspectPlanet { - return txIntent.type === EthTxType.PROSPECT_PLANET; + return txIntent.methodName === ContractMethodName.PROSPECT_PLANET; } export function isUnconfirmedActivateArtifact( txIntent: TxIntent ): txIntent is UnconfirmedActivateArtifact { - return txIntent.type === EthTxType.ACTIVATE_ARTIFACT; + return txIntent.methodName === ContractMethodName.ACTIVATE_ARTIFACT; } export function isUnconfirmedDeactivateArtifact( txIntent: TxIntent ): txIntent is UnconfirmedDeactivateArtifact { - return txIntent.type === EthTxType.DEACTIVATE_ARTIFACT; + return txIntent.methodName === ContractMethodName.DEACTIVATE_ARTIFACT; } export function isUnconfirmedWithdrawSilver( txIntent: TxIntent ): txIntent is UnconfirmedWithdrawSilver { - return txIntent.type === EthTxType.WITHDRAW_SILVER; + return txIntent.methodName === ContractMethodName.WITHDRAW_SILVER; } export function isUnconfirmedBuyGPTCredits( txIntent: TxIntent ): txIntent is UnconfirmedBuyGPTCredits { - return txIntent.type === EthTxType.BUY_GPT_CREDITS; + return txIntent.methodName === ContractMethodName.BUY_GPT_CREDITS; } diff --git a/src/Backend/Utils/Utils.ts b/src/Backend/Utils/Utils.ts index 28991a6a..69d922e5 100644 --- a/src/Backend/Utils/Utils.ts +++ b/src/Backend/Utils/Utils.ts @@ -1,17 +1,8 @@ +import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; +import { EthAddress, Planet, SpaceType, Upgrade, UpgradeBranchName } from '@darkforest_eth/types'; import * as bigInt from 'big-integer'; import { BigInteger } from 'big-integer'; import { StatIdx } from '../../_types/global/GlobalTypes'; -import { - Planet, - EthAddress, - SpaceType, - Upgrade, - UpgradeBranchName, - GasPrices, -} from '@darkforest_eth/types'; -import _ from 'lodash'; -import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; -import { AutoGasSetting } from '../../Frontend/Utils/SettingsHooks'; export const ONE_DAY = 24 * 60 * 60 * 1000; @@ -158,121 +149,3 @@ export const titleCase = (title: string): string => export const hasOwner = (planet: Planet) => { return planet.owner !== EMPTY_ADDRESS; }; - -export function sleep(timeout: number, returns?: T): Promise { - return new Promise((resolve) => setTimeout(() => resolve(returns as T), timeout)); -} - -export async function rejectAfter(ms: number, msg: string): Promise { - await sleep(ms); - throw new Error(msg); -} - -export function neverResolves(): Promise { - return new Promise(() => {}); -} - -export const aggregateBulkGetter = async ( - logTag: string, - total: number, - querySize: number, - getterFn: (startIdx: number, endIdx: number) => Promise, - // the parameter to this function is a value between 0 and 1. We guarantee at least one call to - // `onProgress` if you provide it. The guaranteed call is the one at the end, where the value is 1. - onProgress?: (fractionCompleted: number) => void -) => { - const promises: Promise[] = []; - let loadedSoFar = 0; - - for (let i = 0; i < total / querySize; i += 1) { - const start = i * querySize; - const end = Math.min((i + 1) * querySize, total); - const loadedThisBatch = end - start; - - promises.push( - new Promise(async (resolve) => { - let res: T[] = []; - while (res.length === 0) { - res = await getterFn(start, end); - loadedSoFar += loadedThisBatch; - console.log(`[bulk-fetch] retrieved ${logTag} ${start}-${end}.`); - onProgress && onProgress(loadedSoFar / total); - } - - resolve(res); - }) - ); - } - const unflattenedResults = await Promise.all(promises); - onProgress && onProgress(1); - return _.flatten(unflattenedResults); -}; - -export type RetryErrorHandler = (i: number, e: Error) => void; - -export const callWithRetry = async ( - fn: (...args: unknown[]) => Promise, - args: unknown[] = [], - onError?: RetryErrorHandler, - maxRetries = 10, - retryInterval = 1000 -): Promise => { - return new Promise(async (resolve, reject) => { - let res: T; - for (let i = 0; i < maxRetries; i++) { - try { - res = await fn(...args); - resolve(res); - break; - } catch (e) { - console.error(`error: ${e}`); - console.log(`retrying (${i}/${maxRetries})...`); - - if (onError) { - try { - onError(i, e); - } catch (e) { - console.log(`failed executing callWithRetry error handler`, e); - } - } - - if (i < maxRetries - 1) { - await sleep(Math.min(retryInterval * 2 ** i + Math.random() * 100, 15000)); - } else { - reject(e); - } - } - } - }); -}; - -export const timeoutAfter = async (promise: Promise, ms: number, timeoutMsg: string) => { - return Promise.race([promise, rejectAfter(ms, timeoutMsg)]); -}; - -export function deferred(): [(t: T) => void, (t: Error) => void, Promise] { - let resolve: ((t: T) => void) | null = null; - let reject: ((t: Error) => void) | null = null; - const promise = new Promise((r, rj) => { - resolve = (t: T) => r(t); - reject = (e: Error) => rj(e); - }); - /* eslint-disable @typescript-eslint/no-explicit-any */ - return [resolve as any, reject as any, promise]; -} - -export function getGasSettingGwei( - setting: AutoGasSetting, - gasPrices: GasPrices -): number | undefined { - switch (setting) { - case AutoGasSetting.Slow: - return gasPrices.slow; - case AutoGasSetting.Average: - return gasPrices.average; - case AutoGasSetting.Fast: - return gasPrices.fast; - default: - return undefined; - } -} diff --git a/src/Backend/Utils/UtilsTypes.ts b/src/Backend/Utils/UtilsTypes.ts index f618b4ed..954e490e 100644 --- a/src/Backend/Utils/UtilsTypes.ts +++ b/src/Backend/Utils/UtilsTypes.ts @@ -1,4 +1,4 @@ -import { RGBVec, HSLVec } from '../../Frontend/Renderers/GameRenderer/EngineTypes'; +import { HSLVec, RGBVec } from '../../Frontend/Renderers/GameRenderer/EngineTypes'; import { HatType } from '../../Frontend/Utils/Hats'; export type RuinsInfo = { diff --git a/src/Backend/Utils/Wrapper.ts b/src/Backend/Utils/Wrapper.ts index cacf74e2..ad0725fd 100644 --- a/src/Backend/Utils/Wrapper.ts +++ b/src/Backend/Utils/Wrapper.ts @@ -9,4 +9,8 @@ export class Wrapper { public constructor(value: T) { this.value = value; } + + public or(wrapper: Wrapper) { + return new Wrapper(this.value || wrapper.value); + } } diff --git a/src/Frontend/Components/AncientLabel.tsx b/src/Frontend/Components/AncientLabel.tsx index 5e5460fc..85d5b38f 100644 --- a/src/Frontend/Components/AncientLabel.tsx +++ b/src/Frontend/Components/AncientLabel.tsx @@ -1,8 +1,6 @@ import React from 'react'; - /* ancient label */ - -import styled, { keyframes, css } from 'styled-components'; +import styled, { css, keyframes } from 'styled-components'; import { ANCIENT_BLUE, ANCIENT_PURPLE } from '../Styles/Colors'; const shakeAndFlash = keyframes` diff --git a/src/Frontend/Components/ArtifactImage.tsx b/src/Frontend/Components/ArtifactImage.tsx index 968d87b3..ee51fc9b 100644 --- a/src/Frontend/Components/ArtifactImage.tsx +++ b/src/Frontend/Components/ArtifactImage.tsx @@ -1,6 +1,6 @@ +import { Artifact } from '@darkforest_eth/types'; import React from 'react'; import styled, { css } from 'styled-components'; -import { Artifact } from '@darkforest_eth/types'; import { ArtifactFileColor, artifactFileName } from '../../Backend/GameLogic/ArtifactUtils'; import dfstyles from '../Styles/dfstyles'; diff --git a/src/Frontend/Components/Btn.tsx b/src/Frontend/Components/Btn.tsx index c0ca86b4..3dbb77c1 100644 --- a/src/Frontend/Components/Btn.tsx +++ b/src/Frontend/Components/Btn.tsx @@ -2,39 +2,40 @@ import React from 'react'; import styled, { css } from 'styled-components'; import dfstyles from '../Styles/dfstyles'; -export interface BtnProps { +export type BtnProps = { disabled?: boolean; noBorder?: boolean; wide?: boolean; - color?: string; - borderColor?: string; textColor?: string; -} + forceActive?: boolean; +} & React.HTMLAttributes; -export function Btn(props: BtnProps & React.HTMLAttributes) { +export function Btn(props: BtnProps) { return ; } const BtnElement = styled.span` - ${({ disabled, color, borderColor, textColor, noBorder, wide }: BtnProps) => css` + ${({ disabled, color, borderColor, textColor, noBorder, wide, forceActive }: BtnProps) => css` user-select: none; display: inline-flex; border-radius: 3px; padding: 0 0.3em; - border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.text}; - transition: background-color 0.2s, color 0.2s; + border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.border}; justify-content: center; align-items: center; cursor: pointer; + background-color: ${dfstyles.colors.backgrounddark}; ${wide && `width: 100%;`} ${(textColor || color) && `color: ${textColor || color};`} + &:active, &:hover { ${!disabled && css` + border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.text}; color: ${dfstyles.colors.background}; background: ${color || dfstyles.colors.text}; `} @@ -46,10 +47,17 @@ const BtnElement = styled.span` ${disabled && css` - color: ${dfstyles.colors.subbertext}; + color: ${dfstyles.colors.subbesttext}; + border-color: ${dfstyles.colors.border}; background: none; - border-color: ${dfstyles.colors.subtext}; filter: none; `} + + ${forceActive && + css` + border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.text}; + color: ${dfstyles.colors.background}; + background: ${color || dfstyles.colors.text}; + `} `} `; diff --git a/src/Frontend/Components/CoreUI.tsx b/src/Frontend/Components/CoreUI.tsx index d9a828a2..db5c7838 100644 --- a/src/Frontend/Components/CoreUI.tsx +++ b/src/Frontend/Components/CoreUI.tsx @@ -1,12 +1,217 @@ -import React, { ChangeEvent } from 'react'; -import { useCallback } from 'react'; +import { RECOMMENDED_MODAL_WIDTH } from '@darkforest_eth/constants'; +import colors from 'color'; +import React, { ChangeEvent, useCallback } from 'react'; import styled, { css } from 'styled-components'; import dfstyles from '../Styles/dfstyles'; +import { GameWindowZIndex } from '../Utils/constants'; + +export const InlineBlock = styled.div` + display: inline-block; +`; + +export const FloatRight = styled.div` + float: right; +`; + +export const TextButton = styled.span` + color: ${dfstyles.colors.subtext}; + cursor: pointer; + user-select: none; + text-decoration: underline; + + &:hover { + color: white; + } +`; + +export const Padded = styled.div` + ${({ + left, + top, + right, + bottom, + }: { + left?: string; + top?: string; + right?: string; + bottom?: string; + }) => css` + padding-left: ${left || '8px'}; + padding-top: ${top || '8px'}; + padding-right: ${right || '8px'}; + padding-bottom: ${bottom || '8px'}; + `} +`; + +export const PaddedRecommendedModalWidth = styled(Padded)` + width: ${RECOMMENDED_MODAL_WIDTH}; +`; + +export const RecommendedModalWidth = styled.div` + width: ${RECOMMENDED_MODAL_WIDTH}; +`; + +export const BorderlessPane = styled.div` + transition: '200ms'; + display: inline-block; + z-index: ${GameWindowZIndex.MenuBar}; + margin: 8px; + padding: 8px; + border-radius: ${dfstyles.borderRadius}; + background-color: ${dfstyles.colors.background}; + border-radius: ${dfstyles.borderRadius}; + background-color: ${dfstyles.colors.background}; +`; export const Underline = styled.span` text-decoration: underline; `; +export const Display = styled.div` + ${({ visible }: { visible?: boolean }) => css` + ${!visible && `display: none;`} + `} +`; + +export const Emphasized = styled.span` + font-weight: bold; + color: ${dfstyles.colors.subtext}; +`; + +export const HeaderText = styled.div` + color: ${dfstyles.colors.text}; + text-decoration: underline; + font-weight: bold; + display: inline; +`; + +export const SectionHeader = styled(HeaderText)` + margin-bottom: 16px; + display: block; +`; + +export const Section = styled.div` + padding: 1em 0; + + &:first-child { + margin-top: -8px; + } + + &:last-child { + border-bottom: none; + } +`; + +export const Bottom = styled.div` + position: absolute; + bottom: 0; + left: 0; +`; + +export const VerticalSplit = function ({ + children, +}: { + children: [React.ReactNode, React.ReactNode]; +}) { + return ( + + {children[0]} + {children[1]} + + ); +}; + +const VerticalSplitChild = styled.div` + width: 50%; + flex-grow: 1; + display: inline-block; +`; + +export const FullWidth = styled.div` + ${({ padding }: { padding?: string }) => + css` + ${padding && `padding: ${padding};`} + width: 100%; + display: flex; + box-sizing: border-box; + flex-direction: row; + `} +`; + +export const FullHeight = styled.div` + height: 100%; +`; + +export const HorizontalFlex = styled.div` + ${({ justifyContent }: { justifyContent?: string }) => css` + width: 100%; + display: flex; + flex-direction: row; + justify-content: ${justifyContent || 'center'}; + align-items: center; + `} +`; + +export const VerticalFlex = styled.div` + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +`; + +export const Expand = styled.div` + display: inline-box; + flex-grow: 1; +`; + +export const DontShrink = styled.div` + display: inline-box; + flex-shrink: 0; +`; + +export function Link({ + to, + color, + openInNewTab, + children, +}: { + to: string; + color?: string; + openInNewTab?: boolean; + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} + +export const HoverLink = styled.a` + ${({ color }: { color?: string }) => css` + text-decoration: underline; + color: ${color || dfstyles.colors.dfpurple}; + } + + &:hover { + color: ${colors(color || dfstyles.colors.dfpurple) + .lighten(0.3) + .hex()}; + } + `} +`; + +export const EmSpacer = styled.div` + ${({ width, height }: { width?: number; height?: number }) => css` + width: 1px; + height: 1px; + ${width && !height ? 'display: inline-block;' : ''} + ${width ? `width: ${width}em;` : ''} + ${height ? `height: ${height}em;min-height:${height}em;` : ''} + `} +`; + export const Spacer = styled.div` ${({ width, height }: { width?: number; height?: number }) => css` width: 1px; @@ -69,19 +274,22 @@ export const Hidden = styled.div` `; export const Select = styled.select` - transition: background-color 0.2s, color 0.2s, width 0.2s !important; - outline: none; - background: ${dfstyles.colors.background}; - color: ${dfstyles.colors.subtext}; - border-radius: 4px; - border: 1px solid ${dfstyles.colors.text}; - width: 12em; - padding: 2px 6px; - - &:focus { - background: ${dfstyles.colors.backgroundlight}; - color: ${dfstyles.colors.text}; - } + ${({ wide }: { wide?: boolean }) => css` + outline: none; + background: ${dfstyles.colors.background}; + color: ${dfstyles.colors.subtext}; + border-radius: 4px; + border: 1px solid ${dfstyles.colors.border}; + width: ${wide ? '100%' : '12em'}; + padding: 2px 6px; + cursor: pointer; + + &:hover { + border: 1px solid ${dfstyles.colors.text}; + background: ${dfstyles.colors.text}; + color: ${dfstyles.colors.background}; + } + `} `; /** @@ -94,12 +302,14 @@ export function SelectFrom({ setValue, labels, style, + wide, }: { values: string[]; value: string; setValue: (value: string) => void; labels: string[]; style?: React.CSSProperties; + wide?: boolean; }) { const onChange = useCallback( (e: ChangeEvent) => { @@ -117,7 +327,7 @@ export function SelectFrom({ } return ( - {copyOfValues.map((value, i) => { return (
+
Scroll speed - - Scroll speed + - - + + +
-
+ +
+ Reset Tutorial + + TutorialManager.getInstance().reset(uiManager.getAccount())}> + Reset Tutorial + +
+
); } + +const ScrollContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; +`; diff --git a/src/Frontend/Panes/Tooltip.tsx b/src/Frontend/Panes/Tooltip.tsx index 5dc494d6..cce06d7f 100644 --- a/src/Frontend/Panes/Tooltip.tsx +++ b/src/Frontend/Panes/Tooltip.tsx @@ -1,5 +1,5 @@ -import React, { useState, useEffect, useRef, useLayoutEffect, useMemo } from 'react'; -import styled, { keyframes, css } from 'styled-components'; +import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; +import styled, { css, keyframes } from 'styled-components'; import WindowManager, { TooltipName, WindowManagerEvent } from '../Game/WindowManager'; import dfstyles from '../Styles/dfstyles'; import { useControlDown } from '../Utils/AppHooks'; @@ -36,7 +36,6 @@ const StyledTooltipTrigger = styled.span<{ display?: DisplayType; }>` border-radius: 2px; - transition: background-color 0.2s; background-color: ${(props) => (props.anim ? dfstyles.colors.dfblue : 'none')}; display: ${(props) => props.display || 'inline'}; @@ -85,7 +84,7 @@ const StyledTooltip = styled.div<{ height: fit-content; min-height: 1em; min-width: 5em; - border: 1px solid ${dfstyles.colors.subtext}; + border: 1px solid ${dfstyles.colors.border}; background: ${dfstyles.colors.background}; padding: 0.5em; border-radius: 3px; diff --git a/src/Frontend/Panes/TooltipPanes.tsx b/src/Frontend/Panes/TooltipPanes.tsx index 633940ce..c77976b2 100644 --- a/src/Frontend/Panes/TooltipPanes.tsx +++ b/src/Frontend/Panes/TooltipPanes.tsx @@ -4,9 +4,9 @@ import styled from 'styled-components'; import { getPlanetRank, isFullRank } from '../../Backend/Utils/Utils'; import { ScoreLabel, SilverLabel } from '../Components/Labels/KeywordLabels'; import { SpacetimeRipLabel } from '../Components/Labels/SpacetimeRipLabel'; -import { Sub, White, Green, Red } from '../Components/Text'; +import { Green, Red, Sub, White } from '../Components/Text'; import { TooltipName } from '../Game/WindowManager'; -import { useUIManager, useSelectedPlanet, useAccount } from '../Utils/AppHooks'; +import { useAccount, useSelectedPlanet, useUIManager } from '../Utils/AppHooks'; const TooltipInfo = styled.div` & > div { diff --git a/src/Frontend/Panes/TutorialPane.tsx b/src/Frontend/Panes/TutorialPane.tsx index c8211a7f..3c1845f8 100644 --- a/src/Frontend/Panes/TutorialPane.tsx +++ b/src/Frontend/Panes/TutorialPane.tsx @@ -1,13 +1,13 @@ -import React, { useState, useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; import TutorialManager, { - TutorialState, TutorialManagerEvent, + TutorialState, } from '../../Backend/GameLogic/TutorialManager'; import { Hook } from '../../_types/global/GlobalTypes'; import { Btn } from '../Components/Btn'; import { Underline } from '../Components/CoreUI'; -import { TargetIcon, PauseIcon } from '../Components/Icons'; +import { PauseIcon, TargetIcon } from '../Components/Icons'; import { White } from '../Components/Text'; import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; diff --git a/src/Frontend/Panes/TwitterVerifyPane.tsx b/src/Frontend/Panes/TwitterVerifyPane.tsx index 5293e440..2e973fd0 100644 --- a/src/Frontend/Panes/TwitterVerifyPane.tsx +++ b/src/Frontend/Panes/TwitterVerifyPane.tsx @@ -1,128 +1,143 @@ -import React, { useState, useEffect } from 'react'; -import styled from 'styled-components'; +import React, { useState } from 'react'; import { Btn } from '../Components/Btn'; +import { Expand, Spacer } from '../Components/CoreUI'; import { Input } from '../Components/Input'; -import { Sub, Green, White, Red } from '../Components/Text'; -import dfstyles from '../Styles/dfstyles'; -import { useUIManager } from '../Utils/AppHooks'; +import { TwitterLink } from '../Components/Labels/Labels'; +import { LoadingSpinner } from '../Components/LoadingSpinner'; +import { Red, Sub } from '../Components/Text'; +import { usePlayer, useUIManager } from '../Utils/AppHooks'; import { ModalHook, ModalName, ModalPane } from '../Views/ModalPane'; +import { TabbedView } from '../Views/TabbedView'; -const TwitterWrapper = styled.div` - width: 30em; - height: 15em; - - & > .row { - display: flex; - flex-direction: row; - justify-content: space-between; - - & .input-twitter { - transition: background-color 0.2s, color 0.2s, width 0.2s !important; - outline: none; - background: ${dfstyles.colors.background}; - color: ${dfstyles.colors.subtext}; - border-radius: 4px; - border: 1px solid ${dfstyles.colors.text}; - margin-left: 0.75em; - width: 6em; - padding: 2px 6px; - - &:focus { - background: ${dfstyles.colors.backgroundlight}; - color: ${dfstyles.colors.text}; - width: 8em; - } - } - } - - & span.clickable { - &:hover { - cursor: pointer; - text-decoration: underline; - } - } - & > div, - & > p { - margin: 0.5em 0; - &:first-child { - margin-top: 0; - } - } -`; export function TwitterVerifyPane({ hook }: { hook: ModalHook }) { const uiManager = useUIManager(); - const [twitter, setTwitter] = useState(undefined); - const [twitterInput, setTwitterInput] = useState(''); - const [failedVerify, setFailedVerify] = useState(false); + const user = usePlayer(uiManager); + const [twitterHandleInputValue, setTwitterHandleInputValue] = useState(''); + const [verifying, setVerifying] = useState(false); + const [disconnecting, setDisconnecting] = useState(false); + const [error, setError] = useState(false); - useEffect(() => { - if (!uiManager) return; - setTwitter(uiManager.getTwitter(undefined)); - }, [uiManager]); + const onTwitterInputChange = (newHandle: string) => { + setTwitterHandleInputValue(newHandle.replace('@', '')); + }; + /** + * Called when the user clicks on the 'tweet' button. Opens up a popup that prompts them to tweet + * the required verification tweet from the account that they entered into the pane. + */ const onTweetClick = async () => { if (uiManager) { - const tweetText = await uiManager.generateVerificationTweet(twitterInput); + const tweetText = await uiManager.generateVerificationTweet(twitterHandleInputValue); const str = `Verifying my @darkforest_eth v0.6 account (https://zkga.me): ${tweetText}`; window.open(`https://twitter.com/intent/tweet?hashtags=darkforest&text=${encodeURI(str)}`); } }; + /** + * Called when the user clicks on the 'verify' button. Asks the webserver whether or not the given + * twitter account tweeted the correct verification tweet. If that happened, sets the twitter + * account internally. + */ const onVerifyClick = async () => { - if (uiManager) { - const success = await uiManager.verifyTwitter(twitterInput); - if (success) { - setTwitter(twitterInput); - } else { - setFailedVerify(true); + try { + setVerifying(true); + await uiManager?.verifyTwitter(twitterHandleInputValue); + } catch (e) { + setError(true); + } finally { + setVerifying(false); + } + }; + + /** + * Called when the user clicks the 'disconnect' button. Allows them to disconnect their account from twitter. + */ + const onDisconnectClick = async () => { + if (confirm('are you sure you want to disconnect your twitter?')) { + try { + setDisconnecting(true); + await uiManager?.disconnectTwitter(twitterHandleInputValue); + } catch (e) { + setError(true); + } finally { + setDisconnecting(false); } } }; return ( - - -
-

Connect to Twitter by signing a public tweet.

-
- {twitter && ( -

- - You are connected. Thank you for verifying your twitter account,{' '} - @{twitter}. - -

- )} - {!twitter && ( - <> -
- Verify using this handle: - - @ - setTwitterInput(e.target.value)} - placeholder={'my-twitter'} - /> - -
-
- Tweet -
-

Once you've tweeted, you can verify your account.

-
- - Verify -
- {failedVerify && ( -

- ERROR: failed to verify signature. Please try again. -

+ + {user.value !== undefined && user.value.twitter === undefined && ( + { + if (i === 0) + return ( + <> + Tweet a signed message, proving account ownership! + + onTwitterInputChange(e.target.value)} + placeholder={'your twitter handle'} + /> + + + + Tweet + + + ); + + if (i === 1) { + return ( + <> + + onTwitterInputChange(e.target.value)} + placeholder={'your twitter handle'} + /> + + + {error && ( + <> + + error verifying ownership + + )} + + {verifying ? : 'Verify'} + + + ); + } + }} + /> + )} + + {user.value !== undefined && user.value.twitter && ( + <> + You are connected, . You can disconnect it + anytime by clicking the button below. + + + {verifying ? ( + + ) : ( + 'Disconnect Twitter' )} - - )} -
+ + + )}
); } diff --git a/src/Frontend/Panes/UpgradeDetailsPane.tsx b/src/Frontend/Panes/UpgradeDetailsPane.tsx index 5357d9e5..b35c71cc 100644 --- a/src/Frontend/Panes/UpgradeDetailsPane.tsx +++ b/src/Frontend/Panes/UpgradeDetailsPane.tsx @@ -1,21 +1,26 @@ -import { UpgradeBranchName, Planet, PlanetType } from '@darkforest_eth/types'; -import _ from 'lodash'; +import { RECOMMENDED_MODAL_WIDTH } from '@darkforest_eth/constants'; +import { LocationId, Planet, PlanetType, UpgradeBranchName } from '@darkforest_eth/types'; import React from 'react'; import styled from 'styled-components'; import { - isFullRank, - getPlanetRank, getPlanetMaxRank, + getPlanetRank, + isFullRank, upgradeName, } from '../../Backend/Utils/Utils'; -import { CenterBackgroundSubtext, Spacer } from '../Components/CoreUI'; -import { Gold, Red, Sub, Subber } from '../Components/Text'; -import { useUIManager, useSelectedPlanet, useAccount } from '../Utils/AppHooks'; -import { ModalHook, ModalName, ModalPane, RECOMMENDED_WIDTH } from '../Views/ModalPane'; -import { UpgradePreview } from '../Views/UpgradePreview'; import { Btn } from '../Components/Btn'; +import { CenterBackgroundSubtext, Padded, Spacer } from '../Components/CoreUI'; import { LoadingSpinner } from '../Components/LoadingSpinner'; +import { Gold, Red, Sub, Subber } from '../Components/Text'; +import { + useAccount, + usePlanet, + usePopAllOnSelectedPlanetChanged, + useUIManager, +} from '../Utils/AppHooks'; +import { ModalHandle } from '../Views/ModalPane'; import { TabbedView } from '../Views/TabbedView'; +import { UpgradePreview } from '../Views/UpgradePreview'; const UpgradeDetailsWrapper = styled.div` width: 100%; @@ -31,7 +36,7 @@ const SectionBuy = styled.div` margin-top: ${SECTION_MARGIN}; `; -function HelpContent() { +export function UpgradeDetailsPaneHelpContent() { return (

@@ -67,23 +72,32 @@ function SilverRequired({ planet }: { planet: Planet }) { ); } -export function UpgradeDetailsPane({ hook }: { hook: ModalHook }) { +export function UpgradeDetailsPane({ + planetId, + modal, +}: { + modal: ModalHandle; + planetId: LocationId | undefined; +}) { const uiManager = useUIManager(); - const selected = useSelectedPlanet(uiManager).value; + const planetWrapper = usePlanet(uiManager, planetId); + const planet = planetWrapper.value; const account = useAccount(uiManager); - const planetAtMaxRank = isFullRank(selected); + const planetAtMaxRank = isFullRank(planet); + + usePopAllOnSelectedPlanetChanged(modal, planetId); let content = ( - + Select a Planet
You Own
); - if (selected && account) { - if (selected.owner !== account) { - } else if (selected.planetType !== PlanetType.PLANET || selected.silverCap === 0) { + if (planet && account) { + if (planet.owner !== account) { + } else if (planet.planetType !== PlanetType.PLANET || planet.silverCap === 0) { content = ( - + This Planet
is not Upgradeable
); @@ -93,22 +107,22 @@ export function UpgradeDetailsPane({ hook }: { hook: ModalHook }) { { - const currentLevel = selected.upgradeState[branch]; - const branchAtMaxRank = !selected || selected.upgradeState[branch] >= 4; + const currentLevel = planet.upgradeState[branch]; + const branchAtMaxRank = !planet || planet.upgradeState[branch] >= 4; const upgrade = branchAtMaxRank ? undefined : uiManager.getUpgrade(branch, currentLevel); - const totalLevel = selected.upgradeState.reduce((a, b) => a + b); - const silverNeeded = Math.floor((totalLevel + 1) * 0.2 * selected.silverCap); - const enoughSilver = selected.silver >= silverNeeded; - const isPendingUpgrade = selected.unconfirmedUpgrades.length > 0; + const totalLevel = planet.upgradeState.reduce((a, b) => a + b); + const silverNeeded = Math.floor((totalLevel + 1) * 0.2 * planet.silverCap); + const enoughSilver = planet.silver >= silverNeeded; + const isPendingUpgrade = planet.unconfirmedUpgrades.length > 0; const canUpgrade = enoughSilver && !planetAtMaxRank && !branchAtMaxRank && !isPendingUpgrade; const doUpgrade = (branch: UpgradeBranchName) => { if (canUpgrade) { - uiManager.upgrade(selected, branch); + uiManager.upgrade(planet, branch); } }; @@ -117,17 +131,17 @@ export function UpgradeDetailsPane({ hook }: { hook: ModalHook }) {

- Silver Available: {selected.silver} + Silver Available: {planet.silver}
- Silver Cost: + Silver Cost:
@@ -162,15 +176,5 @@ export function UpgradeDetailsPane({ hook }: { hook: ModalHook }) { } } - return ( - - {content} - - ); + return {content}; } diff --git a/src/Frontend/Panes/WithdrawSilverPane.tsx b/src/Frontend/Panes/WithdrawSilverPane.tsx index 14564fe3..de973c64 100644 --- a/src/Frontend/Panes/WithdrawSilverPane.tsx +++ b/src/Frontend/Panes/WithdrawSilverPane.tsx @@ -1,7 +1,7 @@ import React from 'react'; import styled from 'styled-components'; import { useSelectedPlanet, useUIManager } from '../Utils/AppHooks'; -import { ModalPane, ModalName, ModalHook } from '../Views/ModalPane'; +import { ModalHook, ModalName, ModalPane } from '../Views/ModalPane'; import { WithdrawSilver } from '../Views/WithdrawSilver'; const StyledWithdrawSilverPane = styled.div` diff --git a/src/Frontend/Renderers/Artifacts/ArtifactRenderer.ts b/src/Frontend/Renderers/Artifacts/ArtifactRenderer.ts index 0252eb07..4ce9bf35 100644 --- a/src/Frontend/Renderers/Artifacts/ArtifactRenderer.ts +++ b/src/Frontend/Renderers/Artifacts/ArtifactRenderer.ts @@ -1,6 +1,6 @@ -import { Artifact, Biome, ArtifactRarity, ArtifactType } from '@darkforest_eth/types'; -import autoBind from 'auto-bind'; import { MAX_BIOME, MIN_BIOME } from '@darkforest_eth/constants'; +import { Artifact, ArtifactRarity, ArtifactType, Biome } from '@darkforest_eth/types'; +import autoBind from 'auto-bind'; import { ARTIFACT_ROW_H } from '../../Styles/dfstyles'; import { SpriteRenderer } from '../GameRenderer/Entities/SpriteRenderer'; import { WebGLManager } from '../GameRenderer/WebGL/WebGLManager'; diff --git a/src/Frontend/Renderers/GameRenderer/EngineTypes.ts b/src/Frontend/Renderers/GameRenderer/EngineTypes.ts index ea89a60d..4209d327 100644 --- a/src/Frontend/Renderers/GameRenderer/EngineTypes.ts +++ b/src/Frontend/Renderers/GameRenderer/EngineTypes.ts @@ -1,4 +1,4 @@ -import { mat4, mat3 } from 'gl-matrix'; +import { mat3, mat4 } from 'gl-matrix'; //eslint-disable-next-line @projectsophon/typescript-enum/no-enum export enum AttribType { diff --git a/src/Frontend/Renderers/GameRenderer/Entities/AsteroidRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/AsteroidRenderer.ts index eb50a413..ca903d66 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/AsteroidRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/AsteroidRenderer.ts @@ -1,8 +1,8 @@ +import { Planet } from '@darkforest_eth/types'; import { ProcgenUtils } from '../../../../Backend/Procedural/ProcgenUtils'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; -import { Planet } from '@darkforest_eth/types'; import Viewport from '../../../Game/Viewport'; -import { RGBVec, DrawMode } from '../EngineTypes'; +import { DrawMode, RGBVec } from '../EngineTypes'; import EngineUtils from '../EngineUtils'; import { ASTEROID_PROGRAM_DEFINITION } from '../Programs/AsteroidProgram'; import { GameGLManager } from '../WebGL/GameGLManager'; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/BackgroundRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/BackgroundRenderer.ts index c28551b6..929742ee 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/BackgroundRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/BackgroundRenderer.ts @@ -1,12 +1,12 @@ +import { PerlinConfig } from '@darkforest_eth/hashing'; +import { SpaceType } from '@darkforest_eth/types'; import { Chunk } from '../../../../_types/global/GlobalTypes'; import Viewport from '../../../Game/Viewport'; +import { RGBVec } from '../EngineTypes'; import Renderer from '../Renderer'; import { GameGLManager } from '../WebGL/GameGLManager'; import { PerlinRenderer } from './PerlinRenderer'; import RectRenderer from './RectRenderer'; -import { PerlinConfig } from '@darkforest_eth/hashing'; -import { SpaceType } from '@darkforest_eth/types'; -import { RGBVec } from '../EngineTypes'; export default class BackgroundRenderer { manager: GameGLManager; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/BeltRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/BeltRenderer.ts index 2d82447f..e4b0867a 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/BeltRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/BeltRenderer.ts @@ -1,12 +1,12 @@ -import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import { Planet, WorldCoords } from '@darkforest_eth/types'; +import autoBind from 'auto-bind'; +import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import Viewport from '../../../Game/Viewport'; import { RGBVec } from '../EngineTypes'; import EngineUtils from '../EngineUtils'; -import { BELT_PROGRAM_DEFINITION, BeltProps, propsFromIdx } from '../Programs/BeltProgram'; +import { BeltProps, BELT_PROGRAM_DEFINITION, propsFromIdx } from '../Programs/BeltProgram'; import { GenericRenderer } from '../WebGL/GenericRenderer'; import { WebGLManager } from '../WebGL/WebGLManager'; -import autoBind from 'auto-bind'; export default class BeltRenderer extends GenericRenderer { topRectPosBuffer: number[]; // 2d for rect pos diff --git a/src/Frontend/Renderers/GameRenderer/Entities/BlackDomainRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/BlackDomainRenderer.ts index 694b40e2..dbd33605 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/BlackDomainRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/BlackDomainRenderer.ts @@ -1,10 +1,10 @@ +import { Planet, WorldCoords } from '@darkforest_eth/types'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import Viewport from '../../../Game/Viewport'; import EngineUtils from '../EngineUtils'; +import { BLACKDOMAIN_PROGRAM_DEFINITION } from '../Programs/BlackDomainProgram'; import { GameGLManager } from '../WebGL/GameGLManager'; import { GenericRenderer } from '../WebGL/GenericRenderer'; -import { Planet, WorldCoords } from '@darkforest_eth/types'; -import { BLACKDOMAIN_PROGRAM_DEFINITION } from '../Programs/BlackDomainProgram'; /** Renders a shadow-type thing over destroyed planets */ export default class BlackDomainRenderer extends GenericRenderer< diff --git a/src/Frontend/Renderers/GameRenderer/Entities/CircleRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/CircleRenderer.ts index cf637d29..a78854e6 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/CircleRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/CircleRenderer.ts @@ -1,12 +1,12 @@ +import { WorldCoords } from '@darkforest_eth/types'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import Viewport from '../../../Game/Viewport'; -import { CIRCLE_PROGRAM_DEFINITION } from '../Programs/CircleProgram'; import { engineConsts } from '../EngineConsts'; -import { GameGLManager } from '../WebGL/GameGLManager'; -import { GenericRenderer } from '../WebGL/GenericRenderer'; import { RGBAVec } from '../EngineTypes'; import EngineUtils from '../EngineUtils'; -import { WorldCoords } from '@darkforest_eth/types'; +import { CIRCLE_PROGRAM_DEFINITION } from '../Programs/CircleProgram'; +import { GameGLManager } from '../WebGL/GameGLManager'; +import { GenericRenderer } from '../WebGL/GenericRenderer'; export default class CircleRenderer extends GenericRenderer { quadBuffer: number[]; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/LineRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/LineRenderer.ts index 7fe66d97..5ba14974 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/LineRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/LineRenderer.ts @@ -1,10 +1,10 @@ +import { WorldCoords } from '@darkforest_eth/types'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import Viewport from '../../../Game/Viewport'; -import { RGBAVec, RenderZIndex, DrawMode } from '../EngineTypes'; +import { DrawMode, RenderZIndex, RGBAVec } from '../EngineTypes'; import { LINE_PROGRAM_DEFINITION } from '../Programs/LineProgram'; import { GameGLManager } from '../WebGL/GameGLManager'; import { GenericRenderer } from '../WebGL/GenericRenderer'; -import { WorldCoords } from '@darkforest_eth/types'; export default class LineRenderer extends GenericRenderer { constructor(glManager: GameGLManager) { diff --git a/src/Frontend/Renderers/GameRenderer/Entities/MineBodyRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/MineBodyRenderer.ts index 347daca8..639fef29 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/MineBodyRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/MineBodyRenderer.ts @@ -1,8 +1,8 @@ +import { Planet, WorldCoords } from '@darkforest_eth/types'; import { ProcgenUtils } from '../../../../Backend/Procedural/ProcgenUtils'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; -import { Planet, WorldCoords } from '@darkforest_eth/types'; import Viewport from '../../../Game/Viewport'; -import { RGBVec, DrawMode } from '../EngineTypes'; +import { DrawMode, RGBVec } from '../EngineTypes'; import EngineUtils from '../EngineUtils'; import { MINE_PROGRAM_DEFINITION } from '../Programs/MineProgram'; import { GenericRenderer } from '../WebGL/GenericRenderer'; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/MineRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/MineRenderer.ts index a1f254f5..9f383e74 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/MineRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/MineRenderer.ts @@ -1,5 +1,5 @@ -import { Planet, WorldCoords } from '@darkforest_eth/types'; import { MAX_PLANET_LEVEL } from '@darkforest_eth/constants'; +import { Planet, WorldCoords } from '@darkforest_eth/types'; import Viewport from '../../../Game/Viewport'; import { engineConsts } from '../EngineConsts'; import EngineUtils from '../EngineUtils'; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/PerlinRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/PerlinRenderer.ts index ebf56464..4e70bb77 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/PerlinRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/PerlinRenderer.ts @@ -1,12 +1,12 @@ import { PerlinConfig } from '@darkforest_eth/hashing'; +import { Chunk, Rectangle } from '../../../../_types/global/GlobalTypes'; import Viewport from '../../../Game/Viewport'; +import { Vec3 } from '../EngineTypes'; import EngineUtils from '../EngineUtils'; import { PERLIN_PROGRAM_DEFINITION } from '../Programs/PerlinProgram'; +import AttribManager from '../WebGL/AttribManager'; import { GameGLManager } from '../WebGL/GameGLManager'; import { GenericRenderer } from '../WebGL/GenericRenderer'; -import RectRenderer from './RectRenderer'; -import { Vec3 } from '../EngineTypes'; -import { Chunk, Rectangle } from '../../../../_types/global/GlobalTypes'; import { getCachedGradient, getGridPoint, @@ -16,7 +16,7 @@ import { up, valueOf, } from './PerlinUtils'; -import AttribManager from '../WebGL/AttribManager'; +import RectRenderer from './RectRenderer'; export class PerlinRenderer extends GenericRenderer { manager: GameGLManager; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/PerlinUtils.ts b/src/Frontend/Renderers/GameRenderer/Entities/PerlinUtils.ts index a7a3a8db..6641d0bb 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/PerlinUtils.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/PerlinUtils.ts @@ -1,6 +1,6 @@ +import { Fraction, getRandomGradientAt, PerlinConfig, rand } from '@darkforest_eth/hashing'; import { WorldCoords } from '@darkforest_eth/types'; import { Rectangle } from '../../../../_types/global/GlobalTypes'; -import { getRandomGradientAt, Fraction, rand, PerlinConfig } from '@darkforest_eth/hashing'; /* types */ type Vector = { x: number; y: number }; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager.ts b/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager.ts index 9656abc2..9a34e6f2 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager.ts @@ -1,13 +1,13 @@ -import { PlanetType, WorldCoords, Planet, Artifact, LocationId } from '@darkforest_eth/types'; +import { Artifact, LocationId, Planet, PlanetType, WorldCoords } from '@darkforest_eth/types'; +import { PlanetRenderInfo } from '../../../../Backend/GameLogic/ViewportEntities'; import { ProcgenUtils } from '../../../../Backend/Procedural/ProcgenUtils'; -import { hasOwner, formatNumber } from '../../../../Backend/Utils/Utils'; +import { formatNumber, hasOwner } from '../../../../Backend/Utils/Utils'; import { isLocatable } from '../../../../_types/global/GlobalTypes'; import Viewport from '../../../Game/Viewport'; import { HatType } from '../../../Utils/Hats'; -import Renderer from '../Renderer'; import { engineConsts } from '../EngineConsts'; import { TextAlign, TextAnchor } from '../EngineTypes'; -import { PlanetRenderInfo } from '../../../../Backend/GameLogic/ViewportEntities'; +import Renderer from '../Renderer'; const { whiteA, barbsA, gold } = engineConsts.colors; const { maxRadius } = engineConsts.planet; @@ -291,10 +291,9 @@ export default class PlanetRenderManager { private queueHat(planet: Planet, center: WorldCoords, radius: number) { const { gameUIManager: uiManager } = this.renderer; + const hoveringPlanet = uiManager.getHoveringOverPlanet() !== undefined; const myRotation = 0; - const hatLevel = planet.hatLevel; - const cosmetic = ProcgenUtils.getPlanetCosmetic(planet); if (hatLevel > 0) { @@ -317,6 +316,7 @@ export default class PlanetRenderManager { 1.2 * radius * hatScale, radius, myRotation, + hoveringPlanet, bg, base, hoverCoords diff --git a/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderer.ts index a1b68374..d3d2db80 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderer.ts @@ -1,16 +1,16 @@ +import { Planet, WorldCoords } from '@darkforest_eth/types'; import { mat4 } from 'gl-matrix'; import { ProcgenUtils } from '../../../../Backend/Procedural/ProcgenUtils'; -import { Planet, WorldCoords } from '@darkforest_eth/types'; import Viewport from '../../../Game/Viewport'; +import { engineConsts } from '../EngineConsts'; +import EngineUtils from '../EngineUtils'; import { distortFromPlanet, PLANET_PROGRAM_DEFINITION, propsFromPlanet, } from '../Programs/PlanetProgram'; -import { engineConsts } from '../EngineConsts'; import { GenericRenderer } from '../WebGL/GenericRenderer'; import { WebGLManager } from '../WebGL/WebGLManager'; -import EngineUtils from '../EngineUtils'; const { maxRadius } = engineConsts.planet; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/QuasarBodyRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/QuasarBodyRenderer.ts index c78a0ff4..a90b1b23 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/QuasarBodyRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/QuasarBodyRenderer.ts @@ -1,6 +1,6 @@ +import { Planet, WorldCoords } from '@darkforest_eth/types'; import { ProcgenUtils } from '../../../../Backend/Procedural/ProcgenUtils'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; -import { Planet, WorldCoords } from '@darkforest_eth/types'; import Viewport from '../../../Game/Viewport'; import EngineUtils from '../EngineUtils'; import { QUASARBODY_PROGRAM_DEFINITION } from '../Programs/QuasarBodyProgram'; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/QuasarRayRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/QuasarRayRenderer.ts index 8a988955..c37c57c9 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/QuasarRayRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/QuasarRayRenderer.ts @@ -1,6 +1,6 @@ +import { Planet, WorldCoords } from '@darkforest_eth/types'; import { ProcgenUtils } from '../../../../Backend/Procedural/ProcgenUtils'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; -import { Planet, WorldCoords } from '@darkforest_eth/types'; import Viewport from '../../../Game/Viewport'; import EngineUtils from '../EngineUtils'; import { QUASARRAY_PROGRAM_DEFINITION } from '../Programs/QuasarRayProgram'; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/QuasarRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/QuasarRenderer.ts index f9b16c58..42ba25e9 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/QuasarRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/QuasarRenderer.ts @@ -1,5 +1,5 @@ -import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import { Planet, WorldCoords } from '@darkforest_eth/types'; +import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import EngineUtils from '../EngineUtils'; import Renderer from '../Renderer'; import { WebGLManager } from '../WebGL/WebGLManager'; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/RectRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/RectRenderer.ts index c581c94c..67f6c5f8 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/RectRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/RectRenderer.ts @@ -1,12 +1,12 @@ +import { WorldCoords } from '@darkforest_eth/types'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; +import { Chunk } from '../../../../_types/global/GlobalTypes'; import Viewport from '../../../Game/Viewport'; -import { RGBVec, RenderZIndex } from '../EngineTypes'; +import { RenderZIndex, RGBVec } from '../EngineTypes'; import EngineUtils from '../EngineUtils'; import { RECT_PROGRAM_DEFINITION } from '../Programs/RectProgram'; import { GameGLManager } from '../WebGL/GameGLManager'; import { GenericRenderer } from '../WebGL/GenericRenderer'; -import { WorldCoords } from '@darkforest_eth/types'; -import { Chunk } from '../../../../_types/global/GlobalTypes'; export default class RectRenderer extends GenericRenderer { quad3Buffer: number[]; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/RingRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/RingRenderer.ts index dd5c246e..43494cc0 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/RingRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/RingRenderer.ts @@ -1,11 +1,11 @@ -import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import { Planet, WorldCoords } from '@darkforest_eth/types'; +import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import Viewport from '../../../Game/Viewport'; import { RGBVec } from '../EngineTypes'; import EngineUtils from '../EngineUtils'; +import { propsFromIdx, RingProps, RING_PROGRAM_DEFINITION } from '../Programs/RingProgram'; import { GameGLManager } from '../WebGL/GameGLManager'; import { GenericRenderer } from '../WebGL/GenericRenderer'; -import { propsFromIdx, RingProps, RING_PROGRAM_DEFINITION } from '../Programs/RingProgram'; export default class RingRenderer extends GenericRenderer { viewport: Viewport; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/RuinsRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/RuinsRenderer.ts index 9a06dbe9..21a9582c 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/RuinsRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/RuinsRenderer.ts @@ -1,4 +1,4 @@ -import { PlanetLevel, Planet, WorldCoords } from '@darkforest_eth/types'; +import { Planet, PlanetLevel, WorldCoords } from '@darkforest_eth/types'; import { ProcgenUtils } from '../../../../Backend/Procedural/ProcgenUtils'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import Viewport from '../../../Game/Viewport'; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer.ts index b33065fd..b567abdb 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer.ts @@ -1,4 +1,4 @@ -import { SpaceType, Planet, WorldCoords } from '@darkforest_eth/types'; +import { Planet, SpaceType, WorldCoords } from '@darkforest_eth/types'; import { ProcgenUtils } from '../../../../Backend/Procedural/ProcgenUtils'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import Viewport from '../../../Game/Viewport'; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/SpriteRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/SpriteRenderer.ts index 7009da5c..7fe702e8 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/SpriteRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/SpriteRenderer.ts @@ -1,19 +1,19 @@ -import { ArtifactRarity, Artifact, WorldCoords } from '@darkforest_eth/types'; +import { Artifact, ArtifactRarity, WorldCoords } from '@darkforest_eth/types'; +import { RenderedArtifact } from '../../../../Backend/GameLogic/ArtifactUtils'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import Viewport from '../../../Game/Viewport'; -import { SPRITE_PROGRAM_DEFINITION } from '../Programs/SpriteProgram'; import { engineConsts } from '../EngineConsts'; -import { GenericRenderer } from '../WebGL/GenericRenderer'; -import { WebGLManager } from '../WebGL/WebGLManager'; -import { RGBVec, RGBAVec } from '../EngineTypes'; +import { RGBAVec, RGBVec } from '../EngineTypes'; import EngineUtils from '../EngineUtils'; +import { SPRITE_PROGRAM_DEFINITION } from '../Programs/SpriteProgram'; import { - loadArtifactThumbAtlas, loadArtifactAtlas, - SpriteRectangle, + loadArtifactThumbAtlas, spriteFromArtifact, + SpriteRectangle, } from '../TextureManager'; -import { RenderedArtifact } from '../../../../Backend/GameLogic/ArtifactUtils'; +import { GenericRenderer } from '../WebGL/GenericRenderer'; +import { WebGLManager } from '../WebGL/WebGLManager'; export class SpriteRenderer extends GenericRenderer { private posBuffer: number[]; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/TextRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/TextRenderer.ts index 1fea5b65..5f324ba6 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/TextRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/TextRenderer.ts @@ -1,12 +1,12 @@ +import { WorldCoords } from '@darkforest_eth/types'; import { CanvasCoords } from '../../../../Backend/Utils/Coordinates'; import Viewport from '../../../Game/Viewport'; -import { TEXT_PROGRAM_DEFINITION } from '../Programs/TextProgram'; import { engineConsts } from '../EngineConsts'; -import { WebGLManager } from '../WebGL/WebGLManager'; +import { RenderZIndex, RGBAVec, TextAlign, TextAnchor } from '../EngineTypes'; import EngineUtils from '../EngineUtils'; -import { RGBAVec, TextAlign, TextAnchor, RenderZIndex } from '../EngineTypes'; +import { TEXT_PROGRAM_DEFINITION } from '../Programs/TextProgram'; import { GenericRenderer } from '../WebGL/GenericRenderer'; -import { WorldCoords } from '@darkforest_eth/types'; +import { WebGLManager } from '../WebGL/WebGLManager'; type GlyphInfo = { x: number; diff --git a/src/Frontend/Renderers/GameRenderer/Entities/VoyageRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/VoyageRenderer.ts index 064a7b40..1bd69de0 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/VoyageRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/VoyageRenderer.ts @@ -1,11 +1,10 @@ +import { LocationId, Planet, Player, QueuedArrival } from '@darkforest_eth/types'; import { ProcgenUtils } from '../../../../Backend/Procedural/ProcgenUtils'; -import { hasOwner, formatNumber } from '../../../../Backend/Utils/Utils'; -import { Planet, LocationId } from '@darkforest_eth/types'; +import { formatNumber, hasOwner } from '../../../../Backend/Utils/Utils'; import Viewport from '../../../Game/Viewport'; -import Renderer from '../Renderer'; import { engineConsts } from '../EngineConsts'; -import { TextAlign, TextAnchor, RenderZIndex } from '../EngineTypes'; -import { QueuedArrival } from '@darkforest_eth/types'; +import { RenderZIndex, TextAlign, TextAnchor } from '../EngineTypes'; +import Renderer from '../Renderer'; const { white, gold } = engineConsts.colors; const { enemyA, mineA } = engineConsts.colors.voyage; @@ -31,7 +30,7 @@ export default class VoyageRenderer { this.renderer = renderer; } - drawFleet(voyage: QueuedArrival) { + drawFleet(voyage: QueuedArrival, _player: Player | undefined) { const { now: nowMs, gameUIManager, @@ -153,8 +152,9 @@ export default class VoyageRenderer { const nowS = now / 1000; if (nowS < voyage.arrivalTime) { const isMyVoyage = voyage.player === gameUIManager.getAccount(); + const sender = gameUIManager.getPlayer(voyage.player); this.drawVoyagePath(voyage.fromPlanet, voyage.toPlanet, true, isMyVoyage); - this.drawFleet(voyage); + this.drawFleet(voyage, sender); } } diff --git a/src/Frontend/Renderers/GameRenderer/Entities/WormholeRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/WormholeRenderer.ts index 33d9e4cb..cda26775 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/WormholeRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/WormholeRenderer.ts @@ -1,7 +1,7 @@ import type { LocationId } from '@darkforest_eth/types'; -import Renderer from '../Renderer'; import { engineConsts } from '../EngineConsts'; import { RenderZIndex } from '../EngineTypes'; +import Renderer from '../Renderer'; const { purpleA } = engineConsts.colors; diff --git a/src/Frontend/Renderers/GameRenderer/Overlay2DRenderer.ts b/src/Frontend/Renderers/GameRenderer/Overlay2DRenderer.ts index 90ad5cfb..cd74ce1a 100644 --- a/src/Frontend/Renderers/GameRenderer/Overlay2DRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Overlay2DRenderer.ts @@ -1,12 +1,12 @@ +import { Artifact, EmojiFlagBody, PlanetMessage, WorldCoords } from '@darkforest_eth/types'; +import { PlanetRenderInfo } from '../../../Backend/GameLogic/ViewportEntities'; import { CanvasCoords } from '../../../Backend/Utils/Coordinates'; +import { Chunk, isEmojiFlagMessage } from '../../../_types/global/GlobalTypes'; import Viewport from '../../Game/Viewport'; -import { HatType, hatFromType } from '../../Utils/Hats'; -import Renderer from './Renderer'; +import { hatFromType, HatType } from '../../Utils/Hats'; import { engineConsts } from './EngineConsts'; import { TextAlign } from './EngineTypes'; -import { Artifact, EmojiFlagBody, PlanetMessage, WorldCoords } from '@darkforest_eth/types'; -import { Chunk, isEmojiFlagMessage } from '../../../_types/global/GlobalTypes'; -import { PlanetRenderInfo } from '../../../Backend/GameLogic/ViewportEntities'; +import Renderer from './Renderer'; /* this is mostly migration code from the old renderer; it holds all of the old renderer primitives, @@ -84,6 +84,7 @@ export default class Overlay2DRenderer { height: number, // height of hat radius: number, // radius of planet rotation: number, // rotation of planet / hat (no-op right now) + hoveringPlanet: boolean, // whether or not the user is hovering over the given planet fill1: string | CanvasPattern = 'white', // hat fill color for bottom layer fill2: string | CanvasPattern = 'red', // hat fill color for top layer hoverCoords: WorldCoords | null = null @@ -113,11 +114,12 @@ export default class Overlay2DRenderer { }; const hovering = - hoverCoords && - hoverCoords.x > hatTopLeft.x && - hoverCoords.x < hatTopLeft.x + width && - hoverCoords.y > hatTopLeft.y && - hoverCoords.y < hatTopLeft.y + height; + (hoverCoords && + hoverCoords.x > hatTopLeft.x && + hoverCoords.x < hatTopLeft.x + width && + hoverCoords.y > hatTopLeft.y && + hoverCoords.y < hatTopLeft.y + height) || + hoveringPlanet; // now draw the hat diff --git a/src/Frontend/Renderers/GameRenderer/Programs/AsteroidProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/AsteroidProgram.ts index 4e9a53f0..d4997d3a 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/AsteroidProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/AsteroidProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/BeltProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/BeltProgram.ts index a53bfd31..83621bb5 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/BeltProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/BeltProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/BlackDomainProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/BlackDomainProgram.ts index 1fa74bb4..7bc79e48 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/BlackDomainProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/BlackDomainProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/CircleProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/CircleProgram.ts index 3ced4578..1558d06e 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/CircleProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/CircleProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; const a = { diff --git a/src/Frontend/Renderers/GameRenderer/Programs/LineProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/LineProgram.ts index 527d47cc..ccb2d803 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/LineProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/LineProgram.ts @@ -1,5 +1,5 @@ import { engineConsts } from '../EngineConsts'; -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; const a = { diff --git a/src/Frontend/Renderers/GameRenderer/Programs/MaskProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/MaskProgram.ts index a814999a..f7a343fa 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/MaskProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/MaskProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; // mask shader - takes in world coords and spits out red rects diff --git a/src/Frontend/Renderers/GameRenderer/Programs/MineProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/MineProgram.ts index aae06b8a..33ff5023 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/MineProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/MineProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/PerlinProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/PerlinProgram.ts index 236d9ac6..219ec643 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/PerlinProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/PerlinProgram.ts @@ -1,6 +1,6 @@ -import { UniformType, AttribType } from '../EngineTypes'; -import { glsl } from '../EngineUtils'; import { MAX_PERLIN_VALUE } from '@darkforest_eth/hashing'; +import { AttribType, UniformType } from '../EngineTypes'; +import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; const a = { diff --git a/src/Frontend/Renderers/GameRenderer/Programs/PlanetProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/PlanetProgram.ts index 188ec1b6..2c9b7983 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/PlanetProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/PlanetProgram.ts @@ -1,6 +1,6 @@ import { Biome, Planet } from '@darkforest_eth/types'; import { isLocatable } from '../../../../_types/global/GlobalTypes'; -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/QuasarBodyProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/QuasarBodyProgram.ts index 237ef6d6..a5f2ca67 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/QuasarBodyProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/QuasarBodyProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/QuasarRayProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/QuasarRayProgram.ts index 10087a3b..380fd0f4 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/QuasarRayProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/QuasarRayProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/RectProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/RectProgram.ts index 7e2ae9ff..645f80bc 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/RectProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/RectProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; const a = { diff --git a/src/Frontend/Renderers/GameRenderer/Programs/RingProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/RingProgram.ts index 6f7c8c8d..a91cc356 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/RingProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/RingProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/RuinsProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/RuinsProgram.ts index 1bdcdf71..5c435330 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/RuinsProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/RuinsProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/SpacetimeRipProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/SpacetimeRipProgram.ts index 236e53a5..67f7e8a0 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/SpacetimeRipProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/SpacetimeRipProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/SpriteProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/SpriteProgram.ts index 5dfc01af..7de96196 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/SpriteProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/SpriteProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; import { ShaderMixins } from '../WebGL/ShaderMixins'; diff --git a/src/Frontend/Renderers/GameRenderer/Programs/TextProgram.ts b/src/Frontend/Renderers/GameRenderer/Programs/TextProgram.ts index aefe1353..89e555b2 100644 --- a/src/Frontend/Renderers/GameRenderer/Programs/TextProgram.ts +++ b/src/Frontend/Renderers/GameRenderer/Programs/TextProgram.ts @@ -1,4 +1,4 @@ -import { UniformType, AttribType } from '../EngineTypes'; +import { AttribType, UniformType } from '../EngineTypes'; import { glsl } from '../EngineUtils'; const a = { diff --git a/src/Frontend/Renderers/GameRenderer/Renderer.ts b/src/Frontend/Renderers/GameRenderer/Renderer.ts index c4f71d4a..65a59e30 100644 --- a/src/Frontend/Renderers/GameRenderer/Renderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Renderer.ts @@ -1,27 +1,27 @@ import autoBind from 'auto-bind'; +import GameUIManager from '../../../Backend/GameLogic/GameUIManager'; +import { Setting } from '../../Utils/SettingsHooks'; +import AsteroidRenderer from './Entities/AsteroidRenderer'; import BackgroundRenderer from './Entities/BackgroundRenderer'; -import Overlay2DRenderer from './Overlay2DRenderer'; -import PlanetRenderer from './Entities/PlanetRenderer'; -import VoyageRenderer from './Entities/VoyageRenderer'; -import { UIRenderer } from './UIRenderer'; -import LineRenderer from './Entities/LineRenderer'; +import BeltRenderer from './Entities/BeltRenderer'; +import BlackDomainRenderer from './Entities/BlackDomainRenderer'; import CircleRenderer from './Entities/CircleRenderer'; -import TextRenderer from './Entities/TextRenderer'; -import RectRenderer from './Entities/RectRenderer'; +import LineRenderer from './Entities/LineRenderer'; +import { MineRenderer } from './Entities/MineRenderer'; +import PlanetRenderer from './Entities/PlanetRenderer'; import PlanetRenderManager from './Entities/PlanetRenderManager'; -import AsteroidRenderer from './Entities/AsteroidRenderer'; -import BeltRenderer from './Entities/BeltRenderer'; -import { SpriteRenderer } from './Entities/SpriteRenderer'; -import { GameGLManager } from './WebGL/GameGLManager'; -import { WormholeRenderer } from './Entities/WormholeRenderer'; -import GameUIManager from '../../../Backend/GameLogic/GameUIManager'; import { QuasarRenderer } from './Entities/QuasarRenderer'; -import { SpacetimeRipRenderer } from './Entities/SpacetimeRipRenderer'; -import { RuinsRenderer } from './Entities/RuinsRenderer'; +import RectRenderer from './Entities/RectRenderer'; import RingRenderer from './Entities/RingRenderer'; -import BlackDomainRenderer from './Entities/BlackDomainRenderer'; -import { MineRenderer } from './Entities/MineRenderer'; -import { Setting } from '../../Utils/SettingsHooks'; +import { RuinsRenderer } from './Entities/RuinsRenderer'; +import { SpacetimeRipRenderer } from './Entities/SpacetimeRipRenderer'; +import { SpriteRenderer } from './Entities/SpriteRenderer'; +import TextRenderer from './Entities/TextRenderer'; +import VoyageRenderer from './Entities/VoyageRenderer'; +import { WormholeRenderer } from './Entities/WormholeRenderer'; +import Overlay2DRenderer from './Overlay2DRenderer'; +import { UIRenderer } from './UIRenderer'; +import { GameGLManager } from './WebGL/GameGLManager'; class Renderer { static instance: Renderer | null; diff --git a/src/Frontend/Renderers/GameRenderer/TextureManager.ts b/src/Frontend/Renderers/GameRenderer/TextureManager.ts index dad3c2cc..d600ea62 100644 --- a/src/Frontend/Renderers/GameRenderer/TextureManager.ts +++ b/src/Frontend/Renderers/GameRenderer/TextureManager.ts @@ -1,11 +1,11 @@ -import { Biome, ArtifactType, ArtifactId, ArtifactRarity } from '@darkforest_eth/types'; +import { MAX_ARTIFACT_TYPE, MAX_BIOME, MIN_ARTIFACT_TYPE } from '@darkforest_eth/constants'; +import { ArtifactId, ArtifactRarity, ArtifactType, Biome } from '@darkforest_eth/types'; import { isAncient, isBasic, isRelic, RenderedArtifact, } from '../../../Backend/GameLogic/ArtifactUtils'; -import { MIN_ARTIFACT_TYPE, MAX_ARTIFACT_TYPE, MAX_BIOME } from '@darkforest_eth/constants'; export const ARTIFACTS_URL = 'public/sprites/artifacts.png'; export const ARTIFACTS_THUMBS_URL = 'public/sprites/artifactthumbs.png'; diff --git a/src/Frontend/Renderers/GameRenderer/UIRenderer.ts b/src/Frontend/Renderers/GameRenderer/UIRenderer.ts index a5621fa1..2f4e8a5f 100644 --- a/src/Frontend/Renderers/GameRenderer/UIRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/UIRenderer.ts @@ -1,9 +1,9 @@ -import { formatNumber } from '../../../Backend/Utils/Utils'; +import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; import { Planet, WorldCoords } from '@darkforest_eth/types'; -import Renderer from './Renderer'; +import { formatNumber } from '../../../Backend/Utils/Utils'; import { engineConsts } from './EngineConsts'; import { RenderZIndex, RGBVec, TextAlign, TextAnchor } from './EngineTypes'; -import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; +import Renderer from './Renderer'; const { red, diff --git a/src/Frontend/Renderers/GameRenderer/WebGL/GenericRenderer.ts b/src/Frontend/Renderers/GameRenderer/WebGL/GenericRenderer.ts index 105bd5f3..01ef6d62 100644 --- a/src/Frontend/Renderers/GameRenderer/WebGL/GenericRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/WebGL/GenericRenderer.ts @@ -1,15 +1,15 @@ -import AttribManager from './AttribManager'; -import ProgramUtils from './ProgramUtils'; -import { WebGLManager } from './WebGLManager'; import { mat3, mat4 } from 'gl-matrix'; import { - UniformProps, AttribProps, + DrawMode, UniformJSType, + UniformProps, UniformType, - DrawMode, Vec3, } from '../EngineTypes'; +import AttribManager from './AttribManager'; +import ProgramUtils from './ProgramUtils'; +import { WebGLManager } from './WebGLManager'; type UniformData = { [key: string]: UniformProps; diff --git a/src/Frontend/Renderers/GifRenderer.ts b/src/Frontend/Renderers/GifRenderer.ts index 1215ef09..2ce270d6 100644 --- a/src/Frontend/Renderers/GifRenderer.ts +++ b/src/Frontend/Renderers/GifRenderer.ts @@ -1,24 +1,24 @@ -import JSZip from 'jszip'; +import { + EMPTY_LOCATION_ID, + MAX_ARTIFACT_RARITY, + MAX_ARTIFACT_TYPE, + MAX_BIOME, + MIN_ARTIFACT_RARITY, + MIN_ARTIFACT_TYPE, + MIN_BIOME, +} from '@darkforest_eth/constants'; import { Artifact, ArtifactRarity, ArtifactType, Biome } from '@darkforest_eth/types'; import { mat4 } from 'gl-matrix'; -import { SpriteRenderer } from './GameRenderer/Entities/SpriteRenderer'; -import { WebGLManager } from './GameRenderer/WebGL/WebGLManager'; -import { mockArtifactWithRarity } from '../../Backend/Procedural/ArtifactProcgen'; +import JSZip from 'jszip'; import { ArtifactFileColor, artifactFileName, setForceAncient, } from '../../Backend/GameLogic/ArtifactUtils'; -import { - EMPTY_LOCATION_ID, - MIN_ARTIFACT_TYPE, - MAX_ARTIFACT_TYPE, - MIN_ARTIFACT_RARITY, - MAX_ARTIFACT_RARITY, - MIN_BIOME, - MAX_BIOME, -} from '@darkforest_eth/constants'; +import { mockArtifactWithRarity } from '../../Backend/Procedural/ArtifactProcgen'; import { GIF_ARTIFACT_COLOR } from '../Pages/GifMaker'; +import { SpriteRenderer } from './GameRenderer/Entities/SpriteRenderer'; +import { WebGLManager } from './GameRenderer/WebGL/WebGLManager'; const FileSaver = require('file-saver'); diff --git a/src/Frontend/Renderers/LandingPageCanvas.tsx b/src/Frontend/Renderers/LandingPageCanvas.tsx index 224dc176..6c5628e4 100644 --- a/src/Frontend/Renderers/LandingPageCanvas.tsx +++ b/src/Frontend/Renderers/LandingPageCanvas.tsx @@ -1,5 +1,5 @@ -import React, { useEffect, useRef, RefObject, useCallback } from 'react'; import autoBind from 'auto-bind'; +import React, { RefObject, useCallback, useEffect, useRef } from 'react'; import dfstyles from '../Styles/dfstyles'; import { hasTouchscreen, isMobileOrTablet } from '../Utils/BrowserChecks'; diff --git a/src/Frontend/Renderers/PlanetscapeRenderer/PathRenderer.ts b/src/Frontend/Renderers/PlanetscapeRenderer/PathRenderer.ts index 9e809200..b9043e15 100644 --- a/src/Frontend/Renderers/PlanetscapeRenderer/PathRenderer.ts +++ b/src/Frontend/Renderers/PlanetscapeRenderer/PathRenderer.ts @@ -2,7 +2,7 @@ import { PixelCoords } from '../../../Backend/Procedural/ProcgenUtils'; import { RGBVec } from '../GameRenderer/EngineTypes'; import AttribManager from '../GameRenderer/WebGL/AttribManager'; import { WebGLManager } from '../GameRenderer/WebGL/WebGLManager'; -import { getPathProgramAndUniforms, scapePosProps, scapeColorProps } from './PathProgram'; +import { getPathProgramAndUniforms, scapeColorProps, scapePosProps } from './PathProgram'; export class PathRenderer { private manager: WebGLManager; diff --git a/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx b/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx index d5ea1905..816a779a 100644 --- a/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx +++ b/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx @@ -1,45 +1,44 @@ +import { EMPTY_ADDRESS, MAX_PLANET_LEVEL } from '@darkforest_eth/constants'; +import { bonusFromHex } from '@darkforest_eth/hexgen'; +import { Planet, PlanetType } from '@darkforest_eth/types'; import React from 'react'; import styled from 'styled-components'; -import { isLocatable, StatIdx } from '../../../_types/global/GlobalTypes'; -import dfstyles from '../../Styles/dfstyles'; -import { PlanetType, Planet } from '@darkforest_eth/types'; import { ProcgenUtils } from '../../../Backend/Procedural/ProcgenUtils'; import { getPlanetRank } from '../../../Backend/Utils/Utils'; +import { isLocatable, StatIdx } from '../../../_types/global/GlobalTypes'; import { - PiratesIcon, - MaxLevelIcon, - SilverProdIcon, - EnergyIcon, + ArtifactIcon, + DefenseIcon, EnergyGrowthIcon, + EnergyIcon, + MaxLevelIcon, + PiratesIcon, RangeIcon, - SpeedIcon, - DefenseIcon, RankIcon, - ArtifactIcon, + SilverProdIcon, + SpeedIcon, } from '../../Components/Icons'; import { TooltipName } from '../../Game/WindowManager'; import { TooltipTrigger } from '../../Panes/Tooltip'; -import { EMPTY_ADDRESS, MAX_PLANET_LEVEL } from '@darkforest_eth/constants'; -import { bonusFromHex } from '@darkforest_eth/hexgen'; +import dfstyles from '../../Styles/dfstyles'; const StyledPlanetIcons = styled.div` - position: absolute; - top: 0; - right: 0; - height: 100%; - display: flex; - flex-direction: column; + display: inline-flex; + flex-direction: row; flex-wrap: wrap-reverse; - padding: 0.1em; + align-items: center; + justify-content: center; + margin-right: 0.5em; & > span { - font-size: 8pt; + font-size: 0.9em; width: 1.5em; height: 1.5em; - border: 1px solid ${dfstyles.colors.text}; background: ${dfstyles.colors.backgroundlighter}; border-radius: 2px; margin: 0.1em; + margin-right: 0.25em; + cursor: help; &, & > span { diff --git a/src/Frontend/Renderers/PlanetscapeRenderer/PlanetScape.tsx b/src/Frontend/Renderers/PlanetscapeRenderer/PlanetScape.tsx index 188fc129..e0c860f0 100644 --- a/src/Frontend/Renderers/PlanetscapeRenderer/PlanetScape.tsx +++ b/src/Frontend/Renderers/PlanetscapeRenderer/PlanetScape.tsx @@ -1,10 +1,10 @@ +import { Planet, PlanetType } from '@darkforest_eth/types'; import React, { useEffect, useRef, useState } from 'react'; import styled from 'styled-components'; -import { Planet, PlanetType } from '@darkforest_eth/types'; -import { PlanetscapeRenderer } from './PlanetScapeRenderer'; -import { useUIManager } from '../../Utils/AppHooks'; -import dfstyles from '../../Styles/dfstyles'; import { Wrapper } from '../../../Backend/Utils/Wrapper'; +import dfstyles from '../../Styles/dfstyles'; +import { useUIManager } from '../../Utils/AppHooks'; +import { PlanetscapeRenderer } from './PlanetScapeRenderer'; const PlanetScapeContainer = styled.div` position: relative; diff --git a/src/Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer.ts b/src/Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer.ts index 213b6442..b0db2942 100644 --- a/src/Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer.ts +++ b/src/Frontend/Renderers/PlanetscapeRenderer/PlanetScapeRenderer.ts @@ -1,16 +1,16 @@ +import { bonusFromHex } from '@darkforest_eth/hexgen'; import { Artifact, Planet, PlanetType } from '@darkforest_eth/types'; +import autoBind from 'auto-bind'; import { mat4 } from 'gl-matrix'; import GameUIManager from '../../../Backend/GameLogic/GameUIManager'; import { mockCommon } from '../../../Backend/Procedural/ArtifactProcgen'; import { PixelCoords, ProcgenUtils } from '../../../Backend/Procedural/ProcgenUtils'; -import { bonusFromHex } from '@darkforest_eth/hexgen'; import { StatIdx } from '../../../_types/global/GlobalTypes'; import dfstyles from '../../Styles/dfstyles'; import { RGBVec } from '../GameRenderer/EngineTypes'; import { SpriteRenderer } from '../GameRenderer/Entities/SpriteRenderer'; import { WebGLManager } from '../GameRenderer/WebGL/WebGLManager'; import { PathRenderer } from './PathRenderer'; -import autoBind from 'auto-bind'; const ARTIFACT_W = 128; diff --git a/src/Frontend/Styles/colors.js b/src/Frontend/Styles/colors.js deleted file mode 100644 index ffc82392..00000000 --- a/src/Frontend/Styles/colors.js +++ /dev/null @@ -1,13 +0,0 @@ -export default { - white: '#ffffff', - 'gray-100': '#f7f7f7', - 'gray-200': '#ededed', - 'gray-300': '#e2e2e2', - 'gray-400': '#cbcbcb', - 'gray-500': '#a0a0a0', - 'gray-600': '#717171', - 'gray-700': '#4a4a4a', - 'gray-800': '#2d2d2d', - 'gray-900': '#1a1a1a', - black: '#000000', -}; diff --git a/src/Frontend/Styles/dfstyles.ts b/src/Frontend/Styles/dfstyles.ts index 52b3fab0..ca3ff76a 100644 --- a/src/Frontend/Styles/dfstyles.ts +++ b/src/Frontend/Styles/dfstyles.ts @@ -1,4 +1,5 @@ import { SpaceType } from '@darkforest_eth/types'; +import color from 'color'; import { css } from 'styled-components'; export const ARTIFACT_ROW_H = 48; @@ -10,24 +11,51 @@ export const SPACE_TYPE_COLORS = { [SpaceType.DEAD_SPACE]: 'rgb(37.485, 0, 36)', } as const; +const text = '#ddd'; +const subtext = color(text).darken(0.05).hex(); +const subbertext = color(text).darken(0.3).hex(); +const subbesttext = color(text).darken(0.5).hex(); + +const background = '#151515'; +const backgrounddark = '#252525'; +const backgroundlight = color(background).lighten(0.5).hex(); +const backgroundlighter = color(backgroundlight).lighten(0.3).hex(); + +const border = '#777'; +const darkBorder = color(border).darken(0.2).hex(); + +const blueBackground = '#0a0a23'; + +const dfblue = '#00ADE1'; +const dfgreen = '#00DC82'; +const dfgreendark = color(dfgreen).darken(0.7).hex(); +const dfgreenlight = color(dfgreen).lighten(0.1).hex(); +const dfred = '#FF6492'; +const dfyellow = '#e8e228'; +const dfpurple = '#9189d9'; + const dfstyles = { colors: { - text: '#ffffff', - subtext: '#a0a0a0', - subbertext: '#565656', - subbesttext: '#383838', - blueBackground: '#0a0a23', - background: '#080808', - backgrounddark: '#080808', - backgroundlight: '#282834', - backgroundlighter: '#4a4a5a', - dfblue: '#00ADE1', - - dfgreen: '#00DC82', - dfgreendark: '#025230', - dfgreenlight: '#89facc', - dfred: '#FF6492', - dfyellow: '#e8e228', + text, + subtext, + subbertext, + subbesttext, + blueBackground, + background, + backgrounddark, + backgroundlight, + backgroundlighter, + dfblue, + + border, + darkBorder, + + dfgreen, + dfgreendark, + dfgreenlight, + dfred, + dfyellow, + dfpurple, artifactBackground: 'rgb(21, 17, 71)', icons: { diff --git a/src/Frontend/Styles/tailwind.config.js b/src/Frontend/Styles/tailwind.config.js deleted file mode 100644 index 8331ec1a..00000000 --- a/src/Frontend/Styles/tailwind.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - theme: {}, - variants: {}, - plugins: [], -}; diff --git a/src/Frontend/Utils/AppHooks.ts b/src/Frontend/Utils/AppHooks.ts index 3a7892d9..14e4216e 100644 --- a/src/Frontend/Utils/AppHooks.ts +++ b/src/Frontend/Utils/AppHooks.ts @@ -1,13 +1,22 @@ -import { useCallback, useMemo, useState } from 'react'; +import { + Artifact, + ArtifactId, + EthAddress, + Leaderboard, + LocationId, + Planet, + Player, +} from '@darkforest_eth/types'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { getActivatedArtifact, isActivated } from '../../Backend/GameLogic/ArtifactUtils'; import GameUIManager from '../../Backend/GameLogic/GameUIManager'; +import { loadLeaderboard } from '../../Backend/Network/LeaderboardApi'; import { Wrapper } from '../../Backend/Utils/Wrapper'; -import { EthAddress, Planet, ArtifactId, Artifact, Leaderboard } from '@darkforest_eth/types'; +import { ModalHandle } from '../Views/ModalPane'; import { createDefinedContext } from './createDefinedContext'; -import { useKeyPressed, useWrappedEmitter } from './EmitterHooks'; -import { ctrlDown$, ctrlUp$ } from './KeyEmitters'; -import { getActivatedArtifact, isActivated } from '../../Backend/GameLogic/ArtifactUtils'; -import { loadLeaderboard } from '../../Backend/Network/LeaderboardApi'; +import { useEmitterSubscribe, useKeyPressed, useWrappedEmitter } from './EmitterHooks'; import { usePoll } from './Hooks'; +import { ctrlDown$, ctrlUp$ } from './KeyEmitters'; export const { useDefinedContext: useUIManager, provider: UIManagerProvider } = createDefinedContext(); @@ -25,11 +34,24 @@ export function useAccount(uiManager: GameUIManager): EthAddress | undefined { return account; } -export function useTwitter( - account: EthAddress | undefined, - uiManager: GameUIManager -): string | undefined { - return useMemo(() => account && uiManager.getTwitter(account), [account, uiManager]); +/** + * Hook which gets you the player, and updates whenever that player's twitter or score changes. + */ +export function usePlayer( + uiManager: GameUIManager, + ethAddress?: EthAddress +): Wrapper { + const [player, setPlayer] = useState>( + () => new Wrapper(uiManager.getPlayer(ethAddress)) + ); + + const onUpdate = useCallback(() => { + setPlayer(new Wrapper(uiManager.getPlayer(ethAddress))); + }, [uiManager, ethAddress]); + + useEmitterSubscribe(uiManager.getGameManager().playersUpdated$, onUpdate); + + return player; } /** @@ -40,6 +62,32 @@ export function useSelectedPlanet(uiManager: GameUIManager): Wrapper(uiManager.selectedPlanet$, undefined); } +export function useSelectedPlanetId(uiManager: GameUIManager, defaultId?: LocationId) { + return useWrappedEmitter(uiManager.selectedPlanetId$, defaultId); +} + +export function usePlanet( + uiManager: GameUIManager, + locationId: LocationId | undefined +): Wrapper { + const [planet, setPlanet] = useState>( + () => new Wrapper(uiManager.getPlanetWithId(locationId)) + ); + + const callback = useCallback( + (id: LocationId) => { + if (id === locationId) { + setPlanet(new Wrapper(uiManager.getPlanetWithId(locationId))); + } + }, + [uiManager, locationId] + ); + + useEmitterSubscribe(uiManager.getGameManager().getGameObjects().planetUpdated$, callback); + + return planet; +} + /** * Create a subscription to the currently hovering planet. * @param uiManager instance of GameUIManager @@ -48,13 +96,22 @@ export function useHoverPlanet(uiManager: GameUIManager): Wrapper(uiManager.hoverPlanet$, undefined); } -export function useMyArtifacts( - uiManager: GameUIManager -): Wrapper | undefined> { - return useWrappedEmitter>( - uiManager.myArtifacts$, - uiManager.getMyArtifactMap() - ); +export function useMyArtifacts(uiManager: GameUIManager): Wrapper { + const [myArtifacts, setMyArtifacts] = useState(new Wrapper(uiManager.getMyArtifacts())); + + useEffect(() => { + const interval = setInterval(() => { + setMyArtifacts(new Wrapper(uiManager.getMyArtifacts())); + }, 1000); + return () => clearInterval(interval); + }); + + return myArtifacts; +} + +export function useMyArtifactsList(uiManager: GameUIManager) { + const myArtifactsMap = useMyArtifacts(uiManager); + return Array.from(myArtifactsMap.value?.values() || []); } // note that this is going to throw an error if the pointer to `artifacts` changes but not to `planet` @@ -96,6 +153,22 @@ export function useSelectedArtifact(uiManager: GameUIManager): Wrapper(uiManager.selectedArtifact$, undefined); } +export function useArtifact(uiManager: GameUIManager, artifactId: ArtifactId) { + const [artifact, setArtifact] = useState>( + new Wrapper(uiManager.getArtifactWithId(artifactId)) + ); + + // @todo: actually hook this into the eventing system that we have in the game. + useEffect(() => { + const interval = setInterval(() => { + setArtifact(new Wrapper(uiManager.getArtifactWithId(artifactId))); + }, 1000); + return () => clearInterval(interval); + }); + + return artifact; +} + /** Return a bool that indicates if the control key is pressed. */ export function useControlDown(): boolean { return useKeyPressed(ctrlDown$, ctrlUp$); @@ -124,3 +197,16 @@ export function useLeaderboard(poll: number | undefined = undefined): { return { leaderboard, error }; } + +export function usePopAllOnSelectedPlanetChanged( + modal: ModalHandle, + startingId: LocationId | undefined +) { + const selected = useSelectedPlanetId(useUIManager(), startingId).value; + + useEffect(() => { + if (selected !== startingId) { + modal.popAll(); + } + }, [selected, modal, startingId]); +} diff --git a/src/Frontend/Utils/EmitterHooks.ts b/src/Frontend/Utils/EmitterHooks.ts index b8047470..833429e4 100644 --- a/src/Frontend/Utils/EmitterHooks.ts +++ b/src/Frontend/Utils/EmitterHooks.ts @@ -1,7 +1,6 @@ -import _ from 'lodash'; +import { Callback, Monomitter } from '@darkforest_eth/events'; import { useEffect, useState } from 'react'; import { Wrapper } from '../../Backend/Utils/Wrapper'; -import { Monomitter, Callback } from './Monomitter'; /** * Execute something on emitter callback diff --git a/src/Frontend/Utils/EmitterUtils.ts b/src/Frontend/Utils/EmitterUtils.ts index ac74ea77..ef68596b 100644 --- a/src/Frontend/Utils/EmitterUtils.ts +++ b/src/Frontend/Utils/EmitterUtils.ts @@ -1,5 +1,5 @@ +import { monomitter, Monomitter } from '@darkforest_eth/events'; import { Artifact, EthAddress, Planet } from '@darkforest_eth/types'; -import { monomitter, Monomitter } from './Monomitter'; import _ from 'lodash'; /** diff --git a/src/Frontend/Utils/Hats.ts b/src/Frontend/Utils/Hats.ts index 6005e7bd..c95ef43b 100644 --- a/src/Frontend/Utils/Hats.ts +++ b/src/Frontend/Utils/Hats.ts @@ -1,5 +1,5 @@ -import { ProcgenUtils } from '../../Backend/Procedural/ProcgenUtils'; import { LocationId } from '@darkforest_eth/types'; +import { ProcgenUtils } from '../../Backend/Procedural/ProcgenUtils'; export type Hat = { topLayer: Array; diff --git a/src/Frontend/Utils/KeyEmitters.ts b/src/Frontend/Utils/KeyEmitters.ts index 8ef61bdf..1acd39c9 100644 --- a/src/Frontend/Utils/KeyEmitters.ts +++ b/src/Frontend/Utils/KeyEmitters.ts @@ -1,11 +1,14 @@ +import { monomitter } from '@darkforest_eth/events'; +import { useState } from 'react'; import { Wrapper } from '../../Backend/Utils/Wrapper'; -import { monomitter } from './Monomitter'; +import { useEmitterSubscribe } from './EmitterHooks'; /* key emitters */ export const escapeDown$ = monomitter(); export const ctrlDown$ = monomitter(); export const ctrlUp$ = monomitter(); export const keyUp$ = monomitter>(); +export const keyDown$ = monomitter>(); /** * If the user is using their keyboard to input some text somewhere, we should NOT trigger the @@ -21,6 +24,7 @@ document.addEventListener('keydown', (e: KeyboardEvent) => { if (e.key === 'Escape') escapeDown$.publish(e); else if (e.key === 'Control') ctrlDown$.publish(e); + keyDown$.publish(new Wrapper(e.key)); }); document.addEventListener('keyup', (e: KeyboardEvent) => { @@ -29,3 +33,12 @@ document.addEventListener('keyup', (e: KeyboardEvent) => { if (e.key === 'Control') ctrlUp$.publish(e); keyUp$.publish(new Wrapper(e.key)); }); + +export function useIsDown(key?: string) { + const [isDown, setIsDown] = useState(false); + + useEmitterSubscribe(keyDown$, (k) => key !== undefined && k.value === key && setIsDown(true)); + useEmitterSubscribe(keyUp$, (k) => key !== undefined && k.value === key && setIsDown(false)); + + return isDown; +} diff --git a/src/Frontend/Utils/Monomitter.ts b/src/Frontend/Utils/Monomitter.ts deleted file mode 100644 index d51edd46..00000000 --- a/src/Frontend/Utils/Monomitter.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Typed single pub / sub pattern, inspired by: - * https://github.com/loilo/monomitter/blob/master/monomitter.mjs - */ - -export type Callback = (o: T) => void; - -export type Subscription = { - unsubscribe: () => void; -}; - -export type Monomitter = { - publish: (o: T) => void; - subscribe: (cb: Callback) => Subscription; - clear: () => void; -}; - -/** - * Constructs a new event emitter, whose purpose is to emit values of the given type. - * - * @param emitLatestOnSubscribe - if this is true, upon subscription immediately emit - * the most recently set value, if there is one - */ -export function monomitter(emitLatestOnSubscribe = false): Monomitter { - const callbacks = new Set>(); - let valueBeenSet = false; - let latestValue: T | undefined = undefined; - - function publish(value: T) { - valueBeenSet = true; - latestValue = value; - callbacks.forEach((callback) => callback(value)); - } - - function subscribe(callback: (value: T) => void) { - callbacks.add(callback); - - if (emitLatestOnSubscribe && valueBeenSet) { - callback(latestValue as T); - } - - return { unsubscribe: () => callbacks.delete(callback) }; - } - - function clear() { - callbacks.clear(); - } - - return { - publish, - subscribe, - clear, - }; -} diff --git a/src/Frontend/Utils/SettingsHooks.tsx b/src/Frontend/Utils/SettingsHooks.tsx index 796f1dfa..6dfdfeb9 100644 --- a/src/Frontend/Utils/SettingsHooks.tsx +++ b/src/Frontend/Utils/SettingsHooks.tsx @@ -1,11 +1,11 @@ -import { EthAddress } from '@darkforest_eth/types'; +import { CORE_CONTRACT_ADDRESS } from '@darkforest_eth/contracts'; +import { monomitter, Monomitter } from '@darkforest_eth/events'; +import { AutoGasSetting, EthAddress } from '@darkforest_eth/types'; import React, { useState } from 'react'; import styled from 'styled-components'; -import { CORE_CONTRACT_ADDRESS } from '@darkforest_eth/contracts'; import GameUIManager from '../../Backend/GameLogic/GameUIManager'; import { SelectFrom } from '../Components/CoreUI'; import { useEmitterSubscribe } from './EmitterHooks'; -import { monomitter, Monomitter } from './Monomitter'; /** * Whenever a setting changes, we publish the setting's name to this event emitter. @@ -16,6 +16,7 @@ export const settingChanged$: Monomitter = monomitter(); * Each setting has a unique identifier. Each account gets to store its own local storage setting, * per instance of the dark forest contract that it's connected to. */ + export const enum Setting { OptOutMetrics = 'OptOutMetrics', AutoApproveNonPurchaseTransactions = 'AutoApproveNonPurchaseTransactions', @@ -38,12 +39,7 @@ export const enum Setting { NewPlayer = 'NewPlayer', MiningCores = 'MiningCores', TutorialOpen = 'TutorialOpen', -} - -export const enum AutoGasSetting { - Slow = 'Slow', - Average = 'Average', - Fast = 'Fast', + IsMining = 'IsMining', } export const ALL_AUTO_GAS_SETTINGS = [ @@ -52,16 +48,24 @@ export const ALL_AUTO_GAS_SETTINGS = [ AutoGasSetting.Fast, ]; +function onlyInProduction(): string { + return process.env.NODE_ENV === 'production' ? 'true' : 'false'; +} + +function onlyInDevelopment(): string { + return process.env.NODE_ENV !== 'production' ? 'true' : 'false'; +} + const defaultSettings: Record = { - OptOutMetrics: 'false', - AutoApproveNonPurchaseTransactions: 'false', + OptOutMetrics: onlyInDevelopment(), + AutoApproveNonPurchaseTransactions: onlyInDevelopment(), DrawChunkBorders: 'false', HighPerformanceRendering: 'false', MoveNotifications: 'true', - HasAcceptedPluginRisk: 'false', + HasAcceptedPluginRisk: onlyInDevelopment(), GasFeeGwei: AutoGasSetting.Average, TerminalVisible: 'true', - TutorialOpen: 'true', + TutorialOpen: onlyInProduction(), FoundPirates: 'false', TutorialCompleted: 'false', @@ -72,8 +76,10 @@ const defaultSettings: Record = { FoundArtifact: 'false', FoundDeepSpace: 'false', FoundSpace: 'false', - NewPlayer: 'true', + // prevent the tutorial and help pane popping up in development mode. + NewPlayer: onlyInProduction(), MiningCores: '1', + IsMining: 'true', }; /** @@ -244,25 +250,26 @@ export function MultiSelectSetting({ values, labels, style, + wide, }: { uiManager: GameUIManager; setting: Setting; values: string[]; labels: string[]; style?: React.CSSProperties; + wide?: boolean; }) { const [settingValue, setSettingValue] = useSetting(uiManager, setting); return ( - <> - - + ); } diff --git a/src/Frontend/Utils/ShortcutConstants.ts b/src/Frontend/Utils/ShortcutConstants.ts index 34d4f288..f0f672ac 100644 --- a/src/Frontend/Utils/ShortcutConstants.ts +++ b/src/Frontend/Utils/ShortcutConstants.ts @@ -1,8 +1,28 @@ -export const TOGGLE_PLANET_DETAILS_PANE = 'd'; +import { useEffect, useRef } from 'react'; +import { useEmitterValue } from './EmitterHooks'; +import { keyUp$ } from './KeyEmitters'; + +// planet context pane shortcuts export const TOGGLE_PLANET_ARTIFACTS_PANE = 'a'; export const TOGGLE_HAT_PANE = 'h'; export const TOGGLE_BROADCAST_PANE = 'b'; export const TOGGLE_UPGRADES_PANE = 'u'; + +// global shortcuts export const TOGGLE_PLANET_DEX_PANE = 'q'; export const TOGGLE_ARTIFACTS_DEX_PANE = 'e'; export const TOGGLE_DIAGNOSTICS_PANE = 'p'; + +export function useSubscribeToShortcut(key: string | undefined, callback: () => void) { + const keyUp = useEmitterValue(keyUp$, undefined); + const lastKeyUp = useRef(keyUp); + + useEffect(() => { + if (!keyUp || !key) return; + if (lastKeyUp.current === keyUp) return; + if (keyUp.value !== key) return; + + lastKeyUp.current = keyUp; + callback(); + }, [key, keyUp, lastKeyUp, callback]); +} diff --git a/src/Frontend/Utils/constants.ts b/src/Frontend/Utils/constants.ts index 6de9487d..b985fceb 100644 --- a/src/Frontend/Utils/constants.ts +++ b/src/Frontend/Utils/constants.ts @@ -1,6 +1,12 @@ import * as bigInt from 'big-integer'; -const MIN_CHUNK_SIZE = 16; +/** + * To code reviewer, make sure this does not change! + * + * To developer, increase this number to a large power of two. This, in combination with setting + * `DISABLE_ZK_CHECKS` in darkforest.toml, will make you mine the map at ULTRA SPEED! + */ +const MIN_CHUNK_SIZE = 256; /** * @tutorial to speed up the game's background rendering code, it is possible to set this value to @@ -17,11 +23,6 @@ const LOCATION_ID_UB = bigInt( export { MIN_CHUNK_SIZE, MAX_CHUNK_SIZE, LOCATION_ID_UB }; -// no slash at end plz -export const BLOCK_EXPLORER_URL = 'https://blockscout.com/poa/xdai'; - -export const XDAI_CHAIN_ID = 100; - export const HAT_SIZES = [ 'None', 'Tiny HAT', diff --git a/src/Frontend/Views/ArtifactLink.tsx b/src/Frontend/Views/ArtifactLink.tsx index 948109b4..3fe96d6c 100644 --- a/src/Frontend/Views/ArtifactLink.tsx +++ b/src/Frontend/Views/ArtifactLink.tsx @@ -1,26 +1,28 @@ import { Artifact } from '@darkforest_eth/types'; import React, { useCallback } from 'react'; import styled from 'styled-components'; +import { artifactName } from '../../Backend/Procedural/ArtifactProcgen'; +import { ArtifactDetailsPane } from '../Panes/ArtifactDetailsPane'; import dfstyles from '../Styles/dfstyles'; -import { useUIManager } from '../Utils/AppHooks'; +import { ModalHandle } from './ModalPane'; export function ArtifactLink({ - artifact, - setDetailsOpen, + modal, children, + artifact, }: { + modal: ModalHandle; artifact: Artifact; - setDetailsOpen: (open: boolean) => void; - children: React.ReactNode; + children: React.ReactNode | React.ReactNode[]; }) { - const uiManager = useUIManager(); - - const openArtifactDetails = useCallback(() => { - uiManager.selectedArtifactId$.publish(artifact.id); - setDetailsOpen(true); - }, [uiManager, artifact, setDetailsOpen]); + const onClick = useCallback(() => { + modal.push({ + element: , + title: artifactName(artifact), + }); + }, [artifact, modal]); - return {children}; + return {children}; } const LinkContainer = styled.span` diff --git a/src/Frontend/Views/DarkForestTips.tsx b/src/Frontend/Views/DarkForestTips.tsx index 376fc3dd..b5ad05ca 100644 --- a/src/Frontend/Views/DarkForestTips.tsx +++ b/src/Frontend/Views/DarkForestTips.tsx @@ -1,26 +1,14 @@ import _ from 'lodash'; -import React, { useState } from 'react'; -import { useCallback } from 'react'; -import { useEffect } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import styled from 'styled-components'; -import { White } from '../Components/Text'; +import { HeaderText, Spacer, TextButton } from '../Components/CoreUI'; import dfstyles from '../Styles/dfstyles'; -const TextButton = styled.span` - color: ${dfstyles.colors.subtext}; - text-decoration: underline; - cursor: pointer; - user-select: none; - - &:hover { - color: white; - } -`; - const TipText = styled.div` max-width: 500px; color: ${dfstyles.colors.subtext}; word-break: keep-all; + text-align: justify; `; const Link = styled.a` @@ -59,14 +47,17 @@ export function DarkForestTips() { }, [incrementTipIndex]); return ( - <> - Dark Forest Tips{' '} - incrementTipIndex(-1, true)}>previous{' '} - incrementTipIndex(1, true)}>next + + Dark Forest Tips{' '} + + incrementTipIndex(-1, true)}>previous + + incrementTipIndex(1, true)}>next +

{shuffledTips[tipIndex]} - +
); } @@ -74,6 +65,21 @@ export function MakeDarkForestTips() { return ; } +const PrevNextContainer = styled.div` + float: right; +`; + +const TipsContainer = styled.div` + margin-bottom: 8px; + background-color: ${dfstyles.colors.backgroundlighter}; + width: 400px; + height: 250px; + padding: 16px; + border-radius: 3px; + overflow: hidden; + border: 1px solid ${dfstyles.colors.border}; +`; + const tips = [ 'Beware of pirates! To capture a planet with pirates, simply send an attack large enough to overcome its current energy.', <> @@ -85,7 +91,7 @@ const tips = [ , 'There are many different artifact types, each with unique properties... try activating one on a planet!', 'You can talk to artifacts that you own. They are powered by GPT3. Try it out from the Artifact Details pane!', - 'The top 63 players get NFT rewards at the end of this round!', + 'The top 63 players get NFT rewards at the end of each v0.6 round!', "There are many different ways to enjoy Dark Forest - as long as you're having fun, you're doing it right.", 'Be careful when capturing planets - if you attack a player-owned planet, it may look like an act of war!', 'A planet can have at most one active artifact.', @@ -112,7 +118,7 @@ const tips = [ 'Defense upgrades make your planets less vulnerable to attack, Range upgrades make your voyages go further and decay less, and Speed upgrades make your voyages go much faster.', 'Wormhole artifacts reduce the effective distance between 2 planets. Try using them to link 2 planets very far apart!', 'Upon deactivation, most artifacts must cooldown for 24-hours before they can be activated again. However, wormholes go on a 48-hour cooldown!', - 'Photoid Cannon artifacts will debuff your planet on activation, but get a massive stat boost for the first voyage from the planet after that 4 hours. Photoid Cannon artifacts are destroyed upon use.', + 'Photoid Cannon artifacts will debuff your planet on activation, but get a massive stat boost for the first voyage from the planet after that a charging period. Photoid Cannon artifacts are destroyed upon use.', "Planetary Shield artifacts will massively boost a planet's defense, but at the cost of energy and energy growth stats. Planetary Shield artifacts are destroyed upon deactivation.", "Bloom Filter artifacts instantly set a planet's energy and silver to full, but are destroyed upon activation. Try using them on a Quasar!", 'Dark Forest exists on the blockchain, so you can play with an entirely different client if you want.', diff --git a/src/Frontend/Views/EmojiPicker.tsx b/src/Frontend/Views/EmojiPicker.tsx index 9191b7e6..350aa4d2 100644 --- a/src/Frontend/Views/EmojiPicker.tsx +++ b/src/Frontend/Views/EmojiPicker.tsx @@ -1,7 +1,7 @@ +import Picker from 'emoji-picker-react'; import React, { useState } from 'react'; import styled from 'styled-components'; import dfstyles from '../Styles/dfstyles'; -import Picker from 'emoji-picker-react'; export function EmojiPicker({ emoji, @@ -15,19 +15,17 @@ export function EmojiPicker({ return ( setPickerOpen(true)}>{emoji || '\u00a0'} - - { - setEmoji(emojiObject.emoji); - setPickerOpen(false); - }} - /> - + {pickerOpen && ( + + { + setEmoji(emojiObject.emoji); + setPickerOpen(false); + }} + /> + + )} ); } @@ -36,20 +34,20 @@ const SelectedEmoji = styled.div` display: inline-flex; justify-content: center; align-items: center; - background-color: ${dfstyles.colors.backgroundlight}; - border: 1px solid ${dfstyles.colors.subtext}; + border: 1px solid ${dfstyles.colors.border}; border-radius: 3px; cursor: pointer; font-size: 1.5em; width: 30px; height: 30px; - margin-right: 4px; + margin-right: 8px; &:hover { - background-color: ${dfstyles.colors.backgroundlighter}; + background-color: ${dfstyles.colors.backgroundlight}; } - &:hover:active { + &:hover, + &:active { border: 1px solid ${dfstyles.colors.text}; } `; diff --git a/src/Frontend/Views/EmojiPlanetNotification.tsx b/src/Frontend/Views/EmojiPlanetNotification.tsx index b6a7a10b..30bc13d9 100644 --- a/src/Frontend/Views/EmojiPlanetNotification.tsx +++ b/src/Frontend/Views/EmojiPlanetNotification.tsx @@ -1,12 +1,12 @@ -import React, { useState, useEffect } from 'react'; -import styled from 'styled-components'; import { Planet } from '@darkforest_eth/types'; -import { Btn } from '../Components/Btn'; -import { Sub } from '../Components/Text'; -import { Wrapper } from '../../Backend/Utils/Wrapper'; +import React, { useEffect, useState } from 'react'; +import styled from 'styled-components'; import { getEmojiMessage } from '../../Backend/GameLogic/ArrivalUtils'; +import { Wrapper } from '../../Backend/Utils/Wrapper'; +import { Btn } from '../Components/Btn'; import { SpacedFlexRow } from '../Components/FlexRows'; import { LoadingSpinner } from '../Components/LoadingSpinner'; +import { Sub } from '../Components/Text'; import { useUIManager } from '../Utils/AppHooks'; import { EmojiPicker } from './EmojiPicker'; @@ -25,7 +25,7 @@ export function EmojiPlanetNotification({ wrapper }: { wrapper: Wrapper - off-chain data + Off-Chain Data @@ -53,7 +53,7 @@ export function EmojiPlanetNotification({ wrapper }: { wrapper: Wrapper - set planet emoji + Set Planet Emoji: diff --git a/src/Frontend/Views/GameWindowLayout.tsx b/src/Frontend/Views/GameWindowLayout.tsx index 7f89587c..f74bd293 100644 --- a/src/Frontend/Views/GameWindowLayout.tsx +++ b/src/Frontend/Views/GameWindowLayout.tsx @@ -1,33 +1,21 @@ -import React, { useState, useRef } from 'react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import styled from 'styled-components'; +import { BorderlessPane, EmSpacer } from '../Components/CoreUI'; import { - WindowWrapper, - MainWindow, CanvasContainer, - UpperLeft, CanvasWrapper, + MainWindow, + UpperLeft, + WindowWrapper, } from '../Components/GameWindowComponents'; import ControllableCanvas from '../Game/ControllableCanvas'; -import { ArtifactDetailsPane } from '../Panes/ArtifactDetailsPane'; import { CoordsPane } from '../Panes/CoordsPane'; +import { DiagnosticsPane } from '../Panes/DiagnosticsPane'; import { ExplorePane } from '../Panes/ExplorePane'; -import { HatPane } from '../Panes/HatPane'; import { HelpPane } from '../Panes/HelpPane'; -import { ManagePlanetArtifactsPane } from '../Panes/ManagePlanetArtifacts/ManagePlanetArtifactsPane'; -import { - ModalHelpIcon, - ModalPluginIcon, - ModalYourArtifactsIcon, - ModalSettingsIcon, - ModalPlanetDexIcon, - ModalTwitterVerifyIcon, - ModalArtifactIcon, - ModalHatIcon, - ModalPlanetDetailsIcon, - ModalTwitterBroadcastIcon, - ModalUpgradeDetailsIcon, -} from './ModalIcon'; +import { HoverPlanetPane } from '../Panes/HoverPlanetPane'; import OnboardingPane from '../Panes/OnboardingPane'; -import { PlanetDetailsPane } from '../Panes/PlanetDetailsPane'; +import { PlanetContextPane } from '../Panes/PlanetContextPane'; import { PlanetDexPane } from '../Panes/PlanetDexPane'; import { PlayerArtifactsPane } from '../Panes/PlayerArtifactsPane'; import { PluginLibraryPane } from '../Panes/PluginLibraryPane'; @@ -35,45 +23,37 @@ import { PrivatePane } from '../Panes/PrivatePane'; import { SettingsPane } from '../Panes/SettingsPane'; import { Tooltip } from '../Panes/Tooltip'; import { TutorialPane } from '../Panes/TutorialPane'; -import { BroadcastPane } from '../Panes/BroadcastPane'; import { TwitterVerifyPane } from '../Panes/TwitterVerifyPane'; -import { UpgradeDetailsPane } from '../Panes/UpgradeDetailsPane'; import { ZoomPane } from '../Panes/ZoomPane'; import { useSelectedPlanet, useUIManager } from '../Utils/AppHooks'; -import { NotificationsPane } from './Notifications'; -import { useEffect } from 'react'; -import { useEmitterValue } from '../Utils/EmitterHooks'; -import { keyUp$ } from '../Utils/KeyEmitters'; -import { ArtifactId } from '@darkforest_eth/types'; -import { PaidArtifactConversationPane } from '../Panes/PaidArtifactConversation/PaidArtifactConversationPane'; +import { Setting, useBooleanSetting } from '../Utils/SettingsHooks'; import { TOGGLE_ARTIFACTS_DEX_PANE, - TOGGLE_BROADCAST_PANE, TOGGLE_DIAGNOSTICS_PANE, - TOGGLE_HAT_PANE, - TOGGLE_PLANET_ARTIFACTS_PANE, - TOGGLE_PLANET_DETAILS_PANE, TOGGLE_PLANET_DEX_PANE, - TOGGLE_UPGRADES_PANE, + useSubscribeToShortcut, } from '../Utils/ShortcutConstants'; -import { MenuBar, MenuBarSection } from './MenuBar'; -import { PlanetContextPane } from '../Panes/PlanetContextPane'; -import { HoverPlanetPane } from '../Panes/HoverPlanetPane'; +import { + ModalHelpIcon, + ModalPlanetDexIcon, + ModalPluginIcon, + ModalSettingsIcon, + ModalYourArtifactsIcon, +} from './ModalIcon'; +import { NotificationsPane } from './Notifications'; import { TopBar } from './TopBar'; -import { DiagnosticsPane } from '../Panes/DiagnosticsPane'; -import { Setting, useBooleanSetting } from '../Utils/SettingsHooks'; - -export function GameWindowLayout() { - const planetDetHook = useState(false); +export function GameWindowLayout({ + terminalVisible, + setTerminalVisible, +}: { + terminalVisible: boolean; + setTerminalVisible: (visible: boolean) => void; +}) { const helpHook = useState(false); const planetdexHook = useState(false); const yourArtifactsHook = useState(false); - const upgradeDetHook = useState(false); const twitterVerifyHook = useState(false); - const twitterBroadcastHook = useState(false); - const hatHook = useState(false); - const manageArtifactsHook = useState(false); const settingsHook = useState(false); const privateHook = useState(false); const pluginsHook = useState(false); @@ -87,97 +67,70 @@ export function GameWindowLayout() { const diagnosticsHook = useState(false); const [, setSelectedPlanetVisible] = selectedPlanetHook; - useEffect(() => setSelectedPlanetVisible(!!selected), [selected, setSelectedPlanetVisible]); - - /* artifact stuff */ - const artifactDetailsHook = useState(false); - const artifactConversationHook = useState(false); - const [convoArtifactId, setConvoArtifactId] = useState(); - - const keyUp = useEmitterValue(keyUp$, undefined); - const lastKeyUp = useRef(keyUp); + const [userTerminalVisibleSetting, setTerminalVisibleSetting] = useBooleanSetting( + uiManager, + Setting.TerminalVisible + ); + const account = uiManager.getAccount(); useEffect(() => { - if (!keyUp) return; - if (lastKeyUp.current === keyUp) return; - lastKeyUp.current = keyUp; - - let paneHook; - - if (keyUp.value === TOGGLE_PLANET_DETAILS_PANE) { - paneHook = planetDetHook; - } else if (keyUp.value === TOGGLE_PLANET_ARTIFACTS_PANE) { - paneHook = manageArtifactsHook; - } else if (keyUp.value === TOGGLE_HAT_PANE) { - paneHook = hatHook; - } else if (keyUp.value === TOGGLE_BROADCAST_PANE) { - paneHook = twitterBroadcastHook; - } else if (keyUp.value === TOGGLE_UPGRADES_PANE) { - paneHook = upgradeDetHook; - } else if (keyUp.value === TOGGLE_PLANET_DEX_PANE) { - paneHook = planetdexHook; - } else if (keyUp.value === TOGGLE_ARTIFACTS_DEX_PANE) { - paneHook = yourArtifactsHook; - } else if (keyUp.value === TOGGLE_DIAGNOSTICS_PANE) { - paneHook = diagnosticsHook; + if (uiManager.getAccount()) { + setTerminalVisible(uiManager.getBooleanSetting(Setting.TerminalVisible)); } + }, [account, uiManager, setTerminalVisible]); - if (paneHook) { - paneHook[1]((value) => !value); - } - }, [ - keyUp, - hatHook, - manageArtifactsHook, - planetDetHook, - twitterBroadcastHook, - upgradeDetHook, - planetdexHook, - yourArtifactsHook, - diagnosticsHook, - ]); - - const openConversationForArtifact = (id: ArtifactId) => { - if (id) { - artifactConversationHook[1](true); - setConvoArtifactId(id); - } else { - artifactConversationHook[1](false); + useEffect(() => { + if (userTerminalVisibleSetting !== terminalVisible) { + setTerminalVisibleSetting(terminalVisible); } - }; + }, [userTerminalVisibleSetting, setTerminalVisibleSetting, terminalVisible]); - const convoArtifact = convoArtifactId && uiManager.getArtifactMap().get(convoArtifactId); + useEffect(() => setSelectedPlanetVisible(!!selected), [selected, setSelectedPlanetVisible]); + + useSubscribeToShortcut( + TOGGLE_PLANET_DEX_PANE, + useCallback(() => { + planetdexHook[1](true); + }, [planetdexHook]) + ); + + useSubscribeToShortcut( + TOGGLE_ARTIFACTS_DEX_PANE, + useCallback(() => { + yourArtifactsHook[1](true); + }, [yourArtifactsHook]) + ); + + useSubscribeToShortcut( + TOGGLE_DIAGNOSTICS_PANE, + useCallback(() => { + diagnosticsHook[1](true); + }, [diagnosticsHook]) + ); return ( + + + + + + {/* all modals rendered into here */}
- - - - - - - - - + + {modalsContainerRef.current && ( - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -230,3 +218,23 @@ export function GameWindowLayout() { ); } + +const WindowTogglesPaneContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + position: absolute; + top: 0; + left: 0; +`; + +const TopBarPaneContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; + width: 100vw; + position: absolute; + top: 0; + left: 0; +`; diff --git a/src/Frontend/Views/Leaderboard.tsx b/src/Frontend/Views/Leaderboard.tsx index 5108ab7d..466e224f 100644 --- a/src/Frontend/Views/Leaderboard.tsx +++ b/src/Frontend/Views/Leaderboard.tsx @@ -1,9 +1,8 @@ -import { Leaderboard, ArtifactRarity } from '@darkforest_eth/types'; -import _ from 'lodash'; -import React, { useState } from 'react'; -import { useEffect } from 'react'; +import { ArtifactRarity, Leaderboard } from '@darkforest_eth/types'; +import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; import { Spacer } from '../Components/CoreUI'; +import { TwitterLink } from '../Components/Labels/Labels'; import { LoadingSpinner } from '../Components/LoadingSpinner'; import { Red } from '../Components/Text'; import { TextPreview } from '../Components/TextPreview'; @@ -44,16 +43,20 @@ function scoreToString(score: number) { // pass in either an address, or a twitter handle. this function will render the appropriate // component -function playerToEntry(playerStr: string) { +function playerToEntry(playerStr: string, color: string) { // if this is an address if (playerStr.startsWith('0x') && playerStr.length === 42) { - return ; + return ; } - return @{playerStr}; + return ; } -function getRankColor(rank: number) { +function getRankColor([rank, score]: [number, number]) { + if (score === 0) { + return dfstyles.colors.subtext; + } + if (rank === 0) { return RarityColors[ArtifactRarity.Mythic]; } @@ -81,14 +84,6 @@ function getRankColor(rank: number) { return dfstyles.colors.subtext; } -const LinkToTwitter = styled.a` - text-decoration: underline; - - &:hover { - color: #a59bff; - } -`; - function LeaderboardTable({ rows }: { rows: Array<[string, number]> }) { return ( @@ -102,15 +97,18 @@ function LeaderboardTable({ rows }: { rows: Array<[string, number]> }) { rows={rows} columns={[ (row: [string, number], i) => ( - + {row[1] === 0 ? 'unranked' : i + 1 + '.'} ), (row: [string, number], i) => { - return {playerToEntry(row[0])}; + const color = getRankColor([i, row[1]]); + return {playerToEntry(row[0], color)}; }, (row: [string, number], i) => { - return {scoreToString(row[1])}; + return ( + {scoreToString(row[1])} + ); }, ]} /> diff --git a/src/Frontend/Views/MenuBar.tsx b/src/Frontend/Views/MenuBar.tsx deleted file mode 100644 index 57fa4b6c..00000000 --- a/src/Frontend/Views/MenuBar.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import React, { useState } from 'react'; -import styled from 'styled-components'; -import { Hook } from '../../_types/global/GlobalTypes'; -import dfstyles from '../Styles/dfstyles'; -import { GameWindowZIndex } from '../Utils/constants'; -import { LongDash } from '../Components/Text'; - -/** Left bar (with all the modal icons) */ - -export const MenuBar = styled.div` - background: ${dfstyles.colors.background}; - z-index: ${GameWindowZIndex.MenuBar}; - border-right: 1px solid ${dfstyles.colors.subtext}; - border-bottom: 1px solid ${dfstyles.colors.subtext}; - - & > div { - border-top: 1px solid ${dfstyles.colors.subtext}; - - &:first-child { - border-top: none; - } - } - - border-bottom-right-radius: ${dfstyles.borderRadius}; -`; - -const StyledMenuBarSection = styled.div` - padding: 0.5em; - width: fit-content; - - display: flex; - flex-direction: column; - - & > span { - margin-top: 4pt; - &:first-child { - margin-top: 0; - } - } -`; - -const StyledCollapser = styled.span` - width: 1.5em; - text-align: center; - color: ${dfstyles.colors.subtext}; - - &:hover { - cursor: pointer; - color: ${dfstyles.colors.text}; - } -`; - -function Collapser({ - expanded, - setExpanded, -}: { - expanded: boolean; - setExpanded: Hook[1]; -}) { - return ( - setExpanded((b: boolean) => !b)}> - {expanded ? : '+'} - - ); -} - -export function MenuBarSection({ - children, - collapsible, -}: { - children: React.ReactNode; - collapsible?: boolean; -}) { - const [expanded, setExpanded] = useState(true); - - return ( - - {(!collapsible || (collapsible && expanded)) && children} - {collapsible && } - - ); -} diff --git a/src/Frontend/Views/ModalIcon.tsx b/src/Frontend/Views/ModalIcon.tsx index 9195a777..ed125fe7 100644 --- a/src/Frontend/Views/ModalIcon.tsx +++ b/src/Frontend/Views/ModalIcon.tsx @@ -1,40 +1,48 @@ import React from 'react'; +import styled from 'styled-components'; +import { Spacer } from '../Components/CoreUI'; import { IconButton } from '../Components/IconButton'; import { + ArtifactIcon, + BroadcastIcon, + HatIcon, HelpIcon, - PlanetIcon, LeaderboardIcon, - PlanetdexIcon, - UpgradeIcon, - TwitterIcon, - BroadcastIcon, - ShareIcon, LockIcon, - HatIcon, - SettingsIcon, + PlanetdexIcon, + PlanetIcon, PluginIcon, - ArtifactIcon, + SettingsIcon, + ShareIcon, + TwitterIcon, + UpgradeIcon, WithdrawIcon, } from '../Components/Icons'; -import { TooltipName } from '../Game/WindowManager'; -import { ModalName, ModalHook } from './ModalPane'; -import { TooltipTrigger } from '../Panes/Tooltip'; +import { ModalHook, ModalName } from './ModalPane'; + +const ModalIconText = styled.span` + flex-grow: 1; +`; export function ModalIcon({ modal, hook: [active, setActive], + text, + style, }: { modal: ModalName; hook: ModalHook; + text?: string; + style?: React.CSSProperties; }) { - const child = (): React.ReactNode => { + const icon = (): React.ReactNode => { if (modal === ModalName.Help) return ; else if (modal === ModalName.PlanetDetails) return ; else if (modal === ModalName.Leaderboard) return ; else if (modal === ModalName.PlanetDex) return ; else if (modal === ModalName.UpgradeDetails) return ; else if (modal === ModalName.TwitterVerify) return ; - else if (modal === ModalName.TwitterBroadcast) return ; + else if (modal === ModalName.Broadcast) return ; else if (modal === ModalName.MapShare) return ; else if (modal === ModalName.ManageAccount) return ; else if (modal === ModalName.Hats) return ; @@ -46,84 +54,213 @@ export function ModalIcon({ }; return ( - { + setActive((b) => !b); + e.stopPropagation(); + }} + className={active ? 'active' : undefined} > - { - setActive((b) => !b); - e.stopPropagation(); - }} - className={active ? 'active' : undefined} - > - {child()} - - + {icon()} + {text !== undefined && ( + + + {text} + + )} + ); } -export function ModalArtifactIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalArtifactIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalHelpIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalHelpIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalPlanetDetailsIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalPlanetDetailsIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalLeaderboardIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalLeaderboardIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalPlanetDexIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalPlanetDexIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalUpgradeDetailsIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalUpgradeDetailsIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalMapShareIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalMapShareIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalTwitterVerifyIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalTwitterVerifyIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalYourArtifactsIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalYourArtifactsIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalTwitterBroadcastIcon({ hook }: { hook: ModalHook }) { - return ; +export function BroadcastPlanetIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalAccountIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalAccountIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalHatIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalHatIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalSettingsIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalSettingsIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalPluginIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalPluginIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalArtifactsConversationIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalArtifactsConversationIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } -export function ModalWithdrawIcon({ hook }: { hook: ModalHook }) { - return ; +export function ModalWithdrawIcon({ + hook, + text, + style, +}: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; +}) { + return ; } diff --git a/src/Frontend/Views/ModalPane.tsx b/src/Frontend/Views/ModalPane.tsx index ab03a419..3ca418ee 100644 --- a/src/Frontend/Views/ModalPane.tsx +++ b/src/Frontend/Views/ModalPane.tsx @@ -1,8 +1,8 @@ -import React, { useState, useRef, useCallback, useEffect, useLayoutEffect } from 'react'; +import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; import styled, { css } from 'styled-components'; import { Hook } from '../../_types/global/GlobalTypes'; import { Btn } from '../Components/Btn'; -import { Spacer, Truncate } from '../Components/CoreUI'; +import { EmSpacer, Spacer, Truncate } from '../Components/CoreUI'; import { PaneProps } from '../Components/GameWindowComponents'; import { CloseCircleIcon, @@ -15,8 +15,6 @@ import dfstyles from '../Styles/dfstyles'; import { GameWindowZIndex } from '../Utils/constants'; import { DFErrorBoundary } from './DFErrorBoundary'; -export const RECOMMENDED_WIDTH = '450px'; - export type ModalHook = Hook; export const enum ModalName { @@ -26,7 +24,7 @@ export const enum ModalName { PlanetDex, UpgradeDetails, TwitterVerify, - TwitterBroadcast, + Broadcast, Hats, Settings, YourArtifacts, @@ -56,9 +54,7 @@ function InformationSection({ {children} - - close help - + close help @@ -102,7 +98,7 @@ const ModalButton = styled.div` font-size: 1.5em; span svg path { - fill: #c2c2c2 !important; + fill: ${dfstyles.colors.subbertext} !important; } span:hover svg path { @@ -138,7 +134,7 @@ const Modal = styled.div` height: fit-content; background: ${dfstyles.colors.background}; border-radius: ${dfstyles.borderRadius}; - border: 1px solid ${dfstyles.colors.subtext}; + border: 1px solid ${dfstyles.colors.border}; `; /** @@ -154,6 +150,7 @@ const Content = styled.div` const Title = styled(Truncate)` flex-grow: 1; text-align: left; + color: ${dfstyles.colors.subtext}; `; /** @@ -168,14 +165,11 @@ const TitleBar = styled.div` height: 2.5em; cursor: grab; padding: 8px; - background-color: ${dfstyles.colors.backgroundlight}; - border-bottom: 1px solid ${minimized ? 'transparent' : dfstyles.colors.subtext}; + background-color: ${dfstyles.colors.background}; + border-bottom: 1px solid ${minimized ? 'transparent' : dfstyles.colors.subbertext}; display: flex; justify-content: center; align-items: flex-end; - &:hover { - background: ${dfstyles.colors.backgroundlighter}; - } `} `; @@ -197,6 +191,42 @@ const clipY = (y: number, height: number): number => { return newY; }; +export type ModalProps = PaneProps & { + title: string | React.ReactNode; + hook: Hook; + name?: ModalName; + hideClose?: boolean; + style?: React.CSSProperties; + noPadding?: boolean; + helpContent?: () => React.ReactNode; + width?: string; + borderColor?: string; + backgroundColor?: string; + titlebarColor?: string; + initialPosition?: { + x: number; + y: number; + }; +}; + +/** + * A modal has a {@code content}, and also optionally many {@link ModalFrames} pushed on top of it. + */ +export interface ModalFrame { + title: string; + element: React.ReactElement; + helpContent?: React.ReactElement; +} + +/** + * @todo Add things like open, close, set position, etc. Get rid of {@code ModalHook}. + */ +export interface ModalHandle { + push(frame: ModalFrame): void; + popAll(): void; + pop(): void; +} + export function ModalPane({ children, title, @@ -209,19 +239,12 @@ export function ModalPane({ borderColor, backgroundColor, titlebarColor, -}: PaneProps & { - hook: Hook; - name?: ModalName; - hideClose?: boolean; - style?: React.CSSProperties; - noPadding?: boolean; - helpContent?: () => React.ReactNode; - width?: string; - borderColor?: string; - backgroundColor?: string; - titlebarColor?: string; -}) { + initialPosition, +}: ModalProps) { const windowManager = WindowManager.getInstance(); + const [frames, setFrames] = useState([]); + const [renderedFrame, setRenderedFrame] = useState(); + const [renderedFrameHelp, setRenderedFrameHelp] = useState(); const [minimized, setMinimized] = useState(false); const [coords, setCoords] = useState(null); const [delCoords, setDelCoords] = useState(null); @@ -231,8 +254,6 @@ export function ModalPane({ const [zIndex, setZIndex] = useState(GameWindowZIndex.Modal); const containerRef = useRef(document.createElement('div')); const headerRef = useRef(document.createElement('div')); - const [left, setLeft] = useState(0); - const [top, setTop] = useState(0); const push = useCallback(() => setZIndex(windowManager.getIndex()), [windowManager]); const [gameSize, setGameSize] = useState< @@ -243,6 +264,39 @@ export function ModalPane({ | undefined >(); const [showingInformationSection, setShowingInformationSection] = useState(false); + const onMouseDown = useCallback( + (e: React.SyntheticEvent) => { + push(); + e.stopPropagation(); + }, + [push] + ); + + const showingHelp = helpContent !== undefined && showingInformationSection; + const currentWidth = minimized || showingHelp ? '' : width; + + const api: ModalHandle = useMemo( + () => ({ + pop: () => { + setFrames((frames) => { + frames = [...frames]; + frames.pop(); + return frames; + }); + }, + push: (args: ModalFrame) => { + setFrames((frames) => { + frames = [...frames]; + frames.push(args); + return frames; + }); + }, + popAll: () => { + setFrames([]); + }, + }), + [] + ); useEffect(() => { const onResize = () => { @@ -326,13 +380,18 @@ export function ModalPane({ }; }, [visible, clicking, mousedownCoords, coords]); - // inits at center + // inits at, or provided initial coordinates useLayoutEffect(() => { - const newX = 0.5 * (window.innerWidth - containerRef.current.offsetWidth); - const newY = 0.5 * (window.innerHeight - containerRef.current.offsetHeight); - setCoords({ x: newX, y: newY }); + if (initialPosition) { + setCoords(initialPosition); + } else { + const newX = 0.5 * (window.innerWidth - containerRef.current.offsetWidth); + const newY = 0.5 * (window.innerHeight - containerRef.current.offsetHeight); + setCoords({ x: newX, y: newY }); + } + push(); - }, [containerRef, windowManager, push]); + }, [containerRef, windowManager, push, initialPosition]); // push to top useLayoutEffect(() => { @@ -346,8 +405,14 @@ export function ModalPane({ if (!coords) return; const delX = delCoords ? delCoords.x : 0; const delY = delCoords ? delCoords.y : 0; - setLeft(clipX(coords.x + delX, containerRef.current.offsetWidth)); - setTop(clipY(coords.y + delY, containerRef.current.offsetHeight)); + + const left = clipX(coords.x + delX, containerRef.current.offsetWidth) + 'px'; + const top = clipY(coords.y + delY, containerRef.current.offsetHeight) + 'px'; + + if (containerRef.current) { + containerRef.current.style.left = left; + containerRef.current.style.top = top; + } }, [ coords, delCoords, @@ -357,23 +422,51 @@ export function ModalPane({ containerRef.current.offsetHeight, ]); - const onMouseDown = useCallback( - (e: React.SyntheticEvent) => { - push(); - e.stopPropagation(); - }, - [push] + useEffect(() => { + const topFrame = frames[frames.length - 1]; + setRenderedFrame((topFrame && topFrame.element) || undefined); + setRenderedFrameHelp((topFrame && topFrame.helpContent) || undefined); + }, [frames, api]); + + const content = ( +
+ {renderedFrame} + {!renderedFrame && ( +
+ {typeof children === 'function' ? children(api) : children} +
+ )} +
); - const showingHelp = helpContent !== undefined && showingInformationSection; - const currentWidth = minimized || showingHelp ? '' : width; + function getFrameTitle(args: ModalFrame) { + return ` > ${args.title}`; + } + const modalTitleElement = typeof title === 'string' ? title : title(frames.length > 0); + const allSubModalTitleElements = frames.map(getFrameTitle); + + const mainTitle = ( + <> + {frames.length > 0 && ( + <> + { + api.pop(); + }} + > + Back + + + + )} + {modalTitleElement} + + ); return ( - {title} + + {mainTitle} + {allSubModalTitleElements} + <Spacer width={16} /> + {/* render the 'close' and 'help me' buttons, depending on whether or not they're relevant */} @@ -433,13 +530,13 @@ export function ModalPane({ style={{ display: minimized || !showingHelp ? 'none' : undefined }} hide={() => setShowingInformationSection(false)} > - {helpContent && helpContent()} + {renderedFrameHelp || (helpContent && helpContent())} - {children} + {content} ); diff --git a/src/Frontend/Views/Notifications.tsx b/src/Frontend/Views/Notifications.tsx index 42b7751e..d6ebaa90 100644 --- a/src/Frontend/Views/Notifications.tsx +++ b/src/Frontend/Views/Notifications.tsx @@ -1,11 +1,11 @@ +import { ContractMethodName } from '@darkforest_eth/types'; import _ from 'lodash'; -import React, { useState, useEffect } from 'react'; -import styled, { keyframes, css } from 'styled-components'; -import { EthTxType } from '@darkforest_eth/types'; +import React, { useEffect, useState } from 'react'; +import styled, { css, keyframes } from 'styled-components'; import NotificationManager, { NotificationInfo, - NotificationType, NotificationManagerEvent, + NotificationType, } from '../Game/NotificationManager'; import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; @@ -114,7 +114,11 @@ export function NotificationsPane() { const addNotif = (notif: NotificationInfo) => { const notifMove = uiManager.getBooleanSetting(Setting.MoveNotifications); - if (!notifMove && notif.type === NotificationType.Tx && notif.txData?.type === EthTxType.MOVE) + if ( + !notifMove && + notif.type === NotificationType.Tx && + notif.txData?.methodName === ContractMethodName.MOVE + ) return; setNotifs((arr) => { diff --git a/src/Frontend/Views/OwnedPluginView.tsx b/src/Frontend/Views/OwnedPluginView.tsx index 89b03b7d..3c39a2bd 100644 --- a/src/Frontend/Views/OwnedPluginView.tsx +++ b/src/Frontend/Views/OwnedPluginView.tsx @@ -3,7 +3,7 @@ import styled from 'styled-components'; import { PluginManager } from '../../Backend/GameLogic/PluginManager'; import { PluginId, SerializedPlugin } from '../../Backend/Plugins/SerializedPlugin'; import { Btn } from '../Components/Btn'; -import { PluginElements, Truncate, Spacer } from '../Components/CoreUI'; +import { PluginElements, Spacer, Truncate } from '../Components/CoreUI'; import { RemoteModal } from '../Components/RemoteModal'; import dfstyles from '../Styles/dfstyles'; diff --git a/src/Frontend/Views/PlanetCard.tsx b/src/Frontend/Views/PlanetCard.tsx index 32ae2720..0e81290a 100644 --- a/src/Frontend/Views/PlanetCard.tsx +++ b/src/Frontend/Views/PlanetCard.tsx @@ -1,14 +1,13 @@ import { Planet, PlanetType } from '@darkforest_eth/types'; import React from 'react'; -import { useMemo } from 'react'; import { ProcgenUtils } from '../../Backend/Procedural/ProcgenUtils'; import { Wrapper } from '../../Backend/Utils/Wrapper'; import { StatIdx } from '../../_types/global/GlobalTypes'; +import { EmSpacer, HorizontalFlex, InlineBlock, Padded } from '../Components/CoreUI'; import { DefenseIcon, EnergyGrowthIcon, EnergyIcon, - RangeIcon, SilverGrowthIcon, SilverIcon, SpeedIcon, @@ -16,138 +15,172 @@ import { import { DefenseText, EnergyGrowthText, - PlanetEnergyLabel, - LevelRankTextEm, PlanetBiomeTypeLabelAnim, - PlanetOwnerLabel, - RangeText, - SilverGrowthText, + PlanetEnergyLabel, + PlanetLevel, + PlanetRank, PlanetSilverLabel, + SilverGrowthText, SpeedText, } from '../Components/Labels/PlanetLabels'; -import { PlanetPreview } from '../Components/PlanetPreview'; -import { Red } from '../Components/Text'; +import { ReadMore } from '../Components/ReadMore'; +import { TextPreview } from '../Components/TextPreview'; import { TooltipName } from '../Game/WindowManager'; import { PlanetIcons } from '../Renderers/PlanetscapeRenderer/PlanetIcons'; -import { useUIManager, useActiveArtifact } from '../Utils/AppHooks'; +import { useActiveArtifact, useUIManager } from '../Utils/AppHooks'; import { - StyledPlanetCard, - PreviewSection, - PlanetTag, - IconsWrapper, - StatSection, - BigStatCell, - RowTip, - Small, - StatRow, - TitleBar, - TopRow, + DestroyedMarker, PCStatIcon, - ArtifactSection, PlanetActiveArtifact, - DestroyedMarker, + RowTip, + StatContainer, + TitleBar, } from './PlanetCardComponents'; -const DestroyedLabel = () => ( - <> - DESTROYED{' '} - -); +export function PlanetCardTitle({ + planet, + small, +}: { + planet: Wrapper; + small?: boolean; +}) { + if (!planet.value) return <>; + if (small) return <>{ProcgenUtils.getPlanetName(planet.value)}; + + return ( + + {planet.value.destroyed && ( + <> + + + + )} + {ProcgenUtils.getPlanetName(planet.value)} + + + + ); +} /** Preview basic planet information - used in `PlanetContextPane` and `HoverPlanetPane` */ -export function PlanetCard({ planetWrapper: p }: { planetWrapper: Wrapper }) { +export function PlanetCard({ + planetWrapper: p, + standalone, +}: { + planetWrapper: Wrapper; + standalone?: boolean; +}) { const uiManager = useUIManager(); const active = useActiveArtifact(p, uiManager); const planet = p.value; - const isSilverMine = useMemo( - () => p.value?.planetType === PlanetType.SILVER_MINE, - [p.value?.planetType] - ); - - const destroyed = p.value?.destroyed; - return ( - - -

- {destroyed && } - {ProcgenUtils.getPlanetName(planet)} -

-

- -

-
- - {destroyed && } - - -

+

+ {standalone && ( + + + + )} + + + + + + + + -

-

- -

- - - - - - - - - +
+
+
+ + + +
+ - - - - - - - - - - - - - - - - - - {isSilverMine && ( - - - - - - - )} - - - - - - - - - - - - - - - - - - - - - {active && ( - - - - )} - + + Energy + +
+ + +
+ + +
+ + + Silver +
+ +
+ + +
+ + + + + + Energy Growth + +
+ +
+ + {(p.value?.planetType === PlanetType.SILVER_MINE && ( + +
+ + + + + + Silver Growth + +
+ +
+ )) || <>} + + +
+ + + + + + Defense + +
+ +
+ + +
+ + + + + + Speed + +
+ +
+ + +
Owner Address
+ {' '} +
+ + +
Planet Id
+ +
+
+ {active && } +
); } diff --git a/src/Frontend/Views/PlanetCardComponents.tsx b/src/Frontend/Views/PlanetCardComponents.tsx index 03f6399a..b30e2caf 100644 --- a/src/Frontend/Views/PlanetCardComponents.tsx +++ b/src/Frontend/Views/PlanetCardComponents.tsx @@ -1,11 +1,7 @@ -import { Artifact, Planet, PlanetType } from '@darkforest_eth/types'; +import { Artifact, Planet } from '@darkforest_eth/types'; import React from 'react'; -import styled from 'styled-components'; +import styled, { css } from 'styled-components'; import { StatIdx } from '../../_types/global/GlobalTypes'; -import { TooltipName } from '../Game/WindowManager'; -import { TooltipTrigger } from '../Panes/Tooltip'; -import { planetBackground } from '../Styles/Mixins'; -import dfstyles from '../Styles/dfstyles'; import { ArtifactImage } from '../Components/ArtifactImage'; import { ArtifactBiomeText, @@ -13,18 +9,10 @@ import { ArtifactTypeText, } from '../Components/Labels/ArtifactLabels'; import { Sub } from '../Components/Text'; - -export const StyledPlanetCard = styled.div` - width: 100%; -`; - -export const PreviewSection = styled.div` - height: fit-content; - display: flex; - flex-direction: row; - justify-content: space-between; - position: relative; -`; +import { TooltipName } from '../Game/WindowManager'; +import { TooltipTrigger } from '../Panes/Tooltip'; +import dfstyles from '../Styles/dfstyles'; +import { planetBackground } from '../Styles/Mixins'; export const DestroyedMarker = styled.div` position: absolute; @@ -40,28 +28,8 @@ export const DestroyedMarker = styled.div` `; export const PlanetTag = styled.div<{ planet: Planet | undefined }>` - flex-grow: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - padding: 0.5em; - border-left: 1px solid ${dfstyles.colors.subtext}; - - ${planetBackground} -`; - -export const IconsWrapper = styled.div` - position: relative; - - width: fit-content; -`; - -export const StatSection = styled.div` - border-top: 1px solid ${dfstyles.colors.subtext}; -`; - -export const ArtifactSection = styled.div` - border-top: 1px solid ${dfstyles.colors.subtext}; + width: 100%; + overflow: hidden; `; export const StatRow = styled.div` @@ -70,10 +38,6 @@ export const StatRow = styled.div` justify-content: space-between; `; -export const TopRow = styled(StatRow)` - border-bottom: 1px solid ${dfstyles.colors.subbertext}; -`; - export const StatCell = styled.div` flex-grow: 1; padding: 3px 6px; @@ -83,7 +47,6 @@ export const StatCell = styled.div` flex-direction: row; align-items: center; - border-left: 1px solid ${dfstyles.colors.subbertext}; &:first-child { border-left: none; } @@ -97,8 +60,6 @@ const StyledTimesTwo = styled.span` const TimesTwo = () => x2; -export const StyledStatIcon = styled.span``; - export function PCStatIcon({ planet, children, @@ -109,24 +70,22 @@ export function PCStatIcon({ stat: StatIdx; }) { return ( - + {children} {planet?.bonus && planet.bonus[stat] && ( )} - + ); } -export const Small = styled(StatCell)<{ planet: Planet | undefined }>` - width: ${({ planet: p }) => (p?.planetType === PlanetType.SILVER_MINE ? '25%' : '20%')}; - font-size: 0.8em; -`; - -export const BigStatCell = styled(StatCell)` - width: 50%; +export const StatContainer = styled(StatCell)` + ${({ wide }: { wide?: boolean }) => css` + width: ${wide ? '100%' : '50%'}; + box-sizing: border-box; + `} `; export const RowTip = ({ name, children }: { name: TooltipName; children: React.ReactNode }) => ( @@ -137,11 +96,11 @@ export const RowTip = ({ name, children }: { name: TooltipName; children: React. export const TitleBar = styled.div` height: 2em; - border-bottom: 1px solid ${dfstyles.colors.subtext}; padding: 0.25em 0.5em; display: flex; flex-direction: row; justify-content: space-between; + border-bottom: 1px solid ${dfstyles.colors.border}; `; const StyledPlanetActiveArtifact = styled.div<{ planet: Planet | undefined }>` diff --git a/src/Frontend/Views/PlanetNotifications.tsx b/src/Frontend/Views/PlanetNotifications.tsx index 18ff171f..c555bd13 100644 --- a/src/Frontend/Views/PlanetNotifications.tsx +++ b/src/Frontend/Views/PlanetNotifications.tsx @@ -1,20 +1,20 @@ -import React, { useCallback } from 'react'; import { Planet } from '@darkforest_eth/types'; +import React, { useCallback } from 'react'; import styled from 'styled-components'; import { enoughEnergyToProspect, isFindable, isProspectable, } from '../../Backend/GameLogic/ArrivalUtils'; -import { SpacedFlexRow } from '../Components/FlexRows'; +import { GameObjects } from '../../Backend/GameLogic/GameObjects'; +import { Wrapper } from '../../Backend/Utils/Wrapper'; import { Btn } from '../Components/Btn'; +import { Display } from '../Components/CoreUI'; +import { SpacedFlexRow } from '../Components/FlexRows'; +import { LoadingSpinner } from '../Components/LoadingSpinner'; import { Sub } from '../Components/Text'; -import { ModalHook } from './ModalPane'; import dfstyles from '../Styles/dfstyles'; -import { Wrapper } from '../../Backend/Utils/Wrapper'; -import { LoadingSpinner } from '../Components/LoadingSpinner'; import { useUIManager } from '../Utils/AppHooks'; -import { GameObjects } from '../../Backend/GameLogic/GameObjects'; import { EmojiPlanetNotification } from './EmojiPlanetNotification'; export const enum PlanetNotifType { @@ -27,11 +27,15 @@ export const enum PlanetNotifType { const StyledPlanetNotifications = styled.div` font-size: ${dfstyles.fontSizeXS}; -`; -export type PlanetNotifHooks = { - upgradeDetHook: ModalHook; -}; + > div { + margin-bottom: 4px; + + &:last { + margin-bottom: 0; + } + } +`; export function getNotifsForPlanet( planet: Planet | undefined, @@ -50,19 +54,13 @@ export function getNotifsForPlanet( return notifs; } -const Wrap = styled.div` - width: 100%; - height: fit-content; -`; - function EmojiRow({ wrapper }: { wrapper: Wrapper }) { return ; } -const PlanetCanUpgradeRow = ({ upgradeDetHook }: PlanetNotifHooks) => ( +const PlanetCanUpgradeRow = () => ( This planet can upgrade! - upgradeDetHook[1](true)}>View ); @@ -72,16 +70,16 @@ const PlanetMaxSilverRow = () => ( ); -function FindArtifactRow({ wrapper }: { wrapper: Wrapper }) { +function FindArtifactRow({ planet }: { planet: Wrapper }) { const uiManager = useUIManager(); - const locId = wrapper.value?.locationId; + const locId = planet.value?.locationId; const find = useCallback(() => locId && uiManager?.findArtifact(locId), [locId, uiManager]); return ( Find an artifact on this Foundry for points! - {wrapper.value?.unconfirmedFindArtifact ? ( + {planet.value?.unconfirmedFindArtifact ? ( @@ -92,17 +90,17 @@ function FindArtifactRow({ wrapper }: { wrapper: Wrapper }) ); } -function CanProspectRow({ wrapper }: { wrapper: Wrapper }) { +function CanProspectRow({ planet }: { planet: Wrapper }) { const uiManager = useUIManager(); const prospect = useCallback( - () => wrapper.value && uiManager?.prospectPlanet(wrapper.value.locationId), - [wrapper, uiManager] + () => planet.value && uiManager?.prospectPlanet(planet.value.locationId), + [planet, uiManager] ); return ( You can prospect this Foundry! - {wrapper.value?.unconfirmedProspectPlanet ? ( + {planet.value?.unconfirmedProspectPlanet ? ( @@ -115,21 +113,31 @@ function CanProspectRow({ wrapper }: { wrapper: Wrapper }) { export function PlanetNotifications({ notifs, - wrapper, - upgradeDetHook, -}: { notifs: PlanetNotifType[]; wrapper: Wrapper } & PlanetNotifHooks) { + planet, +}: { + notifs: PlanetNotifType[]; + planet: Wrapper; +}) { return ( - {notifs.map((notif) => ( - - {notif === PlanetNotifType.PlanetCanUpgrade && ( - - )} - {notif === PlanetNotifType.MaxSilver && } - {notif === PlanetNotifType.CanFindArtifact && } - {notif === PlanetNotifType.CanProspect && } - {notif === PlanetNotifType.CanAddEmoji && } - + {notifs.map((notif, i) => ( +
+ + + + + + + + + + + + + + + +
))}
); diff --git a/src/Frontend/Views/SendResources.tsx b/src/Frontend/Views/SendResources.tsx index 622ff31a..caca28c7 100644 --- a/src/Frontend/Views/SendResources.tsx +++ b/src/Frontend/Views/SendResources.tsx @@ -11,12 +11,12 @@ import { Wrapper } from '../../Backend/Utils/Wrapper'; import { Hook } from '../../_types/global/GlobalTypes'; import { ArtifactImage } from '../Components/ArtifactImage'; import { Btn } from '../Components/Btn'; +import { FullWidth, Spacer } from '../Components/CoreUI'; import { EnergyIcon, SilverIcon } from '../Components/Icons'; import { LongDash, Sub } from '../Components/Text'; import WindowManager, { CursorState } from '../Game/WindowManager'; import dfstyles from '../Styles/dfstyles'; -import { planetBackground } from '../Styles/Mixins'; -import { useUIManager, useControlDown, usePlanetInactiveArtifacts } from '../Utils/AppHooks'; +import { useControlDown, usePlanetInactiveArtifacts, useUIManager } from '../Utils/AppHooks'; import { useEmitterSubscribe, useEmitterValue } from '../Utils/EmitterHooks'; import { escapeDown$, keyUp$ } from '../Utils/KeyEmitters'; import UIEmitter, { UIEmitterEvent } from '../Utils/UIEmitter'; @@ -35,6 +35,7 @@ const enum RowType { Silver, Artifact, } + function ResourceRowIcon({ rowType }: { rowType: RowType }) { return ( @@ -49,7 +50,6 @@ const StyledResourceBar = styled.div` input[type='range'] { width: 100%; - height: 3px; } & div { @@ -134,6 +134,7 @@ function ResourceBar({
+ ` width: 100%; - border-top: 1px solid ${dfstyles.colors.subtext}; - border-bottom: 1px solid ${dfstyles.colors.subtext}; + border-top: 1px solid ${dfstyles.colors.border}; + border-bottom: 1px solid ${dfstyles.colors.border}; height: ${height}em; padding: ${margin}em; - - ${planetBackground} `; const RowWrapper = styled.div<{ artifacts: Artifact[] }>` @@ -261,21 +260,12 @@ function SelectArtifactRow({ ); } -const StyledSendRow = styled.div` - display: flex; - flex-direction: row; - justify-content: space-between; - padding: 0.5em; - & > span:first-child { - margin-right: 0.5em; - } -`; - const First = styled.span` display: inline-flex; flex-direction: row; justify-content: space-between; - flex-grow: 1; + width: 100%; + padding: 8px; `; const Remove = styled.span` @@ -290,26 +280,28 @@ function SendRow({ doSend, artifact, remove, + sending, }: { doSend: () => void; artifact: Artifact | undefined; remove: () => void; + sending: boolean; }) { return ( - - - {artifact && ( - <> - - {artifactNameFromArtifact(artifact)}{' '} - {artifact && ({ArtifactTypeNames[artifact.artifactType]})} - - remove - - )} - - Send - + <> + {(artifact && ( + + {artifactNameFromArtifact(artifact)}{' '} + {artifact && ({ArtifactTypeNames[artifact.artifactType]})} + remove + + )) || <>} + + + (S)end + + + ); } @@ -482,7 +474,7 @@ export function SendResources({ )} - + ); } diff --git a/src/Frontend/Views/Share.tsx b/src/Frontend/Views/Share.tsx index f50aad11..2c3e79c1 100644 --- a/src/Frontend/Views/Share.tsx +++ b/src/Frontend/Views/Share.tsx @@ -1,9 +1,9 @@ -import React, { ReactNode, useRef, useState, useEffect } from 'react'; +import { EthConnection } from '@darkforest_eth/network'; +import React, { ReactNode, useEffect, useRef, useState } from 'react'; import styled, { css } from 'styled-components'; -import EthConnection from '../../Backend/Network/EthConnection'; +import { Account, getAccounts } from '../../Backend/Network/AccountManager'; +import { getEthConnection } from '../../Backend/Network/Blockchain'; import ReaderDataStore from '../../Backend/Storage/ReaderDataStore'; -import { address } from '@darkforest_eth/serde'; -import { EthAddress } from '@darkforest_eth/types'; import LandingPageCanvas from '../Renderers/LandingPageCanvas'; import dfstyles from '../Styles/dfstyles'; import { TerminalHandle } from './Terminal'; @@ -68,29 +68,38 @@ export interface ShareProps { */ export function Share(props: ShareProps) { const terminalHandle = useRef(); - const [ethConnection] = useState(new EthConnection()); - const knownAddrs = [undefined, ...ethConnection.getKnownAccounts()]; - const [currentAccount, setCurrentAccount] = useState(knownAddrs[0]); + const [ethConnection, setEthConnection] = useState(); + const knownAccounts = [undefined, ...getAccounts()]; + const [currentAccount, setCurrentAccount] = useState(knownAccounts[0]); const [store, setStore] = useState(); const [state, setState] = useState(); const [error, setError] = useState(); const [loading, setLoading] = useState(false); - const selectAccount = (addr: string | undefined) => () => { - if (!addr) { - setCurrentAccount(undefined); - } else { - setCurrentAccount(address(addr)); - } + const selectAccount = (idx: number) => () => { + setCurrentAccount(knownAccounts[idx]); }; useEffect(() => { - if (terminalHandle.current && !loading && (!store || store?.getViewer() !== currentAccount)) { + getEthConnection() + .then((ethConnection) => { + setEthConnection(ethConnection); + }) + .catch(console.error); + }, []); + + useEffect(() => { + if ( + terminalHandle.current && + !loading && + (!store || store?.getViewer() !== currentAccount) && + ethConnection + ) { store?.destroy(); setStore(undefined); setLoading(true); - ReaderDataStore.create({ current: undefined }, ethConnection, currentAccount).then( + ReaderDataStore.create({ current: undefined }, ethConnection, currentAccount?.address).then( async (store) => { setStore(store); @@ -112,8 +121,8 @@ export function Share(props: ShareProps) {

view as...

- {knownAddrs.map((addr, i) => ( - + {knownAccounts.map((addr, i) => ( + {addr || 'anonymous'} ))} diff --git a/src/Frontend/Views/TabbedView.tsx b/src/Frontend/Views/TabbedView.tsx index c7e0029c..f8dbec89 100644 --- a/src/Frontend/Views/TabbedView.tsx +++ b/src/Frontend/Views/TabbedView.tsx @@ -42,7 +42,7 @@ const TabButton = styled.div<{ active: boolean }>` ${({ active }: { active: boolean }) => css` color: ${dfstyles.colors.subtext}; text-decoration: underline; - border-radius: 2px; + border-radius: 3px; padding: 4px 8px; margin-right: 4px; margin-left: 4px; @@ -61,11 +61,11 @@ const TabButton = styled.div<{ active: boolean }>` &:hover { color: ${dfstyles.colors.text}; - background-color: ${dfstyles.colors.backgroundlight}; + background-color: ${dfstyles.colors.backgroundlighter}; ${active && css` - color: ${dfstyles.colors.dfgreenlight}; + color: ${dfstyles.colors.text}; background-color: ${dfstyles.colors.dfgreendark}; `} } @@ -73,7 +73,7 @@ const TabButton = styled.div<{ active: boolean }>` ${active && css` cursor: default; - color: ${dfstyles.colors.dfgreenlight}; + color: ${dfstyles.colors.text}; background-color: ${dfstyles.colors.dfgreendark}; `} `} diff --git a/src/Frontend/Views/Terminal.tsx b/src/Frontend/Views/Terminal.tsx index 17255435..a1c5bd5b 100644 --- a/src/Frontend/Views/Terminal.tsx +++ b/src/Frontend/Views/Terminal.tsx @@ -1,9 +1,9 @@ import EventEmitter from 'events'; -import React, { useRef, useState, useCallback, useEffect, useImperativeHandle } from 'react'; +import React, { useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'; import styled, { css } from 'styled-components'; import { Hoverable } from '../Components/Hoverable'; import { LoadingSpinner } from '../Components/LoadingSpinner'; -import { BasicLink, Green, Blue, Sub, White, Red, Invisible } from '../Components/Text'; +import { BasicLink, Blue, Green, Invisible, Red, Sub, White } from '../Components/Text'; import { LoadingBarHandle, TextLoadingBar } from '../Components/TextLoadingBar'; import dfstyles from '../Styles/dfstyles'; import { isFirefox } from '../Utils/BrowserChecks'; diff --git a/src/Frontend/Views/TopBar.tsx b/src/Frontend/Views/TopBar.tsx index 1c33357c..f40032ea 100644 --- a/src/Frontend/Views/TopBar.tsx +++ b/src/Frontend/Views/TopBar.tsx @@ -1,261 +1,93 @@ import { EthAddress } from '@darkforest_eth/types'; -import _ from 'lodash'; import React, { useCallback, useState } from 'react'; import styled from 'styled-components'; -import { formatNumber } from '../../Backend/Utils/Utils'; -import { Hook } from '../../_types/global/GlobalTypes'; -import { ArtifactIcon, EnergyIcon, SilverIcon } from '../Components/Icons'; +import { EmSpacer, HorizontalFlex, Spacer } from '../Components/CoreUI'; import { AccountLabel } from '../Components/Labels/Labels'; -import { LoadingSpinner } from '../Components/LoadingSpinner'; -import { LongDash, Sub, White } from '../Components/Text'; +import { Sub, White } from '../Components/Text'; import { TooltipName } from '../Game/WindowManager'; import { TooltipTrigger } from '../Panes/Tooltip'; -import dfstyles from '../Styles/dfstyles'; -import { useAccount, useUIManager } from '../Utils/AppHooks'; +import { usePlayer, useUIManager } from '../Utils/AppHooks'; import { GameWindowZIndex } from '../Utils/constants'; import { usePoll } from '../Utils/Hooks'; +import { ModalTwitterVerifyIcon } from './ModalIcon'; +import { ModalHook } from './ModalPane'; -export const TOP_BAR_HEIGHT = '2.5em'; - -const StyledTopBar = styled.div` - position: absolute; - top: 0; - left: 0; +const TopBarContainer = styled.div` z-index: ${GameWindowZIndex.MenuBar}; - - display: flex; - flex-direction: row; - align-items: center; - - height: ${TOP_BAR_HEIGHT}; - width: fit-content; - background: ${dfstyles.colors.background}; - border-bottom: 1px solid ${dfstyles.colors.subtext}; - border-right: 1px solid ${dfstyles.colors.subtext}; - - border-bottom-right-radius: ${dfstyles.borderRadius}; -`; - -const StyledCollapser = styled.span` - width: 1.5em; - text-align: center; - color: ${dfstyles.colors.subtext}; - - &:hover { - cursor: pointer; - color: ${dfstyles.colors.text}; - } -`; - -function Collapser({ - expanded, - setExpanded, -}: { - expanded: boolean; - setExpanded: Hook[1]; -}) { - return ( - setExpanded((b: boolean) => !b)}> - {expanded ? : '+'} - - ); -} - -const StyledTopBarSection = styled.div` - display: flex; - flex-direction: row; - align-items: center; - - width: fit-content; - padding: 0.5em; - border-right: 1px solid ${dfstyles.colors.subtext}; - - &:last-child { - border-right: none; - } + padding: 0 2px; `; -function TopBarSection({ - collapsible, - children, -}: { - collapsible?: boolean; - children: React.ReactNode; -}) { - const [expanded, setExpanded] = useState(true); - +function TopBarSection({ children }: { children: React.ReactNode }) { return ( - - {(!collapsible || (collapsible && expanded)) && children} - {collapsible && } - + <> + + {children} + ); } -const BarItem = styled.span<{ width?: string }>` - margin-right: 1em; - ${({ width }) => width && `width: ${width};`} - - &:last-child { - margin-right: 0; - } -`; - -const AccountItem = styled(BarItem)` - text-align: left; - width: 8em; -`; - -const StyledBoardPlacement = styled.span<{ single?: boolean }>` - min-width: 12em; - display: inline-flex; - flex-direction: row; - justify-content: ${({ single }) => (single ? 'flex-end' : 'space-between')}; -`; - -// const TEN_MIN = 10 * 60 * 1000; - function BoardPlacement({ account }: { account: EthAddress | undefined }) { const uiManager = useUIManager(); - // const twitter = useTwitter(account, uiManager); - - // const { leaderboard, error } = useLeaderboard(TEN_MIN); const [score, setScore] = useState(); - // const [place, setPlace] = useState(); - // useEffect(() => { - // if (!leaderboard || !account) return; - - // const keys = Object.getOwnPropertyNames(leaderboard); - // const forVersion = leaderboard[keys[0]]; - - // const score = forVersion.scoresByPlayer[account]; - // setScore(score); - - // const entries: [string, number][] = Object.getOwnPropertyNames(leaderboard.scoresByPlayer).map( - // (name) => [name, forVersion.scoresByPlayer[name]] - // ); - - // const sortedEntries = _.sortBy(entries, (row) => -row[1]); - - // const idx = sortedEntries.findIndex(([acc, _score]) => acc === twitter || acc === account); - // setPlace(idx + 1); - // }, [leaderboard, account, twitter]); const syncScore = useCallback(() => { setScore(uiManager.getMyScore()); }, [uiManager, setScore]); usePoll(syncScore, 5000); - let content, single; - // if (error || !account) { - // single = true; - // content = error loading leaderboard; - // } - // else if (!leaderboard) { - // single = true; - // content = ( - // - // - // - // ); - // } + let content; + if (!account) { content = error loading account; } else { - single = true; content = ( - <> - {/* {!score || !place ? 'unranked' : place} */} - - - {score || 0} pts - - - + + + {score || 0} pts + + ); } - return {content}; + return {content}; } +const Points = styled.div` + display: inline-block; +`; + function ScoreSection({ account }: { account: EthAddress | undefined }) { return ( - - - - - - + ); } -const ONE_MIN = 1 * 60 * 1000; - -const ResItem = styled(BarItem)` - display: inline-flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 4em; -`; - -function DataSection({ account }: { account: EthAddress | undefined }) { - const uiManager = useUIManager(); - - const [silver, setSilver] = useState(); - const [energy, setEnergy] = useState(); - const [artifacts, setArtifacts] = useState(); - - const poll = useCallback(() => { - if (!account) return; - - setSilver(uiManager.getSilverOfPlayer(account)); - setEnergy(uiManager.getEnergyOfPlayer(account)); - setArtifacts(uiManager.getMyArtifacts().length); - }, [setSilver, setEnergy, setArtifacts, uiManager, account]); - - usePoll(poll, ONE_MIN, true); - - let content; - - if (silver === undefined || energy === undefined || artifacts === undefined) - content = ( - - - - ); - else - content = ( - <> - - - {formatNumber(silver)} - - - - {formatNumber(energy)} - - - - {artifacts} - - - ); - - return {content}; -} - -export function TopBar() { +export function TopBar({ twitterVerifyHook }: { twitterVerifyHook: ModalHook }) { const uiManager = useUIManager(); - const account = useAccount(uiManager); + const player = usePlayer(uiManager); + const account = player.value?.address; + const twitter = player.value?.twitter; return ( - - - - + + + + + + + + + ); } diff --git a/src/Frontend/Views/UpgradePreview.tsx b/src/Frontend/Views/UpgradePreview.tsx index 48a10f8c..dce9f54f 100644 --- a/src/Frontend/Views/UpgradePreview.tsx +++ b/src/Frontend/Views/UpgradePreview.tsx @@ -1,14 +1,16 @@ +import { Planet, Upgrade, UpgradeBranchName } from '@darkforest_eth/types'; import React from 'react'; import styled from 'styled-components'; -import { Upgrade, Planet, UpgradeBranchName } from '@darkforest_eth/types'; +import { getPlanetMaxRank, getPlanetRank, upgradeName } from '../../Backend/Utils/Utils'; import { RightarrowIcon } from '../Components/Icons'; -import { Red, Green, Sub } from '../Components/Text'; +import { Green, Red, Sub } from '../Components/Text'; import dfstyles from '../Styles/dfstyles'; -import { getPlanetRank, getPlanetMaxRank, upgradeName } from '../../Backend/Utils/Utils'; const StyledUpgradePreview = styled.div` min-width: 15em; width: 100%; + border-radius: 3px; + border: 1px solid ${dfstyles.colors.darkBorder}; `; const StatRow = styled.div` @@ -16,7 +18,8 @@ const StatRow = styled.div` flex-direction: row; justify-content: center; align-items: center; - padding: 2px 4px; + padding-left: 4px; + padding-right: 4px; & > span { margin-left: 0.2em; @@ -47,7 +50,7 @@ const StatRow = styled.div` } &.upgrade-willupdate { - background: ${dfstyles.colors.backgroundlight}; + background: ${dfstyles.colors.backgroundlighter}; } `; diff --git a/src/Frontend/Views/WithdrawSilver.tsx b/src/Frontend/Views/WithdrawSilver.tsx index 9a7eab13..bcf302b6 100644 --- a/src/Frontend/Views/WithdrawSilver.tsx +++ b/src/Frontend/Views/WithdrawSilver.tsx @@ -1,17 +1,17 @@ import { Planet, PlanetType } from '@darkforest_eth/types'; import React, { useCallback, useMemo, useState } from 'react'; import styled from 'styled-components'; +import { Wrapper } from '../../Backend/Utils/Wrapper'; +import { Hook } from '../../_types/global/GlobalTypes'; import { Btn } from '../Components/Btn'; import { CenterBackgroundSubtext } from '../Components/CoreUI'; +import { SpacedFlexRow } from '../Components/FlexRows'; import { Input } from '../Components/Input'; +import { ScoreLabelTip, SilverLabelTip } from '../Components/Labels/KeywordLabels'; import { LoadingSpinner } from '../Components/LoadingSpinner'; -import { SilverLabelTip, ScoreLabelTip } from '../Components/Labels/KeywordLabels'; import { Red, Sub, White } from '../Components/Text'; -import { useUIManager } from '../Utils/AppHooks'; -import { SpacedFlexRow } from '../Components/FlexRows'; -import { Hook } from '../../_types/global/GlobalTypes'; import dfstyles from '../Styles/dfstyles'; -import { Wrapper } from '../../Backend/Utils/Wrapper'; +import { useUIManager } from '../Utils/AppHooks'; const StyledWithdrawSilver = styled.div` display: flex; diff --git a/src/_types/darkforest/api/ChunkStoreTypes.ts b/src/_types/darkforest/api/ChunkStoreTypes.ts index 9da50e4b..4b8f0f38 100644 --- a/src/_types/darkforest/api/ChunkStoreTypes.ts +++ b/src/_types/darkforest/api/ChunkStoreTypes.ts @@ -1,5 +1,5 @@ -import { Rectangle } from '../../global/GlobalTypes'; import { LocationId } from '@darkforest_eth/types'; +import { Rectangle } from '../../global/GlobalTypes'; /** * one of "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/src/_types/global/GlobalTypes.ts b/src/_types/global/GlobalTypes.ts index fa0e1240..1a100ab5 100644 --- a/src/_types/global/GlobalTypes.ts +++ b/src/_types/global/GlobalTypes.ts @@ -1,14 +1,14 @@ -import { Dispatch, SetStateAction } from 'react'; import { + EmojiFlagBody, + LocatablePlanet, LocationId, Planet, - LocatablePlanet, + PlanetMessage, + PlanetMessageType, WorldCoords, WorldLocation, - EmojiFlagBody, - PlanetMessageType, - PlanetMessage, } from '@darkforest_eth/types'; +import { Dispatch, SetStateAction } from 'react'; import GameManager from '../../Backend/GameLogic/GameManager'; import GameUIManager from '../../Backend/GameLogic/GameUIManager'; diff --git a/yarn.lock b/yarn.lock index 1dbf68b0..53c294fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3508,6 +3508,25 @@ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.15.tgz#b7a6d263c2cecf44b6de9a051cf496249b154553" integrity sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ== +"@types/color-convert@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/color-convert/-/color-convert-2.0.0.tgz#8f5ee6b9e863dcbee5703f5a517ffb13d3ea4e22" + integrity sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ== + dependencies: + "@types/color-name" "*" + +"@types/color-name@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/color@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/color/-/color-3.0.2.tgz#3779043e782f562aa9157b5fc6bd07e14fd8e7f3" + integrity sha512-INiJl6sfNn8iyC5paxVzqiVUEj2boIlFki02uRTAkKwAj++7aAF+ZfEv/XrIeBa0XI/fTZuDHW8rEEcEVnON+Q== + dependencies: + "@types/color-convert" "*" + "@types/connect@*", "@types/connect@^3.4.33": version "3.4.34" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" @@ -7151,7 +7170,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0, color-convert@^1.9.1, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -7183,6 +7202,14 @@ color-string@^1.5.2: color-name "^1.0.0" simple-swizzle "^0.2.2" +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + color@3.0.x: version "3.0.0" resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" @@ -7191,6 +7218,14 @@ color@3.0.x: color-convert "^1.9.1" color-string "^1.5.2" +color@^3.0.2: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colorette@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" @@ -9278,7 +9313,7 @@ eslint@^5.6.0: table "^5.2.3" text-table "^0.2.0" -eslint@^7.30.0: +eslint@^7.26.0, eslint@^7.30.0: version "7.30.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.30.0.tgz#6d34ab51aaa56112fd97166226c9a97f505474f8" integrity sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg== @@ -13678,6 +13713,11 @@ junk@^3.1.0: resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== +just-debounce@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.1.0.tgz#2f81a3ad4121a76bc7cb45dbf704c0d76a8e5ddf" + integrity sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ== + just-kebab-case@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/just-kebab-case/-/just-kebab-case-1.1.0.tgz#ebe854fde84b0afa4e597fcd870b12eb3c026755" @@ -16623,6 +16663,11 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.0.tgz#4d51c3b91f483d02a0d300765321fca393d758dd" integrity sha512-HAZyB3ZodPo+BDpb4/Iu7Jv4P6cSazBz9ZM0ChhEXp70scx834aWCEjQRwgt41UzzejUAPdbqqONfRWTPYrPAQ== +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + p-event@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6" @@ -17607,6 +17652,11 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= +prettier-plugin-organize-imports@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-2.3.3.tgz#6877bcf8ca02569198d8f419c954a0d90a95de15" + integrity sha512-PBOwQ8vEIB2b7B3gCuBG7D+dqsr1fsTR4TSAjNacRVdHJrD0yzgz9grOLPSyfwJm+NUTZLyWeHoZ+1mHaUrk+g== + prettier-plugin-solidity@^1.0.0-beta.10: version "1.0.0-beta.10" resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.10.tgz#f2a249002733826b08d981b599335ddb7e93af8d" From f1b00fa95e77c8e0d9bc029b5b2bc4f689d4ee23 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 27 Jul 2021 18:14:12 +0000 Subject: [PATCH 10/68] update client --- last_updated.txt | 2 +- package.json | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/last_updated.txt b/last_updated.txt index 0107ca2f..72ffecef 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Tue Jul 27 17:26:53 UTC 2021 +last updated: Tue Jul 27 18:14:12 UTC 2021 diff --git a/package.json b/package.json index 42eef08a..a37b1049 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,19 @@ { "name": "client", - "version": "6.2.0-staging-jul-27-2021.0", + "version": "6.2.0-staging-jul-27-2021-2.0", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.0-staging-jul-27-2021.0", - "@darkforest_eth/contracts": "6.2.0-staging-jul-27-2021.0", - "@darkforest_eth/events": "6.2.0-staging-jul-27-2021.0", - "@darkforest_eth/hashing": "6.2.0-staging-jul-27-2021.0", - "@darkforest_eth/hexgen": "6.2.0-staging-jul-27-2021.0", - "@darkforest_eth/network": "6.2.0-staging-jul-27-2021.0", - "@darkforest_eth/serde": "6.2.0-staging-jul-27-2021.0", - "@darkforest_eth/snarks": "6.2.0-staging-jul-27-2021.0", - "@darkforest_eth/types": "6.2.0-staging-jul-27-2021.0", + "@darkforest_eth/constants": "6.2.0-staging-jul-27-2021-2.0", + "@darkforest_eth/contracts": "6.2.0-staging-jul-27-2021-2.0", + "@darkforest_eth/events": "6.2.0-staging-jul-27-2021-2.0", + "@darkforest_eth/hashing": "6.2.0-staging-jul-27-2021-2.0", + "@darkforest_eth/hexgen": "6.2.0-staging-jul-27-2021-2.0", + "@darkforest_eth/network": "6.2.0-staging-jul-27-2021-2.0", + "@darkforest_eth/serde": "6.2.0-staging-jul-27-2021-2.0", + "@darkforest_eth/snarks": "6.2.0-staging-jul-27-2021-2.0", + "@darkforest_eth/types": "6.2.0-staging-jul-27-2021-2.0", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", From 5c9fb5ac8b1a7e75ec5242ffd53b9323d39e31e4 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 28 Jul 2021 22:47:00 +0000 Subject: [PATCH 11/68] update client --- .../Backend_GameLogic_GameManager.default.md | 23 +- ...ckend_GameLogic_GameObjects.GameObjects.md | 40 +++- ...Backend_GameLogic_GameUIManager.default.md | 40 ++-- ...Backend_GameLogic_LayeredMap.LayeredMap.md | 37 +++ .../classes/Frontend_Game_Viewport.default.md | 46 +++- ...er_Entities_PlanetRenderManager.default.md | 40 ++++ ...Frontend_Game_WindowManager.TooltipName.md | 73 +++--- .../modules/Backend_GameLogic_ArrivalUtils.md | 18 ++ docs/modules/Frontend_Components_CoreUI.md | 80 ++++--- .../Frontend_Components_Labels_Labels.md | 10 +- .../Frontend_Components_TextPreview.md | 15 +- .../modules/Frontend_Panes_HoverPlanetPane.md | 2 + docs/modules/Frontend_Panes_TooltipPanes.md | 11 - docs/modules/Frontend_Styles_dfstyles.md | 22 +- .../Frontend_Utils_ShortcutConstants.md | 28 ++- .../Frontend_Views_PlanetCardComponents.md | 59 ++--- last_updated.txt | 2 +- package.json | 21 +- src/Backend/GameLogic/ArrivalUtils.ts | 5 + src/Backend/GameLogic/GameManager.ts | 14 +- src/Backend/GameLogic/GameObjects.ts | 19 +- src/Backend/GameLogic/GameUIManager.ts | 36 +-- src/Backend/GameLogic/LayeredMap.ts | 28 ++- src/Backend/GameLogic/ViewportEntities.ts | 5 +- src/Backend/Network/UtilityServerAPI.ts | 4 +- src/Frontend/Components/Btn.tsx | 8 +- src/Frontend/Components/CoreUI.tsx | 105 ++++++-- src/Frontend/Components/DisplayGasPrices.tsx | 7 +- src/Frontend/Components/Input.tsx | 4 +- src/Frontend/Components/Labels/Labels.tsx | 14 +- .../Components/Labels/PlanetLabels.tsx | 3 +- src/Frontend/Components/OpenPaneButtons.tsx | 14 +- src/Frontend/Components/ReadMore.tsx | 2 +- src/Frontend/Components/Text.tsx | 6 +- src/Frontend/Components/TextPreview.tsx | 10 +- src/Frontend/Game/Viewport.ts | 46 ++-- src/Frontend/Game/WindowManager.ts | 1 - src/Frontend/Pages/GameLandingPage.tsx | 2 +- src/Frontend/Panes/DiagnosticsPane.tsx | 208 ++++++++-------- src/Frontend/Panes/ExplorePane.tsx | 2 +- src/Frontend/Panes/HelpPane.tsx | 8 +- src/Frontend/Panes/HoverPlanetPane.tsx | 44 ++-- .../PaidArtifactConversationPane.tsx | 1 - src/Frontend/Panes/PlanetContextPane.tsx | 22 +- src/Frontend/Panes/PlanetDexPane.tsx | 4 +- src/Frontend/Panes/PlayerArtifactsPane.tsx | 3 +- src/Frontend/Panes/PluginEditorPane.tsx | 6 +- src/Frontend/Panes/PluginLibraryPane.tsx | 19 +- src/Frontend/Panes/SettingsPane.tsx | 58 ++--- src/Frontend/Panes/Tooltip.tsx | 10 +- src/Frontend/Panes/TooltipPanes.tsx | 64 +---- src/Frontend/Panes/TwitterVerifyPane.tsx | 133 ++++++----- .../Entities/PlanetRenderManager.ts | 70 +++++- .../Renderers/GameRenderer/UIRenderer.ts | 51 +--- .../PlanetscapeRenderer/PlanetIcons.tsx | 1 - src/Frontend/Styles/dfstyles.ts | 30 ++- src/Frontend/Utils/KeyEmitters.ts | 5 +- src/Frontend/Utils/ShortcutConstants.ts | 16 +- src/Frontend/Views/EmojiPicker.tsx | 4 +- src/Frontend/Views/GameWindowLayout.tsx | 34 ++- src/Frontend/Views/ModalPane.tsx | 45 ++-- src/Frontend/Views/PlanetCard.tsx | 225 +++++++++++------- src/Frontend/Views/PlanetCardComponents.tsx | 67 ++---- src/Frontend/Views/PlanetLink.tsx | 7 +- src/Frontend/Views/SendResources.tsx | 14 +- src/Frontend/Views/Table.tsx | 2 + src/Frontend/Views/TopBar.tsx | 13 +- src/Frontend/Views/UpgradePreview.tsx | 2 +- yarn.lock | 23 ++ 69 files changed, 1236 insertions(+), 855 deletions(-) diff --git a/docs/classes/Backend_GameLogic_GameManager.default.md b/docs/classes/Backend_GameLogic_GameManager.default.md index ec8f8e48..935de70c 100644 --- a/docs/classes/Backend_GameLogic_GameManager.default.md +++ b/docs/classes/Backend_GameLogic_GameManager.default.md @@ -124,6 +124,7 @@ - [getPlanetsInRange](Backend_GameLogic_GameManager.default.md#getplanetsinrange) - [getPlanetsInWorldRectangle](Backend_GameLogic_GameManager.default.md#getplanetsinworldrectangle) - [getPlanetsWithIds](Backend_GameLogic_GameManager.default.md#getplanetswithids) +- [getPlanetsWithinRange](Backend_GameLogic_GameManager.default.md#getplanetswithinrange) - [getPlayer](Backend_GameLogic_GameManager.default.md#getplayer) - [getPrivateKey](Backend_GameLogic_GameManager.default.md#getprivatekey) - [getProcgenUtils](Backend_GameLogic_GameManager.default.md#getprocgenutils) @@ -1544,7 +1545,7 @@ Gets the rarity of planets in the universe ### getPlanetWithCoords -▸ **getPlanetWithCoords**(`coords`): `undefined` \| `Planet` +▸ **getPlanetWithCoords**(`coords`): `undefined` \| `LocatablePlanet` Gets the planet that is located at the given coordinates. Returns undefined if not a valid location or if no planet exists at location. If the planet needs to be updated (because @@ -1558,7 +1559,7 @@ some time has passed since we last updated the planet), then updates that planet #### Returns -`undefined` \| `Planet` +`undefined` \| `LocatablePlanet` --- @@ -1647,6 +1648,24 @@ doesn't exist, no entry for that planet will be returned in the result. --- +### getPlanetsWithinRange + +▸ **getPlanetsWithinRange**(`planet`): `LocatablePlanet`[] + +Gets all the planets that this planet could reach if it sent 100% of its energy. + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | + +#### Returns + +`LocatablePlanet`[] + +--- + ### getPlayer ▸ **getPlayer**(`address?`): `undefined` \| `Player` diff --git a/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md b/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md index cb292b51..f617ec22 100644 --- a/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md +++ b/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md @@ -69,7 +69,9 @@ Representation of the objects which exist in the world. - [getPlanetWithCoords](Backend_GameLogic_GameObjects.GameObjects.md#getplanetwithcoords) - [getPlanetWithId](Backend_GameLogic_GameObjects.GameObjects.md#getplanetwithid) - [getPlanetWithLocation](Backend_GameLogic_GameObjects.GameObjects.md#getplanetwithlocation) +- [getPlanetsInWorldCircle](Backend_GameLogic_GameObjects.GameObjects.md#getplanetsinworldcircle) - [getPlanetsInWorldRectangle](Backend_GameLogic_GameObjects.GameObjects.md#getplanetsinworldrectangle) +- [getPlanetsWithIds](Backend_GameLogic_GameObjects.GameObjects.md#getplanetswithids) - [getRevealedLocations](Backend_GameLogic_GameObjects.GameObjects.md#getrevealedlocations) - [getSilverCurveAtPercent](Backend_GameLogic_GameObjects.GameObjects.md#getsilvercurveatpercent) - [getUnconfirmedBuyGPTCredits](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedbuygptcredits) @@ -772,7 +774,7 @@ time may be in the past ### getPlanetWithCoords -▸ **getPlanetWithCoords**(`coords`): `undefined` \| `Planet` +▸ **getPlanetWithCoords**(`coords`): `undefined` \| `LocatablePlanet` #### Parameters @@ -782,7 +784,7 @@ time may be in the past #### Returns -`undefined` \| `Planet` +`undefined` \| `LocatablePlanet` --- @@ -819,6 +821,23 @@ time may be in the past --- +### getPlanetsInWorldCircle + +▸ **getPlanetsInWorldCircle**(`coords`, `radius`): `LocatablePlanet`[] + +#### Parameters + +| Name | Type | +| :------- | :------------ | +| `coords` | `WorldCoords` | +| `radius` | `number` | + +#### Returns + +`LocatablePlanet`[] + +--- + ### getPlanetsInWorldRectangle ▸ **getPlanetsInWorldRectangle**(`worldX`, `worldY`, `worldWidth`, `worldHeight`, `levels`, `planetLevelToRadii`, `updateIfStale?`): `LocatablePlanet`[] @@ -845,6 +864,23 @@ left coordinate, width, and height) in the world and of a level that was passed --- +### getPlanetsWithIds + +▸ **getPlanetsWithIds**(`locationIds`, `updateIfStale?`): `Planet`[] + +#### Parameters + +| Name | Type | Default value | +| :-------------- | :------------- | :------------ | +| `locationIds` | `LocationId`[] | `undefined` | +| `updateIfStale` | `boolean` | `true` | + +#### Returns + +`Planet`[] + +--- + ### getRevealedLocations ▸ **getRevealedLocations**(): `Map`<`LocationId`, `RevealedLocation`\> diff --git a/docs/classes/Backend_GameLogic_GameUIManager.default.md b/docs/classes/Backend_GameLogic_GameUIManager.default.md index 75eec33f..9c891673 100644 --- a/docs/classes/Backend_GameLogic_GameUIManager.default.md +++ b/docs/classes/Backend_GameLogic_GameUIManager.default.md @@ -285,7 +285,7 @@ indicates whether or not the player is currently selecting a target planet. ### mouseDownOverPlanet -• `Private` **mouseDownOverPlanet**: `undefined` \| `Planet` +• `Private` **mouseDownOverPlanet**: `undefined` \| `LocatablePlanet` --- @@ -297,7 +297,7 @@ indicates whether or not the player is currently selecting a target planet. ### mouseHoveringOverPlanet -• `Private` **mouseHoveringOverPlanet**: `undefined` \| `Planet` +• `Private` **mouseHoveringOverPlanet**: `undefined` \| `LocatablePlanet` --- @@ -369,7 +369,7 @@ indicates whether or not the player is currently selecting a target planet. ### selectedPlanet -• `Private` **selectedPlanet**: `undefined` \| `Planet` +• `Private` **selectedPlanet**: `undefined` \| `LocatablePlanet` --- @@ -393,7 +393,7 @@ indicates whether or not the player is currently selecting a target planet. ### sendingPlanet -• `Private` **sendingPlanet**: `undefined` \| `Planet` +• `Private` **sendingPlanet**: `undefined` \| `LocatablePlanet` --- @@ -555,9 +555,9 @@ indicates whether or not the player is currently selecting a target planet. #### Parameters -| Name | Type | -| :------- | :---------------------- | -| `planet` | `undefined` \| `Planet` | +| Name | Type | +| :------- | :------------------------------- | +| `planet` | `undefined` \| `LocatablePlanet` | #### Returns @@ -1246,11 +1246,11 @@ state in some way ### getMouseDownPlanet -▸ **getMouseDownPlanet**(): `undefined` \| `Planet` +▸ **getMouseDownPlanet**(): `undefined` \| `LocatablePlanet` #### Returns -`undefined` \| `Planet` +`undefined` \| `LocatablePlanet` --- @@ -1502,11 +1502,11 @@ state in some way ### getSelectedPlanet -▸ **getSelectedPlanet**(): `undefined` \| `Planet` +▸ **getSelectedPlanet**(): `undefined` \| `LocatablePlanet` #### Returns -`undefined` \| `Planet` +`undefined` \| `LocatablePlanet` --- @@ -1964,9 +1964,9 @@ drill fields like this anymore. #### Parameters -| Name | Type | -| :------- | :---------------------- | -| `planet` | `undefined` \| `Planet` | +| Name | Type | +| :------- | :------------------------------- | +| `planet` | `undefined` \| `LocatablePlanet` | #### Returns @@ -2079,9 +2079,9 @@ drill fields like this anymore. #### Parameters -| Name | Type | -| :------- | :---------------------- | -| `planet` | `undefined` \| `Planet` | +| Name | Type | +| :------- | :------------------------------- | +| `planet` | `undefined` \| `LocatablePlanet` | #### Returns @@ -2127,9 +2127,9 @@ drill fields like this anymore. #### Parameters -| Name | Type | -| :------- | :---------------------- | -| `planet` | `undefined` \| `Planet` | +| Name | Type | +| :------- | :------------------------------- | +| `planet` | `undefined` \| `LocatablePlanet` | #### Returns diff --git a/docs/classes/Backend_GameLogic_LayeredMap.LayeredMap.md b/docs/classes/Backend_GameLogic_LayeredMap.LayeredMap.md index 4cfad53d..fd385725 100644 --- a/docs/classes/Backend_GameLogic_LayeredMap.LayeredMap.md +++ b/docs/classes/Backend_GameLogic_LayeredMap.LayeredMap.md @@ -20,6 +20,8 @@ chunks are visible in the vieport". ### Methods - [getPlanets](Backend_GameLogic_LayeredMap.LayeredMap.md#getplanets) +- [getPlanetsInCircle](Backend_GameLogic_LayeredMap.LayeredMap.md#getplanetsincircle) +- [getPointLocationId](Backend_GameLogic_LayeredMap.LayeredMap.md#getpointlocationid) - [insertPlanet](Backend_GameLogic_LayeredMap.LayeredMap.md#insertplanet) ## Constructors @@ -73,6 +75,41 @@ left coordinate, width, and height) in the world and of a level that was passed --- +### getPlanetsInCircle + +▸ **getPlanetsInCircle**(`coords`, `worldRadius`): `LocationId`[] + +Gets all the planets within the given world radius of a world location. + +#### Parameters + +| Name | Type | +| :------------ | :------------ | +| `coords` | `WorldCoords` | +| `worldRadius` | `number` | + +#### Returns + +`LocationId`[] + +--- + +### getPointLocationId + +▸ `Private` **getPointLocationId**(`point`): `LocationId` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `point` | `Point` | + +#### Returns + +`LocationId` + +--- + ### insertPlanet ▸ **insertPlanet**(`location`, `planetLevel`): `void` diff --git a/docs/classes/Frontend_Game_Viewport.default.md b/docs/classes/Frontend_Game_Viewport.default.md index ea9116c0..77bb31e6 100644 --- a/docs/classes/Frontend_Game_Viewport.default.md +++ b/docs/classes/Frontend_Game_Viewport.default.md @@ -13,6 +13,7 @@ - [animationManager](Frontend_Game_Viewport.default.md#animationmanager) - [canvas](Frontend_Game_Viewport.default.md#canvas) - [centerWorldCoords](Frontend_Game_Viewport.default.md#centerworldcoords) +- [diagnosticUpdater](Frontend_Game_Viewport.default.md#diagnosticupdater) - [frameRequestId](Frontend_Game_Viewport.default.md#framerequestid) - [gameUIManager](Frontend_Game_Viewport.default.md#gameuimanager) - [heightInWorldUnits](Frontend_Game_Viewport.default.md#heightinworldunits) @@ -47,7 +48,6 @@ - [centerPlanet](Frontend_Game_Viewport.default.md#centerplanet) - [centerPlanetAnimated](Frontend_Game_Viewport.default.md#centerplanetanimated) - [getBottomBound](Frontend_Game_Viewport.default.md#getbottombound) -- [getDetailLevel](Frontend_Game_Viewport.default.md#getdetaillevel) - [getLeftBound](Frontend_Game_Viewport.default.md#getleftbound) - [getRightBound](Frontend_Game_Viewport.default.md#getrightbound) - [getStorage](Frontend_Game_Viewport.default.md#getstorage) @@ -70,10 +70,12 @@ - [onSendInit](Frontend_Game_Viewport.default.md#onsendinit) - [onWindowResize](Frontend_Game_Viewport.default.md#onwindowresize) - [setData](Frontend_Game_Viewport.default.md#setdata) +- [setDiagnosticUpdater](Frontend_Game_Viewport.default.md#setdiagnosticupdater) - [setMouseSensitivty](Frontend_Game_Viewport.default.md#setmousesensitivty) - [setStorage](Frontend_Game_Viewport.default.md#setstorage) - [setWorldHeight](Frontend_Game_Viewport.default.md#setworldheight) - [setWorldWidth](Frontend_Game_Viewport.default.md#setworldwidth) +- [updateDiagnostics](Frontend_Game_Viewport.default.md#updatediagnostics) - [worldToCanvasCoords](Frontend_Game_Viewport.default.md#worldtocanvascoords) - [worldToCanvasDist](Frontend_Game_Viewport.default.md#worldtocanvasdist) - [worldToCanvasX](Frontend_Game_Viewport.default.md#worldtocanvasx) @@ -122,6 +124,12 @@ --- +### diagnosticUpdater + +• `Optional` **diagnosticUpdater**: `DiagnosticUpdater` + +--- + ### frameRequestId • **frameRequestId**: `number` @@ -382,16 +390,6 @@ --- -### getDetailLevel - -▸ `Private` **getDetailLevel**(): `number` - -#### Returns - -`number` - ---- - ### getLeftBound ▸ **getLeftBound**(): `number` @@ -672,6 +670,22 @@ --- +### setDiagnosticUpdater + +▸ **setDiagnosticUpdater**(`diagnosticUpdater`): `void` + +#### Parameters + +| Name | Type | +| :------------------ | :------------------ | +| `diagnosticUpdater` | `DiagnosticUpdater` | + +#### Returns + +`void` + +--- + ### setMouseSensitivty ▸ **setMouseSensitivty**(`mouseSensitivity`): `void` @@ -730,6 +744,16 @@ --- +### updateDiagnostics + +▸ `Private` **updateDiagnostics**(): `void` + +#### Returns + +`void` + +--- + ### worldToCanvasCoords ▸ **worldToCanvasCoords**(`worldCoords`): [`CanvasCoords`](../interfaces/Backend_Utils_Coordinates.CanvasCoords.md) diff --git a/docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md b/docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md index b99b3a67..b3d8c971 100644 --- a/docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md +++ b/docs/classes/Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md @@ -18,6 +18,7 @@ to CanvasCoords. responsible for rendering planets by calling primitive renderer ### Methods - [drawPlanetMessages](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#drawplanetmessages) +- [drawRangeAtPercent](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#drawrangeatpercent) - [flush](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#flush) - [getLockedEnergy](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#getlockedenergy) - [getMouseAtk](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#getmouseatk) @@ -31,6 +32,7 @@ to CanvasCoords. responsible for rendering planets by calling primitive renderer - [queuePlanetEnergyText](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueplanetenergytext) - [queuePlanetSilverText](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueplanetsilvertext) - [queuePlanets](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queueplanets) +- [queueRangeRings](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queuerangerings) - [queueRings](Frontend_Renderers_GameRenderer_Entities_PlanetRenderManager.default.md#queuerings) ## Constructors @@ -72,6 +74,26 @@ to CanvasCoords. responsible for rendering planets by calling primitive renderer --- +### drawRangeAtPercent + +▸ **drawRangeAtPercent**(`planet`, `pct`): `void` + +Renders rings around planet that show how far sending the given percentage of this planet's +energy would be able to travel. + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | +| `pct` | `number` | + +#### Returns + +`void` + +--- + ### flush ▸ **flush**(): `void` @@ -293,6 +315,24 @@ to CanvasCoords. responsible for rendering planets by calling primitive renderer --- +### queueRangeRings + +▸ **queueRangeRings**(`planet`): `void` + +Renders three rings around the planet that show the player how far this planet can attack. + +#### Parameters + +| Name | Type | +| :------- | :---------------- | +| `planet` | `LocatablePlanet` | + +#### Returns + +`void` + +--- + ### queueRings ▸ `Private` **queueRings**(`planet`, `center`, `radius`): `void` diff --git a/docs/enums/Frontend_Game_WindowManager.TooltipName.md b/docs/enums/Frontend_Game_WindowManager.TooltipName.md index ee0197d1..8c071116 100644 --- a/docs/enums/Frontend_Game_WindowManager.TooltipName.md +++ b/docs/enums/Frontend_Game_WindowManager.TooltipName.md @@ -45,7 +45,6 @@ - [Range](Frontend_Game_WindowManager.TooltipName.md#range) - [Rank](Frontend_Game_WindowManager.TooltipName.md#rank) - [Score](Frontend_Game_WindowManager.TooltipName.md#score) -- [SelectedEnergy](Frontend_Game_WindowManager.TooltipName.md#selectedenergy) - [SelectedSilver](Frontend_Game_WindowManager.TooltipName.md#selectedsilver) - [Silver](Frontend_Game_WindowManager.TooltipName.md#silver) - [SilverCap](Frontend_Game_WindowManager.TooltipName.md#silvercap) @@ -61,7 +60,7 @@ ### ArtifactBuff -• **ArtifactBuff** = `36` +• **ArtifactBuff** = `35` --- @@ -79,61 +78,61 @@ ### BonusDefense -• **BonusDefense** = `29` +• **BonusDefense** = `28` --- ### BonusEnergyCap -• **BonusEnergyCap** = `25` +• **BonusEnergyCap** = `24` --- ### BonusEnergyGro -• **BonusEnergyGro** = `26` +• **BonusEnergyGro** = `25` --- ### BonusRange -• **BonusRange** = `27` +• **BonusRange** = `26` --- ### BonusSpeed -• **BonusSpeed** = `28` +• **BonusSpeed** = `27` --- ### Clowntown -• **Clowntown** = `35` +• **Clowntown** = `34` --- ### CurrentMining -• **CurrentMining** = `22` +• **CurrentMining** = `21` --- ### Defense -• **Defense** = `34` +• **Defense** = `33` --- ### Energy -• **Energy** = `30` +• **Energy** = `29` --- ### EnergyGrowth -• **EnergyGrowth** = `31` +• **EnergyGrowth** = `30` --- @@ -145,13 +144,13 @@ ### HashesPerSec -• **HashesPerSec** = `21` +• **HashesPerSec** = `20` --- ### HoverPlanet -• **HoverPlanet** = `23` +• **HoverPlanet** = `22` --- @@ -169,91 +168,91 @@ ### MiningPause -• **MiningPause** = `19` +• **MiningPause** = `18` --- ### MiningTarget -• **MiningTarget** = `20` +• **MiningTarget** = `19` --- ### ModalFindArtifact -• **ModalFindArtifact** = `47` +• **ModalFindArtifact** = `46` --- ### ModalHats -• **ModalHats** = `44` +• **ModalHats** = `43` --- ### ModalHelp -• **ModalHelp** = `37` +• **ModalHelp** = `36` --- ### ModalLeaderboard -• **ModalLeaderboard** = `39` +• **ModalLeaderboard** = `38` --- ### ModalPlanetDetails -• **ModalPlanetDetails** = `38` +• **ModalPlanetDetails** = `37` --- ### ModalPlanetDex -• **ModalPlanetDex** = `40` +• **ModalPlanetDex** = `39` --- ### ModalPlugins -• **ModalPlugins** = `48` +• **ModalPlugins** = `47` --- ### ModalSettings -• **ModalSettings** = `45` +• **ModalSettings** = `44` --- ### ModalTwitterBroadcast -• **ModalTwitterBroadcast** = `43` +• **ModalTwitterBroadcast** = `42` --- ### ModalTwitterVerification -• **ModalTwitterVerification** = `42` +• **ModalTwitterVerification** = `41` --- ### ModalUpgradeDetails -• **ModalUpgradeDetails** = `41` +• **ModalUpgradeDetails** = `40` --- ### ModalWithdrawSilver -• **ModalWithdrawSilver** = `49` +• **ModalWithdrawSilver** = `48` --- ### ModalYourArtifacts -• **ModalYourArtifacts** = `46` +• **ModalYourArtifacts** = `45` --- @@ -277,25 +276,19 @@ ### Range -• **Range** = `32` +• **Range** = `31` --- ### Rank -• **Rank** = `17` +• **Rank** = `16` --- ### Score -• **Score** = `18` - ---- - -### SelectedEnergy - -• **SelectedEnergy** = `16` +• **Score** = `17` --- @@ -325,13 +318,13 @@ ### SilverProd -• **SilverProd** = `24` +• **SilverProd** = `23` --- ### Speed -• **Speed** = `33` +• **Speed** = `32` --- diff --git a/docs/modules/Backend_GameLogic_ArrivalUtils.md b/docs/modules/Backend_GameLogic_ArrivalUtils.md index bf0bbe95..fb133644 100644 --- a/docs/modules/Backend_GameLogic_ArrivalUtils.md +++ b/docs/modules/Backend_GameLogic_ArrivalUtils.md @@ -13,6 +13,7 @@ - [blocksLeftToProspectExpiration](Backend_GameLogic_ArrivalUtils.md#blockslefttoprospectexpiration) - [enoughEnergyToProspect](Backend_GameLogic_ArrivalUtils.md#enoughenergytoprospect) - [getEmojiMessage](Backend_GameLogic_ArrivalUtils.md#getemojimessage) +- [getRange](Backend_GameLogic_ArrivalUtils.md#getrange) - [isFindable](Backend_GameLogic_ArrivalUtils.md#isfindable) - [isProspectable](Backend_GameLogic_ArrivalUtils.md#isprospectable) - [prospectExpired](Backend_GameLogic_ArrivalUtils.md#prospectexpired) @@ -109,6 +110,23 @@ --- +### getRange + +▸ **getRange**(`planet`, `percentEnergySending?`): `number` + +#### Parameters + +| Name | Type | Default value | +| :--------------------- | :------- | :------------ | +| `planet` | `Planet` | `undefined` | +| `percentEnergySending` | `number` | `100` | + +#### Returns + +`number` + +--- + ### isFindable ▸ `Const` **isFindable**(`planet`, `currentBlockNumber?`): `boolean` diff --git a/docs/modules/Frontend_Components_CoreUI.md b/docs/modules/Frontend_Components_CoreUI.md index 5fbab002..a5a345e5 100644 --- a/docs/modules/Frontend_Components_CoreUI.md +++ b/docs/modules/Frontend_Components_CoreUI.md @@ -4,10 +4,13 @@ ### Variables +- [AlignCenterHorizontally](Frontend_Components_CoreUI.md#aligncenterhorizontally) +- [AlignCenterVertically](Frontend_Components_CoreUI.md#aligncentervertically) - [BorderlessPane](Frontend_Components_CoreUI.md#borderlesspane) - [Bottom](Frontend_Components_CoreUI.md#bottom) - [CenterBackgroundSubtext](Frontend_Components_CoreUI.md#centerbackgroundsubtext) - [CenterRow](Frontend_Components_CoreUI.md#centerrow) +- [CenteredText](Frontend_Components_CoreUI.md#centeredtext) - [Display](Frontend_Components_CoreUI.md#display) - [DontShrink](Frontend_Components_CoreUI.md#dontshrink) - [EmSpacer](Frontend_Components_CoreUI.md#emspacer) @@ -18,10 +21,9 @@ - [FullWidth](Frontend_Components_CoreUI.md#fullwidth) - [HeaderText](Frontend_Components_CoreUI.md#headertext) - [Hidden](Frontend_Components_CoreUI.md#hidden) -- [HorizontalFlex](Frontend_Components_CoreUI.md#horizontalflex) -- [HoverLink](Frontend_Components_CoreUI.md#hoverlink) - [HoverableTooltip](Frontend_Components_CoreUI.md#hoverabletooltip) - [InlineBlock](Frontend_Components_CoreUI.md#inlineblock) +- [KeyboardBtn](Frontend_Components_CoreUI.md#keyboardbtn) - [MaxWidth](Frontend_Components_CoreUI.md#maxwidth) - [Padded](Frontend_Components_CoreUI.md#padded) - [PaddedRecommendedModalWidth](Frontend_Components_CoreUI.md#paddedrecommendedmodalwidth) @@ -30,11 +32,11 @@ - [Section](Frontend_Components_CoreUI.md#section) - [SectionHeader](Frontend_Components_CoreUI.md#sectionheader) - [Select](Frontend_Components_CoreUI.md#select) +- [Separator](Frontend_Components_CoreUI.md#separator) - [Spacer](Frontend_Components_CoreUI.md#spacer) - [TextButton](Frontend_Components_CoreUI.md#textbutton) - [Truncate](Frontend_Components_CoreUI.md#truncate) - [Underline](Frontend_Components_CoreUI.md#underline) -- [VerticalFlex](Frontend_Components_CoreUI.md#verticalflex) ### Functions @@ -44,6 +46,20 @@ ## Variables +### AlignCenterHorizontally + +• `Const` **AlignCenterHorizontally**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +Fills parent width, aligns children horizontally in the center. + +--- + +### AlignCenterVertically + +• `Const` **AlignCenterVertically**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + ### BorderlessPane • `Const` **BorderlessPane**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> @@ -72,6 +88,12 @@ be displayed. Think of it as a placeholder. --- +### CenteredText + +• `Const` **CenteredText**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + ### Display • `Const` **Display**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> @@ -82,12 +104,16 @@ be displayed. Think of it as a placeholder. • `Const` **DontShrink**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> +Don't shrink in a flexbox. + --- ### EmSpacer • `Const` **EmSpacer**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> +Inline block rectangle, measured in ems, default 1em by 1em. + --- ### Emphasized @@ -100,6 +126,8 @@ be displayed. Think of it as a placeholder. • `Const` **Expand**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> +Expands to fill space in a flexbox. + --- ### FloatRight @@ -132,18 +160,6 @@ be displayed. Think of it as a placeholder. --- -### HorizontalFlex - -• `Const` **HorizontalFlex**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ---- - -### HoverLink - -• `Const` **HoverLink**: `StyledComponent`<`"a"`, `any`, `Object`, `never`\> - ---- - ### HoverableTooltip • `Const` **HoverableTooltip**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> @@ -156,6 +172,12 @@ be displayed. Think of it as a placeholder. --- +### KeyboardBtn + +• `Const` **KeyboardBtn**: `StyledComponent`<`"kbd"`, `any`, `Object`, `never`\> + +--- + ### MaxWidth • `Const` **MaxWidth**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> @@ -210,6 +232,12 @@ way to do this. --- +### Separator + +• `Const` **Separator**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> + +--- + ### Spacer • `Const` **Spacer**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> @@ -232,27 +260,23 @@ way to do this. • `Const` **Underline**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> ---- - -### VerticalFlex - -• `Const` **VerticalFlex**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ## Functions ### Link ▸ **Link**(`__namedParameters`): `Element` +This is the link that all core ui in Dark Forest should use. Please! + #### Parameters -| Name | Type | -| :-------------------------------- | :---------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.children` | `React.ReactNode` | -| `__namedParameters.color?` | `string` | -| `__namedParameters.openInNewTab?` | `boolean` | -| `__namedParameters.to` | `string` | +| Name | Type | +| :--------------------------------- | :---------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.children` | `React.ReactNode` | +| `__namedParameters.color?` | `string` | +| `__namedParameters.openInThisTab?` | `boolean` | +| `__namedParameters.to` | `string` | #### Returns diff --git a/docs/modules/Frontend_Components_Labels_Labels.md b/docs/modules/Frontend_Components_Labels_Labels.md index 5d7ab2ec..33989458 100644 --- a/docs/modules/Frontend_Components_Labels_Labels.md +++ b/docs/modules/Frontend_Components_Labels_Labels.md @@ -4,14 +4,16 @@ ### Functions -- [AccountLabel](Frontend_Components_Labels_Labels.md#accountlabel) +- [LoggedInPlayer](Frontend_Components_Labels_Labels.md#loggedinplayer) - [TwitterLink](Frontend_Components_Labels_Labels.md#twitterlink) ## Functions -### AccountLabel +### LoggedInPlayer -▸ **AccountLabel**(): `Element` +▸ **LoggedInPlayer**(): `Element` + +Returns a either a link to the player's twitter, or a [TextPreview](Frontend_Components_TextPreview.md#textpreview) of their address. #### Returns @@ -23,6 +25,8 @@ ▸ **TwitterLink**(`__namedParameters`): `Element` +Link to a twitter account. + #### Parameters | Name | Type | diff --git a/docs/modules/Frontend_Components_TextPreview.md b/docs/modules/Frontend_Components_TextPreview.md index 318a770b..f4a3ef66 100644 --- a/docs/modules/Frontend_Components_TextPreview.md +++ b/docs/modules/Frontend_Components_TextPreview.md @@ -14,13 +14,14 @@ #### Parameters -| Name | Type | -| :---------------------------------- | :------- | -| `__namedParameters` | `Object` | -| `__namedParameters.focusedWidth?` | `string` | -| `__namedParameters.maxLength?` | `number` | -| `__namedParameters.text?` | `string` | -| `__namedParameters.unFocusedWidth?` | `string` | +| Name | Type | +| :---------------------------------- | :-------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.focusedWidth?` | `string` | +| `__namedParameters.maxLength?` | `number` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | +| `__namedParameters.unFocusedWidth?` | `string` | #### Returns diff --git a/docs/modules/Frontend_Panes_HoverPlanetPane.md b/docs/modules/Frontend_Panes_HoverPlanetPane.md index 6c0391dc..95c13e20 100644 --- a/docs/modules/Frontend_Panes_HoverPlanetPane.md +++ b/docs/modules/Frontend_Panes_HoverPlanetPane.md @@ -12,6 +12,8 @@ ▸ **HoverPlanetPane**(): `Element` +This is the pane that is rendered when you hover over a planet. + #### Returns `Element` diff --git a/docs/modules/Frontend_Panes_TooltipPanes.md b/docs/modules/Frontend_Panes_TooltipPanes.md index 721e99d6..2c32a5e2 100644 --- a/docs/modules/Frontend_Panes_TooltipPanes.md +++ b/docs/modules/Frontend_Panes_TooltipPanes.md @@ -30,7 +30,6 @@ - [RangeTooltipPane](Frontend_Panes_TooltipPanes.md#rangetooltippane) - [RankTooltipPane](Frontend_Panes_TooltipPanes.md#ranktooltippane) - [ScoreTooltipPane](Frontend_Panes_TooltipPanes.md#scoretooltippane) -- [SelectedEnergyTooltipPane](Frontend_Panes_TooltipPanes.md#selectedenergytooltippane) - [SelectedSilverTooltipPane](Frontend_Panes_TooltipPanes.md#selectedsilvertooltippane) - [SilverCapTooltipPane](Frontend_Panes_TooltipPanes.md#silvercaptooltippane) - [SilverGrowthTooltipPane](Frontend_Panes_TooltipPanes.md#silvergrowthtooltippane) @@ -304,16 +303,6 @@ --- -### SelectedEnergyTooltipPane - -▸ **SelectedEnergyTooltipPane**(): `Element` - -#### Returns - -`Element` - ---- - ### SelectedSilverTooltipPane ▸ **SelectedSilverTooltipPane**(): `Element` diff --git a/docs/modules/Frontend_Styles_dfstyles.md b/docs/modules/Frontend_Styles_dfstyles.md index ef865cb5..825cb0fa 100644 --- a/docs/modules/Frontend_Styles_dfstyles.md +++ b/docs/modules/Frontend_Styles_dfstyles.md @@ -7,6 +7,7 @@ - [ARTIFACT_ROW_H](Frontend_Styles_dfstyles.md#artifact_row_h) - [SPACE_TYPE_COLORS](Frontend_Styles_dfstyles.md#space_type_colors) - [default](Frontend_Styles_dfstyles.md#default) +- [snips](Frontend_Styles_dfstyles.md#snips) ## Variables @@ -39,7 +40,8 @@ | `colors.backgroundlighter` | `string` | | `colors.blueBackground` | `string` | | `colors.border` | `string` | -| `colors.darkBorder` | `string` | +| `colors.borderDark` | `string` | +| `colors.borderDarker` | `string` | | `colors.dfblue` | `string` | | `colors.dfgreen` | `string` | | `colors.dfgreendark` | `string` | @@ -89,3 +91,21 @@ | `prefabs.noselect` | `FlattenSimpleInterpolation` | | `screenSizeS` | `string` | | `titleFont` | `string` | + +--- + +### snips + +• `Const` **snips**: `Object` + +#### Type declaration + +| Name | Type | +| :----------------------- | :--------------------------- | +| `absoluteTopLeft` | `FlattenSimpleInterpolation` | +| `bigPadding` | `FlattenSimpleInterpolation` | +| `defaultBackground` | `string` | +| `defaultModalWidth` | `FlattenSimpleInterpolation` | +| `pane` | `string` | +| `roundedBorders` | `string` | +| `roundedBordersWithEdge` | `FlattenSimpleInterpolation` | diff --git a/docs/modules/Frontend_Utils_ShortcutConstants.md b/docs/modules/Frontend_Utils_ShortcutConstants.md index 07ab1d51..2f3eb371 100644 --- a/docs/modules/Frontend_Utils_ShortcutConstants.md +++ b/docs/modules/Frontend_Utils_ShortcutConstants.md @@ -4,12 +4,14 @@ ### Variables +- [MODAL_BACK_SHORTCUT](Frontend_Utils_ShortcutConstants.md#modal_back_shortcut) - [TOGGLE_ARTIFACTS_DEX_PANE](Frontend_Utils_ShortcutConstants.md#toggle_artifacts_dex_pane) - [TOGGLE_BROADCAST_PANE](Frontend_Utils_ShortcutConstants.md#toggle_broadcast_pane) - [TOGGLE_DIAGNOSTICS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_diagnostics_pane) - [TOGGLE_HAT_PANE](Frontend_Utils_ShortcutConstants.md#toggle_hat_pane) - [TOGGLE_PLANET_ARTIFACTS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_planet_artifacts_pane) - [TOGGLE_PLANET_DEX_PANE](Frontend_Utils_ShortcutConstants.md#toggle_planet_dex_pane) +- [TOGGLE_SEND](Frontend_Utils_ShortcutConstants.md#toggle_send) - [TOGGLE_UPGRADES_PANE](Frontend_Utils_ShortcutConstants.md#toggle_upgrades_pane) ### Functions @@ -18,45 +20,57 @@ ## Variables +### MODAL_BACK_SHORTCUT + +• `Const` **MODAL_BACK_SHORTCUT**: `"r"` + +--- + ### TOGGLE_ARTIFACTS_DEX_PANE -• `Const` **TOGGLE_ARTIFACTS_DEX_PANE**: `"e"` +• `Const` **TOGGLE_ARTIFACTS_DEX_PANE**: `"o"` --- ### TOGGLE_BROADCAST_PANE -• `Const` **TOGGLE_BROADCAST_PANE**: `"b"` +• `Const` **TOGGLE_BROADCAST_PANE**: `"z"` --- ### TOGGLE_DIAGNOSTICS_PANE -• `Const` **TOGGLE_DIAGNOSTICS_PANE**: `"p"` +• `Const` **TOGGLE_DIAGNOSTICS_PANE**: `"i"` --- ### TOGGLE_HAT_PANE -• `Const` **TOGGLE_HAT_PANE**: `"h"` +• `Const` **TOGGLE_HAT_PANE**: `"x"` --- ### TOGGLE_PLANET_ARTIFACTS_PANE -• `Const` **TOGGLE_PLANET_ARTIFACTS_PANE**: `"a"` +• `Const` **TOGGLE_PLANET_ARTIFACTS_PANE**: `"s"` --- ### TOGGLE_PLANET_DEX_PANE -• `Const` **TOGGLE_PLANET_DEX_PANE**: `"q"` +• `Const` **TOGGLE_PLANET_DEX_PANE**: `"p"` + +--- + +### TOGGLE_SEND + +• `Const` **TOGGLE_SEND**: `"q"` --- ### TOGGLE_UPGRADES_PANE -• `Const` **TOGGLE_UPGRADES_PANE**: `"u"` +• `Const` **TOGGLE_UPGRADES_PANE**: `"a"` ## Functions diff --git a/docs/modules/Frontend_Views_PlanetCardComponents.md b/docs/modules/Frontend_Views_PlanetCardComponents.md index 973eb6c9..f569e682 100644 --- a/docs/modules/Frontend_Views_PlanetCardComponents.md +++ b/docs/modules/Frontend_Views_PlanetCardComponents.md @@ -5,17 +5,14 @@ ### Variables - [DestroyedMarker](Frontend_Views_PlanetCardComponents.md#destroyedmarker) -- [PlanetTag](Frontend_Views_PlanetCardComponents.md#planettag) -- [StatCell](Frontend_Views_PlanetCardComponents.md#statcell) -- [StatContainer](Frontend_Views_PlanetCardComponents.md#statcontainer) -- [StatRow](Frontend_Views_PlanetCardComponents.md#statrow) +- [SpreadApart](Frontend_Views_PlanetCardComponents.md#spreadapart) - [TitleBar](Frontend_Views_PlanetCardComponents.md#titlebar) ### Functions -- [PCStatIcon](Frontend_Views_PlanetCardComponents.md#pcstaticon) - [PlanetActiveArtifact](Frontend_Views_PlanetCardComponents.md#planetactiveartifact) - [RowTip](Frontend_Views_PlanetCardComponents.md#rowtip) +- [TimesTwo](Frontend_Views_PlanetCardComponents.md#timestwo) ## Variables @@ -23,29 +20,16 @@ • `Const` **DestroyedMarker**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> ---- - -### PlanetTag - -• `Const` **PlanetTag**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> +Displayed in [PlanetContextPane](Frontend_Panes_PlanetContextPane.md#planetcontextpane) when a planet is {@code destroyed}. --- -### StatCell - -• `Const` **StatCell**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> +### SpreadApart ---- - -### StatContainer +• `Const` **SpreadApart**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> -• `Const` **StatContainer**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> - ---- - -### StatRow - -• `Const` **StatRow**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> +Expands to fit the width of container. Is itself a flex box that spreads out its children +horizontally. --- @@ -55,25 +39,6 @@ ## Functions -### PCStatIcon - -▸ **PCStatIcon**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :--------------------------- | :--------------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.children` | `React.ReactNode` | -| `__namedParameters.planet` | `Planet` \| `undefined` | -| `__namedParameters.stat` | [`StatIdx`](../enums/_types_global_GlobalTypes.StatIdx.md) | - -#### Returns - -`Element` - ---- - ### PlanetActiveArtifact ▸ **PlanetActiveArtifact**(`__namedParameters`): `Element` @@ -107,3 +72,13 @@ #### Returns `Element` + +--- + +### TimesTwo + +▸ `Const` **TimesTwo**(): `Element` + +#### Returns + +`Element` diff --git a/last_updated.txt b/last_updated.txt index 72ffecef..f1f08e18 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Tue Jul 27 18:14:12 UTC 2021 +last updated: Wed Jul 28 22:47:00 UTC 2021 diff --git a/package.json b/package.json index a37b1049..3bad1c97 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,19 @@ { "name": "client", - "version": "6.2.0-staging-jul-27-2021-2.0", + "version": "6.2.0-staging-jul-28.0", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.0-staging-jul-27-2021-2.0", - "@darkforest_eth/contracts": "6.2.0-staging-jul-27-2021-2.0", - "@darkforest_eth/events": "6.2.0-staging-jul-27-2021-2.0", - "@darkforest_eth/hashing": "6.2.0-staging-jul-27-2021-2.0", - "@darkforest_eth/hexgen": "6.2.0-staging-jul-27-2021-2.0", - "@darkforest_eth/network": "6.2.0-staging-jul-27-2021-2.0", - "@darkforest_eth/serde": "6.2.0-staging-jul-27-2021-2.0", - "@darkforest_eth/snarks": "6.2.0-staging-jul-27-2021-2.0", - "@darkforest_eth/types": "6.2.0-staging-jul-27-2021-2.0", + "@darkforest_eth/constants": "6.2.0-staging-jul-28.0", + "@darkforest_eth/contracts": "6.2.0-staging-jul-28.0", + "@darkforest_eth/events": "6.2.0-staging-jul-28.0", + "@darkforest_eth/hashing": "6.2.0-staging-jul-28.0", + "@darkforest_eth/hexgen": "6.2.0-staging-jul-28.0", + "@darkforest_eth/network": "6.2.0-staging-jul-28.0", + "@darkforest_eth/serde": "6.2.0-staging-jul-28.0", + "@darkforest_eth/snarks": "6.2.0-staging-jul-28.0", + "@darkforest_eth/types": "6.2.0-staging-jul-28.0", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", @@ -34,6 +34,7 @@ "json-stable-stringify": "^1.0.1", "lodash": "^4.17.15", "p-defer": "^3.0.0", + "p-timeout": "^4.0.0", "preact": "^10.5.13", "prismjs": "^1.22.0", "react": "^16.9.0", diff --git a/src/Backend/GameLogic/ArrivalUtils.ts b/src/Backend/GameLogic/ArrivalUtils.ts index 4b13dd95..c6de0279 100644 --- a/src/Backend/GameLogic/ArrivalUtils.ts +++ b/src/Backend/GameLogic/ArrivalUtils.ts @@ -218,3 +218,8 @@ export function getEmojiMessage( ): PlanetMessage | undefined { return planet?.messages?.find(isEmojiFlagMessage); } + +export function getRange(planet: Planet, percentEnergySending = 100): number { + if (percentEnergySending === 0) return 0; + return Math.max(Math.log2(percentEnergySending / 5), 0) * planet.range; +} diff --git a/src/Backend/GameLogic/GameManager.ts b/src/Backend/GameLogic/GameManager.ts index 4dcc6be8..af97c5d9 100644 --- a/src/Backend/GameLogic/GameManager.ts +++ b/src/Backend/GameLogic/GameManager.ts @@ -115,7 +115,7 @@ import { isUnconfirmedWithdrawSilver, } from '../Utils/TypeAssertions'; import { getRandomActionId, hexifyBigIntNestedArray } from '../Utils/Utils'; -import { getEmojiMessage } from './ArrivalUtils'; +import { getEmojiMessage, getRange } from './ArrivalUtils'; import { isActivated } from './ArtifactUtils'; import { ContractsAPI, makeContractsAPI } from './ContractsAPI'; import { GameObjects } from './GameObjects'; @@ -365,6 +365,8 @@ class GameManager extends EventEmitter { totalTransactions: 0, transactionsInQueue: 0, totalChunks: 0, + width: 0, + height: 0, }; this.terminal = terminal; @@ -1213,7 +1215,7 @@ class GameManager extends EventEmitter { * location or if no planet exists at location. If the planet needs to be updated (because * some time has passed since we last updated the planet), then updates that planet first. */ - getPlanetWithCoords(coords: WorldCoords): Planet | undefined { + getPlanetWithCoords(coords: WorldCoords): LocatablePlanet | undefined { return this.entityStore.getPlanetWithCoords(coords); } @@ -1238,6 +1240,14 @@ class GameManager extends EventEmitter { return this.entityStore.getPlanetWithId(planetId, false); } + /** + * Gets all the planets that this planet could reach if it sent 100% of its energy. + */ + getPlanetsWithinRange(planet: LocatablePlanet) { + const maxRange = getRange(planet, 100); + return this.getGameObjects().getPlanetsInWorldCircle(planet.location.coords, maxRange); + } + /** * Get the score of the currently logged-in account. */ diff --git a/src/Backend/GameLogic/GameObjects.ts b/src/Backend/GameLogic/GameObjects.ts index 49467990..cd66dc4f 100644 --- a/src/Backend/GameLogic/GameObjects.ts +++ b/src/Backend/GameLogic/GameObjects.ts @@ -561,7 +561,7 @@ export class GameObjects { // returns an empty planet if planet is not in contract // returns undefined if this isn't a planet, according to hash and coords - public getPlanetWithCoords(coords: WorldCoords): Planet | undefined { + public getPlanetWithCoords(coords: WorldCoords): LocatablePlanet | undefined { const str = getCoordsString(coords); const location = this.coordsToLocation.get(str); @@ -569,7 +569,7 @@ export class GameObjects { return undefined; } - return this.getPlanetWithLocation(location); + return this.getPlanetWithLocation(location) as LocatablePlanet; } // returns an empty planet if planet is not in contract @@ -1040,6 +1040,17 @@ export class GameObjects { return this.revealedLocations; } + public getPlanetsWithIds(locationIds: LocationId[], updateIfStale = true): Planet[] { + return locationIds + .map((id) => this.getPlanetWithId(id, updateIfStale)) + .filter((p) => p !== undefined) as LocatablePlanet[]; + } + + public getPlanetsInWorldCircle(coords: WorldCoords, radius: number): LocatablePlanet[] { + const locationIds = this.layeredMap.getPlanetsInCircle(coords, radius); + return this.getPlanetsWithIds(locationIds) as LocatablePlanet[]; + } + /** * Gets the ids of all the planets that are both within the given bounding box (defined by its bottom * left coordinate, width, and height) in the world and of a level that was passed in via the @@ -1062,9 +1073,7 @@ export class GameObjects { levels, planetLevelToRadii ); - return locationIds - .map((id) => this.getPlanetWithId(id, updateIfStale)) - .filter((p) => p !== undefined) as LocatablePlanet[]; + return this.getPlanetsWithIds(locationIds) as LocatablePlanet[]; } /** diff --git a/src/Backend/GameLogic/GameUIManager.ts b/src/Backend/GameLogic/GameUIManager.ts index 9a44f981..dc484f14 100644 --- a/src/Backend/GameLogic/GameUIManager.ts +++ b/src/Backend/GameLogic/GameUIManager.ts @@ -69,13 +69,13 @@ class GameUIManager extends EventEmitter { private terminal: React.MutableRefObject; private previousSelectedPlanet: Planet | undefined; - private selectedPlanet: Planet | undefined; + private selectedPlanet: LocatablePlanet | undefined; private selectedCoords: WorldCoords | undefined; - private mouseDownOverPlanet: Planet | undefined; + private mouseDownOverPlanet: LocatablePlanet | undefined; private mouseDownOverCoords: WorldCoords | undefined; - private mouseHoveringOverPlanet: Planet | undefined; + private mouseHoveringOverPlanet: LocatablePlanet | undefined; private mouseHoveringOverCoords: WorldCoords | undefined; - private sendingPlanet: Planet | undefined; + private sendingPlanet: LocatablePlanet | undefined; private sendingCoords: WorldCoords | undefined; private isSending = false; private viewportEntities: ViewportEntities; @@ -248,7 +248,7 @@ class GameUIManager extends EventEmitter { // actions - public centerPlanet(planet: Planet | undefined) { + public centerPlanet(planet: LocatablePlanet | undefined) { if (planet) { Viewport.getInstance().centerPlanet(planet); this.setSelectedPlanet(planet); @@ -257,7 +257,7 @@ class GameUIManager extends EventEmitter { public centerCoords(coords: WorldCoords) { const planet = this.gameManager.getPlanetWithCoords(coords); - if (planet) { + if (planet && isLocatable(planet)) { this.centerPlanet(planet); } else { Viewport.getInstance().centerCoords(coords); @@ -266,7 +266,9 @@ class GameUIManager extends EventEmitter { public centerLocationId(planetId: LocationId) { const planet = this.getPlanetWithId(planetId); - this.centerPlanet(planet); + if (planet && isLocatable(planet)) { + this.centerPlanet(planet); + } } public joinGame(beforeRetry: (e: Error) => Promise): GameUIManager { @@ -628,7 +630,7 @@ class GameUIManager extends EventEmitter { return this.gameManager.getAllPlayers(); } - public getSelectedPlanet(): Planet | undefined { + public getSelectedPlanet(): LocatablePlanet | undefined { return this.selectedPlanet; } @@ -638,10 +640,10 @@ class GameUIManager extends EventEmitter { public setSelectedId(id: LocationId): void { const planet = this.getPlanetWithId(id); - if (planet) this.setSelectedPlanet(planet); + if (planet && isLocatable(planet)) this.setSelectedPlanet(planet); } - public setSelectedPlanet(planet: Planet | undefined): void { + public setSelectedPlanet(planet: LocatablePlanet | undefined): void { this.previousSelectedPlanet = this.selectedPlanet; if (!planet) { @@ -675,12 +677,12 @@ class GameUIManager extends EventEmitter { return this.selectedCoords; } - public getMouseDownPlanet(): Planet | undefined { + public getMouseDownPlanet(): LocatablePlanet | undefined { if (this.isSending && this.sendingPlanet) return this.sendingPlanet; return this.mouseDownOverPlanet; } - public onSendInit(planet: Planet | undefined): void { + public onSendInit(planet: LocatablePlanet | undefined): void { this.isSending = true; this.sendingPlanet = planet; const loc = planet && this.getLocationOfPlanet(planet.locationId); @@ -847,7 +849,7 @@ class GameUIManager extends EventEmitter { return this.mouseDownOverCoords; } - private setHoveringOverPlanet(planet: Planet | undefined) { + private setHoveringOverPlanet(planet: LocatablePlanet | undefined) { const lastHover = this.mouseHoveringOverPlanet; this.mouseHoveringOverPlanet = planet; @@ -1138,16 +1140,18 @@ class GameUIManager extends EventEmitter { private updatePlanets() { if (this.selectedPlanet) { - this.selectedPlanet = this.gameManager.getPlanetWithId(this.selectedPlanet.locationId); + this.selectedPlanet = this.gameManager.getPlanetWithId( + this.selectedPlanet.locationId + ) as LocatablePlanet; } if (this.mouseDownOverPlanet) { this.mouseDownOverPlanet = this.gameManager.getPlanetWithId( this.mouseDownOverPlanet.locationId - ); + ) as LocatablePlanet; } if (this.mouseHoveringOverPlanet) { this.setHoveringOverPlanet( - this.gameManager.getPlanetWithId(this.mouseHoveringOverPlanet.locationId) + this.gameManager.getPlanetWithId(this.mouseHoveringOverPlanet.locationId) as LocatablePlanet ); } } diff --git a/src/Backend/GameLogic/LayeredMap.ts b/src/Backend/GameLogic/LayeredMap.ts index 15e71665..e94fb81b 100644 --- a/src/Backend/GameLogic/LayeredMap.ts +++ b/src/Backend/GameLogic/LayeredMap.ts @@ -1,6 +1,6 @@ import { MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; -import { LocationId, WorldLocation } from '@darkforest_eth/types'; -import { Box, Point, QuadTree } from 'js-quadtree'; +import { LocationId, WorldCoords, WorldLocation } from '@darkforest_eth/types'; +import { Box, Circle, Point, QuadTree } from 'js-quadtree'; import { QuadTreeConfig } from 'js-quadtree/dist/types'; import { Radii } from './ViewportEntities'; @@ -31,7 +31,7 @@ export class LayeredMap { for (let i = MIN_PLANET_LEVEL; i <= MAX_PLANET_LEVEL; i++) { const config: QuadTreeConfig = { - maximumDepth: i <= 3 ? 15 : 10, + maximumDepth: i <= 3 ? 10 : 10, removeEmptyNodes: true, }; @@ -52,6 +52,19 @@ export class LayeredMap { this.insertedLocations.add(location.hash); } + /** + * Gets all the planets within the given world radius of a world location. + */ + public getPlanetsInCircle(coords: WorldCoords, worldRadius: number): LocationId[] { + const results = []; + for (const quad of this.perLevelPlanetQuadtrees.values()) { + results.push( + ...quad.query(new Circle(coords.x, coords.y, worldRadius)).map(this.getPointLocationId) + ); + } + return results; + } + /** * Gets the ids of all the planets that are both within the given bounding box (defined by its bottom * left coordinate, width, and height) in the world and of a level that was passed in via the @@ -79,14 +92,15 @@ export class LayeredMap { ); const planets = - this.perLevelPlanetQuadtrees - .get(level) - ?.query(bounds) - .map((p) => (p.data as PlanetPointData).locationId) || []; + this.perLevelPlanetQuadtrees.get(level)?.query(bounds).map(this.getPointLocationId) || []; result.push(...planets); } return result; } + + private getPointLocationId(point: Point): LocationId { + return (point.data as PlanetPointData).locationId; + } } diff --git a/src/Backend/GameLogic/ViewportEntities.ts b/src/Backend/GameLogic/ViewportEntities.ts index 8fc245f6..15863b8f 100644 --- a/src/Backend/GameLogic/ViewportEntities.ts +++ b/src/Backend/GameLogic/ViewportEntities.ts @@ -203,11 +203,14 @@ export class ViewportEntities { private getVisiblePlanetLevels(viewport: Viewport) { const result = []; + const viewportWidthPx = viewport.worldToCanvasDist(viewport.getViewportWorldWidth()); + const minPlanetSize = viewportWidthPx > 40_000 ? 3 : 1; + for (let i = 0; i <= MAX_PLANET_LEVEL; i++) { const radiusW = this.uiManager.getRadiusOfPlanetLevel(i as PlanetLevel); const radiusPx = viewport.worldToCanvasDist(radiusW); - if (radiusPx >= 1) { + if (radiusPx >= minPlanetSize && radiusPx < viewportWidthPx * 3) { result.push(i); } } diff --git a/src/Backend/Network/UtilityServerAPI.ts b/src/Backend/Network/UtilityServerAPI.ts index dd6e392a..a668c654 100644 --- a/src/Backend/Network/UtilityServerAPI.ts +++ b/src/Backend/Network/UtilityServerAPI.ts @@ -1,6 +1,6 @@ -import { timeoutAfter } from '@darkforest_eth/network'; import { EthAddress, SignedMessage } from '@darkforest_eth/types'; import * as EmailValidator from 'email-validator'; +import timeout from 'p-timeout'; import { AddressTwitterMap } from '../../_types/darkforest/api/UtilityServerAPITypes'; export const WEBSERVER_URL = process.env.WEBSERVER_URL as string; @@ -112,7 +112,7 @@ export const requestDevFaucet = async (address: EthAddress): Promise => */ export const tryGetAllTwitters = async (): Promise => { try { - return await timeoutAfter(getAllTwitters(), 1000 * 5, "couldn't get twitter map"); + return await timeout(getAllTwitters(), 1000 * 5, "couldn't get twitter map"); } catch (e) {} return {}; }; diff --git a/src/Frontend/Components/Btn.tsx b/src/Frontend/Components/Btn.tsx index 3dbb77c1..5b21e5db 100644 --- a/src/Frontend/Components/Btn.tsx +++ b/src/Frontend/Components/Btn.tsx @@ -21,8 +21,8 @@ const BtnElement = styled.span` user-select: none; display: inline-flex; border-radius: 3px; - padding: 0 0.3em; - border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.border}; + padding: 0.15em; + border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.borderDark}; justify-content: center; align-items: center; cursor: pointer; @@ -35,7 +35,7 @@ const BtnElement = styled.span` &:hover { ${!disabled && css` - border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.text}; + border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.border}; color: ${dfstyles.colors.background}; background: ${color || dfstyles.colors.text}; `} @@ -55,7 +55,7 @@ const BtnElement = styled.span` ${forceActive && css` - border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.text}; + border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.border}; color: ${dfstyles.colors.background}; background: ${color || dfstyles.colors.text}; `} diff --git a/src/Frontend/Components/CoreUI.tsx b/src/Frontend/Components/CoreUI.tsx index db5c7838..f4a81408 100644 --- a/src/Frontend/Components/CoreUI.tsx +++ b/src/Frontend/Components/CoreUI.tsx @@ -9,6 +9,15 @@ export const InlineBlock = styled.div` display: inline-block; `; +export const Separator = styled.div` + width: 100%; + box-sizing: border-box; + padding-left: 2px; + padding-right: 2px; + height: 1px; + background-color: ${dfstyles.colors.borderDark}; +`; + export const FloatRight = styled.div` float: right; `; @@ -142,17 +151,17 @@ export const FullHeight = styled.div` height: 100%; `; -export const HorizontalFlex = styled.div` - ${({ justifyContent }: { justifyContent?: string }) => css` - width: 100%; - display: flex; - flex-direction: row; - justify-content: ${justifyContent || 'center'}; - align-items: center; - `} +/** + * Fills parent width, aligns children horizontally in the center. + */ +export const AlignCenterHorizontally = styled.div` + display: inline-flex; + flex-direction: row; + justify-content: center; + align-items: center; `; -export const VerticalFlex = styled.div` +export const AlignCenterVertically = styled.div` height: 100%; display: flex; flex-direction: column; @@ -160,52 +169,64 @@ export const VerticalFlex = styled.div` align-items: center; `; +/** + * Expands to fill space in a flexbox. + */ export const Expand = styled.div` display: inline-box; flex-grow: 1; `; +/** + * Don't shrink in a flexbox. + */ export const DontShrink = styled.div` display: inline-box; flex-shrink: 0; `; +/** + * This is the link that all core ui in Dark Forest should use. Please! + */ export function Link({ to, color, - openInNewTab, + openInThisTab, children, }: { to: string; color?: string; - openInNewTab?: boolean; + openInThisTab?: boolean; children: React.ReactNode; }) { return ( - + {children} - + ); } -export const HoverLink = styled.a` +const LinkImpl = styled.a` ${({ color }: { color?: string }) => css` text-decoration: underline; - color: ${color || dfstyles.colors.dfpurple}; + color: ${color || dfstyles.colors.dfblue}; } &:hover { - color: ${colors(color || dfstyles.colors.dfpurple) + color: ${colors(color || dfstyles.colors.dfblue) .lighten(0.3) .hex()}; } `} `; +/** + * Inline block rectangle, measured in ems, default 1em by 1em. + */ export const EmSpacer = styled.div` ${({ width, height }: { width?: number; height?: number }) => css` - width: 1px; - height: 1px; + width: ${width === undefined ? '1em' : width}; + height: ${height === undefined ? '1em' : height}; ${width && !height ? 'display: inline-block;' : ''} ${width ? `width: ${width}em;` : ''} ${height ? `height: ${height}em;min-height:${height}em;` : ''} @@ -373,3 +394,51 @@ export const CenterBackgroundSubtext = styled.div` text-align: center; `} `; + +// Styling from https://www.npmjs.com/package/keyboard-css +export const KeyboardBtn = styled.kbd` + ${({ active }: { active?: boolean }) => css` + font-size: 0.7rem; + line-height: 1.5; + margin: 0.25rem 0.25rem 0.375rem; + padding: 0.1rem 0.3rem; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + border: 1px solid #4b545c; + border-radius: 0.25rem; + display: inline-block; + font-weight: 400; + text-align: left; + transform: ${active ? 'translate3d(0, 2px, 0)' : 'translateZ(5px)'}; + transform-style: preserve-3d; + transition: all 0.25s cubic-bezier(0.2, 1, 0.2, 1); + box-shadow: ${active + ? '0 0 1px 1px #7a8793' + : '0 0 #56606a, 0 0 #56606a, 0 1px #56606a, 0 2px #56606a, 2px 1px 4px #adb5bd, 0 -1px 1px #adb5bd'}; + background-color: ${active ? dfstyles.colors.text : '#343a40'}; + color: ${active ? dfstyles.colors.background : '#f8f9fa'}; + &:after { + border-radius: 0.375rem; + border-width: 0.0625rem; + bottom: -6px; + left: -0.25rem; + right: -0.25rem; + top: -2px; + transform: ${active ? 'translate3d(0, -2px, 0)' : 'translateZ(-2px)'}; + border-style: solid; + box-sizing: content-box; + content: ''; + display: block; + position: absolute; + transform-style: preserve-3d; + transition: all 0.25s cubic-bezier(0.2, 1, 0.2, 1); + border-color: #626d78; + background: ${active ? 'transparent' : dfstyles.colors.background}; + } + `} +`; + +export const CenteredText = styled.span` + margin: auto; + text-align: center; +`; diff --git a/src/Frontend/Components/DisplayGasPrices.tsx b/src/Frontend/Components/DisplayGasPrices.tsx index d110c2a6..d19c5a12 100644 --- a/src/Frontend/Components/DisplayGasPrices.tsx +++ b/src/Frontend/Components/DisplayGasPrices.tsx @@ -1,6 +1,5 @@ import { GasPrices } from '@darkforest_eth/types'; import React from 'react'; -import { Underline } from './CoreUI'; export function DisplayGasPrices({ gasPrices }: { gasPrices?: GasPrices }) { return ( @@ -9,9 +8,9 @@ export function DisplayGasPrices({ gasPrices }: { gasPrices?: GasPrices }) { 'unknown' ) : ( <> - slow: {gasPrices.slow + ' '} - average: {gasPrices.average + ' '} - fast: {gasPrices.fast + ' '} + slo: {gasPrices.slow + ' '} + avg: {gasPrices.average + ' '} + fst: {gasPrices.fast + ' '} )}
diff --git a/src/Frontend/Components/Input.tsx b/src/Frontend/Components/Input.tsx index 7a212b78..e93ba817 100644 --- a/src/Frontend/Components/Input.tsx +++ b/src/Frontend/Components/Input.tsx @@ -34,13 +34,13 @@ export const DFInput = styled.input` background: ${dfstyles.colors.background}; color: ${dfstyles.colors.subtext}; border-radius: 4px; - border: 1px solid ${dfstyles.colors.border}; + border: 1px solid ${dfstyles.colors.borderDark}; ${wide ? `width: 100%;` : `width: 21em;`} padding: 2px 12px; &:hover, &:focus { - border: 1px solid ${dfstyles.colors.text}; + border: 1px solid ${dfstyles.colors.border}; background: ${dfstyles.colors.backgroundlight}; color: ${dfstyles.colors.text}; } diff --git a/src/Frontend/Components/Labels/Labels.tsx b/src/Frontend/Components/Labels/Labels.tsx index d342376c..c603ae91 100644 --- a/src/Frontend/Components/Labels/Labels.tsx +++ b/src/Frontend/Components/Labels/Labels.tsx @@ -1,9 +1,12 @@ import React from 'react'; import { usePlayer, useUIManager } from '../../Utils/AppHooks'; -import { HoverLink } from '../CoreUI'; +import { Link } from '../CoreUI'; import { TextPreview } from '../TextPreview'; -export function AccountLabel() { +/** + * Returns a either a link to the player's twitter, or a {@link TextPreview} of their address. + */ +export function LoggedInPlayer() { const uiManager = useUIManager(); const player = usePlayer(uiManager); @@ -20,10 +23,13 @@ export function AccountLabel() { ); } +/** + * Link to a twitter account. + */ export function TwitterLink({ twitter, color }: { twitter: string; color?: string }) { return ( - + @{twitter} - + ); } diff --git a/src/Frontend/Components/Labels/PlanetLabels.tsx b/src/Frontend/Components/Labels/PlanetLabels.tsx index 5c8f8fb3..b56582de 100644 --- a/src/Frontend/Components/Labels/PlanetLabels.tsx +++ b/src/Frontend/Components/Labels/PlanetLabels.tsx @@ -142,7 +142,8 @@ export const PlanetBiomeTypeLabelAnim = ({ planet }: { planet: Planet | undefine <> {planet?.planetType !== PlanetType.TRADING_POST && ( <> - {' '} + + )} diff --git a/src/Frontend/Components/OpenPaneButtons.tsx b/src/Frontend/Components/OpenPaneButtons.tsx index 6097bf2e..14d0c989 100644 --- a/src/Frontend/Components/OpenPaneButtons.tsx +++ b/src/Frontend/Components/OpenPaneButtons.tsx @@ -17,6 +17,7 @@ import { } from '../Utils/ShortcutConstants'; import { ModalHandle } from '../Views/ModalPane'; import { Btn } from './Btn'; +import { CenteredText, KeyboardBtn } from './CoreUI'; export function OpenPaneButton({ modal, @@ -43,8 +44,9 @@ export function OpenPaneButton({ const isDown = useIsDown(shortcutKey); return ( - - {title} + + {title} + {shortcutKey} ); } @@ -59,7 +61,7 @@ export function OpenHatPaneButton({ return ( } /> @@ -76,7 +78,7 @@ export function OpenBroadcastPaneButton({ return ( } helpContent={BroadcastPaneHelpContent()} @@ -94,7 +96,7 @@ export function OpenUpgradeDetailsPaneButton({ return ( } helpContent={UpgradeDetailsPaneHelpContent()} @@ -111,7 +113,7 @@ export function OpenManagePlanetArtifactsButton({ return ( } helpContent={ManagePlanetArtifactsHelpContent()} diff --git a/src/Frontend/Components/ReadMore.tsx b/src/Frontend/Components/ReadMore.tsx index 3ff73776..f1553906 100644 --- a/src/Frontend/Components/ReadMore.tsx +++ b/src/Frontend/Components/ReadMore.tsx @@ -36,7 +36,7 @@ const active = css` const ReadMoreContainer = styled.div` ${({ height, collapsed }: { height: string; collapsed?: boolean }) => css` cursor: pointer; - border: 1px solid ${dfstyles.colors.darkBorder}; + border: 1px solid ${dfstyles.colors.borderDark}; padding: 4px; margin: 8px; border-radius: 3px; diff --git a/src/Frontend/Components/Text.tsx b/src/Frontend/Components/Text.tsx index 5fc74a0d..f61a3429 100644 --- a/src/Frontend/Components/Text.tsx +++ b/src/Frontend/Components/Text.tsx @@ -5,7 +5,7 @@ import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; import { artifactName } from '../../Backend/Procedural/ArtifactProcgen'; import { ProcgenUtils } from '../../Backend/Procedural/ProcgenUtils'; -import { Chunk } from '../../_types/global/GlobalTypes'; +import { Chunk, isLocatable } from '../../_types/global/GlobalTypes'; import Viewport from '../Game/Viewport'; import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; @@ -180,7 +180,9 @@ export function CenterPlanetLink({ { - uiManager.centerPlanet(planet); + if (isLocatable(planet)) { + uiManager.centerPlanet(planet); + } }} > {children} diff --git a/src/Frontend/Components/TextPreview.tsx b/src/Frontend/Components/TextPreview.tsx index 5245b758..dae41517 100644 --- a/src/Frontend/Components/TextPreview.tsx +++ b/src/Frontend/Components/TextPreview.tsx @@ -9,11 +9,13 @@ export function TextPreview({ text, unFocusedWidth, focusedWidth, + style, }: { text?: string; unFocusedWidth?: string; focusedWidth?: string; maxLength?: number; + style?: React.CSSProperties; }) { const [isTextBox, setIsTextbox] = useState(false); const [inputRef, setInputRef] = useState(null); @@ -37,7 +39,7 @@ export function TextPreview({ if (isTextBox) { return ( - + {}} @@ -49,7 +51,11 @@ export function TextPreview({ } return ( - + {text || ''} ); diff --git a/src/Frontend/Game/Viewport.ts b/src/Frontend/Game/Viewport.ts index eda5b1ed..fea8038c 100644 --- a/src/Frontend/Game/Viewport.ts +++ b/src/Frontend/Game/Viewport.ts @@ -1,4 +1,4 @@ -import { Planet, WorldCoords } from '@darkforest_eth/types'; +import { DiagnosticUpdater, Planet, WorldCoords } from '@darkforest_eth/types'; import autoBind from 'auto-bind'; import GameUIManager from '../../Backend/GameLogic/GameUIManager'; import { CanvasCoords, distL2, vectorLength } from '../../Backend/Utils/Coordinates'; @@ -50,11 +50,12 @@ class Viewport { // for momentum stuff velocity: WorldCoords | undefined = undefined; momentum = false; - mouseSensitivity: number; intervalId: ReturnType; frameRequestId: number; + diagnosticUpdater?: DiagnosticUpdater; + scale: number; private isSending = false; private animationManager: AnimationManager; @@ -96,6 +97,10 @@ class Viewport { this.onScroll(0); } + public setDiagnosticUpdater(diagnosticUpdater: DiagnosticUpdater) { + this.diagnosticUpdater = diagnosticUpdater; + } + onSendInit() { this.isSending = true; } @@ -197,6 +202,8 @@ class Viewport { canvas ); + viewport.setDiagnosticUpdater(gameUIManager); + // set starting position based on storage const stored = viewport.getStorage(); if (!stored) { @@ -504,40 +511,23 @@ class Viewport { this.widthInWorldUnits = width; this.heightInWorldUnits = (width * this.viewportHeight) / this.viewportWidth; this.scale = this.widthInWorldUnits / this.viewportWidth; + this.updateDiagnostics(); } } public setWorldHeight(height: number): void { this.heightInWorldUnits = height; this.widthInWorldUnits = (height * this.viewportWidth) / this.viewportHeight; + this.updateDiagnostics(); } - private getDetailLevel(): number { - if (this.widthInWorldUnits > 65536) { - return 5; - } - if (this.widthInWorldUnits > 32768) { - return 4; - } - if (this.widthInWorldUnits > 16384) { - return 3; - } - if (this.widthInWorldUnits > 8192) { - return 2; - } - if (this.widthInWorldUnits > 4096) { - return 1; - } - if (this.widthInWorldUnits > 2048) { - return 0; - } - if (this.widthInWorldUnits > 1024) { - return -1; - } - if (this.widthInWorldUnits > 512) { - return -2; - } - return -3; + private updateDiagnostics() { + this.diagnosticUpdater?.updateDiagnostics( + (d) => (d.width = Math.floor(this.widthInWorldUnits)) + ); + this.diagnosticUpdater?.updateDiagnostics( + (d) => (d.height = Math.floor(this.heightInWorldUnits)) + ); } } diff --git a/src/Frontend/Game/WindowManager.ts b/src/Frontend/Game/WindowManager.ts index 9e525436..727da628 100644 --- a/src/Frontend/Game/WindowManager.ts +++ b/src/Frontend/Game/WindowManager.ts @@ -39,7 +39,6 @@ export const enum TooltipName { FindArtifact, ArtifactStored, SelectedSilver, - SelectedEnergy, Rank, Score, MiningPause, diff --git a/src/Frontend/Pages/GameLandingPage.tsx b/src/Frontend/Pages/GameLandingPage.tsx index 345e064e..258db7e5 100644 --- a/src/Frontend/Pages/GameLandingPage.tsx +++ b/src/Frontend/Pages/GameLandingPage.tsx @@ -207,7 +207,7 @@ export function GameLandingPage() { terminal.current?.println(`Select an option:`, TerminalTextStyle.White); const userInput = await terminal.current?.getInput(); - if (userInput === 'a') { + if (userInput === 'a' && accounts.length > 0) { setStep(TerminalPromptStep.DISPLAY_ACCOUNTS); } else if (userInput === 'n') { setStep(TerminalPromptStep.GENERATE_ACCOUNT); diff --git a/src/Frontend/Panes/DiagnosticsPane.tsx b/src/Frontend/Panes/DiagnosticsPane.tsx index 1252f8d4..ee8173c7 100644 --- a/src/Frontend/Panes/DiagnosticsPane.tsx +++ b/src/Frontend/Panes/DiagnosticsPane.tsx @@ -1,21 +1,15 @@ import { Diagnostics } from '@darkforest_eth/types'; import React, { useEffect, useState } from 'react'; -import styled from 'styled-components'; import { Wrapper } from '../../Backend/Utils/Wrapper'; -import { Spacer, Underline } from '../Components/CoreUI'; +import { EmSpacer, PaddedRecommendedModalWidth, Separator } from '../Components/CoreUI'; import { DisplayGasPrices } from '../Components/DisplayGasPrices'; -import { White } from '../Components/Text'; import { TextPreview } from '../Components/TextPreview'; -import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; import { BooleanSetting, Setting } from '../Utils/SettingsHooks'; import { ModalHook, ModalPane } from '../Views/ModalPane'; +import { SpreadApart } from '../Views/PlanetCardComponents'; import { TabbedView } from '../Views/TabbedView'; -const DiagnosticsContent = styled.div` - min-width: 350px; -`; - export function DiagnosticsPane({ hook }: { hook: ModalHook }) { const uiManager = useUIManager(); const [currentDiagnostics, setCurrentDiagnostics] = useState( @@ -32,9 +26,9 @@ export function DiagnosticsPane({ hook }: { hook: ModalHook }) { return ( - + - + ); } @@ -60,39 +54,60 @@ function RenderingTab({ diagnostics }: { diagnostics: Wrapper }) { return ( <> - - - - fps - {Math.floor(diagnostics.value.fps)} - - - visible chunks - {diagnostics.value.visibleChunks.toLocaleString()} - - - total chunks - {diagnostics.value.totalChunks.toLocaleString()} - - - visible planets - {diagnostics.value.visiblePlanets.toLocaleString()} - - - total planets - {diagnostics.value.totalPlanets.toLocaleString()} - - - queued chunk writes - {diagnostics.value.chunkUpdates.toLocaleString()} - - - - - - Debug Options - - + + + + fps + {Math.floor(diagnostics.value.fps)} + + + + + + visible chunks + {diagnostics.value.visibleChunks.toLocaleString()} + + + + + + total chunks + {diagnostics.value.totalChunks.toLocaleString()} + + + + + + visible planets + {diagnostics.value.visiblePlanets.toLocaleString()} + + + + + + total planets + {diagnostics.value.totalPlanets.toLocaleString()} + + + + + + queued chunk writes + {diagnostics.value.chunkUpdates.toLocaleString()} + + + + + + viewport + + {diagnostics.value.width.toLocaleString()} + x + {diagnostics.value.height.toLocaleString()} + + + + }) { function NetworkingTab({ diagnostics }: { diagnostics: Wrapper }) { return ( - - - - rpc url - - - - - - completed calls - {diagnostics.value.totalCalls.toLocaleString()} - - - - queued calls - {diagnostics.value.callsInQueue.toLocaleString()} - - - - completed transactions - {diagnostics.value.totalTransactions.toLocaleString()} - - - - queued transactions - {diagnostics.value.transactionsInQueue.toLocaleString()} - - - - oracle gas prices (gwei) - - - - - - + <> + + + + rpc url + + + + + + + completed calls + {diagnostics.value.totalCalls.toLocaleString()} + + + + + + queued calls + {diagnostics.value.callsInQueue.toLocaleString()} + + + + + + completed transactions + {diagnostics.value.totalTransactions.toLocaleString()} + + + + + + queued transactions + {diagnostics.value.transactionsInQueue.toLocaleString()} + + + + + + oracle gas prices + + + + + ); } - -const DiagnosticsTableStyle = styled.table` - width: 100%; - border-collapse: collapse; - - td { - border: 1px solid ${dfstyles.colors.subbertext}; - padding: 2px 4px; - - &:first-child { - text-align: right; - } - - &:last-child { - min-width: 100px; - } - } -`; diff --git a/src/Frontend/Panes/ExplorePane.tsx b/src/Frontend/Panes/ExplorePane.tsx index afd59e2b..6333a01c 100644 --- a/src/Frontend/Panes/ExplorePane.tsx +++ b/src/Frontend/Panes/ExplorePane.tsx @@ -65,7 +65,7 @@ function HashesPerSec() { }, [uiManager]); const getHashes = () => { - return hashRate.toFixed(0); + return hashRate.toFixed(0).toLocaleString(); }; return ( diff --git a/src/Frontend/Panes/HelpPane.tsx b/src/Frontend/Panes/HelpPane.tsx index d86bb050..c23710e9 100644 --- a/src/Frontend/Panes/HelpPane.tsx +++ b/src/Frontend/Panes/HelpPane.tsx @@ -1,6 +1,6 @@ import React from 'react'; import styled from 'styled-components'; -import { EmSpacer, Link, Section, SectionHeader } from '../Components/CoreUI'; +import { EmSpacer, Link, Padded, Section, SectionHeader } from '../Components/CoreUI'; import { ScoreLabel } from '../Components/Labels/KeywordLabels'; import { LegendaryLabel } from '../Components/Labels/LegendaryLabel'; import { MythicLabel } from '../Components/Labels/MythicLabel'; @@ -8,7 +8,7 @@ import { White } from '../Components/Text'; import { useUIManager } from '../Utils/AppHooks'; import { ModalHook, ModalName, ModalPane } from '../Views/ModalPane'; -const HelpContent = styled.div` +const HelpContent = styled(Padded)` width: 500px; height: 500px; max-height: 500px; @@ -31,9 +31,7 @@ export function HelpPane({ hook }: { hook: ModalHook }) {
- - Official Info and Announcements - + Official Info and Announcements
diff --git a/src/Frontend/Panes/HoverPlanetPane.tsx b/src/Frontend/Panes/HoverPlanetPane.tsx index 24050582..6f547a99 100644 --- a/src/Frontend/Panes/HoverPlanetPane.tsx +++ b/src/Frontend/Panes/HoverPlanetPane.tsx @@ -1,33 +1,21 @@ -import { RECOMMENDED_MODAL_WIDTH } from '@darkforest_eth/constants'; import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; -import styled, { css } from 'styled-components'; -import dfstyles from '../Styles/dfstyles'; +import styled from 'styled-components'; +import { snips } from '../Styles/dfstyles'; import { useHoverPlanet, useSelectedPlanet, useUIManager } from '../Utils/AppHooks'; import { GameWindowZIndex } from '../Utils/constants'; import UIEmitter, { UIEmitterEvent } from '../Utils/UIEmitter'; import { PlanetCard } from '../Views/PlanetCard'; -const StyledHoverPlanetPane = styled.div<{ visible: boolean }>` - width: ${RECOMMENDED_MODAL_WIDTH}; - position: absolute; - top: 0; - left: 0; - border-radius: ${dfstyles.borderRadius}; - border: 1px solid ${dfstyles.colors.border}; - background: ${dfstyles.colors.background}; - - ${({ visible }) => - visible - ? css` - z-index: ${GameWindowZIndex.Tooltip}; - ` - : css` - opacity: 0; - pointer-events: none; - z-index: -1000 !important; - `} +const StyledHoverPlanetPane = styled.div` + ${snips.absoluteTopLeft} + ${snips.defaultBackground} + ${snips.defaultModalWidth} + ${snips.roundedBordersWithEdge} `; +/** + * This is the pane that is rendered when you hover over a planet. + */ export function HoverPlanetPane() { const uiManager = useUIManager(); const hoverWrapper = useHoverPlanet(uiManager); @@ -36,6 +24,7 @@ export function HoverPlanetPane() { /* really bad way to do this but it works for now */ const [sending, setSending] = useState(false); + useEffect(() => { const uiEmitter = UIEmitter.getInstance(); const setSendTrue = () => setSending(true); @@ -81,7 +70,7 @@ export function HoverPlanetPane() { return () => window.removeEventListener('mousemove', doMouseMove); }, [paneRef]); - const beVisible = useMemo( + const visible = useMemo( () => !!hovering && hovering?.locationId !== selected?.locationId && @@ -90,11 +79,12 @@ export function HoverPlanetPane() { [hovering, selected, sending, uiManager] ); - const visible = beVisible; - return ( - - + + {visible && } ); } diff --git a/src/Frontend/Panes/PaidArtifactConversation/PaidArtifactConversationPane.tsx b/src/Frontend/Panes/PaidArtifactConversation/PaidArtifactConversationPane.tsx index 0a955ae6..e58d72a9 100644 --- a/src/Frontend/Panes/PaidArtifactConversation/PaidArtifactConversationPane.tsx +++ b/src/Frontend/Panes/PaidArtifactConversation/PaidArtifactConversationPane.tsx @@ -71,7 +71,6 @@ export function PaidArtifactConversationPane({ + {owned && ( <> @@ -55,25 +55,21 @@ function PlanetContextPaneContent({ {owned && ( {[ - - + + , - - - + + + , ]} )} - {owned && notifs.length > 0 && ( - - - - )} - + {owned && notifs.length > 0 && } + ); } diff --git a/src/Frontend/Panes/PlanetDexPane.tsx b/src/Frontend/Panes/PlanetDexPane.tsx index 81e61392..95d520fa 100644 --- a/src/Frontend/Panes/PlanetDexPane.tsx +++ b/src/Frontend/Panes/PlanetDexPane.tsx @@ -8,7 +8,7 @@ import { } from '../../Backend/GameLogic/ArrivalUtils'; import { ProcgenUtils } from '../../Backend/Procedural/ProcgenUtils'; import { formatNumber, getPlanetRank } from '../../Backend/Utils/Utils'; -import { CenterBackgroundSubtext, Spacer } from '../Components/CoreUI'; +import { CenterBackgroundSubtext, Padded, Spacer } from '../Components/CoreUI'; import { ArtifactIcon, SilverGrowthIcon, SilverIcon, WithdrawIcon } from '../Components/Icons'; import { Green, Sub } from '../Components/Text'; import { engineConsts } from '../Renderers/GameRenderer/EngineConsts'; @@ -290,7 +290,7 @@ export function PlanetDexPane({ hook }: { hook: ModalHook }) { width='unset' helpContent={HelpContent} > - {content} + {content} ); } diff --git a/src/Frontend/Panes/PlayerArtifactsPane.tsx b/src/Frontend/Panes/PlayerArtifactsPane.tsx index a4cc9f28..2242d3bc 100644 --- a/src/Frontend/Panes/PlayerArtifactsPane.tsx +++ b/src/Frontend/Panes/PlayerArtifactsPane.tsx @@ -1,3 +1,4 @@ +import { RECOMMENDED_MODAL_WIDTH } from '@darkforest_eth/constants'; import { Artifact, ArtifactTypeNames } from '@darkforest_eth/types'; import React, { useCallback } from 'react'; import styled from 'styled-components'; @@ -93,7 +94,7 @@ function PlayerArtifactsPaneContent({ modal }: { modal: ModalHandle }) { if (myArtifacts.length === 0) { return ( - + You Don't Have
Any Artifacts
); diff --git a/src/Frontend/Panes/PluginEditorPane.tsx b/src/Frontend/Panes/PluginEditorPane.tsx index 235af948..2fab0f46 100644 --- a/src/Frontend/Panes/PluginEditorPane.tsx +++ b/src/Frontend/Panes/PluginEditorPane.tsx @@ -7,7 +7,7 @@ import { PluginManager } from '../../Backend/GameLogic/PluginManager'; import { PLUGIN_TEMPLATE } from '../../Backend/Plugins/PluginTemplate'; import { PluginId } from '../../Backend/Plugins/SerializedPlugin'; import { Btn } from '../Components/Btn'; -import { Spacer } from '../Components/CoreUI'; +import { Padded, Spacer } from '../Components/CoreUI'; import { Input } from '../Components/Input'; import dfstyles from '../Styles/dfstyles'; require('prismjs/themes/prism-dark.css'); @@ -60,7 +60,7 @@ export function PluginEditorPane({ } return ( - <> + @@ -80,6 +80,6 @@ export function PluginEditorPane({ Save - + ); } diff --git a/src/Frontend/Panes/PluginLibraryPane.tsx b/src/Frontend/Panes/PluginLibraryPane.tsx index 5a8e7a48..c07966b0 100644 --- a/src/Frontend/Panes/PluginLibraryPane.tsx +++ b/src/Frontend/Panes/PluginLibraryPane.tsx @@ -6,7 +6,7 @@ import { v4 as uuidv4 } from 'uuid'; import GameUIManager from '../../Backend/GameLogic/GameUIManager'; import { PluginId, SerializedPlugin } from '../../Backend/Plugins/SerializedPlugin'; import { Btn } from '../Components/Btn'; -import { MaxWidth, Spacer } from '../Components/CoreUI'; +import { PaddedRecommendedModalWidth, Spacer } from '../Components/CoreUI'; import { RemoteModal } from '../Components/RemoteModal'; import dfstyles from '../Styles/dfstyles'; import { useEmitterValue } from '../Utils/EmitterHooks'; @@ -172,13 +172,13 @@ export function PluginLibraryPane({ } return ( - <> + - +

Dark Forest supports plugins, which allow you to write JavaScript code that can interact with the game. Plugins are powerful and can enhance your gameplay experience, but they @@ -198,7 +198,7 @@ export function PluginLibraryPane({ > Click {clicksUntilHasPlugins} times for Plugins - + - {renderPluginsList()} - - Add Plugin + + {renderPluginsList()} + + Add Plugin + - + ); } diff --git a/src/Frontend/Panes/SettingsPane.tsx b/src/Frontend/Panes/SettingsPane.tsx index 96bac4c8..579fb2be 100644 --- a/src/Frontend/Panes/SettingsPane.tsx +++ b/src/Frontend/Panes/SettingsPane.tsx @@ -5,7 +5,7 @@ import styled from 'styled-components'; import TutorialManager from '../../Backend/GameLogic/TutorialManager'; import { Chunk } from '../../_types/global/GlobalTypes'; import { Btn } from '../Components/Btn'; -import { Section, SectionHeader, Spacer } from '../Components/CoreUI'; +import { Padded, Section, SectionHeader, Spacer } from '../Components/CoreUI'; import { Input } from '../Components/Input'; import { Green, Red } from '../Components/Text'; import Viewport, { getDefaultScroll } from '../Game/Viewport'; @@ -21,7 +21,7 @@ const DEFAULT_SCROLL = Math.round(10000 * (getDefaultScroll() - 1)); const Range = styled.input``; -const SettingsContent = styled.div` +const SettingsContent = styled(Padded)` width: 500px; height: 500px; overflow-y: scroll; @@ -198,33 +198,6 @@ export function SettingsPane({

-
- Burner Wallet Info (Private) - Your secret key, together with your home planet's coordinates, grant you access to your - Dark Forest account on different browsers. You should save this info somewhere on your - computer. - - WARNING: Never ever send this to anyone! - - - Click {clicks} times to view info - -
- -
- Auto Confirm Transactions - Whether or not to auto-confirm all transactions, except purchases. This will allow you to - make moves, spend silver on upgrades, etc. without requiring you to confirm each - transaction. However, the client WILL ask for confirmation before sending transactions - that spend wallet funds. - - -
-
Gas Price Your gas price setting determines the price you pay for each transaction. A higher gas @@ -261,6 +234,33 @@ export function SettingsPane({ />
+
+ Burner Wallet Info (Private) + Your secret key, together with your home planet's coordinates, grant you access to your + Dark Forest account on different browsers. You should save this info somewhere on your + computer. + + WARNING: Never ever send this to anyone! + + + Click {clicks} times to view info + +
+ +
+ Auto Confirm Transactions + Whether or not to auto-confirm all transactions, except purchases. This will allow you to + make moves, spend silver on upgrades, etc. without requiring you to confirm each + transaction. However, the client WILL ask for confirmation before sending transactions + that spend wallet funds. + + +
+
Import and Export Map Data WARNING: Maps from others could be altered and are not guaranteed to be diff --git a/src/Frontend/Panes/Tooltip.tsx b/src/Frontend/Panes/Tooltip.tsx index cce06d7f..62291018 100644 --- a/src/Frontend/Panes/Tooltip.tsx +++ b/src/Frontend/Panes/Tooltip.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; import styled, { css, keyframes } from 'styled-components'; import WindowManager, { TooltipName, WindowManagerEvent } from '../Game/WindowManager'; -import dfstyles from '../Styles/dfstyles'; +import dfstyles, { snips } from '../Styles/dfstyles'; import { useControlDown } from '../Utils/AppHooks'; import { GameWindowZIndex } from '../Utils/constants'; import { TooltipContent } from './TooltipPanes'; @@ -32,12 +32,9 @@ const _animation = css` // ${(props) => (props.anim ? animation : 'animation: none;')} const StyledTooltipTrigger = styled.span<{ - anim: boolean; display?: DisplayType; }>` border-radius: 2px; - background-color: ${(props) => (props.anim ? dfstyles.colors.dfblue : 'none')}; - display: ${(props) => props.display || 'inline'}; `; @@ -67,7 +64,6 @@ export function TooltipTrigger({ display={display} style={{ ...style }} className={className} - anim={ctrl} onMouseEnter={() => setHovering(true)} onMouseLeave={() => setHovering(false)} > @@ -79,15 +75,15 @@ export function TooltipTrigger({ const StyledTooltip = styled.div<{ visible: boolean; }>` + ${snips.defaultModalWidth} position: absolute; - width: fit-content; - height: fit-content; min-height: 1em; min-width: 5em; border: 1px solid ${dfstyles.colors.border}; background: ${dfstyles.colors.background}; padding: 0.5em; border-radius: 3px; + text-align: justify; z-index: ${GameWindowZIndex.Tooltip}; display: ${(props) => (props.visible ? 'block' : 'none')}; diff --git a/src/Frontend/Panes/TooltipPanes.tsx b/src/Frontend/Panes/TooltipPanes.tsx index c77976b2..53bdf786 100644 --- a/src/Frontend/Panes/TooltipPanes.tsx +++ b/src/Frontend/Panes/TooltipPanes.tsx @@ -1,6 +1,5 @@ import { PlanetType } from '@darkforest_eth/types'; import React from 'react'; -import styled from 'styled-components'; import { getPlanetRank, isFullRank } from '../../Backend/Utils/Utils'; import { ScoreLabel, SilverLabel } from '../Components/Labels/KeywordLabels'; import { SpacetimeRipLabel } from '../Components/Labels/SpacetimeRipLabel'; @@ -8,18 +7,6 @@ import { Green, Red, Sub, White } from '../Components/Text'; import { TooltipName } from '../Game/WindowManager'; import { useAccount, useSelectedPlanet, useUIManager } from '../Utils/AppHooks'; -const TooltipInfo = styled.div` - & > div { - display: flex; - flex-direction: row; - justify-content: space-between; - - & > span:first-child { - margin-right: 0.5em; - } - } -`; - export function TwitterHandleTooltipPane() { return (
@@ -69,8 +56,8 @@ export function MiningTargetTooltipPane() {
Change the location of your explorer. Click anywhere on the{' '} - Game Screen,
- and your miner will start hashing around that chunk. + Game Screen, and your miner will start hashing around that + chunk.
); @@ -98,9 +85,8 @@ export function SilverTooltipPane() { return (
- Silver: the universe's monetary resource. It allows you to buy upgrades.{' '} -
- Only silver mines produce silver. They're much rarer than planets! + Silver: the universe's monetary resource. It allows you to buy upgrades. Only + Asteroid Fields produce silver. They're much rarer than planets!
); @@ -110,38 +96,13 @@ export function EnergyTooltipPane() { return (
- Energy: Energy allows you to make moves.
- Energy grows following an S-curve, and grows fastest at{' '} - 50% capacity. + Energy: allows you to make moves. Energy grows following an{' '} + s-curve, and grows fastest at 50% capacity.
); } -export function SelectedEnergyTooltipPane() { - const uiManager = useUIManager(); - const selected = useSelectedPlanet(uiManager); - - return ( -
- {selected.value ? ( - -
- Energy: - {selected.value.energy} -
-
- Growth: - {selected.value.energyGrowth} -
-
- ) : ( - <>Select a planet to view more about its stats. - )} -
- ); -} - export function PlanetRankTooltipPane() { const uiManager = useUIManager(); const selected = useSelectedPlanet(uiManager); @@ -184,7 +145,7 @@ export function SelectedSilverTooltipPane() { return (
{selected.value ? ( - + <>
Silver: {selected.value.silver} @@ -203,7 +164,7 @@ export function SelectedSilverTooltipPane() { This planet does not produce silver.
)} -
+ ) : ( <>Select a planet to view more about its stats. )} @@ -248,8 +209,8 @@ export function Time90TooltipPane() { return (
- Time to 90% of full energy. Since energy grows on an
- s-curve, energy growth slows drastically by this point. + Time to 90% of full energy. Since energy grows on an s-curve, energy growth + slows drastically by this point.
); @@ -259,8 +220,8 @@ export function EnergyGrowthTooltipPane() { return (
- Energy Growth: the maximum growth rate of this planet's energy
- representing the rate at the middle of the s-curve. + Energy Growth: the maximum growth rate of this planet's energy representing + the rate at the middle of the s-curve.
); @@ -455,7 +416,6 @@ export function TooltipContent({ name }: { name: TooltipName }) { if (name === TooltipName.PlanetRank) return ; if (name === TooltipName.MaxLevel) return ; if (name === TooltipName.SelectedSilver) return ; - if (name === TooltipName.SelectedEnergy) return ; if (name === TooltipName.Rank) return ; if (name === TooltipName.Score) return ; if (name === TooltipName.MiningPause) return ; diff --git a/src/Frontend/Panes/TwitterVerifyPane.tsx b/src/Frontend/Panes/TwitterVerifyPane.tsx index 2e973fd0..be273f18 100644 --- a/src/Frontend/Panes/TwitterVerifyPane.tsx +++ b/src/Frontend/Panes/TwitterVerifyPane.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { Btn } from '../Components/Btn'; -import { Expand, Spacer } from '../Components/CoreUI'; +import { Expand, PaddedRecommendedModalWidth, Spacer } from '../Components/CoreUI'; import { Input } from '../Components/Input'; import { TwitterLink } from '../Components/Labels/Labels'; import { LoadingSpinner } from '../Components/LoadingSpinner'; @@ -69,75 +69,78 @@ export function TwitterVerifyPane({ hook }: { hook: ModalHook }) { - {user.value !== undefined && user.value.twitter === undefined && ( - { - if (i === 0) - return ( - <> - Tweet a signed message, proving account ownership! - - onTwitterInputChange(e.target.value)} - placeholder={'your twitter handle'} - /> - - - - Tweet - - - ); + + {user.value !== undefined && user.value.twitter === undefined && ( + { + if (i === 0) + return ( + <> + Tweet a signed message, proving account ownership! + + onTwitterInputChange(e.target.value)} + placeholder={'your twitter handle'} + /> + + + + Tweet + + + ); - if (i === 1) { - return ( - <> - - onTwitterInputChange(e.target.value)} - placeholder={'your twitter handle'} - /> - - - {error && ( - <> - - error verifying ownership - - )} - - {verifying ? : 'Verify'} - - - ); - } - }} - /> - )} + if (i === 1) { + return ( + <> + After tweeting, click the button below to verify ownership! - {user.value !== undefined && user.value.twitter && ( - <> - You are connected, . You can disconnect it - anytime by clicking the button below. - - - {verifying ? ( - - ) : ( - 'Disconnect Twitter' - )} - - - )} + + onTwitterInputChange(e.target.value)} + placeholder={'your twitter handle'} + /> + + + {error && ( + <> + + error verifying ownership + + )} + + {verifying ? : 'Verify'} + + + ); + } + }} + /> + )} + + {user.value !== undefined && user.value.twitter && ( + <> + You are connected, . You can disconnect it + anytime by clicking the button below. + + + {verifying ? ( + + ) : ( + 'Disconnect Twitter' + )} + + + )} + ); } diff --git a/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager.ts b/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager.ts index 9a34e6f2..98271441 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/PlanetRenderManager.ts @@ -1,4 +1,13 @@ -import { Artifact, LocationId, Planet, PlanetType, WorldCoords } from '@darkforest_eth/types'; +import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; +import { + Artifact, + LocatablePlanet, + LocationId, + Planet, + PlanetType, + WorldCoords, +} from '@darkforest_eth/types'; +import { getRange } from '../../../../Backend/GameLogic/ArrivalUtils'; import { PlanetRenderInfo } from '../../../../Backend/GameLogic/ViewportEntities'; import { ProcgenUtils } from '../../../../Backend/Procedural/ProcgenUtils'; import { formatNumber, hasOwner } from '../../../../Backend/Utils/Utils'; @@ -28,6 +37,7 @@ export default class PlanetRenderManager { const planet = renderInfo.planet; const renderAtReducedQuality = renderInfo.radii.radiusPixels <= 5 && highPerfMode; const isHovering = uiManager.getHoveringOverPlanet()?.locationId === planet.locationId; + const isSelected = uiManager.getSelectedPlanet()?.locationId === planet.locationId; let textAlpha = 255; if (renderInfo.radii.radiusPixels < 2 * maxRadius) { @@ -106,6 +116,10 @@ export default class PlanetRenderManager { isHovering ? 0.2 : textAlpha ); } + + if (isHovering && !isSelected) { + this.queueRangeRings(planet); + } } private queueArtifactsAroundPlanet( @@ -373,6 +387,60 @@ export default class PlanetRenderManager { } } + /** + * Renders rings around planet that show how far sending the given percentage of this planet's + * energy would be able to travel. + */ + drawRangeAtPercent(planet: LocatablePlanet, pct: number) { + const { circleRenderer: cR, textRenderer: tR } = this.renderer; + const range = getRange(planet, pct); + const { + range: { dash }, + } = engineConsts.colors; + cR.queueCircleWorld(planet.location.coords, range, [...dash, 255], 1, 1, true); + tR.queueTextWorld( + `${pct}%`, + { x: planet.location.coords.x, y: planet.location.coords.y + range }, + [...dash, 255] + ); + } + + /** + * Renders three rings around the planet that show the player how far this planet can attack. + */ + queueRangeRings(planet: LocatablePlanet) { + const { circleRenderer: cR, gameUIManager, textRenderer: tR } = this.renderer; + const { + range: { energy }, + } = engineConsts.colors; + const { x, y } = planet.location.coords; + + this.drawRangeAtPercent(planet, 100); + this.drawRangeAtPercent(planet, 50); + this.drawRangeAtPercent(planet, 25); + + if (planet.owner === EMPTY_ADDRESS) return; + + const percentForces = gameUIManager.getForcesSending(planet.locationId); // [0, 100] + const forces = (percentForces / 100) * planet.energy; + const range = getRange(planet, percentForces); + + if (range > 1) { + cR.queueCircleWorld({ x, y }, range, [...energy, 255], 1, 1, true); + tR.queueTextWorld( + `${formatNumber(forces)}`, + { x, y: y + range }, + [...energy, 255], + 0, + TextAlign.Center, + TextAnchor.Bottom + ); + } + + // so that it draws below the planets + cR.flush(); + } + queuePlanets( cachedPlanets: Map, now: number, diff --git a/src/Frontend/Renderers/GameRenderer/UIRenderer.ts b/src/Frontend/Renderers/GameRenderer/UIRenderer.ts index 2f4e8a5f..2294e2d7 100644 --- a/src/Frontend/Renderers/GameRenderer/UIRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/UIRenderer.ts @@ -1,8 +1,6 @@ -import { EMPTY_ADDRESS } from '@darkforest_eth/constants'; import { Planet, WorldCoords } from '@darkforest_eth/types'; -import { formatNumber } from '../../../Backend/Utils/Utils'; import { engineConsts } from './EngineConsts'; -import { RenderZIndex, RGBVec, TextAlign, TextAnchor } from './EngineTypes'; +import { RenderZIndex, RGBVec } from './EngineTypes'; import Renderer from './Renderer'; const { @@ -110,50 +108,7 @@ export class UIRenderer { } queueSelectedRangeRing() { - const { circleRenderer: cR, gameUIManager, textRenderer: tR } = this.renderer; - const selected = gameUIManager.getSelectedPlanet(); - if (!selected) return; - - const loc = gameUIManager.getLocationOfPlanet(selected.locationId); - if (!loc) return; - const { x, y } = loc.coords; - - // gets range from percent - const drawRangeAtPercent = (pct: number) => { - const fac = Math.log2(pct / 5); - const range = fac * selected.range; - cR.queueCircleWorld({ x, y }, range, [...dash, 255], 1, 1, true); - tR.queueTextWorld(`${pct}%`, { x, y: y + range }, [...dash, 255]); - }; - - drawRangeAtPercent(100); - drawRangeAtPercent(50); - drawRangeAtPercent(25); - - if (selected.owner === EMPTY_ADDRESS) return; - - const forcesSending = gameUIManager.getForcesSending(selected.locationId); // [0, 100] - const totalForces = (forcesSending / 100) * selected.energy; - - const scaled = (forcesSending * selected.energy) / selected.energyCap; - let ratio = Math.log2(scaled / 5); - ratio = Math.max(ratio, 0); - - const rOrange = ratio * selected.range; - - if (rOrange > 1) { - cR.queueCircleWorld({ x, y }, rOrange, [...energy, 255], 1, 1, true); - tR.queueTextWorld( - `${formatNumber(totalForces)}`, - { x, y: y + rOrange }, - [...energy, 255], - 0, - TextAlign.Center, - TextAnchor.Bottom - ); - } - - // so that it draws below the planets - cR.flush(); + const selectedPlanet = this.renderer.gameUIManager.getSelectedPlanet(); + selectedPlanet && this.renderer.planetRenderManager.queueRangeRings(selectedPlanet); } } diff --git a/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx b/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx index 816a779a..67b203e4 100644 --- a/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx +++ b/src/Frontend/Renderers/PlanetscapeRenderer/PlanetIcons.tsx @@ -28,7 +28,6 @@ const StyledPlanetIcons = styled.div` flex-wrap: wrap-reverse; align-items: center; justify-content: center; - margin-right: 0.5em; & > span { font-size: 0.9em; diff --git a/src/Frontend/Styles/dfstyles.ts b/src/Frontend/Styles/dfstyles.ts index ca3ff76a..c2423413 100644 --- a/src/Frontend/Styles/dfstyles.ts +++ b/src/Frontend/Styles/dfstyles.ts @@ -1,3 +1,4 @@ +import { RECOMMENDED_MODAL_WIDTH } from '@darkforest_eth/constants'; import { SpaceType } from '@darkforest_eth/types'; import color from 'color'; import { css } from 'styled-components'; @@ -22,7 +23,8 @@ const backgroundlight = color(background).lighten(0.5).hex(); const backgroundlighter = color(backgroundlight).lighten(0.3).hex(); const border = '#777'; -const darkBorder = color(border).darken(0.2).hex(); +const borderDark = color(border).darken(0.2).hex(); +const borderDarker = color(borderDark).darken(0.2).hex(); const blueBackground = '#0a0a23'; @@ -48,7 +50,8 @@ const dfstyles = { dfblue, border, - darkBorder, + borderDark, + borderDarker, dfgreen, dfgreendark, @@ -58,6 +61,7 @@ const dfstyles = { dfpurple, artifactBackground: 'rgb(21, 17, 71)', + icons: { twitter: '#1DA1F2', github: '#8e65db', @@ -121,4 +125,26 @@ const dfstyles = { }, }; +export const snips = { + bigPadding: css` + padding: 2px 12px; + `, + defaultModalWidth: css` + width: ${RECOMMENDED_MODAL_WIDTH}; + max-width: ${RECOMMENDED_MODAL_WIDTH}; + `, + defaultBackground: `background: ${dfstyles.colors.background};`, + roundedBorders: `border-radius:${dfstyles.borderRadius};`, + roundedBordersWithEdge: css` + border-radius: 3px; + border: 1px solid ${dfstyles.colors.borderDark}; + `, + absoluteTopLeft: css` + position: absolute; + top: 0; + left: 0; + `, + pane: ``, +}; + export default dfstyles; diff --git a/src/Frontend/Utils/KeyEmitters.ts b/src/Frontend/Utils/KeyEmitters.ts index 1acd39c9..8cb7485a 100644 --- a/src/Frontend/Utils/KeyEmitters.ts +++ b/src/Frontend/Utils/KeyEmitters.ts @@ -16,7 +16,10 @@ export const keyDown$ = monomitter>(); */ function shouldIgnoreShortcutKeypress(e: KeyboardEvent): boolean { const targetElement = e.target as HTMLElement; - return ['INPUT', 'TEXTAREA'].includes(targetElement.tagName); + if (targetElement.tagName === 'INPUT') + return targetElement.attributes.getNamedItem('type')?.value !== 'range'; + + return targetElement.tagName === 'TEXTAREA'; } document.addEventListener('keydown', (e: KeyboardEvent) => { diff --git a/src/Frontend/Utils/ShortcutConstants.ts b/src/Frontend/Utils/ShortcutConstants.ts index f0f672ac..06b0c0a7 100644 --- a/src/Frontend/Utils/ShortcutConstants.ts +++ b/src/Frontend/Utils/ShortcutConstants.ts @@ -3,15 +3,17 @@ import { useEmitterValue } from './EmitterHooks'; import { keyUp$ } from './KeyEmitters'; // planet context pane shortcuts -export const TOGGLE_PLANET_ARTIFACTS_PANE = 'a'; -export const TOGGLE_HAT_PANE = 'h'; -export const TOGGLE_BROADCAST_PANE = 'b'; -export const TOGGLE_UPGRADES_PANE = 'u'; +export const MODAL_BACK_SHORTCUT = 'r'; +export const TOGGLE_PLANET_ARTIFACTS_PANE = 's'; +export const TOGGLE_HAT_PANE = 'x'; +export const TOGGLE_BROADCAST_PANE = 'z'; +export const TOGGLE_UPGRADES_PANE = 'a'; +export const TOGGLE_SEND = 'q'; // global shortcuts -export const TOGGLE_PLANET_DEX_PANE = 'q'; -export const TOGGLE_ARTIFACTS_DEX_PANE = 'e'; -export const TOGGLE_DIAGNOSTICS_PANE = 'p'; +export const TOGGLE_PLANET_DEX_PANE = 'p'; +export const TOGGLE_ARTIFACTS_DEX_PANE = 'o'; +export const TOGGLE_DIAGNOSTICS_PANE = 'i'; export function useSubscribeToShortcut(key: string | undefined, callback: () => void) { const keyUp = useEmitterValue(keyUp$, undefined); diff --git a/src/Frontend/Views/EmojiPicker.tsx b/src/Frontend/Views/EmojiPicker.tsx index 350aa4d2..5f72e2aa 100644 --- a/src/Frontend/Views/EmojiPicker.tsx +++ b/src/Frontend/Views/EmojiPicker.tsx @@ -14,7 +14,9 @@ export function EmojiPicker({ return ( - setPickerOpen(true)}>{emoji || '\u00a0'} + setPickerOpen((open) => !open)}> + {emoji || '\u00a0'} + {pickerOpen && ( (false); const selected = useSelectedPlanet(uiManager).value; const selectedPlanetHook = useState(!!selected); @@ -108,6 +109,14 @@ export function GameWindowLayout({ }, [diagnosticsHook]) ); + function onSidebarMouseEnter() { + setSidebarHovered(true); + } + + function onSidebarMouseLeave() { + setSidebarHovered(false); + } + return ( @@ -148,57 +157,60 @@ export function GameWindowLayout({ - + diff --git a/src/Frontend/Views/ModalPane.tsx b/src/Frontend/Views/ModalPane.tsx index 3ca418ee..20d61a52 100644 --- a/src/Frontend/Views/ModalPane.tsx +++ b/src/Frontend/Views/ModalPane.tsx @@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useSta import styled, { css } from 'styled-components'; import { Hook } from '../../_types/global/GlobalTypes'; import { Btn } from '../Components/Btn'; -import { EmSpacer, Spacer, Truncate } from '../Components/CoreUI'; +import { CenteredText, EmSpacer, KeyboardBtn, Spacer, Truncate } from '../Components/CoreUI'; import { PaneProps } from '../Components/GameWindowComponents'; import { CloseCircleIcon, @@ -13,6 +13,8 @@ import { import WindowManager from '../Game/WindowManager'; import dfstyles from '../Styles/dfstyles'; import { GameWindowZIndex } from '../Utils/constants'; +import { useIsDown } from '../Utils/KeyEmitters'; +import { MODAL_BACK_SHORTCUT, useSubscribeToShortcut } from '../Utils/ShortcutConstants'; import { DFErrorBoundary } from './DFErrorBoundary'; export type ModalHook = Hook; @@ -134,17 +136,7 @@ const Modal = styled.div` height: fit-content; background: ${dfstyles.colors.background}; border-radius: ${dfstyles.borderRadius}; - border: 1px solid ${dfstyles.colors.border}; -`; - -/** - * Contains all the UI inside of this modal, which the - * users of the `ModalPane` class have full controll over. - */ -const Content = styled.div` - ${({ noPadding }: { noPadding?: boolean }) => css` - ${!noPadding && 'padding: 8px;'} - `} + border: 1px solid ${dfstyles.colors.borderDark}; `; const Title = styled(Truncate)` @@ -162,11 +154,10 @@ const TitleBar = styled.div` user-select: none; line-height: 1.5em; width: 100%; - height: 2.5em; cursor: grab; padding: 8px; background-color: ${dfstyles.colors.background}; - border-bottom: 1px solid ${minimized ? 'transparent' : dfstyles.colors.subbertext}; + border-bottom: 1px solid ${minimized ? 'transparent' : dfstyles.colors.borderDark}; display: flex; justify-content: center; align-items: flex-end; @@ -233,7 +224,6 @@ export function ModalPane({ hook: [visible, setVisible], hideClose, style, - noPadding, helpContent, width, borderColor, @@ -255,6 +245,7 @@ export function ModalPane({ const containerRef = useRef(document.createElement('div')); const headerRef = useRef(document.createElement('div')); const push = useCallback(() => setZIndex(windowManager.getIndex()), [windowManager]); + const [hasSetInitialPosition, setHasSetInitialPosition] = useState(false); const [gameSize, setGameSize] = useState< | { @@ -380,8 +371,11 @@ export function ModalPane({ }; }, [visible, clicking, mousedownCoords, coords]); - // inits at, or provided initial coordinates + // inits at center, or provided initial coordinates useLayoutEffect(() => { + if (hasSetInitialPosition) return; + setHasSetInitialPosition(true); + if (initialPosition) { setCoords(initialPosition); } else { @@ -444,17 +438,26 @@ export function ModalPane({ } const modalTitleElement = typeof title === 'string' ? title : title(frames.length > 0); const allSubModalTitleElements = frames.map(getFrameTitle); + const isBackShortcutDown = useIsDown(MODAL_BACK_SHORTCUT); + useSubscribeToShortcut( + MODAL_BACK_SHORTCUT, + useCallback(() => { + api.pop(); + }, [api]) + ); const mainTitle = ( <> {frames.length > 0 && ( <> { api.pop(); }} > - Back + Back + {MODAL_BACK_SHORTCUT} @@ -532,12 +535,10 @@ export function ModalPane({ > {renderedFrameHelp || (helpContent && helpContent())} - + +
{content} - +
); } diff --git a/src/Frontend/Views/PlanetCard.tsx b/src/Frontend/Views/PlanetCard.tsx index 0e81290a..d5cd5a5a 100644 --- a/src/Frontend/Views/PlanetCard.tsx +++ b/src/Frontend/Views/PlanetCard.tsx @@ -1,13 +1,15 @@ import { Planet, PlanetType } from '@darkforest_eth/types'; import React from 'react'; +import styled from 'styled-components'; import { ProcgenUtils } from '../../Backend/Procedural/ProcgenUtils'; import { Wrapper } from '../../Backend/Utils/Wrapper'; import { StatIdx } from '../../_types/global/GlobalTypes'; -import { EmSpacer, HorizontalFlex, InlineBlock, Padded } from '../Components/CoreUI'; +import { AlignCenterHorizontally, EmSpacer, InlineBlock } from '../Components/CoreUI'; import { DefenseIcon, EnergyGrowthIcon, EnergyIcon, + RangeIcon, SilverGrowthIcon, SilverIcon, SpeedIcon, @@ -20,20 +22,22 @@ import { PlanetLevel, PlanetRank, PlanetSilverLabel, + RangeText, SilverGrowthText, SpeedText, } from '../Components/Labels/PlanetLabels'; -import { ReadMore } from '../Components/ReadMore'; +import { Subber } from '../Components/Text'; import { TextPreview } from '../Components/TextPreview'; import { TooltipName } from '../Game/WindowManager'; import { PlanetIcons } from '../Renderers/PlanetscapeRenderer/PlanetIcons'; +import dfstyles, { snips } from '../Styles/dfstyles'; import { useActiveArtifact, useUIManager } from '../Utils/AppHooks'; import { DestroyedMarker, - PCStatIcon, PlanetActiveArtifact, RowTip, - StatContainer, + SpreadApart, + TimesTwo, TitleBar, } from './PlanetCardComponents'; @@ -48,7 +52,7 @@ export function PlanetCardTitle({ if (small) return <>{ProcgenUtils.getPlanetName(planet.value)}; return ( - + {planet.value.destroyed && ( <> @@ -58,10 +62,19 @@ export function PlanetCardTitle({ {ProcgenUtils.getPlanetName(planet.value)} - + ); } +const StatsContainer = styled.div` + ${snips.bigPadding} + ${snips.roundedBordersWithEdge} + border-color: ${dfstyles.colors.borderDarker}; + background-color: ${dfstyles.colors.backgroundlight}; + margin-top: 8px; + margin-bottom: 8px; +`; + /** Preview basic planet information - used in `PlanetContextPane` and `HoverPlanetPane` */ export function PlanetCard({ planetWrapper: p, @@ -75,112 +88,144 @@ export function PlanetCard({ const planet = p.value; return ( -
+ <> {standalone && ( )} - - - +
+ - + + - - - - - -
- - - - Energy - -
+
- - - - -
- - - Silver -
- -
+ + + + + + + energy + + + {planet?.bonus && planet.bonus[StatIdx.EnergyCap] && } + + + - -
- - + + - - - Energy Growth - -
- -
+ + growth + + + {planet?.bonus && planet.bonus[StatIdx.EnergyGro] && } + + +
- {(p.value?.planetType === PlanetType.SILVER_MINE && ( - -
- + + + + + + silver + + + + + {(p.value?.planetType === PlanetType.SILVER_MINE && ( + <> + - + + + + growth + + + - - Silver Growth - -
- -
- )) || <>} + + )) || <>} + - -
- - + + + - - - Defense - -
- -
+ + defense + + + {planet?.bonus && planet.bonus[StatIdx.Defense] && } + + + - -
- - + + + - - - Speed - -
- -
+ + speed + + + {planet?.bonus && planet.bonus[StatIdx.Speed] && } + + + + + + + + + + range + + + {planet?.bonus && planet.bonus[StatIdx.Range] && } + + + +
- -
Owner Address
- {' '} -
+ + owner address + {' '} + - -
Planet Id
- -
- - {active && } -
+ + planet id + + + {active && } +
+ ); } + +const StatRow = styled(AlignCenterHorizontally)` + ${snips.roundedBorders} + display: inline-block; + box-sizing: border-box; + width: 100%; +`; diff --git a/src/Frontend/Views/PlanetCardComponents.tsx b/src/Frontend/Views/PlanetCardComponents.tsx index b30e2caf..3657b3e1 100644 --- a/src/Frontend/Views/PlanetCardComponents.tsx +++ b/src/Frontend/Views/PlanetCardComponents.tsx @@ -1,7 +1,6 @@ import { Artifact, Planet } from '@darkforest_eth/types'; import React from 'react'; -import styled, { css } from 'styled-components'; -import { StatIdx } from '../../_types/global/GlobalTypes'; +import styled from 'styled-components'; import { ArtifactImage } from '../Components/ArtifactImage'; import { ArtifactBiomeText, @@ -14,6 +13,9 @@ import { TooltipTrigger } from '../Panes/Tooltip'; import dfstyles from '../Styles/dfstyles'; import { planetBackground } from '../Styles/Mixins'; +/** + * Displayed in {@link PlanetContextPane} when a planet is {@code destroyed}. + */ export const DestroyedMarker = styled.div` position: absolute; bottom: 0; @@ -27,21 +29,24 @@ export const DestroyedMarker = styled.div` background-repeat: no-repeat; `; -export const PlanetTag = styled.div<{ planet: Planet | undefined }>` - width: 100%; - overflow: hidden; +const StyledTimesTwo = styled.span` + color: ${dfstyles.colors.dfgreen}; + font-size: 0.8em; + vertical-align: center; + line-height: 1.5em; + margin-left: 8px; `; -export const StatRow = styled.div` - display: flex; - flex-direction: row; - justify-content: space-between; -`; +export const TimesTwo = () => x2; -export const StatCell = styled.div` +/** + * Expands to fit the width of container. Is itself a flex box that spreads out its children + * horizontally. + */ +export const SpreadApart = styled.div` + width: 100%; + box-sizing: border-box; flex-grow: 1; - padding: 3px 6px; - display: inline-flex; justify-content: space-between; flex-direction: row; @@ -52,42 +57,6 @@ export const StatCell = styled.div` } `; -const StyledTimesTwo = styled.span` - color: ${dfstyles.colors.dfgreen}; - font-size: 0.8em; - margin-left: 3px; -`; - -const TimesTwo = () => x2; - -export function PCStatIcon({ - planet, - children, - stat: stat, -}: { - planet: Planet | undefined; - children: React.ReactNode; - stat: StatIdx; -}) { - return ( - - {children} - {planet?.bonus && planet.bonus[stat] && ( - - - - )} - - ); -} - -export const StatContainer = styled(StatCell)` - ${({ wide }: { wide?: boolean }) => css` - width: ${wide ? '100%' : '50%'}; - box-sizing: border-box; - `} -`; - export const RowTip = ({ name, children }: { name: TooltipName; children: React.ReactNode }) => ( {children} diff --git a/src/Frontend/Views/PlanetLink.tsx b/src/Frontend/Views/PlanetLink.tsx index 04b87853..32fda7e7 100644 --- a/src/Frontend/Views/PlanetLink.tsx +++ b/src/Frontend/Views/PlanetLink.tsx @@ -1,6 +1,7 @@ import { Planet } from '@darkforest_eth/types'; import React from 'react'; import styled from 'styled-components'; +import { isLocatable } from '../../_types/global/GlobalTypes'; import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; import UIEmitter, { UIEmitterEvent } from '../Utils/UIEmitter'; @@ -12,8 +13,10 @@ export function PlanetLink({ planet, children }: { planet: Planet; children: Rea return ( { - uiManager?.setSelectedPlanet(planet); - uiEmitter.emit(UIEmitterEvent.CenterPlanet, planet); + if (isLocatable(planet)) { + uiManager?.setSelectedPlanet(planet); + uiEmitter.emit(UIEmitterEvent.CenterPlanet, planet); + } }} > {children} diff --git a/src/Frontend/Views/SendResources.tsx b/src/Frontend/Views/SendResources.tsx index caca28c7..54ed48a5 100644 --- a/src/Frontend/Views/SendResources.tsx +++ b/src/Frontend/Views/SendResources.tsx @@ -11,14 +11,15 @@ import { Wrapper } from '../../Backend/Utils/Wrapper'; import { Hook } from '../../_types/global/GlobalTypes'; import { ArtifactImage } from '../Components/ArtifactImage'; import { Btn } from '../Components/Btn'; -import { FullWidth, Spacer } from '../Components/CoreUI'; +import { CenteredText, FullWidth, KeyboardBtn, Spacer } from '../Components/CoreUI'; import { EnergyIcon, SilverIcon } from '../Components/Icons'; import { LongDash, Sub } from '../Components/Text'; import WindowManager, { CursorState } from '../Game/WindowManager'; import dfstyles from '../Styles/dfstyles'; import { useControlDown, usePlanetInactiveArtifacts, useUIManager } from '../Utils/AppHooks'; import { useEmitterSubscribe, useEmitterValue } from '../Utils/EmitterHooks'; -import { escapeDown$, keyUp$ } from '../Utils/KeyEmitters'; +import { escapeDown$, keyUp$, useIsDown } from '../Utils/KeyEmitters'; +import { TOGGLE_SEND } from '../Utils/ShortcutConstants'; import UIEmitter, { UIEmitterEvent } from '../Utils/UIEmitter'; const DEFAULT_ENERGY_PERCENT = 50; @@ -287,6 +288,8 @@ function SendRow({ remove: () => void; sending: boolean; }) { + const isDown = useIsDown(TOGGLE_SEND); + return ( <> {(artifact && ( @@ -296,9 +299,10 @@ function SendRow({ remove )) || <>} - + - (S)end + Send + {TOGGLE_SEND} @@ -392,7 +396,7 @@ export function SendResources({ } else if (keyUp.value === '=') { setPercent(Math.min(currentPercent + 1, 100)); return; - } else if (keyUp.value === 's') { + } else if (keyUp.value === TOGGLE_SEND) { doSend(); return; } diff --git a/src/Frontend/Views/Table.tsx b/src/Frontend/Views/Table.tsx index e6939e16..c2a4a6c0 100644 --- a/src/Frontend/Views/Table.tsx +++ b/src/Frontend/Views/Table.tsx @@ -1,9 +1,11 @@ import React, { CSSProperties } from 'react'; import styled from 'styled-components'; +import dfstyles from '../Styles/dfstyles'; const TableElement = styled.table` overflow-y: scroll; scrollbar-width: initial; + border-radius: ${dfstyles.borderRadius}; `; const ScrollableBody = styled.tbody` diff --git a/src/Frontend/Views/TopBar.tsx b/src/Frontend/Views/TopBar.tsx index f40032ea..32595506 100644 --- a/src/Frontend/Views/TopBar.tsx +++ b/src/Frontend/Views/TopBar.tsx @@ -1,8 +1,8 @@ import { EthAddress } from '@darkforest_eth/types'; import React, { useCallback, useState } from 'react'; import styled from 'styled-components'; -import { EmSpacer, HorizontalFlex, Spacer } from '../Components/CoreUI'; -import { AccountLabel } from '../Components/Labels/Labels'; +import { AlignCenterHorizontally, EmSpacer, Spacer } from '../Components/CoreUI'; +import { LoggedInPlayer } from '../Components/Labels/Labels'; import { Sub, White } from '../Components/Text'; import { TooltipName } from '../Game/WindowManager'; import { TooltipTrigger } from '../Panes/Tooltip'; @@ -73,21 +73,22 @@ export function TopBar({ twitterVerifyHook }: { twitterVerifyHook: ModalHook }) return ( - - + + - + ); } diff --git a/src/Frontend/Views/UpgradePreview.tsx b/src/Frontend/Views/UpgradePreview.tsx index dce9f54f..83edb197 100644 --- a/src/Frontend/Views/UpgradePreview.tsx +++ b/src/Frontend/Views/UpgradePreview.tsx @@ -10,7 +10,7 @@ const StyledUpgradePreview = styled.div` min-width: 15em; width: 100%; border-radius: 3px; - border: 1px solid ${dfstyles.colors.darkBorder}; + border: 1px solid ${dfstyles.colors.borderDark}; `; const StatRow = styled.div` diff --git a/yarn.lock b/yarn.lock index 53c294fb..84dd76d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3930,6 +3930,11 @@ dependencies: "@types/node" "*" +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + "@types/scheduler@*": version "0.16.1" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" @@ -16809,6 +16814,14 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" +p-retry@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.13.1" + p-timeout@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" @@ -16830,6 +16843,11 @@ p-timeout@^3.0.0, p-timeout@^3.1.0, p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" +p-timeout@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-4.1.0.tgz#788253c0452ab0ffecf18a62dff94ff1bd09ca0a" + integrity sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw== + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -18954,6 +18972,11 @@ retry@0.12.0, retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" From 32c99454a74e808d5f36a2f500f5e552fd29e489 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 10 Aug 2021 05:45:48 +0000 Subject: [PATCH 12/68] update client --- docs/README.md | 3 +- ...end_GameLogic_ContractsAPI.ContractsAPI.md | 65 +++ .../Backend_GameLogic_GameManager.default.md | 139 +++--- ...ckend_GameLogic_GameObjects.GameObjects.md | 74 +++- ...Backend_GameLogic_GameUIManager.default.md | 88 +++- ...nd_Storage_PersistentChunkStore.default.md | 28 ++ ...d_Utils_TerminalTypes.TerminalTextStyle.md | 29 +- ...est_api_ContractsAPITypes.ContractEvent.md | 7 + ...api_ContractsAPITypes.ContractsAPIEvent.md | 7 + ...ialGameStateDownloader.InitialGameState.md | 14 + .../Frontend_Views_ModalPane.ModalFrame.md | 19 +- ...api_ContractsAPITypes.ContractConstants.md | 14 + ...s_global_GlobalTypes.ClaimCountdownInfo.md | 29 ++ .../modules/Backend_GameLogic_ArrivalUtils.md | 2 + docs/modules/Backend_Network_Blockchain.md | 23 + docs/modules/Backend_Utils_TypeAssertions.md | 17 + docs/modules/Frontend_Components_Btn.md | 2 +- docs/modules/Frontend_Components_CoreUI.md | 52 ++- .../modules/Frontend_Components_IconButton.md | 13 - docs/modules/Frontend_Components_Icons.md | 18 +- .../Frontend_Components_Labels_Labels.md | 14 +- ...Frontend_Components_Labels_PlanetLabels.md | 1 + .../Frontend_Components_OpenPaneButtons.md | 21 +- docs/modules/Frontend_Components_Text.md | 7 - .../modules/Frontend_Panes_ClaimPlanetPane.md | 25 ++ docs/modules/Frontend_Utils_AppHooks.md | 32 +- docs/modules/Frontend_Utils_EmitterHooks.md | 20 - docs/modules/Frontend_Utils_KeyEmitters.md | 66 ++- .../Frontend_Utils_ShortcutConstants.md | 79 +++- docs/modules/Frontend_Utils_constants.md | 7 +- docs/modules/Frontend_Views_ModalIcon.md | 253 ++++++----- docs/modules/Frontend_Views_SidebarPane.md | 28 ++ .../_types_darkforest_api_ChunkStoreTypes.md | 4 +- ..._types_darkforest_api_ContractsAPITypes.md | 7 + docs/modules/_types_global_GlobalTypes.md | 1 + last_updated.txt | 2 +- package.json | 21 +- src/Backend/GameLogic/ArrivalUtils.ts | 3 + src/Backend/GameLogic/ContractsAPI.ts | 118 +++++- src/Backend/GameLogic/ConversationManager.tsx | 3 +- src/Backend/GameLogic/GameManager.ts | 394 ++++++++++++++---- src/Backend/GameLogic/GameObjects.ts | 62 ++- src/Backend/GameLogic/GameUIManager.ts | 39 +- .../GameLogic/InitialGameStateDownloader.ts | 20 +- src/Backend/GameLogic/LayeredMap.ts | 2 +- .../GameLogic/PaidConversationManager.tsx | 3 +- src/Backend/Network/Blockchain.ts | 16 + src/Backend/Procedural/ArtifactProcgen.ts | 3 +- src/Backend/Procedural/ProcgenUtils.ts | 4 +- src/Backend/Storage/PersistentChunkStore.ts | 19 + src/Backend/Utils/TypeAssertions.ts | 5 + src/Frontend/Components/Btn.tsx | 28 +- src/Frontend/Components/CoreUI.tsx | 82 ++-- src/Frontend/Components/IconButton.tsx | 34 -- src/Frontend/Components/Icons.tsx | 48 ++- src/Frontend/Components/Labels/Labels.tsx | 34 +- .../Components/Labels/PlanetLabels.tsx | 16 +- src/Frontend/Components/OpenPaneButtons.tsx | 47 ++- src/Frontend/Components/Text.tsx | 14 +- src/Frontend/Components/TextLoadingBar.tsx | 8 +- src/Frontend/Game/Popups.ts | 4 +- src/Frontend/Pages/GameLandingPage.tsx | 60 +-- src/Frontend/Pages/LandingPage.tsx | 4 +- src/Frontend/Pages/TestArtifactImages.tsx | 4 +- src/Frontend/Panes/ArtifactDetailsPane.tsx | 2 +- src/Frontend/Panes/ClaimPlanetPane.tsx | 109 +++++ src/Frontend/Panes/ExplorePane.tsx | 78 ++-- src/Frontend/Panes/HelpPane.tsx | 5 +- .../ManagePlanetArtifacts/ArtifactActions.tsx | 9 +- .../ArtifactListItem.tsx | 60 +-- .../ManagePlanetArtifacts/ArtifactsList.tsx | 3 +- src/Frontend/Panes/PlanetContextPane.tsx | 4 +- src/Frontend/Panes/PlanetDexPane.tsx | 3 +- src/Frontend/Panes/PlayerInfoPane.tsx | 2 +- src/Frontend/Panes/PluginEditorPane.tsx | 2 +- src/Frontend/Panes/PluginLibraryPane.tsx | 4 +- src/Frontend/Panes/SettingsPane.tsx | 2 - src/Frontend/Panes/Tooltip.tsx | 24 +- .../Entities/BackgroundRenderer.ts | 2 +- .../Entities/PlanetRenderManager.ts | 3 +- .../Entities/SpacetimeRipRenderer.ts | 2 +- .../GameRenderer/Programs/PerlinProgram.ts | 2 +- .../Renderers/GameRenderer/UIRenderer.ts | 14 +- src/Frontend/Renderers/GifRenderer.ts | 4 +- src/Frontend/Styles/Colors.tsx | 4 +- src/Frontend/Styles/dfstyles.ts | 10 +- src/Frontend/Utils/AppHooks.ts | 22 +- src/Frontend/Utils/EmitterHooks.ts | 28 +- src/Frontend/Utils/KeyEmitters.ts | 69 ++- src/Frontend/Utils/ShortcutConstants.ts | 34 +- src/Frontend/Utils/TerminalTypes.ts | 3 +- src/Frontend/Utils/constants.ts | 11 +- src/Frontend/Views/ArtifactLink.tsx | 22 +- src/Frontend/Views/DarkForestTips.tsx | 38 +- src/Frontend/Views/GameWindowLayout.tsx | 155 +++---- src/Frontend/Views/Leaderboard.tsx | 8 +- src/Frontend/Views/ModalIcon.tsx | 288 +++++++++---- src/Frontend/Views/ModalPane.tsx | 165 ++++---- src/Frontend/Views/OwnedPluginView.tsx | 9 +- src/Frontend/Views/PlanetCard.tsx | 50 ++- src/Frontend/Views/PlanetCardComponents.tsx | 37 +- src/Frontend/Views/PlanetLink.tsx | 17 +- src/Frontend/Views/SendResources.tsx | 209 ++++------ src/Frontend/Views/Share.tsx | 4 +- src/Frontend/Views/SidebarPane.tsx | 110 +++++ src/Frontend/Views/SortableTable.tsx | 2 +- src/Frontend/Views/Terminal.tsx | 14 +- src/Frontend/Views/TopBar.tsx | 24 +- src/_types/darkforest/api/ChunkStoreTypes.ts | 12 +- .../darkforest/api/ContractsAPITypes.ts | 13 + src/_types/global/GlobalTypes.ts | 6 + yarn.lock | 10 + 112 files changed, 2646 insertions(+), 1367 deletions(-) create mode 100644 docs/interfaces/_types_global_GlobalTypes.ClaimCountdownInfo.md delete mode 100644 docs/modules/Frontend_Components_IconButton.md create mode 100644 docs/modules/Frontend_Panes_ClaimPlanetPane.md create mode 100644 docs/modules/Frontend_Views_SidebarPane.md delete mode 100644 src/Frontend/Components/IconButton.tsx create mode 100644 src/Frontend/Panes/ClaimPlanetPane.tsx create mode 100644 src/Frontend/Views/SidebarPane.tsx diff --git a/docs/README.md b/docs/README.md index e97d850d..fc35c123 100644 --- a/docs/README.md +++ b/docs/README.md @@ -61,7 +61,6 @@ - [Frontend/Components/GameLandingPageComponents](modules/Frontend_Components_GameLandingPageComponents.md) - [Frontend/Components/GameWindowComponents](modules/Frontend_Components_GameWindowComponents.md) - [Frontend/Components/Hoverable](modules/Frontend_Components_Hoverable.md) -- [Frontend/Components/IconButton](modules/Frontend_Components_IconButton.md) - [Frontend/Components/Icons](modules/Frontend_Components_Icons.md) - [Frontend/Components/Input](modules/Frontend_Components_Input.md) - [Frontend/Components/Labels/ArtifactLabels](modules/Frontend_Components_Labels_ArtifactLabels.md) @@ -107,6 +106,7 @@ - [Frontend/Panes/ArtifactConversation/ConversationSuggestions](modules/Frontend_Panes_ArtifactConversation_ConversationSuggestions.md) - [Frontend/Panes/ArtifactDetailsPane](modules/Frontend_Panes_ArtifactDetailsPane.md) - [Frontend/Panes/BroadcastPane](modules/Frontend_Panes_BroadcastPane.md) +- [Frontend/Panes/ClaimPlanetPane](modules/Frontend_Panes_ClaimPlanetPane.md) - [Frontend/Panes/CoordsPane](modules/Frontend_Panes_CoordsPane.md) - [Frontend/Panes/DiagnosticsPane](modules/Frontend_Panes_DiagnosticsPane.md) - [Frontend/Panes/ExplorePane](modules/Frontend_Panes_ExplorePane.md) @@ -243,6 +243,7 @@ - [Frontend/Views/PlanetNotifications](modules/Frontend_Views_PlanetNotifications.md) - [Frontend/Views/SendResources](modules/Frontend_Views_SendResources.md) - [Frontend/Views/Share](modules/Frontend_Views_Share.md) +- [Frontend/Views/SidebarPane](modules/Frontend_Views_SidebarPane.md) - [Frontend/Views/SortableTable](modules/Frontend_Views_SortableTable.md) - [Frontend/Views/TabbedView](modules/Frontend_Views_TabbedView.md) - [Frontend/Views/Table](modules/Frontend_Views_Table.md) diff --git a/docs/classes/Backend_GameLogic_ContractsAPI.ContractsAPI.md b/docs/classes/Backend_GameLogic_ContractsAPI.ContractsAPI.md index b60c44a9..3828040c 100644 --- a/docs/classes/Backend_GameLogic_ContractsAPI.ContractsAPI.md +++ b/docs/classes/Backend_GameLogic_ContractsAPI.ContractsAPI.md @@ -31,6 +31,7 @@ reading and writing to and from the blockchain. - [coreContract](Backend_GameLogic_ContractsAPI.ContractsAPI.md#corecontract) - [gettersContract](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getterscontract) - [gptCreditContract](Backend_GameLogic_ContractsAPI.ContractsAPI.md#gptcreditcontract) +- [scoreContract](Backend_GameLogic_ContractsAPI.ContractsAPI.md#scorecontract) - [whitelistContract](Backend_GameLogic_ContractsAPI.ContractsAPI.md#whitelistcontract) ### Methods @@ -43,6 +44,7 @@ reading and writing to and from the blockchain. - [bulkGetPlanets](Backend_GameLogic_ContractsAPI.ContractsAPI.md#bulkgetplanets) - [buyGPTCredits](Backend_GameLogic_ContractsAPI.ContractsAPI.md#buygptcredits) - [buyHat](Backend_GameLogic_ContractsAPI.ContractsAPI.md#buyhat) +- [claim](Backend_GameLogic_ContractsAPI.ContractsAPI.md#claim) - [deactivateArtifact](Backend_GameLogic_ContractsAPI.ContractsAPI.md#deactivateartifact) - [depositArtifact](Backend_GameLogic_ContractsAPI.ContractsAPI.md#depositartifact) - [destroy](Backend_GameLogic_ContractsAPI.ContractsAPI.md#destroy) @@ -53,6 +55,8 @@ reading and writing to and from the blockchain. - [getArrivalsForPlanet](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getarrivalsforplanet) - [getArtifactById](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getartifactbyid) - [getBalance](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getbalance) +- [getClaimedCoordsByIdIfExists](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getclaimedcoordsbyidifexists) +- [getClaimedPlanetsCoords](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getclaimedplanetscoords) - [getConstants](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getconstants) - [getContractAddress](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getcontractaddress) - [getContractBalance](Backend_GameLogic_ContractsAPI.ContractsAPI.md#getcontractbalance) @@ -163,6 +167,16 @@ Don't allow users to submit txs if balance falls below this amount/ --- +### scoreContract + +• `get` **scoreContract**(): `DarkForestScoringRound3` + +#### Returns + +`DarkForestScoringRound3` + +--- + ### whitelistContract • `get` **whitelistContract**(): `Whitelist` @@ -313,6 +327,23 @@ interaction. To prevent the queued transaction from being submitted, throw an Er --- +### claim + +▸ **claim**(`args`, `action`): `Promise`<`TransactionReceipt`\> + +#### Parameters + +| Name | Type | +| :------- | :----------------------------------------------------------------------------- | +| `args` | [`ClaimArgs`](../modules/_types_darkforest_api_ContractsAPITypes.md#claimargs) | +| `action` | `UnconfirmedClaim` | + +#### Returns + +`Promise`<`TransactionReceipt`\> + +--- + ### deactivateArtifact ▸ **deactivateArtifact**(`action`): `Promise`<`TransactionReceipt`\> @@ -458,6 +489,40 @@ interaction. To prevent the queued transaction from being submitted, throw an Er --- +### getClaimedCoordsByIdIfExists + +▸ **getClaimedCoordsByIdIfExists**(`planetId`): `Promise`<`undefined` \| `ClaimedCoords`\> + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +`Promise`<`undefined` \| `ClaimedCoords`\> + +--- + +### getClaimedPlanetsCoords + +▸ **getClaimedPlanetsCoords**(`startingAt`, `onProgressIds?`, `onProgressCoords?`): `Promise`<`ClaimedCoords`[]\> + +#### Parameters + +| Name | Type | +| :------------------ | :---------------------------------------- | +| `startingAt` | `number` | +| `onProgressIds?` | (`fractionCompleted`: `number`) => `void` | +| `onProgressCoords?` | (`fractionCompleted`: `number`) => `void` | + +#### Returns + +`Promise`<`ClaimedCoords`[]\> + +--- + ### getConstants ▸ **getConstants**(): `Promise`<[`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md)\> diff --git a/docs/classes/Backend_GameLogic_GameManager.default.md b/docs/classes/Backend_GameLogic_GameManager.default.md index 935de70c..754c8be9 100644 --- a/docs/classes/Backend_GameLogic_GameManager.default.md +++ b/docs/classes/Backend_GameLogic_GameManager.default.md @@ -59,11 +59,13 @@ - [buyGPTCredits](Backend_GameLogic_GameManager.default.md#buygptcredits) - [buyHat](Backend_GameLogic_GameManager.default.md#buyhat) - [checkGameHasEnded](Backend_GameLogic_GameManager.default.md#checkgamehasended) +- [claimLocation](Backend_GameLogic_GameManager.default.md#claimlocation) - [clearEmoji](Backend_GameLogic_GameManager.default.md#clearemoji) - [deactivateArtifact](Backend_GameLogic_GameManager.default.md#deactivateartifact) - [depositArtifact](Backend_GameLogic_GameManager.default.md#depositartifact) - [destroy](Backend_GameLogic_GameManager.default.md#destroy) - [findArtifact](Backend_GameLogic_GameManager.default.md#findartifact) +- [findRandomHomePlanet](Backend_GameLogic_GameManager.default.md#findrandomhomeplanet) - [getAccount](Backend_GameLogic_GameManager.default.md#getaccount) - [getActiveArtifact](Backend_GameLogic_GameManager.default.md#getactiveartifact) - [getAllOwnedPlanets](Backend_GameLogic_GameManager.default.md#getallownedplanets) @@ -76,6 +78,7 @@ - [getArtifactsWithIds](Backend_GameLogic_GameManager.default.md#getartifactswithids) - [getChunk](Backend_GameLogic_GameManager.default.md#getchunk) - [getChunkStore](Backend_GameLogic_GameManager.default.md#getchunkstore) +- [getClaimedLocations](Backend_GameLogic_GameManager.default.md#getclaimedlocations) - [getConstructors](Backend_GameLogic_GameManager.default.md#getconstructors) - [getContractAddress](Backend_GameLogic_GameManager.default.md#getcontractaddress) - [getContractConstants](Backend_GameLogic_GameManager.default.md#getcontractconstants) @@ -112,6 +115,8 @@ - [getMyPlanetsUpdated$](Backend_GameLogic_GameManager.default.md#getmyplanetsupdated$) - [getMyScore](Backend_GameLogic_GameManager.default.md#getmyscore) - [getNextBroadcastAvailableTimestamp](Backend_GameLogic_GameManager.default.md#getnextbroadcastavailabletimestamp) +- [getNextClaimAvailableTimestamp](Backend_GameLogic_GameManager.default.md#getnextclaimavailabletimestamp) +- [getNextClaimCountdownInfo](Backend_GameLogic_GameManager.default.md#getnextclaimcountdowninfo) - [getNextRevealCountdownInfo](Backend_GameLogic_GameManager.default.md#getnextrevealcountdowninfo) - [getNotificationsManager](Backend_GameLogic_GameManager.default.md#getnotificationsmanager) - [getPerlinThresholds](Backend_GameLogic_GameManager.default.md#getperlinthresholds) @@ -124,11 +129,10 @@ - [getPlanetsInRange](Backend_GameLogic_GameManager.default.md#getplanetsinrange) - [getPlanetsInWorldRectangle](Backend_GameLogic_GameManager.default.md#getplanetsinworldrectangle) - [getPlanetsWithIds](Backend_GameLogic_GameManager.default.md#getplanetswithids) -- [getPlanetsWithinRange](Backend_GameLogic_GameManager.default.md#getplanetswithinrange) - [getPlayer](Backend_GameLogic_GameManager.default.md#getplayer) +- [getPlayerScore](Backend_GameLogic_GameManager.default.md#getplayerscore) - [getPrivateKey](Backend_GameLogic_GameManager.default.md#getprivatekey) - [getProcgenUtils](Backend_GameLogic_GameManager.default.md#getprocgenutils) -- [getRandomHomePlanetCoords](Backend_GameLogic_GameManager.default.md#getrandomhomeplanetcoords) - [getRevealedLocations](Backend_GameLogic_GameManager.default.md#getrevealedlocations) - [getSignedTwitter](Backend_GameLogic_GameManager.default.md#getsignedtwitter) - [getSilverCurveAtPercent](Backend_GameLogic_GameManager.default.md#getsilvercurveatpercent) @@ -144,7 +148,6 @@ - [getUnconfirmedWormholeActivations](Backend_GameLogic_GameManager.default.md#getunconfirmedwormholeactivations) - [getUniverseTotalEnergy](Backend_GameLogic_GameManager.default.md#getuniversetotalenergy) - [getUpgrade](Backend_GameLogic_GameManager.default.md#getupgrade) -- [getWithdrawnSilverOfPlayer](Backend_GameLogic_GameManager.default.md#getwithdrawnsilverofplayer) - [getWorldRadius](Backend_GameLogic_GameManager.default.md#getworldradius) - [getWorldSilver](Backend_GameLogic_GameManager.default.md#getworldsilver) - [getWormholeFactors](Backend_GameLogic_GameManager.default.md#getwormholefactors) @@ -206,7 +209,7 @@ ### constructor -• `Private` **new default**(`terminal`, `account`, `players`, `touchedPlanets`, `allTouchedPlanetIds`, `revealedCoords`, `worldRadius`, `unprocessedArrivals`, `unprocessedPlanetArrivalIds`, `contractsAPI`, `contractConstants`, `persistentChunkStore`, `snarkHelper`, `homeLocation`, `useMockHash`, `artifacts`, `ethConnection`, `gptCreditPriceEther`, `myGPTCredits`) +• `Private` **new default**(`terminal`, `account`, `players`, `touchedPlanets`, `allTouchedPlanetIds`, `revealedCoords`, `claimedCoords`, `worldRadius`, `unprocessedArrivals`, `unprocessedPlanetArrivalIds`, `contractsAPI`, `contractConstants`, `persistentChunkStore`, `snarkHelper`, `homeLocation`, `useMockHash`, `artifacts`, `ethConnection`, `gptCreditPriceEther`, `myGPTCredits`) #### Parameters @@ -218,6 +221,7 @@ | `touchedPlanets` | `Map`<`LocationId`, `Planet`\> | | `allTouchedPlanetIds` | `Set`<`LocationId`\> | | `revealedCoords` | `Map`<`LocationId`, `RevealedCoords`\> | +| `claimedCoords` | `Map`<`LocationId`, `ClaimedCoords`\> | | `worldRadius` | `number` | | `unprocessedArrivals` | `Map`<`VoyageId`, `QueuedArrival`\> | | `unprocessedPlanetArrivalIds` | `Map`<`LocationId`, `VoyageId`[]\> | @@ -700,6 +704,22 @@ look your best. Just like in the real world, more money means more hat. --- +### claimLocation + +▸ **claimLocation**(`planetId`): [`default`](Backend_GameLogic_GameManager.default.md) + +#### Parameters + +| Name | Type | +| :--------- | :----------- | +| `planetId` | `LocationId` | + +#### Returns + +[`default`](Backend_GameLogic_GameManager.default.md) + +--- + ### clearEmoji ▸ **clearEmoji**(`locationId`): `Promise`<`void`\> @@ -787,6 +807,16 @@ Calls the contract to find an artifact on the given planet. --- +### findRandomHomePlanet + +▸ `Private` **findRandomHomePlanet**(): `Promise`<`LocatablePlanet`\> + +#### Returns + +`Promise`<`LocatablePlanet`\> + +--- + ### getAccount ▸ **getAccount**(): `undefined` \| `EthAddress` @@ -953,6 +983,18 @@ represented by `undefined`. --- +### getClaimedLocations + +▸ **getClaimedLocations**(): `Map`<`LocationId`, `ClaimedLocation`\> + +Gets a map of all location IDs which have been claimed. + +#### Returns + +`Map`<`LocationId`, `ClaimedLocation`\> + +--- + ### getConstructors ▸ **getConstructors**(): `Object` @@ -1042,7 +1084,7 @@ Gets some diagnostic information about the game. Returns a copy, you can't modif ▸ **getDist**(`fromId`, `toId`): `number` Gets the distance between two planets. Throws an exception if you don't -know the location of either planet. +know the location of either planet. Takes into account wormholes. #### Parameters @@ -1453,6 +1495,30 @@ Gets the timestamp (ms) of the next time that we can broadcast the coordinates o --- +### getNextClaimAvailableTimestamp + +▸ **getNextClaimAvailableTimestamp**(): `number` + +Gets the timestamp (ms) of the next time that we can claim a planet. + +#### Returns + +`number` + +--- + +### getNextClaimCountdownInfo + +▸ **getNextClaimCountdownInfo**(): [`ClaimCountdownInfo`](../interfaces/_types_global_GlobalTypes.ClaimCountdownInfo.md) + +Returns info about the next time you can claim a Planet + +#### Returns + +[`ClaimCountdownInfo`](../interfaces/_types_global_GlobalTypes.ClaimCountdownInfo.md) + +--- + ### getNextRevealCountdownInfo ▸ **getNextRevealCountdownInfo**(): [`RevealCountdownInfo`](../interfaces/_types_global_GlobalTypes.RevealCountdownInfo.md) @@ -1588,7 +1654,7 @@ passed since we last updated the planet), then updates that planet first. ▸ **getPlanetsInRange**(`planetId`, `sendingPercent`): `Planet`[] Gets all the planets that you can reach with at least 1 energy from -the given planet. +the given planet. Does not take into account wormholes. #### Parameters @@ -1648,40 +1714,38 @@ doesn't exist, no entry for that planet will be returned in the result. --- -### getPlanetsWithinRange +### getPlayer -▸ **getPlanetsWithinRange**(`planet`): `LocatablePlanet`[] +▸ **getPlayer**(`address?`): `undefined` \| `Player` -Gets all the planets that this planet could reach if it sent 100% of its energy. +Gets either the given player, or if no address was provided, gets the player that is logged +this client. #### Parameters -| Name | Type | -| :------- | :---------------- | -| `planet` | `LocatablePlanet` | +| Name | Type | +| :--------- | :----------- | +| `address?` | `EthAddress` | #### Returns -`LocatablePlanet`[] +`undefined` \| `Player` --- -### getPlayer - -▸ **getPlayer**(`address?`): `undefined` \| `Player` +### getPlayerScore -Gets either the given player, or if no address was provided, gets the player that is logged -this client. +▸ **getPlayerScore**(`addr`): `number` #### Parameters -| Name | Type | -| :--------- | :----------- | -| `address?` | `EthAddress` | +| Name | Type | +| :----- | :----------- | +| `addr` | `EthAddress` | #### Returns -`undefined` \| `Player` +`number` --- @@ -1709,21 +1773,11 @@ typeof [`ProcgenUtils`](Backend_Procedural_ProcgenUtils.ProcgenUtils.md) --- -### getRandomHomePlanetCoords - -▸ `Private` **getRandomHomePlanetCoords**(): `Promise`<`WorldLocation`\> - -#### Returns - -`Promise`<`WorldLocation`\> - ---- - ### getRevealedLocations ▸ **getRevealedLocations**(): `Map`<`LocationId`, `RevealedLocation`\> -Gets a map of all location IDs whose coords have been publicly revealed +Gets a map of all location IDs whose coords have been publically revealed #### Returns @@ -1954,22 +2008,6 @@ upgrade branch (defense, range, speed) and level of upgrade. --- -### getWithdrawnSilverOfPlayer - -▸ **getWithdrawnSilverOfPlayer**(`addr`): `number` - -#### Parameters - -| Name | Type | -| :----- | :----------- | -| `addr` | `EthAddress` | - -#### Returns - -`number` - ---- - ### getWorldRadius ▸ **getWorldRadius**(): `number` @@ -2121,13 +2159,14 @@ Whether or not the given rectangle has been mined. ### initMiningManager -▸ `Private` **initMiningManager**(`homeCoords`): `void` +▸ `Private` **initMiningManager**(`homeCoords`, `cores?`): `void` #### Parameters | Name | Type | | :----------- | :------------ | | `homeCoords` | `WorldCoords` | +| `cores?` | `number` | #### Returns diff --git a/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md b/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md index f617ec22..03e049a8 100644 --- a/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md +++ b/docs/classes/Backend_GameLogic_GameObjects.GameObjects.md @@ -16,6 +16,7 @@ Representation of the objects which exist in the world. - [arrivals](Backend_GameLogic_GameObjects.GameObjects.md#arrivals) - [artifactUpdated$](Backend_GameLogic_GameObjects.GameObjects.md#artifactupdated$) - [artifacts](Backend_GameLogic_GameObjects.GameObjects.md#artifacts) +- [claimedLocations](Backend_GameLogic_GameObjects.GameObjects.md#claimedlocations) - [contractConstants](Backend_GameLogic_GameObjects.GameObjects.md#contractconstants) - [coordsToLocation](Backend_GameLogic_GameObjects.GameObjects.md#coordstolocation) - [isBuyingCredits$](Backend_GameLogic_GameObjects.GameObjects.md#isbuyingcredits$) @@ -32,6 +33,7 @@ Representation of the objects which exist in the world. - [touchedPlanetIds](Backend_GameLogic_GameObjects.GameObjects.md#touchedplanetids) - [unconfirmedBuyGPTCredits](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedbuygptcredits) - [unconfirmedBuyHats](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedbuyhats) +- [unconfirmedClaim](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedclaim) - [unconfirmedMoves](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedmoves) - [unconfirmedPlanetTransfers](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedplanettransfers) - [unconfirmedReveal](Backend_GameLogic_GameObjects.GameObjects.md#unconfirmedreveal) @@ -57,6 +59,7 @@ Representation of the objects which exist in the world. - [getArtifactsOnPlanetsOwnedBy](Backend_GameLogic_GameObjects.GameObjects.md#getartifactsonplanetsownedby) - [getArtifactsOwnedBy](Backend_GameLogic_GameObjects.GameObjects.md#getartifactsownedby) - [getBiome](Backend_GameLogic_GameObjects.GameObjects.md#getbiome) +- [getClaimedLocations](Backend_GameLogic_GameObjects.GameObjects.md#getclaimedlocations) - [getEnergyCurveAtPercent](Backend_GameLogic_GameObjects.GameObjects.md#getenergycurveatpercent) - [getIsBuyingCreditsEmitter](Backend_GameLogic_GameObjects.GameObjects.md#getisbuyingcreditsemitter) - [getLocationOfPlanet](Backend_GameLogic_GameObjects.GameObjects.md#getlocationofplanet) @@ -75,6 +78,7 @@ Representation of the objects which exist in the world. - [getRevealedLocations](Backend_GameLogic_GameObjects.GameObjects.md#getrevealedlocations) - [getSilverCurveAtPercent](Backend_GameLogic_GameObjects.GameObjects.md#getsilvercurveatpercent) - [getUnconfirmedBuyGPTCredits](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedbuygptcredits) +- [getUnconfirmedClaim](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedclaim) - [getUnconfirmedMoves](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedmoves) - [getUnconfirmedReveal](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedreveal) - [getUnconfirmedUpgrades](Backend_GameLogic_GameObjects.GameObjects.md#getunconfirmedupgrades) @@ -90,6 +94,7 @@ Representation of the objects which exist in the world. - [replaceArtifactsFromContractData](Backend_GameLogic_GameObjects.GameObjects.md#replaceartifactsfromcontractdata) - [replacePlanetFromContractData](Backend_GameLogic_GameObjects.GameObjects.md#replaceplanetfromcontractdata) - [setArtifact](Backend_GameLogic_GameObjects.GameObjects.md#setartifact) +- [setClaimedLocation](Backend_GameLogic_GameObjects.GameObjects.md#setclaimedlocation) - [setPlanet](Backend_GameLogic_GameObjects.GameObjects.md#setplanet) - [spaceTypeFromPerlin](Backend_GameLogic_GameObjects.GameObjects.md#spacetypefromperlin) - [updatePlanet](Backend_GameLogic_GameObjects.GameObjects.md#updateplanet) @@ -102,7 +107,7 @@ Representation of the objects which exist in the world. ### constructor -• **new GameObjects**(`address`, `touchedPlanets`, `allTouchedPlanetIds`, `revealedLocations`, `artifacts`, `allChunks`, `unprocessedArrivals`, `unprocessedPlanetArrivalIds`, `contractConstants`, `worldRadius`) +• **new GameObjects**(`address`, `touchedPlanets`, `allTouchedPlanetIds`, `revealedLocations`, `claimedLocations`, `artifacts`, `allChunks`, `unprocessedArrivals`, `unprocessedPlanetArrivalIds`, `contractConstants`, `worldRadius`) #### Parameters @@ -112,6 +117,7 @@ Representation of the objects which exist in the world. | `touchedPlanets` | `Map`<`LocationId`, `Planet`\> | | `allTouchedPlanetIds` | `Set`<`LocationId`\> | | `revealedLocations` | `Map`<`LocationId`, `RevealedLocation`\> | +| `claimedLocations` | `Map`<`LocationId`, `ClaimedLocation`\> | | `artifacts` | `Map`<`ArtifactId`, `Artifact`\> | | `allChunks` | `Iterable`<[`Chunk`](_types_global_GlobalTypes.Chunk.md)\> | | `unprocessedArrivals` | `Map`<`VoyageId`, `QueuedArrival`\> | @@ -159,6 +165,16 @@ Cached index of all known artifact data. --- +### claimedLocations + +• `Private` `Readonly` **claimedLocations**: `Map`<`LocationId`, `ClaimedLocation`\> + +Map from location ids to, if that location id has been claimed on-chain, the world coordinates +of that location id, as well as some extra information regarding the circumstances of the +revealing of this planet. + +--- + ### contractConstants • `Private` `Readonly` **contractConstants**: [`ContractConstants`](../interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md) @@ -319,6 +335,12 @@ Set of all planet ids that we know have been interacted-with on-chain. --- +### unconfirmedClaim + +• `Private` `Optional` **unconfirmedClaim**: `UnconfirmedClaim` + +--- + ### unconfirmedMoves • `Private` `Readonly` **unconfirmedMoves**: `Record`<`string`, `UnconfirmedMove`\> @@ -648,6 +670,16 @@ if the artifact is not on either, then it is the owner of the artifact NFT --- +### getClaimedLocations + +▸ **getClaimedLocations**(): `Map`<`LocationId`, `ClaimedLocation`\> + +#### Returns + +`Map`<`LocationId`, `ClaimedLocation`\> + +--- + ### getEnergyCurveAtPercent ▸ **getEnergyCurveAtPercent**(`planet`, `percent`): `number` @@ -825,6 +857,9 @@ time may be in the past ▸ **getPlanetsInWorldCircle**(`coords`, `radius`): `LocatablePlanet`[] +Gets all the planets that are within {@code radius} world units from the given coordinate. Fast +because it uses [LayeredMap](Backend_GameLogic_LayeredMap.LayeredMap.md). + #### Parameters | Name | Type | @@ -842,9 +877,9 @@ time may be in the past ▸ **getPlanetsInWorldRectangle**(`worldX`, `worldY`, `worldWidth`, `worldHeight`, `levels`, `planetLevelToRadii`, `updateIfStale?`): `LocatablePlanet`[] -Gets the ids of all the planets that are both within the given bounding box (defined by its bottom -left coordinate, width, and height) in the world and of a level that was passed in via the -`planetLevels` parameter. +Gets the ids of all the planets that are both within the given bounding box (defined by its +bottom left coordinate, width, and height) in the world and of a level that was passed in via +the `planetLevels` parameter. Fast because it uses [LayeredMap](Backend_GameLogic_LayeredMap.LayeredMap.md). #### Parameters @@ -868,6 +903,8 @@ left coordinate, width, and height) in the world and of a level that was passed ▸ **getPlanetsWithIds**(`locationIds`, `updateIfStale?`): `Planet`[] +Gets all the planets with the given ids, giltering out the ones that we don't have. + #### Parameters | Name | Type | Default value | @@ -922,6 +959,16 @@ returns undefined --- +### getUnconfirmedClaim + +▸ **getUnconfirmedClaim**(): `undefined` \| `UnconfirmedClaim` + +#### Returns + +`undefined` \| `UnconfirmedClaim` + +--- + ### getUnconfirmedMoves ▸ **getUnconfirmedMoves**(): `UnconfirmedMove`[] @@ -1124,7 +1171,7 @@ received some artifact data from the contract. update our stores ### replacePlanetFromContractData -▸ **replacePlanetFromContractData**(`planet`, `updatedArrivals?`, `updatedArtifactsOnPlanet?`, `revealedLocation?`): `void` +▸ **replacePlanetFromContractData**(`planet`, `updatedArrivals?`, `updatedArtifactsOnPlanet?`, `revealedLocation?`, `claimerEthAddress?`): `void` received some planet data from the contract. update our stores @@ -1136,6 +1183,7 @@ received some planet data from the contract. update our stores | `updatedArrivals?` | `QueuedArrival`[] | | `updatedArtifactsOnPlanet?` | `ArtifactId`[] | | `revealedLocation?` | `RevealedLocation` | +| `claimerEthAddress?` | `EthAddress` | #### Returns @@ -1163,6 +1211,22 @@ This function also handles managing artifact update messages and indexing the ma --- +### setClaimedLocation + +▸ **setClaimedLocation**(`claimedLocation`): `void` + +#### Parameters + +| Name | Type | +| :---------------- | :---------------- | +| `claimedLocation` | `ClaimedLocation` | + +#### Returns + +`void` + +--- + ### setPlanet ▸ `Private` **setPlanet**(`planet`): `void` diff --git a/docs/classes/Backend_GameLogic_GameUIManager.default.md b/docs/classes/Backend_GameLogic_GameUIManager.default.md index 9c891673..74a3efe6 100644 --- a/docs/classes/Backend_GameLogic_GameUIManager.default.md +++ b/docs/classes/Backend_GameLogic_GameUIManager.default.md @@ -57,6 +57,7 @@ - [centerCoords](Backend_GameLogic_GameUIManager.default.md#centercoords) - [centerLocationId](Backend_GameLogic_GameUIManager.default.md#centerlocationid) - [centerPlanet](Backend_GameLogic_GameUIManager.default.md#centerplanet) +- [claimLocation](Backend_GameLogic_GameUIManager.default.md#claimlocation) - [deactivateArtifact](Backend_GameLogic_GameUIManager.default.md#deactivateartifact) - [depositArtifact](Backend_GameLogic_GameUIManager.default.md#depositartifact) - [destroy](Backend_GameLogic_GameUIManager.default.md#destroy) @@ -127,6 +128,7 @@ - [getPlanetWithId](Backend_GameLogic_GameUIManager.default.md#getplanetwithid) - [getPlanetsInViewport](Backend_GameLogic_GameUIManager.default.md#getplanetsinviewport) - [getPlayer](Backend_GameLogic_GameUIManager.default.md#getplayer) +- [getPlayerScore](Backend_GameLogic_GameUIManager.default.md#getplayerscore) - [getPluginManager](Backend_GameLogic_GameUIManager.default.md#getpluginmanager) - [getPreviousSelectedPlanet](Backend_GameLogic_GameUIManager.default.md#getpreviousselectedplanet) - [getPrivateKey](Backend_GameLogic_GameUIManager.default.md#getprivatekey) @@ -146,11 +148,11 @@ - [getUniverseTotalEnergy](Backend_GameLogic_GameUIManager.default.md#getuniversetotalenergy) - [getUpgrade](Backend_GameLogic_GameUIManager.default.md#getupgrade) - [getViewport](Backend_GameLogic_GameUIManager.default.md#getviewport) -- [getWithdrawnSilverOfPlayer](Backend_GameLogic_GameUIManager.default.md#getwithdrawnsilverofplayer) - [getWorldRadius](Backend_GameLogic_GameUIManager.default.md#getworldradius) - [getWorldSilver](Backend_GameLogic_GameUIManager.default.md#getworldsilver) - [getWormholes](Backend_GameLogic_GameUIManager.default.md#getwormholes) - [hasMinedChunk](Backend_GameLogic_GameUIManager.default.md#hasminedchunk) +- [isCurrentlyClaiming](Backend_GameLogic_GameUIManager.default.md#iscurrentlyclaiming) - [isCurrentlyRevealing](Backend_GameLogic_GameUIManager.default.md#iscurrentlyrevealing) - [isMining](Backend_GameLogic_GameUIManager.default.md#ismining) - [isOverOwnPlanet](Backend_GameLogic_GameUIManager.default.md#isoverownplanet) @@ -184,6 +186,8 @@ - [startWormholeFrom](Backend_GameLogic_GameUIManager.default.md#startwormholefrom) - [stepConversation](Backend_GameLogic_GameUIManager.default.md#stepconversation) - [stopExplore](Backend_GameLogic_GameUIManager.default.md#stopexplore) +- [toggleExplore](Backend_GameLogic_GameUIManager.default.md#toggleexplore) +- [toggleTargettingExplorer](Backend_GameLogic_GameUIManager.default.md#toggletargettingexplorer) - [updateDiagnostics](Backend_GameLogic_GameUIManager.default.md#updatediagnostics) - [updateMouseHoveringOverCoords](Backend_GameLogic_GameUIManager.default.md#updatemousehoveringovercoords) - [updatePlanets](Backend_GameLogic_GameUIManager.default.md#updateplanets) @@ -565,6 +569,22 @@ indicates whether or not the player is currently selecting a target planet. --- +### claimLocation + +▸ **claimLocation**(`locationId`): `void` + +#### Parameters + +| Name | Type | +| :----------- | :----------- | +| `locationId` | `LocationId` | + +#### Returns + +`void` + +--- + ### deactivateArtifact ▸ **deactivateArtifact**(`locationId`, `artifactId`): `void` @@ -1027,6 +1047,8 @@ indicates whether or not the player is currently selecting a target planet. ▸ **getForcesSending**(`planetId`): `number` +Percent from 0 to 100. + #### Parameters | Name | Type | @@ -1444,6 +1466,22 @@ state in some way --- +### getPlayerScore + +▸ **getPlayerScore**(`player`): `number` + +#### Parameters + +| Name | Type | +| :------- | :----------- | +| `player` | `EthAddress` | + +#### Returns + +`number` + +--- + ### getPluginManager ▸ **getPluginManager**(): [`PluginManager`](Backend_GameLogic_PluginManager.PluginManager.md) @@ -1547,6 +1585,8 @@ state in some way ▸ **getSilverSending**(`planetId`): `number` +Percent from 0 to 100. + #### Parameters | Name | Type | @@ -1692,22 +1732,6 @@ drill fields like this anymore. --- -### getWithdrawnSilverOfPlayer - -▸ **getWithdrawnSilverOfPlayer**(`player`): `number` - -#### Parameters - -| Name | Type | -| :------- | :----------- | -| `player` | `EthAddress` | - -#### Returns - -`number` - ---- - ### getWorldRadius ▸ **getWorldRadius**(): `number` @@ -1754,6 +1778,16 @@ drill fields like this anymore. --- +### isCurrentlyClaiming + +▸ **isCurrentlyClaiming**(): `boolean` + +#### Returns + +`boolean` + +--- + ### isCurrentlyRevealing ▸ **isCurrentlyRevealing**(): `boolean` @@ -2239,6 +2273,26 @@ drill fields like this anymore. --- +### toggleExplore + +▸ **toggleExplore**(): `void` + +#### Returns + +`void` + +--- + +### toggleTargettingExplorer + +▸ **toggleTargettingExplorer**(): `void` + +#### Returns + +`void` + +--- + ### updateDiagnostics ▸ **updateDiagnostics**(`updateFn`): `void` diff --git a/docs/classes/Backend_Storage_PersistentChunkStore.default.md b/docs/classes/Backend_Storage_PersistentChunkStore.default.md index 33f81243..b1a9621e 100644 --- a/docs/classes/Backend_Storage_PersistentChunkStore.default.md +++ b/docs/classes/Backend_Storage_PersistentChunkStore.default.md @@ -36,6 +36,7 @@ - [getHomeLocations](Backend_Storage_PersistentChunkStore.default.md#gethomelocations) - [getKey](Backend_Storage_PersistentChunkStore.default.md#getkey) - [getMinedSubChunks](Backend_Storage_PersistentChunkStore.default.md#getminedsubchunks) +- [getSavedClaimedCoords](Backend_Storage_PersistentChunkStore.default.md#getsavedclaimedcoords) - [getSavedRevealedCoords](Backend_Storage_PersistentChunkStore.default.md#getsavedrevealedcoords) - [getSavedTouchedPlanetIds](Backend_Storage_PersistentChunkStore.default.md#getsavedtouchedplanetids) - [getUnconfirmedSubmittedEthTxs](Backend_Storage_PersistentChunkStore.default.md#getunconfirmedsubmittedethtxs) @@ -47,6 +48,7 @@ - [persistQueuedChunks](Backend_Storage_PersistentChunkStore.default.md#persistqueuedchunks) - [recomputeSaveThrottleAfterUpdate](Backend_Storage_PersistentChunkStore.default.md#recomputesavethrottleafterupdate) - [removeKey](Backend_Storage_PersistentChunkStore.default.md#removekey) +- [saveClaimedCoords](Backend_Storage_PersistentChunkStore.default.md#saveclaimedcoords) - [savePlugins](Backend_Storage_PersistentChunkStore.default.md#saveplugins) - [saveRevealedCoords](Backend_Storage_PersistentChunkStore.default.md#saverevealedcoords) - [saveTouchedPlanetIds](Backend_Storage_PersistentChunkStore.default.md#savetouchedplanetids) @@ -304,6 +306,16 @@ the function named `addToChunkMap`. --- +### getSavedClaimedCoords + +▸ **getSavedClaimedCoords**(): `Promise`<`ClaimedCoords`[]\> + +#### Returns + +`Promise`<`ClaimedCoords`[]\> + +--- + ### getSavedRevealedCoords ▸ **getSavedRevealedCoords**(): `Promise`<`RevealedCoords`[]\> @@ -449,6 +461,22 @@ indexed db. --- +### saveClaimedCoords + +▸ **saveClaimedCoords**(`claimedCoordTupps`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :------------------ | :---------------- | +| `claimedCoordTupps` | `ClaimedCoords`[] | + +#### Returns + +`Promise`<`void`\> + +--- + ### savePlugins ▸ **savePlugins**(`plugins`): `Promise`<`void`\> diff --git a/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md b/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md index de165a96..8bb10098 100644 --- a/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md +++ b/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md @@ -7,12 +7,13 @@ ### Enumeration members - [Blue](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#blue) -- [Default](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#default) - [Green](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#green) - [Hoverable](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#hoverable) - [Invisible](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#invisible) +- [Mythic](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#mythic) - [Red](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#red) - [Sub](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#sub) +- [Subber](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#subber) - [Underline](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#underline) - [White](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#white) @@ -20,13 +21,7 @@ ### Blue -• **Blue** = `4` - ---- - -### Default - -• **Default** = `6` +• **Blue** = `5` --- @@ -44,13 +39,19 @@ ### Invisible -• **Invisible** = `5` +• **Invisible** = `6` + +--- + +### Mythic + +• **Mythic** = `9` --- ### Red -• **Red** = `3` +• **Red** = `4` --- @@ -60,6 +61,12 @@ --- +### Subber + +• **Subber** = `2` + +--- + ### Underline • **Underline** = `7` @@ -68,4 +75,4 @@ ### White -• **White** = `2` +• **White** = `3` diff --git a/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md b/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md index 4a9f0d5f..b7a2a6d0 100644 --- a/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md +++ b/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractEvent.md @@ -13,6 +13,7 @@ - [ArtifactFound](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#artifactfound) - [ArtifactWithdrawn](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#artifactwithdrawn) - [ChangedGPTCreditPrice](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#changedgptcreditprice) +- [LocationClaimed](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#locationclaimed) - [LocationRevealed](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#locationrevealed) - [PlanetHatBought](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#planethatbought) - [PlanetSilverWithdrawn](_types_darkforest_api_ContractsAPITypes.ContractEvent.md#planetsilverwithdrawn) @@ -64,6 +65,12 @@ --- +### LocationClaimed + +• **LocationClaimed** = `"LocationClaimed"` + +--- + ### LocationRevealed • **LocationRevealed** = `"LocationRevealed"` diff --git a/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md b/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md index 1f89fde0..329a253e 100644 --- a/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md +++ b/docs/enums/_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md @@ -10,6 +10,7 @@ - [ArtifactUpdate](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#artifactupdate) - [ChangedGPTCreditPrice](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#changedgptcreditprice) - [LocationRevealed](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#locationrevealed) +- [PlanetClaimed](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#planetclaimed) - [PlanetTransferred](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#planettransferred) - [PlanetUpdate](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#planetupdate) - [PlayerUpdate](_types_darkforest_api_ContractsAPITypes.ContractsAPIEvent.md#playerupdate) @@ -45,6 +46,12 @@ --- +### PlanetClaimed + +• **PlanetClaimed** = `"PlanetClaimed"` + +--- + ### PlanetTransferred • **PlanetTransferred** = `"PlanetTransferred"` diff --git a/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md b/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md index a9ee1550..a04023e0 100644 --- a/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md +++ b/docs/interfaces/Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md @@ -6,11 +6,13 @@ ### Properties +- [allClaimedCoords](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#allclaimedcoords) - [allRevealedCoords](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#allrevealedcoords) - [allTouchedPlanetIds](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#alltouchedplanetids) - [arrivals](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#arrivals) - [artifactsOnVoyages](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#artifactsonvoyages) - [balance](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#balance) +- [claimedCoordsMap](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#claimedcoordsmap) - [contractConstants](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#contractconstants) - [gptCreditPriceEther](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#gptcreditpriceether) - [heldArtifacts](Backend_GameLogic_InitialGameStateDownloader.InitialGameState.md#heldartifacts) @@ -27,6 +29,12 @@ ## Properties +### allClaimedCoords + +• **allClaimedCoords**: `ClaimedCoords`[] + +--- + ### allRevealedCoords • **allRevealedCoords**: `RevealedCoords`[] @@ -57,6 +65,12 @@ --- +### claimedCoordsMap + +• **claimedCoordsMap**: `Map`<`LocationId`, `ClaimedCoords`\> + +--- + ### contractConstants • **contractConstants**: [`ContractConstants`](_types_darkforest_api_ContractsAPITypes.ContractConstants.md) diff --git a/docs/interfaces/Frontend_Views_ModalPane.ModalFrame.md b/docs/interfaces/Frontend_Views_ModalPane.ModalFrame.md index 43b522d7..acd19f00 100644 --- a/docs/interfaces/Frontend_Views_ModalPane.ModalFrame.md +++ b/docs/interfaces/Frontend_Views_ModalPane.ModalFrame.md @@ -8,17 +8,14 @@ A modal has a {@code content}, and also optionally many {@link ModalFrames} push ### Properties -- [element](Frontend_Views_ModalPane.ModalFrame.md#element) - [helpContent](Frontend_Views_ModalPane.ModalFrame.md#helpcontent) - [title](Frontend_Views_ModalPane.ModalFrame.md#title) -## Properties - -### element +### Methods -• **element**: `ReactElement`<`any`, `string` \| `JSXElementConstructor`<`any`\>\> +- [element](Frontend_Views_ModalPane.ModalFrame.md#element) ---- +## Properties ### helpContent @@ -29,3 +26,13 @@ A modal has a {@code content}, and also optionally many {@link ModalFrames} push ### title • **title**: `string` + +## Methods + +### element + +▸ **element**(): `ReactElement`<`any`, `string` \| `JSXElementConstructor`<`any`\>\> + +#### Returns + +`ReactElement`<`any`, `string` \| `JSXElementConstructor`<`any`\>\> diff --git a/docs/interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md b/docs/interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md index 2b1e55d5..bcb47157 100644 --- a/docs/interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md +++ b/docs/interfaces/_types_darkforest_api_ContractsAPITypes.ContractConstants.md @@ -10,6 +10,7 @@ - [BIOMEBASE_KEY](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#biomebase_key) - [BIOME_THRESHOLD_1](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#biome_threshold_1) - [BIOME_THRESHOLD_2](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#biome_threshold_2) +- [CLAIM_PLANET_COOLDOWN](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#claim_planet_cooldown) - [DISABLE_ZK_CHECKS](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#disable_zk_checks) - [INIT_PERLIN_MAX](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#init_perlin_max) - [INIT_PERLIN_MIN](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#init_perlin_min) @@ -26,6 +27,7 @@ - [PLANET_RARITY](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#planet_rarity) - [PLANET_TYPE_WEIGHTS](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#planet_type_weights) - [SPACETYPE_KEY](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#spacetype_key) +- [SPAWN_RIM_AREA](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#spawn_rim_area) - [TIME_FACTOR_HUNDREDTHS](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#time_factor_hundredths) - [TOKEN_MINT_END_SECONDS](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#token_mint_end_seconds) - [defaultBarbarianPercentage](_types_darkforest_api_ContractsAPITypes.ContractConstants.md#defaultbarbarianpercentage) @@ -66,6 +68,12 @@ --- +### CLAIM_PLANET_COOLDOWN + +• **CLAIM_PLANET_COOLDOWN**: `number` + +--- + ### DISABLE_ZK_CHECKS • **DISABLE_ZK_CHECKS**: `boolean` @@ -167,6 +175,12 @@ four ranges: `PERLIN_THRESHOLD_1`, `PERLIN_THRESHOLD_2`, `PERLIN_THRESHOLD_3`. --- +### SPAWN_RIM_AREA + +• **SPAWN_RIM_AREA**: `number` + +--- + ### TIME_FACTOR_HUNDREDTHS • **TIME_FACTOR_HUNDREDTHS**: `number` diff --git a/docs/interfaces/_types_global_GlobalTypes.ClaimCountdownInfo.md b/docs/interfaces/_types_global_GlobalTypes.ClaimCountdownInfo.md new file mode 100644 index 00000000..959d76b0 --- /dev/null +++ b/docs/interfaces/_types_global_GlobalTypes.ClaimCountdownInfo.md @@ -0,0 +1,29 @@ +# Interface: ClaimCountdownInfo + +[\_types/global/GlobalTypes](../modules/_types_global_GlobalTypes.md).ClaimCountdownInfo + +## Table of contents + +### Properties + +- [claimCooldownTime](_types_global_GlobalTypes.ClaimCountdownInfo.md#claimcooldowntime) +- [currentlyClaiming](_types_global_GlobalTypes.ClaimCountdownInfo.md#currentlyclaiming) +- [myLastClaimTimestamp](_types_global_GlobalTypes.ClaimCountdownInfo.md#mylastclaimtimestamp) + +## Properties + +### claimCooldownTime + +• **claimCooldownTime**: `number` + +--- + +### currentlyClaiming + +• **currentlyClaiming**: `boolean` + +--- + +### myLastClaimTimestamp + +• `Optional` **myLastClaimTimestamp**: `number` diff --git a/docs/modules/Backend_GameLogic_ArrivalUtils.md b/docs/modules/Backend_GameLogic_ArrivalUtils.md index fb133644..2a5bb6bf 100644 --- a/docs/modules/Backend_GameLogic_ArrivalUtils.md +++ b/docs/modules/Backend_GameLogic_ArrivalUtils.md @@ -114,6 +114,8 @@ ▸ **getRange**(`planet`, `percentEnergySending?`): `number` +**`todo`** - planet class + #### Parameters | Name | Type | Default value | diff --git a/docs/modules/Backend_Network_Blockchain.md b/docs/modules/Backend_Network_Blockchain.md index ee5778b4..ada4e43c 100644 --- a/docs/modules/Backend_Network_Blockchain.md +++ b/docs/modules/Backend_Network_Blockchain.md @@ -8,6 +8,7 @@ - [loadCoreContract](Backend_Network_Blockchain.md#loadcorecontract) - [loadGettersContract](Backend_Network_Blockchain.md#loadgetterscontract) - [loadGptCreditContract](Backend_Network_Blockchain.md#loadgptcreditcontract) +- [loadScoringContract](Backend_Network_Blockchain.md#loadscoringcontract) - [loadWhitelistContract](Backend_Network_Blockchain.md#loadwhitelistcontract) ## Functions @@ -89,6 +90,28 @@ Loads ths GPT Credit contract, which players can pay to talk to artifacts. --- +### loadScoringContract + +▸ **loadScoringContract**(`address`, `provider`, `signer?`): `Promise`<`DarkForestScoringRound3`\> + +Loads ths GPT Credit contract, which players can pay to talk to artifacts. + +**`see`** https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestGPTCredit.sol + +#### Parameters + +| Name | Type | +| :--------- | :-------------------------- | +| `address` | `string` | +| `provider` | `providers.JsonRpcProvider` | +| `signer?` | `Wallet` | + +#### Returns + +`Promise`<`DarkForestScoringRound3`\> + +--- + ### loadWhitelistContract ▸ **loadWhitelistContract**(`address`, `provider`, `signer?`): `Promise`<`Whitelist`\> diff --git a/docs/modules/Backend_Utils_TypeAssertions.md b/docs/modules/Backend_Utils_TypeAssertions.md index 629a8c40..4dc59866 100644 --- a/docs/modules/Backend_Utils_TypeAssertions.md +++ b/docs/modules/Backend_Utils_TypeAssertions.md @@ -7,6 +7,7 @@ - [isUnconfirmedActivateArtifact](Backend_Utils_TypeAssertions.md#isunconfirmedactivateartifact) - [isUnconfirmedBuyGPTCredits](Backend_Utils_TypeAssertions.md#isunconfirmedbuygptcredits) - [isUnconfirmedBuyHat](Backend_Utils_TypeAssertions.md#isunconfirmedbuyhat) +- [isUnconfirmedClaim](Backend_Utils_TypeAssertions.md#isunconfirmedclaim) - [isUnconfirmedDeactivateArtifact](Backend_Utils_TypeAssertions.md#isunconfirmeddeactivateartifact) - [isUnconfirmedDepositArtifact](Backend_Utils_TypeAssertions.md#isunconfirmeddepositartifact) - [isUnconfirmedFindArtifact](Backend_Utils_TypeAssertions.md#isunconfirmedfindartifact) @@ -69,6 +70,22 @@ txIntent is UnconfirmedBuyHat --- +### isUnconfirmedClaim + +▸ **isUnconfirmedClaim**(`txIntent`): txIntent is UnconfirmedClaim + +#### Parameters + +| Name | Type | +| :--------- | :--------- | +| `txIntent` | `TxIntent` | + +#### Returns + +txIntent is UnconfirmedClaim + +--- + ### isUnconfirmedDeactivateArtifact ▸ **isUnconfirmedDeactivateArtifact**(`txIntent`): txIntent is UnconfirmedDeactivateArtifact diff --git a/docs/modules/Frontend_Components_Btn.md b/docs/modules/Frontend_Components_Btn.md index 2aef5aba..b00990cf 100644 --- a/docs/modules/Frontend_Components_Btn.md +++ b/docs/modules/Frontend_Components_Btn.md @@ -14,7 +14,7 @@ ### BtnProps -Ƭ **BtnProps**: { `borderColor?`: `string` ; `color?`: `string` ; `disabled?`: `boolean` ; `forceActive?`: `boolean` ; `noBorder?`: `boolean` ; `textColor?`: `string` ; `wide?`: `boolean` } & `React.HTMLAttributes`<`HTMLSpanElement`\> +Ƭ **BtnProps**: { `borderColor?`: `string` ; `color?`: `string` ; `disabled?`: `boolean` ; `forceActive?`: `boolean` ; `noBorder?`: `boolean` ; `small?`: `boolean` ; `textColor?`: `string` ; `wide?`: `boolean` } & `React.HTMLAttributes`<`HTMLSpanElement`\> ## Functions diff --git a/docs/modules/Frontend_Components_CoreUI.md b/docs/modules/Frontend_Components_CoreUI.md index a5a345e5..36022993 100644 --- a/docs/modules/Frontend_Components_CoreUI.md +++ b/docs/modules/Frontend_Components_CoreUI.md @@ -42,6 +42,8 @@ - [Link](Frontend_Components_CoreUI.md#link) - [SelectFrom](Frontend_Components_CoreUI.md#selectfrom) +- [ShortcutButton](Frontend_Components_CoreUI.md#shortcutbutton) +- [ShortcutKeyDown](Frontend_Components_CoreUI.md#shortcutkeydown) - [VerticalSplit](Frontend_Components_CoreUI.md#verticalsplit) ## Variables @@ -264,19 +266,15 @@ way to do this. ### Link -▸ **Link**(`__namedParameters`): `Element` +▸ **Link**(`props`): `Element` This is the link that all core ui in Dark Forest should use. Please! #### Parameters -| Name | Type | -| :--------------------------------- | :---------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.children` | `React.ReactNode` | -| `__namedParameters.color?` | `string` | -| `__namedParameters.openInThisTab?` | `boolean` | -| `__namedParameters.to` | `string` | +| Name | Type | +| :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `props` | { `children`: `React.ReactNode` ; `color?`: `string` ; `openInThisTab?`: `boolean` ; `to?`: `string` } & `React.HtmlHTMLAttributes`<`HTMLAnchorElement`\> | #### Returns @@ -309,6 +307,44 @@ given string values. --- +### ShortcutButton + +▸ **ShortcutButton**(`props`): `Element` + +A button that also displays a {@code KeyboardBtn} directly next to it, which shows the user +whether or not the given shortcut key is down. In the case that now {@code shortcutKey} was +provided, this is just a normal button. + +#### Parameters + +| Name | Type | +| :------ | :------------------------------------------------------------------------------------------------------------------------------------------- | +| `props` | { `children`: `React.ReactNode` ; `shortcutKey?`: `string` ; `shortcutText?`: `string` } & [`BtnProps`](Frontend_Components_Btn.md#btnprops) | + +#### Returns + +`Element` + +--- + +### ShortcutKeyDown + +▸ **ShortcutKeyDown**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.text?` | `string` | + +#### Returns + +`Element` + +--- + ### VerticalSplit ▸ `Const` **VerticalSplit**(`__namedParameters`): `Element` diff --git a/docs/modules/Frontend_Components_IconButton.md b/docs/modules/Frontend_Components_IconButton.md deleted file mode 100644 index 650e454f..00000000 --- a/docs/modules/Frontend_Components_IconButton.md +++ /dev/null @@ -1,13 +0,0 @@ -# Module: Frontend/Components/IconButton - -## Table of contents - -### Variables - -- [IconButton](Frontend_Components_IconButton.md#iconbutton) - -## Variables - -### IconButton - -• `Const` **IconButton**: `StyledComponent`<`"div"`, `any`, `Object`, `never`\> diff --git a/docs/modules/Frontend_Components_Icons.md b/docs/modules/Frontend_Components_Icons.md index a7838ff8..5411fccb 100644 --- a/docs/modules/Frontend_Components_Icons.md +++ b/docs/modules/Frontend_Components_Icons.md @@ -940,7 +940,14 @@ ### SilverGrowthIcon -▸ `Const` **SilverGrowthIcon**(): `Element` +▸ `Const` **SilverGrowthIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | #### Returns @@ -950,7 +957,14 @@ ### SilverIcon -▸ `Const` **SilverIcon**(): `Element` +▸ `Const` **SilverIcon**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------- | :------- | +| `__namedParameters` | `Object` | +| `__namedParameters.color?` | `string` | #### Returns diff --git a/docs/modules/Frontend_Components_Labels_Labels.md b/docs/modules/Frontend_Components_Labels_Labels.md index 33989458..dc41ca1a 100644 --- a/docs/modules/Frontend_Components_Labels_Labels.md +++ b/docs/modules/Frontend_Components_Labels_Labels.md @@ -4,16 +4,22 @@ ### Functions -- [LoggedInPlayer](Frontend_Components_Labels_Labels.md#loggedinplayer) +- [AccountLabel](Frontend_Components_Labels_Labels.md#accountlabel) - [TwitterLink](Frontend_Components_Labels_Labels.md#twitterlink) ## Functions -### LoggedInPlayer +### AccountLabel -▸ **LoggedInPlayer**(): `Element` +▸ **AccountLabel**(`__namedParameters`): `Element` -Returns a either a link to the player's twitter, or a [TextPreview](Frontend_Components_TextPreview.md#textpreview) of their address. +#### Parameters + +| Name | Type | +| :---------------------------------------------- | :----------- | +| `__namedParameters` | `Object` | +| `__namedParameters.ethAddress?` | `EthAddress` | +| `__namedParameters.includeAddressIfHasTwitter?` | `boolean` | #### Returns diff --git a/docs/modules/Frontend_Components_Labels_PlanetLabels.md b/docs/modules/Frontend_Components_Labels_PlanetLabels.md index 51d20f83..8c9d9f7f 100644 --- a/docs/modules/Frontend_Components_Labels_PlanetLabels.md +++ b/docs/modules/Frontend_Components_Labels_PlanetLabels.md @@ -384,6 +384,7 @@ Either 'yours' in green text, | :-------------------------- | :---------------------- | | `__namedParameters` | `Object` | | `__namedParameters.planet` | `Planet` \| `undefined` | +| `__namedParameters.style?` | `React.CSSProperties` | | `__namedParameters.getStat` | | #### Returns diff --git a/docs/modules/Frontend_Components_OpenPaneButtons.md b/docs/modules/Frontend_Components_OpenPaneButtons.md index d8daeeb8..68cccede 100644 --- a/docs/modules/Frontend_Components_OpenPaneButtons.md +++ b/docs/modules/Frontend_Components_OpenPaneButtons.md @@ -5,6 +5,7 @@ ### Functions - [OpenBroadcastPaneButton](Frontend_Components_OpenPaneButtons.md#openbroadcastpanebutton) +- [OpenClaimPlanetPane](Frontend_Components_OpenPaneButtons.md#openclaimplanetpane) - [OpenHatPaneButton](Frontend_Components_OpenPaneButtons.md#openhatpanebutton) - [OpenManagePlanetArtifactsButton](Frontend_Components_OpenPaneButtons.md#openmanageplanetartifactsbutton) - [OpenPaneButton](Frontend_Components_OpenPaneButtons.md#openpanebutton) @@ -30,6 +31,24 @@ --- +### OpenClaimPlanetPane + +▸ **OpenClaimPlanetPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :--------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planetId` | `LocationId` \| `undefined` | + +#### Returns + +`Element` + +--- + ### OpenHatPaneButton ▸ **OpenHatPaneButton**(`__namedParameters`): `Element` @@ -75,11 +94,11 @@ | Name | Type | | :------------------------------- | :--------------------------------------------------------------------- | | `__namedParameters` | `Object` | -| `__namedParameters.element` | `React.ReactElement` | | `__namedParameters.helpContent?` | `React.ReactElement` | | `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | | `__namedParameters.shortcutKey?` | `string` | | `__namedParameters.title` | `string` | +| `__namedParameters.element` | | #### Returns diff --git a/docs/modules/Frontend_Components_Text.md b/docs/modules/Frontend_Components_Text.md index 52fad457..30c60afb 100644 --- a/docs/modules/Frontend_Components_Text.md +++ b/docs/modules/Frontend_Components_Text.md @@ -4,7 +4,6 @@ ### Variables -- [BasicLink](Frontend_Components_Text.md#basiclink) - [Blue](Frontend_Components_Text.md#blue) - [Colored](Frontend_Components_Text.md#colored) - [Gold](Frontend_Components_Text.md#gold) @@ -41,12 +40,6 @@ ## Variables -### BasicLink - -• `Const` **BasicLink**: `StyledComponent`<`"u"`, `any`, `Object`, `never`\> - ---- - ### Blue • `Const` **Blue**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> diff --git a/docs/modules/Frontend_Panes_ClaimPlanetPane.md b/docs/modules/Frontend_Panes_ClaimPlanetPane.md new file mode 100644 index 00000000..069c2991 --- /dev/null +++ b/docs/modules/Frontend_Panes_ClaimPlanetPane.md @@ -0,0 +1,25 @@ +# Module: Frontend/Panes/ClaimPlanetPane + +## Table of contents + +### Functions + +- [ClaimPlanetPane](Frontend_Panes_ClaimPlanetPane.md#claimplanetpane) + +## Functions + +### ClaimPlanetPane + +▸ **ClaimPlanetPane**(`__namedParameters`): `null` \| `Element` + +#### Parameters + +| Name | Type | +| :---------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | +| `__namedParameters.planetId?` | `LocationId` | + +#### Returns + +`null` \| `Element` diff --git a/docs/modules/Frontend_Utils_AppHooks.md b/docs/modules/Frontend_Utils_AppHooks.md index 4d526fa7..38a258ce 100644 --- a/docs/modules/Frontend_Utils_AppHooks.md +++ b/docs/modules/Frontend_Utils_AppHooks.md @@ -12,11 +12,11 @@ - [useAccount](Frontend_Utils_AppHooks.md#useaccount) - [useActiveArtifact](Frontend_Utils_AppHooks.md#useactiveartifact) - [useArtifact](Frontend_Utils_AppHooks.md#useartifact) -- [useControlDown](Frontend_Utils_AppHooks.md#usecontroldown) - [useHoverPlanet](Frontend_Utils_AppHooks.md#usehoverplanet) - [useLeaderboard](Frontend_Utils_AppHooks.md#useleaderboard) - [useMyArtifacts](Frontend_Utils_AppHooks.md#usemyartifacts) - [useMyArtifactsList](Frontend_Utils_AppHooks.md#usemyartifactslist) +- [useOnSendCompleted](Frontend_Utils_AppHooks.md#useonsendcompleted) - [usePlanet](Frontend_Utils_AppHooks.md#useplanet) - [usePlanetArtifacts](Frontend_Utils_AppHooks.md#useplanetartifacts) - [usePlanetInactiveArtifacts](Frontend_Utils_AppHooks.md#useplanetinactiveartifacts) @@ -94,18 +94,6 @@ Get the currently used account on the client. --- -### useControlDown - -▸ **useControlDown**(): `boolean` - -Return a bool that indicates if the control key is pressed. - -#### Returns - -`boolean` - ---- - ### useHoverPlanet ▸ **useHoverPlanet**(`uiManager`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> @@ -179,6 +167,24 @@ Loads the leaderboard --- +### useOnSendCompleted + +▸ **useOnSendCompleted**(`onCompleted`): `void` + +Calls {@code onCompleted} when the user sends a move via the ui. + +#### Parameters + +| Name | Type | +| :------------ | :----------- | +| `onCompleted` | () => `void` | + +#### Returns + +`void` + +--- + ### usePlanet ▸ **usePlanet**(`uiManager`, `locationId`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`Planet` \| `undefined`\> diff --git a/docs/modules/Frontend_Utils_EmitterHooks.md b/docs/modules/Frontend_Utils_EmitterHooks.md index 6cb13e72..d39dc6ea 100644 --- a/docs/modules/Frontend_Utils_EmitterHooks.md +++ b/docs/modules/Frontend_Utils_EmitterHooks.md @@ -6,7 +6,6 @@ - [useEmitterSubscribe](Frontend_Utils_EmitterHooks.md#useemittersubscribe) - [useEmitterValue](Frontend_Utils_EmitterHooks.md#useemittervalue) -- [useKeyPressed](Frontend_Utils_EmitterHooks.md#usekeypressed) - [useWrappedEmitter](Frontend_Utils_EmitterHooks.md#usewrappedemitter) ## Functions @@ -61,25 +60,6 @@ Use returned value from an emitter --- -### useKeyPressed - -▸ **useKeyPressed**(`keydown$`, `keyup$`): `boolean` - -Return a bool indicating if a key is pressed - -#### Parameters - -| Name | Type | Description | -| :--------- | :----------------------------- | :----------------- | -| `keydown$` | `Monomitter`<`KeyboardEvent`\> | keydown monomitter | -| `keyup$` | `Monomitter`<`KeyboardEvent`\> | keyup monomitter | - -#### Returns - -`boolean` - ---- - ### useWrappedEmitter ▸ **useWrappedEmitter**<`T`\>(`emitter`, `initialVal`): [`Wrapper`](../classes/Backend_Utils_Wrapper.Wrapper.md)<`T` \| `undefined`\> diff --git a/docs/modules/Frontend_Utils_KeyEmitters.md b/docs/modules/Frontend_Utils_KeyEmitters.md index 2a121b34..2529472a 100644 --- a/docs/modules/Frontend_Utils_KeyEmitters.md +++ b/docs/modules/Frontend_Utils_KeyEmitters.md @@ -4,33 +4,32 @@ ### Variables -- [ctrlDown$](Frontend_Utils_KeyEmitters.md#ctrldown$) -- [ctrlUp$](Frontend_Utils_KeyEmitters.md#ctrlup$) -- [escapeDown$](Frontend_Utils_KeyEmitters.md#escapedown$) +- [SpecialKey](Frontend_Utils_KeyEmitters.md#specialkey) - [keyDown$](Frontend_Utils_KeyEmitters.md#keydown$) - [keyUp$](Frontend_Utils_KeyEmitters.md#keyup$) ### Functions +- [listenForKeyboardEvents](Frontend_Utils_KeyEmitters.md#listenforkeyboardevents) +- [unlinkKeyboardEvents](Frontend_Utils_KeyEmitters.md#unlinkkeyboardevents) - [useIsDown](Frontend_Utils_KeyEmitters.md#useisdown) +- [useOnUp](Frontend_Utils_KeyEmitters.md#useonup) ## Variables -### ctrlDown$ +### SpecialKey -• `Const` **ctrlDown$**: `Monomitter`<`KeyboardEvent`\> +• `Const` **SpecialKey**: `Object` ---- - -### ctrlUp$ - -• `Const` **ctrlUp$**: `Monomitter`<`KeyboardEvent`\> - ---- - -### escapeDown$ +#### Type declaration -• `Const` **escapeDown$**: `Monomitter`<`KeyboardEvent`\> +| Name | Type | +| :-------- | :---------- | +| `Control` | `"Control"` | +| `Escape` | `"Escape"` | +| `Shift` | `"Shift"` | +| `Space` | `" "` | +| `Tab` | `"Tab"` | --- @@ -46,6 +45,26 @@ ## Functions +### listenForKeyboardEvents + +▸ **listenForKeyboardEvents**(): `void` + +#### Returns + +`void` + +--- + +### unlinkKeyboardEvents + +▸ **unlinkKeyboardEvents**(): `void` + +#### Returns + +`void` + +--- + ### useIsDown ▸ **useIsDown**(`key?`): `boolean` @@ -59,3 +78,20 @@ #### Returns `boolean` + +--- + +### useOnUp + +▸ **useOnUp**(`key?`, `onUp?`): `void` + +#### Parameters + +| Name | Type | +| :------ | :----------- | +| `key?` | `string` | +| `onUp?` | () => `void` | + +#### Returns + +`void` diff --git a/docs/modules/Frontend_Utils_ShortcutConstants.md b/docs/modules/Frontend_Utils_ShortcutConstants.md index 2f3eb371..9bb70d44 100644 --- a/docs/modules/Frontend_Utils_ShortcutConstants.md +++ b/docs/modules/Frontend_Utils_ShortcutConstants.md @@ -4,31 +4,41 @@ ### Variables +- [CLOSE_MODAL](Frontend_Utils_ShortcutConstants.md#close_modal) +- [EXIT_PANE](Frontend_Utils_ShortcutConstants.md#exit_pane) - [MODAL_BACK_SHORTCUT](Frontend_Utils_ShortcutConstants.md#modal_back_shortcut) -- [TOGGLE_ARTIFACTS_DEX_PANE](Frontend_Utils_ShortcutConstants.md#toggle_artifacts_dex_pane) - [TOGGLE_BROADCAST_PANE](Frontend_Utils_ShortcutConstants.md#toggle_broadcast_pane) +- [TOGGLE_CLAIM_PLANET_PANE](Frontend_Utils_ShortcutConstants.md#toggle_claim_planet_pane) - [TOGGLE_DIAGNOSTICS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_diagnostics_pane) +- [TOGGLE_EXPLORE](Frontend_Utils_ShortcutConstants.md#toggle_explore) - [TOGGLE_HAT_PANE](Frontend_Utils_ShortcutConstants.md#toggle_hat_pane) +- [TOGGLE_HELP_PANE](Frontend_Utils_ShortcutConstants.md#toggle_help_pane) - [TOGGLE_PLANET_ARTIFACTS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_planet_artifacts_pane) -- [TOGGLE_PLANET_DEX_PANE](Frontend_Utils_ShortcutConstants.md#toggle_planet_dex_pane) +- [TOGGLE_PLUGINS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_plugins_pane) - [TOGGLE_SEND](Frontend_Utils_ShortcutConstants.md#toggle_send) +- [TOGGLE_SETTINGS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_settings_pane) +- [TOGGLE_TARGETTING](Frontend_Utils_ShortcutConstants.md#toggle_targetting) - [TOGGLE_UPGRADES_PANE](Frontend_Utils_ShortcutConstants.md#toggle_upgrades_pane) +- [TOGGLE_YOUR_ARTIFACTS_PANE](Frontend_Utils_ShortcutConstants.md#toggle_your_artifacts_pane) +- [TOGGLE_YOUR_PLANETS_DEX_PANE](Frontend_Utils_ShortcutConstants.md#toggle_your_planets_dex_pane) -### Functions +## Variables -- [useSubscribeToShortcut](Frontend_Utils_ShortcutConstants.md#usesubscribetoshortcut) +### CLOSE_MODAL -## Variables +• `Const` **CLOSE_MODAL**: `"t"` -### MODAL_BACK_SHORTCUT +--- -• `Const` **MODAL_BACK_SHORTCUT**: `"r"` +### EXIT_PANE + +• `Const` **EXIT_PANE**: `"Escape"` --- -### TOGGLE_ARTIFACTS_DEX_PANE +### MODAL_BACK_SHORTCUT -• `Const` **TOGGLE_ARTIFACTS_DEX_PANE**: `"o"` +• `Const` **MODAL_BACK_SHORTCUT**: `"t"` --- @@ -38,27 +48,45 @@ --- +### TOGGLE_CLAIM_PLANET_PANE + +• `Const` **TOGGLE_CLAIM_PLANET_PANE**: `"c"` + +--- + ### TOGGLE_DIAGNOSTICS_PANE • `Const` **TOGGLE_DIAGNOSTICS_PANE**: `"i"` --- +### TOGGLE_EXPLORE + +• `Const` **TOGGLE_EXPLORE**: `" "` + +--- + ### TOGGLE_HAT_PANE • `Const` **TOGGLE_HAT_PANE**: `"x"` --- +### TOGGLE_HELP_PANE + +• `Const` **TOGGLE_HELP_PANE**: `"j"` + +--- + ### TOGGLE_PLANET_ARTIFACTS_PANE • `Const` **TOGGLE_PLANET_ARTIFACTS_PANE**: `"s"` --- -### TOGGLE_PLANET_DEX_PANE +### TOGGLE_PLUGINS_PANE -• `Const` **TOGGLE_PLANET_DEX_PANE**: `"p"` +• `Const` **TOGGLE_PLUGINS_PANE**: `"k"` --- @@ -68,23 +96,30 @@ --- +### TOGGLE_SETTINGS_PANE + +• `Const` **TOGGLE_SETTINGS_PANE**: `"h"` + +--- + +### TOGGLE_TARGETTING + +• `Const` **TOGGLE_TARGETTING**: `` "`" `` + +--- + ### TOGGLE_UPGRADES_PANE • `Const` **TOGGLE_UPGRADES_PANE**: `"a"` -## Functions - -### useSubscribeToShortcut +--- -▸ **useSubscribeToShortcut**(`key`, `callback`): `void` +### TOGGLE_YOUR_ARTIFACTS_PANE -#### Parameters +• `Const` **TOGGLE_YOUR_ARTIFACTS_PANE**: `"l"` -| Name | Type | -| :--------- | :---------------------- | -| `key` | `string` \| `undefined` | -| `callback` | () => `void` | +--- -#### Returns +### TOGGLE_YOUR_PLANETS_DEX_PANE -`void` +• `Const` **TOGGLE_YOUR_PLANETS_DEX_PANE**: `";"` diff --git a/docs/modules/Frontend_Utils_constants.md b/docs/modules/Frontend_Utils_constants.md index 244f010e..8bd4221f 100644 --- a/docs/modules/Frontend_Utils_constants.md +++ b/docs/modules/Frontend_Utils_constants.md @@ -41,9 +41,4 @@ the algorithms implemented in {@link ChunkUtils}. ### MIN_CHUNK_SIZE -• `Const` **MIN_CHUNK_SIZE**: `256` - -To code reviewer, make sure this does not change! - -To developer, increase this number to a large power of two. This, in combination with setting -`DISABLE_ZK_CHECKS` in darkforest.toml, will make you mine the map at ULTRA SPEED! +• `Const` **MIN_CHUNK_SIZE**: `16` diff --git a/docs/modules/Frontend_Views_ModalIcon.md b/docs/modules/Frontend_Views_ModalIcon.md index 83e62cbf..07c84080 100644 --- a/docs/modules/Frontend_Views_ModalIcon.md +++ b/docs/modules/Frontend_Views_ModalIcon.md @@ -8,15 +8,14 @@ - [ModalAccountIcon](Frontend_Views_ModalIcon.md#modalaccounticon) - [ModalArtifactIcon](Frontend_Views_ModalIcon.md#modalartifacticon) - [ModalArtifactsConversationIcon](Frontend_Views_ModalIcon.md#modalartifactsconversationicon) -- [ModalHatIcon](Frontend_Views_ModalIcon.md#modalhaticon) - [ModalHelpIcon](Frontend_Views_ModalIcon.md#modalhelpicon) -- [ModalIcon](Frontend_Views_ModalIcon.md#modalicon) - [ModalLeaderboardIcon](Frontend_Views_ModalIcon.md#modalleaderboardicon) - [ModalMapShareIcon](Frontend_Views_ModalIcon.md#modalmapshareicon) - [ModalPlanetDetailsIcon](Frontend_Views_ModalIcon.md#modalplanetdetailsicon) - [ModalPlanetDexIcon](Frontend_Views_ModalIcon.md#modalplanetdexicon) - [ModalPluginIcon](Frontend_Views_ModalIcon.md#modalpluginicon) - [ModalSettingsIcon](Frontend_Views_ModalIcon.md#modalsettingsicon) +- [ModalToggleButton](Frontend_Views_ModalIcon.md#modaltogglebutton) - [ModalTwitterVerifyIcon](Frontend_Views_ModalIcon.md#modaltwitterverifyicon) - [ModalUpgradeDetailsIcon](Frontend_Views_ModalIcon.md#modalupgradedetailsicon) - [ModalWithdrawIcon](Frontend_Views_ModalIcon.md#modalwithdrawicon) @@ -30,12 +29,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -49,12 +49,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -68,12 +69,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -87,31 +89,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | - -#### Returns - -`Element` - ---- - -### ModalHatIcon - -▸ **ModalHatIcon**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -125,32 +109,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | - -#### Returns - -`Element` - ---- - -### ModalIcon - -▸ **ModalIcon**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :------------------------- | :------------------------------------------------------------ | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.modal` | [`ModalName`](../enums/Frontend_Views_ModalPane.ModalName.md) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -164,12 +129,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -183,12 +149,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -202,12 +169,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -221,12 +189,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -240,12 +209,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -259,12 +229,31 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | + +#### Returns + +`Element` + +--- + +### ModalToggleButton + +▸ **ModalToggleButton**(`props`): `Element` + +A button which allows you to open a modal. + +#### Parameters + +| Name | Type | +| :------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `props` | { `hook`: [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) ; `modal`: [`ModalName`](../enums/Frontend_Views_ModalPane.ModalName.md) ; `shortcutKey?`: `string` ; `style?`: `React.CSSProperties` ; `text?`: `string` } & [`BtnProps`](Frontend_Components_Btn.md#btnprops) | #### Returns @@ -274,16 +263,13 @@ ### ModalTwitterVerifyIcon -▸ **ModalTwitterVerifyIcon**(`__namedParameters`): `Element` +▸ **ModalTwitterVerifyIcon**(`props`): `Element` #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `props` | { `hook`: [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) ; `shortcutKey?`: `string` ; `style?`: `React.CSSProperties` ; `text?`: `string` } & [`BtnProps`](Frontend_Components_Btn.md#btnprops) | #### Returns @@ -297,12 +283,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -316,12 +303,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns @@ -335,12 +323,13 @@ #### Parameters -| Name | Type | -| :------------------------- | :--------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | -| `__namedParameters.style?` | `React.CSSProperties` | -| `__namedParameters.text?` | `string` | +| Name | Type | +| :------------------------------- | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.hook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.shortcutKey?` | `string` | +| `__namedParameters.style?` | `React.CSSProperties` | +| `__namedParameters.text?` | `string` | #### Returns diff --git a/docs/modules/Frontend_Views_SidebarPane.md b/docs/modules/Frontend_Views_SidebarPane.md new file mode 100644 index 00000000..200e8034 --- /dev/null +++ b/docs/modules/Frontend_Views_SidebarPane.md @@ -0,0 +1,28 @@ +# Module: Frontend/Views/SidebarPane + +## Table of contents + +### Functions + +- [SidebarPane](Frontend_Views_SidebarPane.md#sidebarpane) + +## Functions + +### SidebarPane + +▸ **SidebarPane**(`__namedParameters`): `Element` + +#### Parameters + +| Name | Type | +| :------------------------------------ | :--------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.helpHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.planetdexHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.pluginsHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.settingsHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | +| `__namedParameters.yourArtifactsHook` | [`ModalHook`](Frontend_Views_ModalPane.md#modalhook) | + +#### Returns + +`Element` diff --git a/docs/modules/_types_darkforest_api_ChunkStoreTypes.md b/docs/modules/_types_darkforest_api_ChunkStoreTypes.md index 92e57ef8..efa2be05 100644 --- a/docs/modules/_types_darkforest_api_ChunkStoreTypes.md +++ b/docs/modules/_types_darkforest_api_ChunkStoreTypes.md @@ -17,7 +17,7 @@ ### BucketId -Ƭ **BucketId**: `string` & { `__value__`: `never` } +Ƭ **BucketId**: `Abstract`<`string`, `"BucketId"`\> one of "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -25,6 +25,6 @@ one of "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ### ChunkId -Ƭ **ChunkId**: `string` & { `__value__`: `never` } +Ƭ **ChunkId**: `Abstract`<`string`, `"ChunkId"`\> Don't worry about the values here. Never base code off the values here. PLEASE. diff --git a/docs/modules/_types_darkforest_api_ContractsAPITypes.md b/docs/modules/_types_darkforest_api_ContractsAPITypes.md index e3279d25..6aca9b0b 100644 --- a/docs/modules/_types_darkforest_api_ContractsAPITypes.md +++ b/docs/modules/_types_darkforest_api_ContractsAPITypes.md @@ -18,6 +18,7 @@ ### Type aliases +- [ClaimArgs](_types_darkforest_api_ContractsAPITypes.md#claimargs) - [ClientMockchainData](_types_darkforest_api_ContractsAPITypes.md#clientmockchaindata) - [DepositArtifactArgs](_types_darkforest_api_ContractsAPITypes.md#depositartifactargs) - [MoveArgs](_types_darkforest_api_ContractsAPITypes.md#moveargs) @@ -29,6 +30,12 @@ ## Type aliases +### ClaimArgs + +Ƭ **ClaimArgs**: [[`string`, `string`], [[`string`, `string`], [`string`, `string`]], [`string`, `string`], [`string`, `string`, `string`, `string`, `string`, `string`, `string`, `string`, `string`]] + +--- + ### ClientMockchainData Ƭ **ClientMockchainData**: `null` \| `undefined` \| `number` \| `string` \| `boolean` \| `EthersBN` \| [`ClientMockchainData`](_types_darkforest_api_ContractsAPITypes.md#clientmockchaindata)[] \| { [key in string \| number]: ClientMockchainData} diff --git a/docs/modules/_types_global_GlobalTypes.md b/docs/modules/_types_global_GlobalTypes.md index b3b7d610..dcdd047e 100644 --- a/docs/modules/_types_global_GlobalTypes.md +++ b/docs/modules/_types_global_GlobalTypes.md @@ -12,6 +12,7 @@ ### Interfaces +- [ClaimCountdownInfo](../interfaces/_types_global_GlobalTypes.ClaimCountdownInfo.md) - [MinerWorkerMessage](../interfaces/_types_global_GlobalTypes.MinerWorkerMessage.md) - [Rectangle](../interfaces/_types_global_GlobalTypes.Rectangle.md) - [RevealCountdownInfo](../interfaces/_types_global_GlobalTypes.RevealCountdownInfo.md) diff --git a/last_updated.txt b/last_updated.txt index f1f08e18..4d28969d 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Wed Jul 28 22:47:00 UTC 2021 +last updated: Tue Aug 10 05:45:48 UTC 2021 diff --git a/package.json b/package.json index 3bad1c97..c14cb75d 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,19 @@ { "name": "client", - "version": "6.2.0-staging-jul-28.0", + "version": "6.3.0-staging-round-3.0", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.2.0-staging-jul-28.0", - "@darkforest_eth/contracts": "6.2.0-staging-jul-28.0", - "@darkforest_eth/events": "6.2.0-staging-jul-28.0", - "@darkforest_eth/hashing": "6.2.0-staging-jul-28.0", - "@darkforest_eth/hexgen": "6.2.0-staging-jul-28.0", - "@darkforest_eth/network": "6.2.0-staging-jul-28.0", - "@darkforest_eth/serde": "6.2.0-staging-jul-28.0", - "@darkforest_eth/snarks": "6.2.0-staging-jul-28.0", - "@darkforest_eth/types": "6.2.0-staging-jul-28.0", + "@darkforest_eth/constants": "6.3.0-staging-round-3.0", + "@darkforest_eth/contracts": "6.3.0-staging-round-3.0", + "@darkforest_eth/events": "6.3.0-staging-round-3.0", + "@darkforest_eth/hashing": "6.3.0-staging-round-3.0", + "@darkforest_eth/hexgen": "6.3.0-staging-round-3.0", + "@darkforest_eth/network": "6.3.0-staging-round-3.0", + "@darkforest_eth/serde": "6.3.0-staging-round-3.0", + "@darkforest_eth/snarks": "6.3.0-staging-round-3.0", + "@darkforest_eth/types": "6.3.0-staging-round-3.0", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", @@ -22,6 +22,7 @@ "big-integer": "^1.6.48", "canvas-confetti": "^1.4.0", "color": "^3.0.2", + "delay": "^5.0.0", "email-validator": "^2.0.4", "emoji-picker-react": "^3.4.8", "ethers": "^5.0.7", diff --git a/src/Backend/GameLogic/ArrivalUtils.ts b/src/Backend/GameLogic/ArrivalUtils.ts index c6de0279..5a855a87 100644 --- a/src/Backend/GameLogic/ArrivalUtils.ts +++ b/src/Backend/GameLogic/ArrivalUtils.ts @@ -219,6 +219,9 @@ export function getEmojiMessage( return planet?.messages?.find(isEmojiFlagMessage); } +/** + * @todo - planet class + */ export function getRange(planet: Planet, percentEnergySending = 100): number { if (percentEnergySending === 0) return 0; return Math.max(Math.log2(percentEnergySending / 5), 0) * planet.range; diff --git a/src/Backend/GameLogic/ContractsAPI.ts b/src/Backend/GameLogic/ContractsAPI.ts index 766c9394..24ff88d4 100644 --- a/src/Backend/GameLogic/ContractsAPI.ts +++ b/src/Backend/GameLogic/ContractsAPI.ts @@ -3,12 +3,14 @@ import { CORE_CONTRACT_ADDRESS, GETTERS_CONTRACT_ADDRESS, GPT_CREDIT_CONTRACT_ADDRESS, + SCORING_CONTRACT_ADDRESS, WHITELIST_CONTRACT_ADDRESS, } from '@darkforest_eth/contracts'; import type { DarkForestCore, DarkForestGetters, DarkForestGPTCredit, + DarkForestScoringRound3, Whitelist, } from '@darkforest_eth/contracts/typechain'; import { @@ -26,6 +28,7 @@ import { decodeArrival, decodeArtifact, decodeArtifactPointValues, + decodeClaimedCoords, decodePlanet, decodePlanetDefaults, decodePlayer, @@ -44,6 +47,7 @@ import type { import { Artifact, ArtifactId, + ClaimedCoords, ContractMethodName, DiagnosticUpdater, EthAddress, @@ -55,6 +59,7 @@ import { SubmittedActivateArtifact, SubmittedBuyGPTCredits, SubmittedBuyHat, + SubmittedClaim, SubmittedDeactivateArtifact, SubmittedDepositArtifact, SubmittedFindArtifact, @@ -68,6 +73,7 @@ import { SubmittedWithdrawArtifact, SubmittedWithdrawSilver, UnconfirmedActivateArtifact, + UnconfirmedClaim, UnconfirmedDeactivateArtifact, UnconfirmedDepositArtifact, UnconfirmedInit, @@ -85,6 +91,7 @@ import NotificationManager from '../../Frontend/Game/NotificationManager'; import { openConfirmationWindowForTransaction } from '../../Frontend/Game/Popups'; import { getSetting, Setting } from '../../Frontend/Utils/SettingsHooks'; import { + ClaimArgs, ContractConstants, ContractEvent, ContractsAPIEvent, @@ -101,6 +108,7 @@ import { loadCoreContract, loadGettersContract, loadGptCreditContract, + loadScoringContract, loadWhitelistContract, } from '../Network/Blockchain'; import { eventLogger, EventType } from '../Network/EventLogger'; @@ -137,6 +145,10 @@ export class ContractsAPI extends EventEmitter { return this.ethConnection.getContract(CORE_CONTRACT_ADDRESS); } + get scoreContract() { + return this.ethConnection.getContract(SCORING_CONTRACT_ADDRESS); + } + get gettersContract() { return this.ethConnection.getContract(GETTERS_CONTRACT_ADDRESS); } @@ -198,7 +210,7 @@ export class ContractsAPI extends EventEmitter { } public async setupEventListeners(): Promise { - const { coreContract, gptCreditContract } = this; + const { coreContract, gptCreditContract, scoreContract } = this; const filter = { address: coreContract.address, @@ -349,6 +361,18 @@ export class ContractsAPI extends EventEmitter { ); } ); + scoreContract.on( + ContractEvent.LocationClaimed, + async (revealerAddr: string, location: EthersBN, _: Event) => { + this.emit(ContractsAPIEvent.PlanetUpdate, locationIdFromEthersBN(location)); + this.emit( + ContractsAPIEvent.PlanetClaimed, + locationIdFromEthersBN(location), + address(revealerAddr.toLowerCase()) + ); + this.emit(ContractsAPIEvent.PlayerUpdate, address(revealerAddr)); + } + ); } public removeEventListeners(): void { @@ -414,6 +438,26 @@ export class ContractsAPI extends EventEmitter { return this.waitFor(unminedRevealTx, tx.confirmed); } + async claim(args: ClaimArgs, action: UnconfirmedClaim): Promise { + if (!this.txExecutor) { + throw new Error('no signer, cannot execute tx'); + } + + const tx = this.txExecutor.queueTransaction( + action.actionId, + this.scoreContract, + ContractMethodName.CLAIM_LOCATION, + args + ); + const unminedClaimTx: SubmittedClaim = { + ...action, + txHash: (await tx.submitted).hash, + sentAtTimestamp: Math.floor(Date.now() / 1000), + }; + + return this.waitFor(unminedClaimTx, tx.confirmed); + } + async initializePlayer( args: InitSnarkContractCallArgs, action: UnconfirmedInit @@ -817,6 +861,7 @@ export class ContractsAPI extends EventEmitter { PERLIN_THRESHOLD_3, INIT_PERLIN_MIN, INIT_PERLIN_MAX, + SPAWN_RIM_AREA, BIOME_THRESHOLD_1, BIOME_THRESHOLD_2, PLANET_RARITY, @@ -824,6 +869,8 @@ export class ContractsAPI extends EventEmitter { LOCATION_REVEAL_COOLDOWN, } = await this.makeCall(this.coreContract.gameConstants); + const CLAIM_PLANET_COOLDOWN = await this.makeCall(this.scoreContract.gameConstants); + const TOKEN_MINT_END_SECONDS = ( await this.makeCall(this.coreContract.TOKEN_MINT_END_TIMESTAMP) ).toNumber(); @@ -859,7 +906,6 @@ export class ContractsAPI extends EventEmitter { PERLIN_MIRROR_Y, TOKEN_MINT_END_SECONDS, - MAX_NATURAL_PLANET_LEVEL: MAX_NATURAL_PLANET_LEVEL.toNumber(), TIME_FACTOR_HUNDREDTHS: TIME_FACTOR_HUNDREDTHS.toNumber(), PERLIN_THRESHOLD_1: PERLIN_THRESHOLD_1.toNumber(), @@ -874,7 +920,9 @@ export class ContractsAPI extends EventEmitter { ARTIFACT_POINT_VALUES, PHOTOID_ACTIVATION_DELAY: PHOTOID_ACTIVATION_DELAY.toNumber(), + SPAWN_RIM_AREA: SPAWN_RIM_AREA.toNumber(), LOCATION_REVEAL_COOLDOWN: LOCATION_REVEAL_COOLDOWN.toNumber(), + CLAIM_PLANET_COOLDOWN: CLAIM_PLANET_COOLDOWN.toNumber(), defaultPopulationCap: planetDefaults.populationCap, defaultPopulationGrowth: planetDefaults.populationGrowth, @@ -904,9 +952,23 @@ export class ContractsAPI extends EventEmitter { (await this.makeCall(this.gettersContract.bulkGetPlayers, [start, end])).map(decodePlayer), onProgress ); + const lastClaimTimestamps = await aggregateBulkGetter( + nPlayers, + 5, + (start: number, end: number) => + this.contractCaller.makeCall(this.scoreContract.bulkGetLastClaimTimestamp, [start, end]) + ); + const playerLastClaimTimestampMap = lastClaimTimestamps.reduce((acc, pair): Map< + string, + EthersBN + > => { + acc.set(pair.player, pair.lastClaimTimestamp); + return acc; + }, new Map()); const playerMap: Map = new Map(); for (const player of players) { + player.lastClaimTimestamp = playerLastClaimTimestampMap.get(player.address)?.toNumber() || 0; playerMap.set(player.address, player); } return playerMap; @@ -914,8 +976,14 @@ export class ContractsAPI extends EventEmitter { public async getPlayerById(playerId: EthAddress): Promise { const rawPlayer = await this.makeCall(this.coreContract.players, [playerId]); + const lastClaimedTimestamp = await this.makeCall(this.scoreContract.getLastClaimTimestamp, [ + playerId, + ]); if (!rawPlayer.isInitialized) return undefined; - return decodePlayer(rawPlayer); + + const player = decodePlayer(rawPlayer); + player.lastClaimTimestamp = lastClaimedTimestamp.toNumber(); + return player; } public async getWorldRadius(): Promise { @@ -1036,6 +1104,49 @@ export class ContractsAPI extends EventEmitter { return rawRevealedCoords.map(decodeRevealedCoords); } + public async getClaimedCoordsByIdIfExists( + planetId: LocationId + ): Promise { + const decStrId = locationIdToDecStr(planetId); + const rawClaimedCoords = await this.makeCall(this.scoreContract.getClaimedCoords, [decStrId]); + const ret = decodeClaimedCoords(rawClaimedCoords); + if (ret.hash === EMPTY_LOCATION_ID) { + return undefined; + } + return ret; + } + public async getClaimedPlanetsCoords( + startingAt: number, + onProgressIds?: (fractionCompleted: number) => void, + onProgressCoords?: (fractionCompleted: number) => void + ): Promise { + const nRevealedPlanets: number = ( + await this.makeCall(this.scoreContract.getNClaimedPlanets) + ).toNumber(); + + const rawRevealedPlanetIds = await aggregateBulkGetter( + nRevealedPlanets - startingAt, + 500, + async (start, end) => + await this.makeCall(this.scoreContract.bulkGetClaimedPlanetIds, [ + start + startingAt, + end + startingAt, + ]), + onProgressIds + ); + + const rawClaimedCoords = await aggregateBulkGetter( + rawRevealedPlanetIds.length, + 500, + async (start, end) => + await this.makeCall(this.scoreContract.bulkGetClaimedCoordsByIds, [ + rawRevealedPlanetIds.slice(start, end), + ]), + onProgressCoords + ); + + return rawClaimedCoords.map(decodeClaimedCoords); + } public async bulkGetPlanets( toLoadPlanets: LocationId[], @@ -1175,6 +1286,7 @@ export class ContractsAPI extends EventEmitter { export async function makeContractsAPI(ethConnection: EthConnection): Promise { // Could turn this into an array and iterate, but I like the explicitness await ethConnection.loadContract(CORE_CONTRACT_ADDRESS, loadCoreContract); + await ethConnection.loadContract(SCORING_CONTRACT_ADDRESS, loadScoringContract); await ethConnection.loadContract(GETTERS_CONTRACT_ADDRESS, loadGettersContract); await ethConnection.loadContract(WHITELIST_CONTRACT_ADDRESS, loadWhitelistContract); await ethConnection.loadContract(GPT_CREDIT_CONTRACT_ADDRESS, loadGptCreditContract); diff --git a/src/Backend/GameLogic/ConversationManager.tsx b/src/Backend/GameLogic/ConversationManager.tsx index e3179f75..e6e756a9 100644 --- a/src/Backend/GameLogic/ConversationManager.tsx +++ b/src/Backend/GameLogic/ConversationManager.tsx @@ -10,6 +10,7 @@ import { import React from 'react'; import styled from 'styled-components'; import { WikiPane } from '../../Frontend/Panes/WikiPane'; +import dfstyles from '../../Frontend/Styles/dfstyles'; import { TerminalTextStyle } from '../../Frontend/Utils/TerminalTypes'; import { TerminalHandle } from '../../Frontend/Views/Terminal'; import { startConversationOpenAI, stepConversationOpenAI } from '../Network/ConversationAPI'; @@ -172,5 +173,5 @@ const WikiEntryTitle = styled.div` font-size: 150%; margin-bottom: 8px; text-decoration: underline; - color: white; + color: ${dfstyles.colors.text}; `; diff --git a/src/Backend/GameLogic/GameManager.ts b/src/Backend/GameLogic/GameManager.ts index af97c5d9..391fbe05 100644 --- a/src/Backend/GameLogic/GameManager.ts +++ b/src/Backend/GameLogic/GameManager.ts @@ -1,4 +1,8 @@ -import { BLOCK_EXPLORER_URL, MIN_PLANET_LEVEL } from '@darkforest_eth/constants'; +import { + BLOCK_EXPLORER_URL, + MIN_PLANET_LEVEL, + PLANET_CLAIM_MIN_LEVEL, +} from '@darkforest_eth/constants'; import { monomitter, Monomitter, Subscription } from '@darkforest_eth/events'; import { fakeHash, mimcHash, perlin } from '@darkforest_eth/hashing'; import { @@ -14,6 +18,8 @@ import { ArtifactId, ArtifactRarity, ArtifactType, + ClaimedCoords, + ClaimedLocation, ContractMethodName, Conversation, Diagnostics, @@ -34,6 +40,7 @@ import { TxIntent, UnconfirmedActivateArtifact, UnconfirmedBuyGPTCredits, + UnconfirmedClaim, UnconfirmedDeactivateArtifact, UnconfirmedDepositArtifact, UnconfirmedFindArtifact, @@ -51,6 +58,7 @@ import { WorldLocation, } from '@darkforest_eth/types'; import { BigInteger } from 'big-integer'; +import delay from 'delay'; import { BigNumber, Contract, ContractInterface } from 'ethers'; import { EventEmitter } from 'events'; import stringify from 'json-stable-stringify'; @@ -77,6 +85,7 @@ import { import { AddressTwitterMap } from '../../_types/darkforest/api/UtilityServerAPITypes'; import { Chunk, + ClaimCountdownInfo, HashConfig, isLocatable, Rectangle, @@ -103,6 +112,7 @@ import { isUnconfirmedActivateArtifact, isUnconfirmedBuyGPTCredits, isUnconfirmedBuyHat, + isUnconfirmedClaim, isUnconfirmedDeactivateArtifact, isUnconfirmedDepositArtifact, isUnconfirmedFindArtifact, @@ -337,6 +347,7 @@ class GameManager extends EventEmitter { touchedPlanets: Map, allTouchedPlanetIds: Set, revealedCoords: Map, + claimedCoords: Map, worldRadius: number, unprocessedArrivals: Map, unprocessedPlanetArrivalIds: Map, @@ -408,11 +419,32 @@ class GameManager extends EventEmitter { } } + const claimedLocations = new Map(); + + for (const [locationId, coords] of claimedCoords) { + const planet = touchedPlanets.get(locationId); + + if (planet) { + const location: WorldLocation = { + hash: locationId, + coords, + perlin: planet.perlin, + biomebase: this.biomebasePerlin(coords, true), + }; + + const revealedLocation = { ...location, revealer: coords.revealer }; + + revealedLocations.set(locationId, revealedLocation); + claimedLocations.set(locationId, revealedLocation); + } + } + this.entityStore = new GameObjects( account, touchedPlanets, allTouchedPlanetIds, revealedLocations, + claimedLocations, artifacts, persistentChunkStore.allChunks(), unprocessedArrivals, @@ -447,6 +479,8 @@ class GameManager extends EventEmitter { } } }); + + this.refreshScoreboard(); } private async uploadDiagnostics() { @@ -454,15 +488,20 @@ class GameManager extends EventEmitter { } private async refreshScoreboard() { - const leaderboard = await loadLeaderboard(); - for (const entry of leaderboard.entries) { - const player = this.players.get(entry.ethAddress); - if (player) { - player.score = entry.score; + try { + const leaderboard = await loadLeaderboard(); + for (const entry of leaderboard.entries) { + const player = this.players.get(entry.ethAddress); + if (player) { + player.score = entry.score; + } } - } - this.playersUpdated$.publish(); + this.playersUpdated$.publish(); + } catch (e) { + // @todo - what do we do if we can't connect to the webserver? in general this should be a + // state of affairs because arenas is a thing. + } } public getEthConnection() { @@ -515,6 +554,7 @@ class GameManager extends EventEmitter { await persistentChunkStore.saveTouchedPlanetIds(initialState.allTouchedPlanetIds); await persistentChunkStore.saveRevealedCoords(initialState.allRevealedCoords); + await persistentChunkStore.saveClaimedCoords(initialState.allClaimedCoords); const knownArtifacts: Map = new Map(); @@ -569,6 +609,7 @@ class GameManager extends EventEmitter { initialState.touchedAndLocatedPlanets, new Set(Array.from(initialState.allTouchedPlanetIds)), initialState.revealedCoordsMap, + initialState.claimedCoordsMap, initialState.worldRadius, initialState.arrivals, initialState.planetVoyageIdMap, @@ -639,6 +680,10 @@ class GameManager extends EventEmitter { } } ) + .on(ContractsAPIEvent.PlanetClaimed, async (planetId: LocationId, _address: EthAddress) => { + await gameManager.hardRefreshPlanet(planetId); + gameManager.emit(GameManagerEvent.PlanetUpdate); + }) .on( ContractsAPIEvent.LocationRevealed, async (planetId: LocationId, _revealer: EthAddress) => { @@ -660,9 +705,22 @@ class GameManager extends EventEmitter { if (isUnconfirmedReveal(unconfirmedTx)) { await gameManager.hardRefreshPlanet(unconfirmedTx.locationId); } else if (isUnconfirmedInit(unconfirmedTx)) { + terminal.current?.println('Loading Home Planet from Blockchain...'); + const retries = 5; + for (let i = 0; i < retries; i++) { + const planet = await gameManager.contractsAPI.getPlanetById(unconfirmedTx.locationId); + if (planet) { + break; + } else if (i === retries - 1) { + console.error("couldn't load player's home planet"); + } else { + await delay(2000); + } + } + await gameManager.hardRefreshPlanet(unconfirmedTx.locationId); gameManager.emit(GameManagerEvent.InitializedPlayer); // mining manager should be initialized already via joinGame, but just in case... - gameManager.initMiningManager(unconfirmedTx.location.coords); + gameManager.initMiningManager(unconfirmedTx.location.coords, 4); } else if (isUnconfirmedMove(unconfirmedTx)) { const promises = [ gameManager.bulkHardRefreshPlanets([unconfirmedTx.from, unconfirmedTx.to]), @@ -705,6 +763,11 @@ class GameManager extends EventEmitter { await gameManager.softRefreshPlanet(unconfirmedTx.locationId); } else if (isUnconfirmedBuyGPTCredits(unconfirmedTx)) { await gameManager.refreshMyGPTCredits(); + } else if (isUnconfirmedClaim(unconfirmedTx)) { + gameManager.entityStore.updatePlanet( + unconfirmedTx.locationId, + (p) => (p.claimer = gameManager.getAccount()) + ); } gameManager.entityStore.clearUnconfirmedTxIntent(unconfirmedTx); @@ -742,13 +805,19 @@ class GameManager extends EventEmitter { private async hardRefreshPlayer(address: EthAddress): Promise { const player = await this.contractsAPI.getPlayerById(address); + if (!player) { return; } + const existingPlayerTwitter = this.players.get(address)?.twitter; + const existingPlayerScore = this.players.get(address)?.score; + if (existingPlayerTwitter) { player.twitter = existingPlayerTwitter; + player.score = existingPlayerScore; } + this.players.set(address, player); } @@ -767,8 +836,17 @@ class GameManager extends EventEmitter { const artifactsOnPlanet = artifactsOnPlanets[0]; const revealedCoords = await this.contractsAPI.getRevealedCoordsByIdIfExists(planetId); + const claimedCoords = await this.contractsAPI.getClaimedCoordsByIdIfExists(planetId); + let revealedLocation: RevealedLocation | undefined; - if (revealedCoords) { + + if (claimedCoords) { + revealedLocation = { + ...this.locationFromCoords(claimedCoords), + revealer: claimedCoords.revealer, + }; + this.getGameObjects().setClaimedLocation(revealedLocation); + } else if (revealedCoords) { revealedLocation = { ...this.locationFromCoords(revealedCoords), revealer: revealedCoords.revealer, @@ -779,7 +857,8 @@ class GameManager extends EventEmitter { planet, arrivals, artifactsOnPlanet.map((a) => a.id), - revealedLocation + revealedLocation, + claimedCoords?.revealer ); // it's important that we reload the artifacts that are on the planet after the move @@ -1092,13 +1171,13 @@ class GameManager extends EventEmitter { .reduce((totalSoFar: number, nextPlanet: Planet) => totalSoFar + nextPlanet.energy, 0); } - public getWithdrawnSilverOfPlayer(addr: EthAddress): number { + public getPlayerScore(addr: EthAddress): number { const player = this.players.get(addr); if (!player) return 0; - return player.withdrawnSilver; + return player?.score || 0; } - private initMiningManager(homeCoords: WorldCoords): void { + private initMiningManager(homeCoords: WorldCoords, cores?: number): void { if (this.minerManager) return; const myPattern: MiningPattern = new SpiralPattern(homeCoords, MIN_CHUNK_SIZE); @@ -1112,7 +1191,7 @@ class GameManager extends EventEmitter { this.useMockHash ); - this.minerManager.setCores(getNumberSetting(this.account, Setting.MiningCores)); + this.minerManager.setCores(cores || getNumberSetting(this.account, Setting.MiningCores)); this.minerManager.on( MinerManagerEvent.DiscoveredNewChunk, @@ -1199,6 +1278,20 @@ class GameManager extends EventEmitter { revealCooldownTime: this.contractConstants.LOCATION_REVEAL_COOLDOWN, }; } + /** + * Returns info about the next time you can claim a Planet + */ + getNextClaimCountdownInfo(): ClaimCountdownInfo { + if (!this.account) { + throw new Error('no account set'); + } + const myLastClaimTimestamp = this.players.get(this.account)?.lastClaimTimestamp; + return { + myLastClaimTimestamp: myLastClaimTimestamp || undefined, + currentlyClaiming: !!this.entityStore.getUnconfirmedClaim(), + claimCooldownTime: this.contractConstants.CLAIM_PLANET_COOLDOWN, + }; + } /** * gets both deposited artifacts that are on planets i own as well as artifacts i own @@ -1240,14 +1333,6 @@ class GameManager extends EventEmitter { return this.entityStore.getPlanetWithId(planetId, false); } - /** - * Gets all the planets that this planet could reach if it sent 100% of its energy. - */ - getPlanetsWithinRange(planet: LocatablePlanet) { - const maxRange = getRange(planet, 100); - return this.getGameObjects().getPlanetsInWorldCircle(planet.location.coords, maxRange); - } - /** * Get the score of the currently logged-in account. */ @@ -1259,7 +1344,7 @@ class GameManager extends EventEmitter { if (!player) { return 0; } - return player.withdrawnSilver + player.totalArtifactPoints; + return player?.score || 0; } /** @@ -1325,12 +1410,19 @@ class GameManager extends EventEmitter { } /** - * Gets a map of all location IDs whose coords have been publicly revealed + * Gets a map of all location IDs whose coords have been publically revealed */ getRevealedLocations(): Map { return this.entityStore.getRevealedLocations(); } + /** + * Gets a map of all location IDs which have been claimed. + */ + getClaimedLocations(): Map { + return this.entityStore.getClaimedLocations(); + } + /** * Each coordinate lives in a particular type of space, determined by a smooth random * function called 'perlin noise. @@ -1533,6 +1625,91 @@ class GameManager extends EventEmitter { return (myLastRevealTimestamp + this.contractConstants.LOCATION_REVEAL_COOLDOWN) * 1000; } + /** + * Gets the timestamp (ms) of the next time that we can claim a planet. + */ + public getNextClaimAvailableTimestamp() { + if (!this.account) { + throw new Error('no account set'); + } + const myLastClaimTimestamp = this.players.get(this.account)?.lastClaimTimestamp; + + if (!myLastClaimTimestamp) { + return Date.now(); + } + + // both the variables in the next line are denominated in seconds + return (myLastClaimTimestamp + this.contractConstants.CLAIM_PLANET_COOLDOWN) * 1000; + } + + public claimLocation(planetId: LocationId): GameManager { + if (this.checkGameHasEnded()) return this; + + if (!this.account) { + throw new Error('no account set'); + } + + const planet = this.entityStore.getPlanetWithId(planetId); + + if (!planet) { + throw new Error("you can't reveal a planet you haven't discovered"); + } + + if (!isLocatable(planet)) { + throw new Error("you can't reveal a planet whose coordinates you don't know"); + } + + if (planet.unconfirmedClaim) { + throw new Error("you're already claiming this planet's location"); + } + + if (planet.planetLevel < PLANET_CLAIM_MIN_LEVEL) { + throw new Error( + `you can't claim a planet whose level is less than ${PLANET_CLAIM_MIN_LEVEL}` + ); + } + + if (!!this.entityStore.getUnconfirmedClaim()) { + throw new Error("you're already broadcasting coordinates"); + } + const myLastClaimTimestamp = this.players.get(this.account)?.lastClaimTimestamp; + if (myLastClaimTimestamp && Date.now() < this.getNextClaimAvailableTimestamp()) { + throw new Error('still on cooldown for broadcasting'); + } + + // this is shitty. used for the popup window + localStorage.setItem(`${this.getAccount()?.toLowerCase()}-claimLocationId`, planetId); + + const actionId = getRandomActionId(); + const txIntent: UnconfirmedClaim = { + actionId, + methodName: ContractMethodName.CLAIM_LOCATION, + locationId: planetId, + location: planet.location, + }; + + this.handleTxIntent(txIntent); + + this.snarkHelper + .getRevealArgs(planet.location.coords.x, planet.location.coords.y) + .then((snarkArgs) => { + this.terminal.current?.println('CLAIM: calculated SNARK with args:', TerminalTextStyle.Sub); + this.terminal.current?.println( + JSON.stringify(hexifyBigIntNestedArray(snarkArgs.slice(0, 3))), + TerminalTextStyle.Sub + ); + this.terminal.current?.newline(); + + // blehh + return this.contractsAPI.claim(snarkArgs, txIntent); + }) + .catch((err) => { + this.onTxIntentFail(txIntent, err); + }); + + return this; + } + /** * Reveals a planet's location on-chain. */ @@ -1611,24 +1788,36 @@ class GameManager extends EventEmitter { if (this.checkGameHasEnded()) return this; let actionId: string; let txIntent: UnconfirmedInit; - this.getRandomHomePlanetCoords() - .then(async (loc) => { - const { - coords: { x, y }, - hash: h, - } = loc; - this.homeLocation = loc; - await this.persistentChunkStore.addHomeLocation(loc); + this.findRandomHomePlanet() + .then(async (planet) => { + this.homeLocation = planet.location; + this.terminal.current?.println(''); + this.terminal.current?.println( + `Found Suitable Home Planet: ${ProcgenUtils.getPlanetName(planet)} ` + ); + // @todo: add planet preview render here, the planet procedural generation text, etc. + this.terminal.current?.println( + `Its coordinates are: (${planet.location.coords.x}, ${planet.location.coords.y})` + ); + this.terminal.current?.println(''); + + await this.persistentChunkStore.addHomeLocation(planet.location); + actionId = getRandomActionId(); txIntent = { actionId, methodName: ContractMethodName.INIT, - locationId: h, - location: loc, + locationId: planet.location.hash, + location: planet.location, }; this.handleTxIntent(txIntent as TxIntent); - const callArgs = await this.snarkHelper.getInitArgs(x, y, this.worldRadius); - this.initMiningManager(loc.coords); // get an early start + this.terminal.current?.println('INIT: proving that planet exists', TerminalTextStyle.Sub); + const callArgs = await this.snarkHelper.getInitArgs( + planet.location.coords.x, + planet.location.coords.y, + Math.floor(Math.sqrt(planet.location.coords.x ** 2 + planet.location.coords.y ** 2)) + 1 // floor(sqrt(x^2 + y^2)) + 1 + ); + this.initMiningManager(planet.location.coords); // get an early start // if player initialization causes an error, give the caller an opportunity // to resolve that error. if the asynchronous `beforeRetry` function returns @@ -1693,8 +1882,8 @@ class GameManager extends EventEmitter { return true; } - private async getRandomHomePlanetCoords(): Promise { - return new Promise((resolve) => { + private async findRandomHomePlanet(): Promise { + return new Promise((resolve, reject) => { const initPerlinMin = this.contractConstants.INIT_PERLIN_MIN; const initPerlinMax = this.contractConstants.INIT_PERLIN_MAX; let minedChunksCount = 0; @@ -1704,13 +1893,11 @@ class GameManager extends EventEmitter { let d: number; let p: number; - const isProd = process.env.NODE_ENV === 'production'; - let spawnInnerRadius = 0; - if (isProd) { - // there is always a fixed area for players to spawn in, equal to the - // area of a 32 radius disc - spawnInnerRadius = Math.sqrt(Math.max(this.worldRadius ** 2 - 32000 ** 2, 0)); - } + // there is always a fixed area for players to spawn in, set by the contract + const spawnInnerRadius = Math.sqrt( + Math.max(Math.PI * this.worldRadius ** 2 - this.contractConstants.SPAWN_RIM_AREA, 0) / + Math.PI + ); do { // sample from square @@ -1757,31 +1944,52 @@ class GameManager extends EventEmitter { this.hashConfig, this.useMockHash ); + + this.terminal.current?.println(``); + this.terminal.current?.println(`Initializing Home Planet Search...`); + this.terminal.current?.println(``); + this.terminal.current?.println(`Chunked explorer: start!`); + this.terminal.current?.println( + `Each chunk contains ${MIN_CHUNK_SIZE}x${MIN_CHUNK_SIZE} coordinates.` + ); + const percentSpawn = (1 / this.contractConstants.PLANET_RARITY) * 100; + const printProgress = 8; + this.terminal.current?.print(`Each coordinate has a`); + this.terminal.current?.print(` ${percentSpawn}%`, TerminalTextStyle.White); + this.terminal.current?.print(` chance of spawning a planet.`); + this.terminal.current?.println(''); + + this.terminal.current?.println( + `Hashing first ${MIN_CHUNK_SIZE ** 2 * printProgress} potential home planets...` + ); + homePlanetFinder.on(MinerManagerEvent.DiscoveredNewChunk, (chunk: Chunk) => { chunkStore.addChunk(chunk); minedChunksCount++; - if (minedChunksCount % 8 === 0) { + if (minedChunksCount % printProgress === 0) { this.terminal.current?.println( `Hashed ${minedChunksCount * MIN_CHUNK_SIZE ** 2} potential home planets...` ); } - for (const planetLoc of chunk.planetLocations) { - const planetPerlin = planetLoc.perlin; - const planetX = planetLoc.coords.x; - const planetY = planetLoc.coords.y; + for (const homePlanetLocation of chunk.planetLocations) { + const planetPerlin = homePlanetLocation.perlin; + const planetX = homePlanetLocation.coords.x; + const planetY = homePlanetLocation.coords.y; const planetLevel = this.entityStore.planetLevelFromHexPerlin( - planetLoc.hash, - planetLoc.perlin + homePlanetLocation.hash, + homePlanetLocation.perlin ); const planetType = this.entityStore.planetTypeFromHexPerlin( - planetLoc.hash, - planetLoc.perlin + homePlanetLocation.hash, + homePlanetLocation.perlin ); - const planet = this.getPlanetWithId(planetLoc.hash); + const planet = this.getPlanetWithId(homePlanetLocation.hash); + const distFromOrigin = Math.sqrt(planetX ** 2 + planetY ** 2); if ( planetPerlin < initPerlinMax && planetPerlin >= initPerlinMin && - planetX ** 2 + planetY ** 2 < this.worldRadius ** 2 && + distFromOrigin < this.worldRadius && + distFromOrigin > spawnInnerRadius && planetLevel === MIN_PLANET_LEVEL && planetType === PlanetType.PLANET && (!planet || !planet.isInContract) // init will fail if planet has been initialized in contract already @@ -1789,7 +1997,16 @@ class GameManager extends EventEmitter { // valid home planet homePlanetFinder.stopExplore(); homePlanetFinder.destroy(); - resolve(planetLoc); + + const homePlanet = this.getGameObjects().getPlanetWithLocation(homePlanetLocation); + + if (!homePlanet) { + reject(new Error("Unable to create default planet for your home planet's location.")); + } else { + // can cast to `LocatablePlanet` because we know its location, as we just mined it. + resolve(homePlanet as LocatablePlanet); + } + break; } } @@ -2688,23 +2905,31 @@ class GameManager extends EventEmitter { getMaxMoveDist(planetId: LocationId, sendingPercent: number): number { const planet = this.getPlanetWithId(planetId); if (!planet) throw new Error('origin planet unknown'); - // log_2(sendingPercent / 5%) - let ratio = Math.log(sendingPercent / 5) / Math.log(2); - ratio = Math.max(ratio, 0); - return ratio * planet.range; + return getRange(planet, sendingPercent); } /** * Gets the distance between two planets. Throws an exception if you don't - * know the location of either planet. + * know the location of either planet. Takes into account wormholes. */ getDist(fromId: LocationId, toId: LocationId): number { - const fromLoc = this.entityStore.getLocationOfPlanet(fromId); - if (!fromLoc) throw new Error('origin location unknown'); - const toLoc = this.entityStore.getLocationOfPlanet(toId); - if (!toLoc) throw new Error('destination location unknown'); + const from = this.entityStore.getPlanetWithId(fromId); + const to = this.entityStore.getPlanetWithId(toId); + + if (!from) throw new Error('origin planet unknown'); + if (!to) throw new Error('destination planet unknown'); + if (!isLocatable(from)) throw new Error('origin location unknown'); + if (!isLocatable(to)) throw new Error('destination location unknown'); + + const wormholeFactors = this.getWormholeFactors(from, to); - return this.getDistCoords(fromLoc.coords, toLoc.coords); + let distance = this.getDistCoords(from.location.coords, to.location.coords); + + if (wormholeFactors) { + distance /= wormholeFactors.distanceFactor; + } + + return distance; } /** @@ -2716,26 +2941,17 @@ class GameManager extends EventEmitter { /** * Gets all the planets that you can reach with at least 1 energy from - * the given planet. + * the given planet. Does not take into account wormholes. */ getPlanetsInRange(planetId: LocationId, sendingPercent: number): Planet[] { - const loc = this.entityStore.getLocationOfPlanet(planetId); - if (!loc) throw new Error('origin planet location unknown'); - - const ret: Planet[] = []; - const maxDist = this.getMaxMoveDist(planetId, sendingPercent); - const planetsIt = this.entityStore.getAllPlanets(); - for (const toPlanet of planetsIt) { - const toLoc = this.entityStore.getLocationOfPlanet(toPlanet.locationId); - if (!toLoc) continue; - - const { x: fromX, y: fromY } = loc.coords; - const { x: toX, y: toY } = toLoc.coords; - if ((fromX - toX) ** 2 + (fromY - toY) ** 2 < maxDist ** 2) { - ret.push(toPlanet); - } - } - return ret; + const planet = this.entityStore.getPlanetWithId(planetId); + if (!planet) throw new Error('planet unknown'); + if (!isLocatable(planet)) throw new Error('planet location unknown'); + + return this.getGameObjects().getPlanetsInWorldCircle( + planet.location.coords, + getRange(planet, sendingPercent) + ); } /** @@ -2771,14 +2987,12 @@ class GameManager extends EventEmitter { if (distance === undefined && toId === undefined) throw new Error(`you must provide either a target planet or a distance`); - let dist = (toId && this.getDist(fromId, toId)) || (distance as number); + const dist = (toId && this.getDist(fromId, toId)) || (distance as number); if (to && toId) { const wormholeFactors = this.getWormholeFactors(from, to); if (wormholeFactors !== undefined) { - if (to.owner === from.owner) { - dist /= wormholeFactors.distanceFactor; - } else { + if (to.owner !== from.owner) { return 0; } } diff --git a/src/Backend/GameLogic/GameObjects.ts b/src/Backend/GameLogic/GameObjects.ts index cd66dc4f..6f7b5ee2 100644 --- a/src/Backend/GameLogic/GameObjects.ts +++ b/src/Backend/GameLogic/GameObjects.ts @@ -2,11 +2,13 @@ import { EMPTY_ADDRESS, MAX_PLANET_LEVEL, MIN_PLANET_LEVEL } from '@darkforest_e import { Monomitter, monomitter } from '@darkforest_eth/events'; import { bonusFromHex, getBytesFromHex } from '@darkforest_eth/hexgen'; import { + Abstract, ArrivalWithTimer, Artifact, ArtifactId, ArtifactType, Biome, + ClaimedLocation, EthAddress, LocatablePlanet, LocationId, @@ -20,6 +22,7 @@ import { UnconfirmedActivateArtifact, UnconfirmedBuyGPTCredits, UnconfirmedBuyHat, + UnconfirmedClaim, UnconfirmedMove, UnconfirmedPlanetTransfer, UnconfirmedReveal, @@ -62,9 +65,7 @@ import { isActivated } from './ArtifactUtils'; import { LayeredMap } from './LayeredMap'; import { Radii } from './ViewportEntities'; -type CoordsString = string & { - __value__: never; -}; +type CoordsString = Abstract; const getCoordsString = (coords: WorldCoords): CoordsString => { return `${coords.x},${coords.y}` as CoordsString; @@ -163,6 +164,13 @@ export class GameObjects { */ private readonly revealedLocations: Map; + /** + * Map from location ids to, if that location id has been claimed on-chain, the world coordinates + * of that location id, as well as some extra information regarding the circumstances of the + * revealing of this planet. + */ + private readonly claimedLocations: Map; + /** * Some of the game's parameters are downloaded from the blockchain. This allows the client to be * flexible, and connect to any compatible set of Dark Forest contracts, download the parameters, @@ -194,6 +202,7 @@ export class GameObjects { private unconfirmedReveal?: UnconfirmedReveal; // at most one at a time private unconfirmedBuyGPTCredits?: UnconfirmedBuyGPTCredits; // at most one at a time + private unconfirmedClaim?: UnconfirmedClaim; // at most one at a time private readonly unconfirmedMoves: Record; private readonly unconfirmedUpgrades: Record; private readonly unconfirmedBuyHats: Record; @@ -238,6 +247,7 @@ export class GameObjects { touchedPlanets: Map, allTouchedPlanetIds: Set, revealedLocations: Map, + claimedLocations: Map, artifacts: Map, allChunks: Iterable, unprocessedArrivals: Map, @@ -251,7 +261,8 @@ export class GameObjects { this.planets = touchedPlanets; this.myPlanets = new Map(); this.touchedPlanetIds = allTouchedPlanetIds; - this.revealedLocations = new Map(); + this.revealedLocations = revealedLocations; + this.claimedLocations = claimedLocations; this.artifacts = artifacts; this.myArtifacts = new Map(); this.contractConstants = contractConstants; @@ -473,7 +484,8 @@ export class GameObjects { planet: Planet, updatedArrivals?: QueuedArrival[], updatedArtifactsOnPlanet?: ArtifactId[], - revealedLocation?: RevealedLocation + revealedLocation?: RevealedLocation, + claimerEthAddress?: EthAddress ): void { this.touchedPlanetIds.add(planet.locationId); // does not modify unconfirmed txs @@ -540,6 +552,10 @@ export class GameObjects { planet.revealer = revealedLocation.revealer; } + if (claimerEthAddress) { + planet.claimer = claimerEthAddress; + } + this.setPlanet(planet); if (updatedArrivals) { @@ -572,8 +588,9 @@ export class GameObjects { return this.getPlanetWithLocation(location) as LocatablePlanet; } - // returns an empty planet if planet is not in contract - // returns undefined if this isn't a planet, according to hash and coords + // - returns an empty planet if planet is not in contract + // - returns undefined if this isn't a planet, according to hash and coords + // - if this planet hasn't been initialized in the client yet, initializes it public getPlanetWithLocation(location: WorldLocation): Planet | undefined { const planet = this.planets.get(location.hash); if (planet) { @@ -603,7 +620,8 @@ export class GameObjects { public addPlanetLocation(planetLocation: WorldLocation): void { this.layeredMap.insertPlanet( planetLocation, - this.planetLevelFromHexPerlin(planetLocation.hash, planetLocation.perlin) + this.getPlanetWithId(planetLocation.hash)?.planetLevel || + this.planetLevelFromHexPerlin(planetLocation.hash, planetLocation.perlin) ); this.planetLocationMap.set(planetLocation.hash, planetLocation); @@ -1015,6 +1033,9 @@ export class GameObjects { public getUnconfirmedReveal(): UnconfirmedReveal | undefined { return this.unconfirmedReveal; } + public getUnconfirmedClaim(): UnconfirmedClaim | undefined { + return this.unconfirmedClaim; + } public getUnconfirmedBuyGPTCredits(): UnconfirmedBuyGPTCredits | undefined { return this.unconfirmedBuyGPTCredits; @@ -1040,21 +1061,36 @@ export class GameObjects { return this.revealedLocations; } + public getClaimedLocations(): Map { + return this.claimedLocations; + } + + public setClaimedLocation(claimedLocation: ClaimedLocation) { + this.claimedLocations.set(claimedLocation.hash, claimedLocation); + } + + /** + * Gets all the planets with the given ids, giltering out the ones that we don't have. + */ public getPlanetsWithIds(locationIds: LocationId[], updateIfStale = true): Planet[] { return locationIds .map((id) => this.getPlanetWithId(id, updateIfStale)) - .filter((p) => p !== undefined) as LocatablePlanet[]; + .filter((p) => p !== undefined) as Planet[]; } + /** + * Gets all the planets that are within {@code radius} world units from the given coordinate. Fast + * because it uses {@link LayeredMap}. + */ public getPlanetsInWorldCircle(coords: WorldCoords, radius: number): LocatablePlanet[] { const locationIds = this.layeredMap.getPlanetsInCircle(coords, radius); return this.getPlanetsWithIds(locationIds) as LocatablePlanet[]; } /** - * Gets the ids of all the planets that are both within the given bounding box (defined by its bottom - * left coordinate, width, and height) in the world and of a level that was passed in via the - * `planetLevels` parameter. + * Gets the ids of all the planets that are both within the given bounding box (defined by its + * bottom left coordinate, width, and height) in the world and of a level that was passed in via + * the `planetLevels` parameter. Fast because it uses {@link LayeredMap}. */ public getPlanetsInWorldRectangle( worldX: number, @@ -1073,7 +1109,7 @@ export class GameObjects { levels, planetLevelToRadii ); - return this.getPlanetsWithIds(locationIds) as LocatablePlanet[]; + return this.getPlanetsWithIds(locationIds, updateIfStale) as LocatablePlanet[]; } /** diff --git a/src/Backend/GameLogic/GameUIManager.ts b/src/Backend/GameLogic/GameUIManager.ts index dc484f14..8eb79be7 100644 --- a/src/Backend/GameLogic/GameUIManager.ts +++ b/src/Backend/GameLogic/GameUIManager.ts @@ -32,7 +32,9 @@ import EventEmitter from 'events'; import deferred from 'p-defer'; import NotificationManager from '../../Frontend/Game/NotificationManager'; import Viewport from '../../Frontend/Game/Viewport'; +import WindowManager, { CursorState } from '../../Frontend/Game/WindowManager'; import { getObjectWithIdFromMap } from '../../Frontend/Utils/EmitterUtils'; +import { listenForKeyboardEvents, unlinkKeyboardEvents } from '../../Frontend/Utils/KeyEmitters'; import { getBooleanSetting, getSetting, @@ -167,6 +169,7 @@ class GameUIManager extends EventEmitter { gameManager: GameManager, terminalHandle: React.MutableRefObject ) { + listenForKeyboardEvents(); const uiEmitter = UIEmitter.getInstance(); const uiManager = new GameUIManager(gameManager, terminalHandle); @@ -187,6 +190,7 @@ class GameUIManager extends EventEmitter { } public destroy(): void { + unlinkKeyboardEvents(); const uiEmitter = UIEmitter.getInstance(); uiEmitter.removeListener(UIEmitterEvent.WorldMouseDown, this.onMouseDown); @@ -384,6 +388,9 @@ class GameUIManager extends EventEmitter { public revealLocation(locationId: LocationId) { this.gameManager.revealLocation(locationId); } + public claimLocation(locationId: LocationId) { + this.gameManager.claimLocation(locationId); + } public getNextBroadcastAvailableTimestamp() { return this.gameManager.getNextBroadcastAvailableTimestamp(); @@ -541,6 +548,22 @@ class GameUIManager extends EventEmitter { this.minerLocation = undefined; } + public toggleExplore() { + if (this.isMining()) { + this?.stopExplore(); + TutorialManager.getInstance().acceptInput(TutorialState.MinerPause); + } else { + this?.startExplore(); + } + } + + public toggleTargettingExplorer() { + const windowManager = WindowManager.getInstance(); + if (windowManager.getCursorState() === CursorState.TargetingExplorer) + windowManager.setCursorState(CursorState.Normal); + else windowManager.setCursorState(CursorState.TargetingExplorer); + } + public setForcesSending(planetId: LocationId, percentage: number) { this.forcesSending[planetId] = percentage; } @@ -867,10 +890,17 @@ class GameUIManager extends EventEmitter { return this.mouseHoveringOverCoords; } + /** + * Percent from 0 to 100. + */ public getForcesSending(planetId: LocationId): number { - return this.forcesSending[planetId] || 50; + const forces = this.forcesSending[planetId]; + return forces ?? 50; } + /** + * Percent from 0 to 100. + */ public getSilverSending(planetId: LocationId): number { return this.silverSending[planetId] || 0; } @@ -954,6 +984,9 @@ class GameUIManager extends EventEmitter { public isCurrentlyRevealing(): boolean { return this.gameManager.getNextRevealCountdownInfo().currentlyRevealing; } + public isCurrentlyClaiming(): boolean { + return this.gameManager.getNextClaimCountdownInfo().currentlyClaiming; + } public getUnconfirmedWormholeActivations(): UnconfirmedActivateArtifact[] { return this.gameManager.getUnconfirmedWormholeActivations(); @@ -1011,8 +1044,8 @@ class GameUIManager extends EventEmitter { return this.gameManager.getEnergyOfPlayer(player); } - public getWithdrawnSilverOfPlayer(player: EthAddress): number { - return this.gameManager.getWithdrawnSilverOfPlayer(player); + public getPlayerScore(player: EthAddress): number { + return this.gameManager.getPlayerScore(player); } public upgrade(planet: Planet, branch: number): void { diff --git a/src/Backend/GameLogic/InitialGameStateDownloader.ts b/src/Backend/GameLogic/InitialGameStateDownloader.ts index f751775a..b0b4a14e 100644 --- a/src/Backend/GameLogic/InitialGameStateDownloader.ts +++ b/src/Backend/GameLogic/InitialGameStateDownloader.ts @@ -2,6 +2,7 @@ import { weiToEth } from '@darkforest_eth/network'; import { Artifact, ArtifactId, + ClaimedCoords, LocationId, Planet, Player, @@ -28,6 +29,7 @@ export interface InitialGameState { myGPTCredits: number; allTouchedPlanetIds: LocationId[]; allRevealedCoords: RevealedCoords[]; + allClaimedCoords: ClaimedCoords[]; pendingMoves: QueuedArrival[]; touchedAndLocatedPlanets: Map; artifactsOnVoyages: Artifact[]; @@ -36,6 +38,7 @@ export interface InitialGameState { loadedPlanets: LocationId[]; balance: number; revealedCoordsMap: Map; + claimedCoordsMap: Map; planetVoyageIdMap: Map; arrivals: Map; twitters: AddressTwitterMap; @@ -64,6 +67,7 @@ export class InitialGameStateDownloader { ): Promise { const storedTouchedPlanetIds = await persistentChunkStore.getSavedTouchedPlanetIds(); const storedRevealedCoords = await persistentChunkStore.getSavedRevealedCoords(); + const storedClaimedCoords = await persistentChunkStore.getSavedClaimedCoords(); this.terminal.printElement(MakeDarkForestTips()); this.terminal.newline(); @@ -74,6 +78,8 @@ export class InitialGameStateDownloader { const revealedPlanetsCoordsLoadingBar = this.makeProgressListener( 'Revealed Planet Coordinates' ); + const claimedPlanetsLoadingBar = this.makeProgressListener('Claimed Planet IDs'); + const claimedPlanetsCoordsLoadingBar = this.makeProgressListener('Claimed Planet Coordinates'); const pendingMovesLoadingBar = this.makeProgressListener('Pending Moves'); const planetsLoadingBar = this.makeProgressListener('Planets'); const planetsMetadataLoadingBar = this.makeProgressListener('Planet Metadatas'); @@ -107,16 +113,26 @@ export class InitialGameStateDownloader { revealedPlanetsLoadingBar, revealedPlanetsCoordsLoadingBar ); + const loadedClaimedCoords = contractsAPI.getClaimedPlanetsCoords( + storedClaimedCoords.length, + claimedPlanetsLoadingBar, + claimedPlanetsCoordsLoadingBar + ); const allTouchedPlanetIds = storedTouchedPlanetIds.concat(await loadedTouchedPlanetIds); const allRevealedCoords = storedRevealedCoords.concat(await loadedRevealedCoords); + const allClaimedCoords = storedClaimedCoords.concat(await loadedClaimedCoords); const revealedCoordsMap = new Map(); for (const revealedCoords of allRevealedCoords) { revealedCoordsMap.set(revealedCoords.hash, revealedCoords); } + const claimedCoordsMap = new Map(); + for (const claimedCoords of allClaimedCoords) { + claimedCoordsMap.set(claimedCoords.hash, claimedCoords); + } let planetsToLoad = allTouchedPlanetIds.filter( - (id) => minedPlanetIds.has(id) || revealedCoordsMap.has(id) + (id) => minedPlanetIds.has(id) || revealedCoordsMap.has(id) || claimedCoordsMap.has(id) ); const pendingMoves = await contractsAPI.getAllArrivals(planetsToLoad, pendingMovesLoadingBar); @@ -180,6 +196,7 @@ export class InitialGameStateDownloader { myGPTCredits: await myGPTCredits, allTouchedPlanetIds, allRevealedCoords, + allClaimedCoords, pendingMoves, touchedAndLocatedPlanets, artifactsOnVoyages, @@ -188,6 +205,7 @@ export class InitialGameStateDownloader { loadedPlanets: planetsToLoad, balance: weiToEth(await balance), revealedCoordsMap, + claimedCoordsMap, planetVoyageIdMap, arrivals, twitters, diff --git a/src/Backend/GameLogic/LayeredMap.ts b/src/Backend/GameLogic/LayeredMap.ts index e94fb81b..6bedba31 100644 --- a/src/Backend/GameLogic/LayeredMap.ts +++ b/src/Backend/GameLogic/LayeredMap.ts @@ -31,7 +31,7 @@ export class LayeredMap { for (let i = MIN_PLANET_LEVEL; i <= MAX_PLANET_LEVEL; i++) { const config: QuadTreeConfig = { - maximumDepth: i <= 3 ? 10 : 10, + maximumDepth: 10, removeEmptyNodes: true, }; diff --git a/src/Backend/GameLogic/PaidConversationManager.tsx b/src/Backend/GameLogic/PaidConversationManager.tsx index 7bd960c4..4b37a2d4 100644 --- a/src/Backend/GameLogic/PaidConversationManager.tsx +++ b/src/Backend/GameLogic/PaidConversationManager.tsx @@ -2,6 +2,7 @@ import { Artifact, ArtifactTypeNames, Conversation, Message } from '@darkforest_ import React from 'react'; import styled from 'styled-components'; import { WikiPane } from '../../Frontend/Panes/WikiPane'; +import dfstyles from '../../Frontend/Styles/dfstyles'; import { TerminalTextStyle } from '../../Frontend/Utils/TerminalTypes'; import { TerminalHandle } from '../../Frontend/Views/Terminal'; import { artifactName } from '../Procedural/ArtifactProcgen'; @@ -207,5 +208,5 @@ const WikiEntryTitle = styled.div` font-size: 150%; margin-bottom: 8px; text-decoration: underline; - color: white; + color: ${dfstyles.colors.text}; `; diff --git a/src/Backend/Network/Blockchain.ts b/src/Backend/Network/Blockchain.ts index 45972941..070f3df9 100644 --- a/src/Backend/Network/Blockchain.ts +++ b/src/Backend/Network/Blockchain.ts @@ -2,11 +2,13 @@ import coreContractAbiUrl from '@darkforest_eth/contracts/abis/DarkForestCore.json'; import gettersContractAbiUrl from '@darkforest_eth/contracts/abis/DarkForestGetters.json'; import gptCreditContractAbiUrl from '@darkforest_eth/contracts/abis/DarkForestGPTCredit.json'; +import scoringContractAbiUrl from '@darkforest_eth/contracts/abis/DarkForestScoringRound3.json'; import whitelistContractAbiUrl from '@darkforest_eth/contracts/abis/Whitelist.json'; import type { DarkForestCore, DarkForestGetters, DarkForestGPTCredit, + DarkForestScoringRound3, Whitelist, } from '@darkforest_eth/contracts/typechain'; import { createContract, createEthConnection, EthConnection } from '@darkforest_eth/network'; @@ -69,6 +71,20 @@ export async function loadGptCreditContract( return createContract(address, gptCreditContractAbi, provider, signer); } +/** + * Loads ths GPT Credit contract, which players can pay to talk to artifacts. + * @see https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestGPTCredit.sol + */ +export async function loadScoringContract( + address: string, + provider: providers.JsonRpcProvider, + signer?: Wallet +): Promise { + const scoringContractAbi = await fetch(scoringContractAbiUrl).then((r) => r.json()); + + return createContract(address, scoringContractAbi, provider, signer); +} + export function getEthConnection(): Promise { const isProd = process.env.NODE_ENV === 'production'; const defaultUrl = process.env.DEFAULT_RPC as string; diff --git a/src/Backend/Procedural/ArtifactProcgen.ts b/src/Backend/Procedural/ArtifactProcgen.ts index 2e0df036..71048014 100644 --- a/src/Backend/Procedural/ArtifactProcgen.ts +++ b/src/Backend/Procedural/ArtifactProcgen.ts @@ -7,7 +7,6 @@ import { ArtifactType, ArtifactTypeNames, Biome, - LocationId, } from '@darkforest_eth/types'; import { artifactBiomeName } from '../GameLogic/ArtifactUtils'; @@ -21,7 +20,7 @@ export const dateMintedAt = (artifact: Artifact | undefined): string => { return new Date(artifact.mintedAtTimestamp * 1000).toDateString(); }; -const namesById = new Map(); +const namesById = new Map(); export const artifactName = (artifact: Artifact | undefined): string => { if (!artifact) return 'Unknown'; diff --git a/src/Backend/Procedural/ProcgenUtils.ts b/src/Backend/Procedural/ProcgenUtils.ts index 3ae3b43c..2b13d5b5 100644 --- a/src/Backend/Procedural/ProcgenUtils.ts +++ b/src/Backend/Procedural/ProcgenUtils.ts @@ -51,7 +51,7 @@ export class ProcgenUtils { [Biome.ICE]: [198, 78, 77], [Biome.WASTELAND]: [0, 0, 18], [Biome.LAVA]: [19, 100, 50], - [Biome.CORRUPTED]: [280, 100, 54], + [Biome.CORRUPTED]: [100, 80, 54], } as const; private static oceanByBiome: { readonly [Biome: number]: HSLVec } = { [Biome.UNKNOWN]: [0, 0, 0], @@ -64,7 +64,7 @@ export class ProcgenUtils { [Biome.ICE]: [198, 90, 85], [Biome.WASTELAND]: [0, 98, 42], [Biome.LAVA]: [12, 92, 39], - [Biome.CORRUPTED]: [308, 90, 63], + [Biome.CORRUPTED]: [128, 90, 63], } as const; private static strByBiome = new Map(); diff --git a/src/Backend/Storage/PersistentChunkStore.ts b/src/Backend/Storage/PersistentChunkStore.ts index 882f41bf..dab3a0d6 100644 --- a/src/Backend/Storage/PersistentChunkStore.ts +++ b/src/Backend/Storage/PersistentChunkStore.ts @@ -1,5 +1,6 @@ import { CORE_CONTRACT_ADDRESS } from '@darkforest_eth/contracts'; import { + ClaimedCoords, DiagnosticUpdater, EthAddress, LocationId, @@ -242,6 +243,21 @@ class PersistentChunkStore implements ChunkStore { return []; } + public async getSavedClaimedCoords(): Promise { + const claimedPlanetIds = await this.getKey('claimedPlanetIds'); + + if (claimedPlanetIds) { + const parsed = JSON.parse(claimedPlanetIds); + // changed the type on 6/1/21 to include revealer field + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (parsed.length === 0 || !(parsed[0] as any).revealer) { + return []; + } + return parsed as ClaimedCoords[]; + } + + return []; + } public async saveTouchedPlanetIds(ids: LocationId[]) { await this.setKey('touchedPlanetIds', stringify(ids)); @@ -250,6 +266,9 @@ class PersistentChunkStore implements ChunkStore { public async saveRevealedCoords(revealedCoordTups: RevealedCoords[]) { await this.setKey('revealedPlanetIds', stringify(revealedCoordTups)); } + public async saveClaimedCoords(claimedCoordTupps: ClaimedCoords[]) { + await this.setKey('claimedPlanetIds', stringify(claimedCoordTupps)); + } /** * Returns the explored chunk data for the given rectangle if that chunk has been mined. If this diff --git a/src/Backend/Utils/TypeAssertions.ts b/src/Backend/Utils/TypeAssertions.ts index 5ee5720c..53a9ecea 100644 --- a/src/Backend/Utils/TypeAssertions.ts +++ b/src/Backend/Utils/TypeAssertions.ts @@ -4,6 +4,7 @@ import { UnconfirmedActivateArtifact, UnconfirmedBuyGPTCredits, UnconfirmedBuyHat, + UnconfirmedClaim, UnconfirmedDeactivateArtifact, UnconfirmedDepositArtifact, UnconfirmedFindArtifact, @@ -86,3 +87,7 @@ export function isUnconfirmedBuyGPTCredits( ): txIntent is UnconfirmedBuyGPTCredits { return txIntent.methodName === ContractMethodName.BUY_GPT_CREDITS; } + +export function isUnconfirmedClaim(txIntent: TxIntent): txIntent is UnconfirmedClaim { + return txIntent.methodName === ContractMethodName.CLAIM_LOCATION; +} diff --git a/src/Frontend/Components/Btn.tsx b/src/Frontend/Components/Btn.tsx index 5b21e5db..b23e7623 100644 --- a/src/Frontend/Components/Btn.tsx +++ b/src/Frontend/Components/Btn.tsx @@ -6,6 +6,7 @@ export type BtnProps = { disabled?: boolean; noBorder?: boolean; wide?: boolean; + small?: boolean; color?: string; borderColor?: string; textColor?: string; @@ -17,37 +18,48 @@ export function Btn(props: BtnProps) { } const BtnElement = styled.span` - ${({ disabled, color, borderColor, textColor, noBorder, wide, forceActive }: BtnProps) => css` + ${({ + disabled, + color, + borderColor, + textColor, + noBorder, + wide, + forceActive, + small, + }: BtnProps) => css` user-select: none; display: inline-flex; border-radius: 3px; - padding: 0.15em; + padding: 2px 8px; + ${small ? `padding: 0 4px;` : `padding: 2px 8px;`} border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.borderDark}; justify-content: center; align-items: center; cursor: pointer; background-color: ${dfstyles.colors.backgrounddark}; + ${small && `font-size: 0.8em;`} ${wide && `width: 100%;`} - ${(textColor || color) && `color: ${textColor || color};`} + ${(textColor || color) && `color: ${textColor || color || dfstyles.colors.text};`} &:active, &:hover { ${!disabled && css` + ${dfstyles.game.styles.active}; border: ${noBorder ? 0 : 1}px solid ${borderColor || color || dfstyles.colors.border}; color: ${dfstyles.colors.background}; background: ${color || dfstyles.colors.text}; + span svg path { + fill: ${dfstyles.colors.background}; + } `} } - &:active { - ${dfstyles.game.styles.active}; - } - ${disabled && css` - color: ${dfstyles.colors.subbesttext}; + color: ${dfstyles.colors.subtext}; border-color: ${dfstyles.colors.border}; background: none; filter: none; diff --git a/src/Frontend/Components/CoreUI.tsx b/src/Frontend/Components/CoreUI.tsx index f4a81408..67ea94e8 100644 --- a/src/Frontend/Components/CoreUI.tsx +++ b/src/Frontend/Components/CoreUI.tsx @@ -4,6 +4,8 @@ import React, { ChangeEvent, useCallback } from 'react'; import styled, { css } from 'styled-components'; import dfstyles from '../Styles/dfstyles'; import { GameWindowZIndex } from '../Utils/constants'; +import { useIsDown } from '../Utils/KeyEmitters'; +import { Btn, BtnProps } from './Btn'; export const InlineBlock = styled.div` display: inline-block; @@ -188,25 +190,26 @@ export const DontShrink = styled.div` /** * This is the link that all core ui in Dark Forest should use. Please! */ -export function Link({ - to, - color, - openInThisTab, - children, -}: { - to: string; - color?: string; - openInThisTab?: boolean; - children: React.ReactNode; -}) { +export function Link( + props: { + to?: string; + color?: string; + openInThisTab?: boolean; + children: React.ReactNode; + } & React.HtmlHTMLAttributes +) { + const { to, color, openInThisTab, children } = props; + return ( - + {children} ); } const LinkImpl = styled.a` + cursor: pointer; + ${({ color }: { color?: string }) => css` text-decoration: underline; color: ${color || dfstyles.colors.dfblue}; @@ -227,6 +230,8 @@ export const EmSpacer = styled.div` ${({ width, height }: { width?: number; height?: number }) => css` width: ${width === undefined ? '1em' : width}; height: ${height === undefined ? '1em' : height}; + flex-grow: 0; + flex-shrink: 0; ${width && !height ? 'display: inline-block;' : ''} ${width ? `width: ${width}em;` : ''} ${height ? `height: ${height}em;min-height:${height}em;` : ''} @@ -245,6 +250,7 @@ export const Spacer = styled.div` export const Truncate = styled.div` ${({ maxWidth }: { maxWidth?: string }) => css` + vertical-align: bottom; display: inline-block; white-space: nowrap; overflow: hidden; @@ -261,7 +267,7 @@ export const Truncate = styled.div` * way to do this. */ export const PluginElements = styled.div` - color: white; + color: ${dfstyles.colors.text}; width: 400px; min-height: 100px; max-height: 600px; @@ -275,7 +281,7 @@ export const PluginElements = styled.div` transition: background-color 0.2s colors 0.2s; &:hover { - background-color: white; + background-color: ${dfstyles.colors.text}; color: black; border: 1px transparent; } @@ -306,8 +312,8 @@ export const Select = styled.select` cursor: pointer; &:hover { - border: 1px solid ${dfstyles.colors.text}; - background: ${dfstyles.colors.text}; + border: 1px solid ${dfstyles.colors.subtext}; + background: ${dfstyles.colors.subtext}; color: ${dfstyles.colors.background}; } `} @@ -395,16 +401,38 @@ export const CenterBackgroundSubtext = styled.div` `} `; +/** + * A button that also displays a {@code KeyboardBtn} directly next to it, which shows the user + * whether or not the given shortcut key is down. In the case that now {@code shortcutKey} was + * provided, this is just a normal button. + */ +export function ShortcutButton( + props: { children: React.ReactNode; shortcutKey?: string; shortcutText?: string } & BtnProps +) { + return ( + + + + {props.shortcutKey && ( + <> + + + + )} + + + ); +} + // Styling from https://www.npmjs.com/package/keyboard-css export const KeyboardBtn = styled.kbd` ${({ active }: { active?: boolean }) => css` font-size: 0.7rem; - line-height: 1.5; - margin: 0.25rem 0.25rem 0.375rem; - padding: 0.1rem 0.3rem; + line-height: 1.4; + padding: 0.1rem 0.45rem; -webkit-backface-visibility: hidden; backface-visibility: hidden; - border: 1px solid #4b545c; + border: 1px solid ${dfstyles.colors.border}; border-radius: 0.25rem; display: inline-block; font-weight: 400; @@ -413,10 +441,10 @@ export const KeyboardBtn = styled.kbd` transform-style: preserve-3d; transition: all 0.25s cubic-bezier(0.2, 1, 0.2, 1); box-shadow: ${active - ? '0 0 1px 1px #7a8793' - : '0 0 #56606a, 0 0 #56606a, 0 1px #56606a, 0 2px #56606a, 2px 1px 4px #adb5bd, 0 -1px 1px #adb5bd'}; + ? '0 0 1px 1px #929292' + : '0 0 #6b6b6b, 0 0 #6b6b6b, 0 1px #6d6d6d, 0 2px #6d6d6d, 2px 1px 4px #adb5bd, 0 -1px 1px #adb5bd'}; background-color: ${active ? dfstyles.colors.text : '#343a40'}; - color: ${active ? dfstyles.colors.background : '#f8f9fa'}; + color: ${active ? dfstyles.colors.background : dfstyles.colors.text}; &:after { border-radius: 0.375rem; border-width: 0.0625rem; @@ -432,7 +460,7 @@ export const KeyboardBtn = styled.kbd` position: absolute; transform-style: preserve-3d; transition: all 0.25s cubic-bezier(0.2, 1, 0.2, 1); - border-color: #626d78; + border-color: ${dfstyles.colors.borderDarker}; background: ${active ? 'transparent' : dfstyles.colors.background}; } `} @@ -442,3 +470,9 @@ export const CenteredText = styled.span` margin: auto; text-align: center; `; + +export function ShortcutKeyDown({ shortcutKey, text }: { shortcutKey?: string; text?: string }) { + const isDown = useIsDown(shortcutKey); + + return {text === undefined ? shortcutKey : text}; +} diff --git a/src/Frontend/Components/IconButton.tsx b/src/Frontend/Components/IconButton.tsx deleted file mode 100644 index 996ee43a..00000000 --- a/src/Frontend/Components/IconButton.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import styled from 'styled-components'; -import dfstyles from '../Styles/dfstyles'; - -export const IconButton = styled.div<{ - iconColor?: string; -}>` - display: inline-flex; - flex-direction: row; - justify-content: center; - align-items: center; - cursor: pointer; - border-radius: 3px; - border: 1px solid ${dfstyles.colors.border}; - color: ${dfstyles.colors.text}; - background-color: ${dfstyles.colors.backgrounddark}; - user-select: none; - - & svg path { - fill: ${(props) => props.iconColor || dfstyles.colors.subtext}; - } - - &:hover { - border: 1px solid ${dfstyles.colors.text}; - background: ${dfstyles.colors.text}; - color: ${dfstyles.colors.background}; - & svg path { - fill: ${dfstyles.colors.background}; - } - } - - &:active { - ${dfstyles.game.styles.active}; - } -`; diff --git a/src/Frontend/Components/Icons.tsx b/src/Frontend/Components/Icons.tsx index 91162da4..355c4276 100644 --- a/src/Frontend/Components/Icons.tsx +++ b/src/Frontend/Components/Icons.tsx @@ -52,7 +52,7 @@ const DefaultSVG = ({ ); }; -const SilverGrowthSVG = () => ( +const SilverGrowthSVG = ({ color }: { color?: string }) => ( ( // style="enable-background:new 0 0 512 512;" > ( > - + ); @@ -126,7 +131,10 @@ export const EnergyGrowthIcon = ({ color }: { color?: string }) => ( const EnergySVG = ({ color }: { color?: string }) => ( - + ); @@ -139,7 +147,7 @@ export const EnergyIcon = ({ color }: { color?: string }) => ( const RangeSVG = ({ color }: { color?: string }) => ( @@ -451,7 +459,7 @@ const SpeedSVG = ({ color }: { color?: string }) => { return ( @@ -470,11 +478,11 @@ const DefenseSVG = ({ color }: { color?: string }) => { return ( @@ -572,7 +580,7 @@ export const PluginIcon = () => ( const DepositSVG = ({ color }: { color?: string }) => ( @@ -588,7 +596,7 @@ export const DepositIcon = ({ color }: { color?: string }) => ( const QuestionCircle = ({ color }: { color?: string }) => ( @@ -604,7 +612,7 @@ export const QuestionCircleIcon = ({ color }: { color?: string }) => ( const CloseCircle = ({ color }: { color?: string }) => ( @@ -620,7 +628,7 @@ export const CloseCircleIcon = ({ color }: { color?: string }) => ( const MaximizeCircle = ({ color }: { color?: string }) => ( @@ -636,7 +644,7 @@ export const MaximizeCircleIcon = ({ color }: { color?: string }) => ( const MinimizeCircle = ({ color }: { color?: string }) => ( @@ -668,7 +676,7 @@ export const WithdrawIcon = ({ color }: { color?: string }) => ( const ActivateSVG = ({ color }: { color?: string }) => ( @@ -684,7 +692,7 @@ export const ActivateIcon = ({ color }: { color?: string }) => ( const DeactivateSVG = ({ color }: { color?: string }) => ( diff --git a/src/Frontend/Components/Labels/Labels.tsx b/src/Frontend/Components/Labels/Labels.tsx index c603ae91..515e8942 100644 --- a/src/Frontend/Components/Labels/Labels.tsx +++ b/src/Frontend/Components/Labels/Labels.tsx @@ -1,22 +1,42 @@ +import { EthAddress } from '@darkforest_eth/types'; import React from 'react'; import { usePlayer, useUIManager } from '../../Utils/AppHooks'; import { Link } from '../CoreUI'; +import { Sub } from '../Text'; import { TextPreview } from '../TextPreview'; -/** - * Returns a either a link to the player's twitter, or a {@link TextPreview} of their address. - */ -export function LoggedInPlayer() { +export function AccountLabel({ + includeAddressIfHasTwitter, + ethAddress, +}: { + includeAddressIfHasTwitter?: boolean; + ethAddress?: EthAddress; +}) { const uiManager = useUIManager(); - const player = usePlayer(uiManager); + const player = usePlayer(uiManager, ethAddress); if (player.value !== undefined && player.value.twitter !== undefined) { - return ; + return ( + <> + + {includeAddressIfHasTwitter && ( + + ( + '} + unFocusedWidth={'100px'} + focusedWidth={'100px'} + /> + ) + + )} + + ); } return ( '} + text={ethAddress || uiManager.getAccount() || ''} unFocusedWidth={'350px'} focusedWidth={'350px'} /> diff --git a/src/Frontend/Components/Labels/PlanetLabels.tsx b/src/Frontend/Components/Labels/PlanetLabels.tsx index b56582de..fd1bd9b0 100644 --- a/src/Frontend/Components/Labels/PlanetLabels.tsx +++ b/src/Frontend/Components/Labels/PlanetLabels.tsx @@ -7,7 +7,7 @@ import { formatNumber, getPlanetRank } from '../../../Backend/Utils/Utils'; import dfstyles from '../../Styles/dfstyles'; import { useAccount, usePlayer, useUIManager } from '../../Utils/AppHooks'; import { EmSpacer } from '../CoreUI'; -import { Colored, Sub, White } from '../Text'; +import { Colored, Sub, Subber, White } from '../Text'; import { TextPreview } from '../TextPreview'; import { OptionalPlanetBiomeLabelAnim } from './BiomeLabels'; import { TwitterLink } from './Labels'; @@ -21,21 +21,23 @@ import { SpacetimeRipLabel } from './SpacetimeRipLabel'; export function StatText({ planet, getStat, + style, }: { planet: Planet | undefined; getStat: (p: Planet) => number; + style?: React.CSSProperties; }) { - return <>{planet ? formatNumber(getStat(planet), 2) : 'n/a'}; + return {planet ? formatNumber(getStat(planet), 2) : 'n/a'}; } const getSilver = (p: Planet) => p.silver; export const SilverText = ({ planet }: { planet: Planet | undefined }) => ( - + ); const getSilverCap = (p: Planet) => p.silverCap; export const SilverCapText = ({ planet }: { planet: Planet | undefined }) => ( - + ); const getEnergy = (p: Planet) => p.energy; @@ -51,7 +53,7 @@ export const EnergyCapText = ({ planet }: { planet: Planet | undefined }) => ( export function PlanetEnergyLabel({ planet }: { planet: Planet | undefined }) { return ( - / + / ); } @@ -59,7 +61,7 @@ export function PlanetEnergyLabel({ planet }: { planet: Planet | undefined }) { export function PlanetSilverLabel({ planet }: { planet: Planet | undefined }) { return ( - / + / ); } @@ -86,7 +88,7 @@ export const EnergyGrowthText = ({ planet }: { planet: Planet | undefined }) => const getSilverGrowth = (p: Planet) => p.silverGrowth; export const SilverGrowthText = ({ planet }: { planet: Planet | undefined }) => ( - + ); // level and rank stuff diff --git a/src/Frontend/Components/OpenPaneButtons.tsx b/src/Frontend/Components/OpenPaneButtons.tsx index 14d0c989..38d62571 100644 --- a/src/Frontend/Components/OpenPaneButtons.tsx +++ b/src/Frontend/Components/OpenPaneButtons.tsx @@ -1,23 +1,23 @@ import { LocationId } from '@darkforest_eth/types'; import React, { useCallback } from 'react'; import { BroadcastPane, BroadcastPaneHelpContent } from '../Panes/BroadcastPane'; +import { ClaimPlanetPane } from '../Panes/ClaimPlanetPane'; import { HatPane } from '../Panes/HatPane'; import { ManagePlanetArtifactsHelpContent, ManagePlanetArtifactsPane, } from '../Panes/ManagePlanetArtifacts/ManagePlanetArtifactsPane'; import { UpgradeDetailsPane, UpgradeDetailsPaneHelpContent } from '../Panes/UpgradeDetailsPane'; -import { useIsDown } from '../Utils/KeyEmitters'; +import { useOnUp } from '../Utils/KeyEmitters'; import { TOGGLE_BROADCAST_PANE, + TOGGLE_CLAIM_PLANET_PANE, TOGGLE_HAT_PANE, TOGGLE_PLANET_ARTIFACTS_PANE, TOGGLE_UPGRADES_PANE, - useSubscribeToShortcut, } from '../Utils/ShortcutConstants'; import { ModalHandle } from '../Views/ModalPane'; -import { Btn } from './Btn'; -import { CenteredText, KeyboardBtn } from './CoreUI'; +import { AlignCenterHorizontally, CenteredText, ShortcutButton } from './CoreUI'; export function OpenPaneButton({ modal, @@ -28,7 +28,7 @@ export function OpenPaneButton({ }: { modal: ModalHandle; title: string; - element: React.ReactElement; + element: () => React.ReactElement; helpContent?: React.ReactElement; shortcutKey?: string; }) { @@ -40,14 +40,31 @@ export function OpenPaneButton({ }); }, [title, element, helpContent, modal]); - useSubscribeToShortcut(shortcutKey, open); - const isDown = useIsDown(shortcutKey); + useOnUp(shortcutKey, open); return ( - - {title} - {shortcutKey} - + + + {title} + + + ); +} + +export function OpenClaimPlanetPane({ + modal, + planetId, +}: { + modal: ModalHandle; + planetId: LocationId | undefined; +}) { + return ( + } + /> ); } @@ -63,7 +80,7 @@ export function OpenHatPaneButton({ modal={modal} title='Hat' shortcutKey={TOGGLE_HAT_PANE} - element={} + element={() => } /> ); } @@ -80,7 +97,7 @@ export function OpenBroadcastPaneButton({ modal={modal} title='Broadcast' shortcutKey={TOGGLE_BROADCAST_PANE} - element={} + element={() => } helpContent={BroadcastPaneHelpContent()} /> ); @@ -98,7 +115,7 @@ export function OpenUpgradeDetailsPaneButton({ modal={modal} title='Upgrade' shortcutKey={TOGGLE_UPGRADES_PANE} - element={} + element={() => } helpContent={UpgradeDetailsPaneHelpContent()} /> ); @@ -115,7 +132,7 @@ export function OpenManagePlanetArtifactsButton({ modal={modal} title='Artifacts' shortcutKey={TOGGLE_PLANET_ARTIFACTS_PANE} - element={} + element={() => } helpContent={ManagePlanetArtifactsHelpContent()} /> ); diff --git a/src/Frontend/Components/Text.tsx b/src/Frontend/Components/Text.tsx index f61a3429..ce16409c 100644 --- a/src/Frontend/Components/Text.tsx +++ b/src/Frontend/Components/Text.tsx @@ -147,14 +147,6 @@ export const HideSmall = styled.span` } `; -// todo make this work nicely with react router links -export const BasicLink = styled.u` - cursor: pointer; - &:hover { - cursor: pointer; - } -`; - export function TxLink({ tx }: { tx: SubmittedTx }) { return ( <> @@ -230,7 +222,7 @@ export const LongDash = () => ( ); export const Coords = ({ coords: { x, y } }: { coords: WorldCoords }) => ( - <> - ({x}, {y}) - + + ({x}, {y}) + ); diff --git a/src/Frontend/Components/TextLoadingBar.tsx b/src/Frontend/Components/TextLoadingBar.tsx index 0080df9d..f465abc5 100644 --- a/src/Frontend/Components/TextLoadingBar.tsx +++ b/src/Frontend/Components/TextLoadingBar.tsx @@ -41,12 +41,16 @@ export function TextLoadingBarImpl( return ( - [{progressText}] {percentText}% {prettyEntityName} + [{progressText}]{' '} + + {percentText}%{' '} + + {prettyEntityName} ); } const LoadingTitle = styled.div` display: inline-block; - color: ${dfstyles.colors.subtext}; + color: ${dfstyles.colors.text}; `; diff --git a/src/Frontend/Game/Popups.ts b/src/Frontend/Game/Popups.ts index a909251f..2499b8d0 100644 --- a/src/Frontend/Game/Popups.ts +++ b/src/Frontend/Game/Popups.ts @@ -53,7 +53,9 @@ export async function openConfirmationWindowForTransaction( }, 100); }); } else { - throw new Error('You need to enable popups to confirm this transaction.'); + throw new Error( + "Please enable popups to confirm this transaction. After you've done so, try again." + ); } } } diff --git a/src/Frontend/Pages/GameLandingPage.tsx b/src/Frontend/Pages/GameLandingPage.tsx index 258db7e5..45d12bcb 100644 --- a/src/Frontend/Pages/GameLandingPage.tsx +++ b/src/Frontend/Pages/GameLandingPage.tsx @@ -131,14 +131,14 @@ export function GameLandingPage() { terminal.current?.newline(); terminal.current?.print(' '); - terminal.current?.print('Version', TerminalTextStyle.Underline); + terminal.current?.print('Version', TerminalTextStyle.Sub); terminal.current?.print(' '); - terminal.current?.print('Date', TerminalTextStyle.Underline); + terminal.current?.print('Date', TerminalTextStyle.Sub); terminal.current?.print(' '); - terminal.current?.print('Champion', TerminalTextStyle.Underline); + terminal.current?.print('Champion', TerminalTextStyle.Sub); terminal.current?.newline(); - terminal.current?.print(' v0.1 '); + terminal.current?.print(' v0.1 ', TerminalTextStyle.White); terminal.current?.print('02/05/2020 ', TerminalTextStyle.White); terminal.current?.printLink( 'Dylan Field', @@ -148,9 +148,9 @@ export function GameLandingPage() { TerminalTextStyle.White ); terminal.current?.newline(); - terminal.current?.print(' v0.2 '); + terminal.current?.print(' v0.2 ', TerminalTextStyle.White); terminal.current?.println('06/06/2020 Nate Foss', TerminalTextStyle.White); - terminal.current?.print(' v0.3 '); + terminal.current?.print(' v0.3 ', TerminalTextStyle.White); terminal.current?.print('08/07/2020 ', TerminalTextStyle.White); terminal.current?.printLink( '[ANON] Singer', @@ -160,7 +160,7 @@ export function GameLandingPage() { TerminalTextStyle.White ); terminal.current?.newline(); - terminal.current?.print(' v0.4 '); + terminal.current?.print(' v0.4 ', TerminalTextStyle.White); terminal.current?.print('10/02/2020 ', TerminalTextStyle.White); terminal.current?.printLink( 'Jacob Rosenthal', @@ -170,18 +170,18 @@ export function GameLandingPage() { TerminalTextStyle.White ); terminal.current?.newline(); - terminal.current?.print(' v0.5 '); + terminal.current?.print(' v0.5 ', TerminalTextStyle.White); terminal.current?.print('12/25/2020 ', TerminalTextStyle.White); terminal.current?.printElement( ); terminal.current?.println(''); - terminal.current?.print(' v0.6 r1 '); + terminal.current?.print(' v0.6 r1 ', TerminalTextStyle.White); terminal.current?.print('05/22/2021 ', TerminalTextStyle.White); terminal.current?.printLink( 'Ansgar Dietrichs', @@ -198,11 +198,14 @@ export function GameLandingPage() { terminal.current?.println(``); if (accounts.length > 0) { - terminal.current?.println('(a) Login with existing account.'); + terminal.current?.print('(a) ', TerminalTextStyle.Sub); + terminal.current?.println('Login with existing account.'); } - terminal.current?.println(`(n) Generate new burner wallet account.`); - terminal.current?.println(`(i) Import private key.`); + terminal.current?.print('(n) ', TerminalTextStyle.Sub); + terminal.current?.println(`Generate new burner wallet account.`); + terminal.current?.print('(i) ', TerminalTextStyle.Sub); + terminal.current?.println(`Import private key.`); terminal.current?.println(``); terminal.current?.println(`Select an option:`, TerminalTextStyle.White); @@ -226,7 +229,8 @@ export function GameLandingPage() { terminal.current?.println(``); const accounts = getAccounts(); for (let i = 0; i < accounts.length; i += 1) { - terminal.current?.println(`(${i + 1}): ${accounts[i].address}`); + terminal.current?.print(`(${i + 1}): `, TerminalTextStyle.Sub); + terminal.current?.println(`${accounts[i].address}`); } terminal.current?.println(``); terminal.current?.println(`Select an account:`, TerminalTextStyle.White); @@ -619,16 +623,16 @@ export function GameLandingPage() { terminal.current?.newline(); - terminal.current?.println( - 'We collect a minimal set of statistics such as SNARK proving' + - ' times and average transaction times across browsers, to help ' + - 'us optimize performance and fix bugs. You can opt out of ' + - 'this in the settings pane.' - ); + terminal.current?.println('We collect a minimal set of statistics such as SNARK proving'); + terminal.current?.println('times and average transaction times across browsers, to help '); + terminal.current?.println('us optimize performance and fix bugs. You can opt out of this'); + terminal.current?.println('in the Settings pane.'); + terminal.current?.println(''); terminal.current?.newline(); terminal.current?.println('Press ENTER to find a home planet. This may take up to 120s.'); + terminal.current?.println('This will consume a lot of CPU.'); await terminal.current?.getInput(); @@ -638,13 +642,12 @@ export function GameLandingPage() { .joinGame(async (e) => { console.error(e); - terminal.current?.println( - '[ERROR] please enable popups to confirm the transaction.', - TerminalTextStyle.Red - ); - terminal.current?.println( - 'Press ENTER to try again. The previous popup is invalidated.' - ); + terminal.current?.println('Error Joining Game:'); + terminal.current?.println(''); + terminal.current?.println(e.message, TerminalTextStyle.Red); + terminal.current?.println(''); + terminal.current?.println('Press Enter to Try Again:'); + await terminal.current?.getInput(); return true; }) @@ -660,7 +663,6 @@ export function GameLandingPage() { }); if (success) { - terminal.current?.println('Found suitable home planet!'); terminal.current?.println('Initializing game...'); setStep(TerminalPromptStep.ALL_CHECKS_PASS); } diff --git a/src/Frontend/Pages/LandingPage.tsx b/src/Frontend/Pages/LandingPage.tsx index 56900356..db2263de 100644 --- a/src/Frontend/Pages/LandingPage.tsx +++ b/src/Frontend/Pages/LandingPage.tsx @@ -51,7 +51,7 @@ export default function LandingPage() {

- zkSNARK space warfare (v0.6 Round 2) + zkSNARK space warfare (v0.6 round 3)

@@ -137,7 +137,7 @@ export default function LandingPage() { - v0.6 Round 2 + v0.6 round 3 06/28/2021 diff --git a/src/Frontend/Pages/TestArtifactImages.tsx b/src/Frontend/Pages/TestArtifactImages.tsx index 53cbd56e..8caef488 100644 --- a/src/Frontend/Pages/TestArtifactImages.tsx +++ b/src/Frontend/Pages/TestArtifactImages.tsx @@ -1,4 +1,4 @@ -import { EMPTY_LOCATION_ID } from '@darkforest_eth/constants'; +import { EMPTY_ARTIFACT_ID } from '@darkforest_eth/constants'; import { ArtifactRarity, ArtifactType, Biome } from '@darkforest_eth/types'; import React, { useEffect } from 'react'; import styled from 'styled-components'; @@ -59,7 +59,7 @@ function ArtifactPreviewer({ artifactType: type, planetBiome: biome, rarity, - id: EMPTY_LOCATION_ID, + id: EMPTY_ARTIFACT_ID, }, ArtifactFileColor.BLUE, { forceAncient: ancient === true, skipCaching: true } diff --git a/src/Frontend/Panes/ArtifactDetailsPane.tsx b/src/Frontend/Panes/ArtifactDetailsPane.tsx index a44aeb9e..bd1a9d59 100644 --- a/src/Frontend/Panes/ArtifactDetailsPane.tsx +++ b/src/Frontend/Panes/ArtifactDetailsPane.tsx @@ -118,7 +118,7 @@ const StyledArtifactDetailsBody = styled.div` `; const ArtifactName = styled.div` - color: white; + color: ${dfstyles.colors.text}; font-weight: bold; `; diff --git a/src/Frontend/Panes/ClaimPlanetPane.tsx b/src/Frontend/Panes/ClaimPlanetPane.tsx new file mode 100644 index 00000000..f9f9b1a8 --- /dev/null +++ b/src/Frontend/Panes/ClaimPlanetPane.tsx @@ -0,0 +1,109 @@ +import { PLANET_CLAIM_MIN_LEVEL } from '@darkforest_eth/constants'; +import { LocationId } from '@darkforest_eth/types'; +import React from 'react'; +import { isLocatable } from '../../_types/global/GlobalTypes'; +import { Btn } from '../Components/Btn'; +import { EmSpacer, PaddedRecommendedModalWidth } from '../Components/CoreUI'; +import { AccountLabel } from '../Components/Labels/Labels'; +import { MythicLabelText } from '../Components/Labels/MythicLabel'; +import { LoadingSpinner } from '../Components/LoadingSpinner'; +import { + usePlanet, + usePlayer, + usePopAllOnSelectedPlanetChanged, + useUIManager, +} from '../Utils/AppHooks'; +import { ModalHandle } from '../Views/ModalPane'; + +export function ClaimPlanetPane({ + planetId, + modal, +}: { + modal: ModalHandle; + planetId?: LocationId; +}) { + usePopAllOnSelectedPlanetChanged(modal, planetId); + const uiManager = useUIManager(); + const gameManager = uiManager.getGameManager(); + const planetWrapper = usePlanet(uiManager, planetId); + const planet = planetWrapper.value; + const player = usePlayer(uiManager); + + if (!planetId || !planet || !isLocatable(planet) || !player.value) return null; + + const center = { x: 0, y: 0 }; + const distanceFromCenter = Math.floor(gameManager.getDistCoords(planet.location.coords, center)); + const currentPlayerScore = player.value.score || 0; + const isClaimingNow = + !!planet?.unconfirmedClaim || !!gameManager.getGameObjects().getUnconfirmedClaim(); + const isClaimingThisPlanetNow = !!planet?.unconfirmedClaim; + const existingClaim = gameManager.getClaimedLocations().get(planetId); + const claimedByThisPlayer = + (!!existingClaim && existingClaim.revealer === player.value?.address) || + (planet.claimer === player.value?.address && !!planet.claimer); + const claimedByOtherPlayer = !!existingClaim && existingClaim.revealer !== player.value?.address; + const planetIsLargeEnough = planet.planetLevel >= PLANET_CLAIM_MIN_LEVEL; + const disableClaimButton = !planetIsLargeEnough || claimedByThisPlayer || isClaimingNow; + const isCloserThanPlayersCurrentClosest = currentPlayerScore > distanceFromCenter; + + let description = <>; + let claimButtonContent = <>; + + if (planet.planetLevel < PLANET_CLAIM_MIN_LEVEL) { + description = ( + <> + Unfortunately, you cannot claim it planet because it is below level {PLANET_CLAIM_MIN_LEVEL} + . Find a bigger planet to claim! + + ); + } else if (claimedByOtherPlayer && existingClaim) { + description = ( + <> + This planet is claimed by ! You can + claim it for yourself, making it count towards your score, and not theirs. + + ); + } else if (claimedByThisPlayer) { + description = <>You've claimed this planet!; + } else if (currentPlayerScore === 0) { + description = ( + <>You haven't claimed a planet yet. Claiming this planet gets you on the board! + ); + } else { + description = ( + <> + Your current closest planet is{' '} + away from the center. This + planet is {isCloserThanPlayersCurrentClosest ? 'closer' : 'further'} away from the center + than your closet planet. + {isCloserThanPlayersCurrentClosest && ' Claim it to move up on the leaderboard!'} + + ); + } + + if (planet.planetLevel < PLANET_CLAIM_MIN_LEVEL) { + claimButtonContent = <>Too Small; + } else if (isClaimingNow && !isClaimingThisPlanetNow) { + claimButtonContent = <>Claiming Other Planet; + } else if (isClaimingNow) { + claimButtonContent = ; + } else { + claimButtonContent = <>Claim Planet; + } + + if (claimedByOtherPlayer && existingClaim) { + } + + return ( + + This planet is away from the + center! + + {description} + + gameManager.claimLocation(planetId)}> + {claimButtonContent} + + + ); +} diff --git a/src/Frontend/Panes/ExplorePane.tsx b/src/Frontend/Panes/ExplorePane.tsx index 6333a01c..910b5ebb 100644 --- a/src/Frontend/Panes/ExplorePane.tsx +++ b/src/Frontend/Panes/ExplorePane.tsx @@ -3,8 +3,7 @@ import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; import TutorialManager, { TutorialState } from '../../Backend/GameLogic/TutorialManager'; import { SpiralPattern } from '../../Backend/Miner/MiningPatterns'; -import { Spacer } from '../Components/CoreUI'; -import { IconButton } from '../Components/IconButton'; +import { EmSpacer, ShortcutButton } from '../Components/CoreUI'; import { PauseIcon, PlayIcon, TargetIcon } from '../Components/Icons'; import { Coords, Sub } from '../Components/Text'; import WindowManager, { CursorState, TooltipName, WindowManagerEvent } from '../Game/WindowManager'; @@ -12,6 +11,7 @@ import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; import { MIN_CHUNK_SIZE } from '../Utils/constants'; import { MultiSelectSetting, Setting, useBooleanSetting } from '../Utils/SettingsHooks'; +import { TOGGLE_EXPLORE, TOGGLE_TARGETTING } from '../Utils/ShortcutConstants'; import UIEmitter, { UIEmitterEvent } from '../Utils/UIEmitter'; import { TooltipTrigger } from './Tooltip'; @@ -36,7 +36,7 @@ function Cores() { return ( { - return hashRate.toFixed(0).toLocaleString(); + return Math.floor(hashRate).toLocaleString(); }; return ( <> - {getHashes()} - + {getHashes()} + #/s @@ -83,19 +83,10 @@ export function ExplorePane() { const uiManager = useUIManager(); const windowManager = WindowManager.getInstance(); const uiEmitter = UIEmitter.getInstance(); - + const [pattern, setPattern] = useState(undefined); const [mining] = useBooleanSetting(uiManager, Setting.IsMining); + const [targetting, setTargetting] = useState(false); - const minerButtonClicked = () => { - if (mining) uiManager?.stopExplore(); - else { - uiManager?.startExplore(); - const tutorialManager = TutorialManager.getInstance(); - tutorialManager.acceptInput(TutorialState.MinerPause); - } - }; - - const [pattern, setPattern] = useState(undefined); useEffect(() => { if (!uiManager) return; setPattern(uiManager.getMiningPattern() as SpiralPattern | undefined); @@ -117,18 +108,22 @@ export function ExplorePane() { tutorialManager.acceptInput(TutorialState.MinerMove); }; + const cursorStateChanged = (state: CursorState) => { + setTargetting(state === CursorState.TargetingExplorer); + }; + uiEmitter.on(UIEmitterEvent.WorldMouseDown, doMouseDown); windowManager.on(WindowManagerEvent.MiningCoordsUpdate, updatePattern); + uiEmitter.on(WindowManagerEvent.StateChanged, cursorStateChanged); return () => { uiEmitter.removeListener(UIEmitterEvent.WorldMouseDown, doMouseDown); windowManager.removeListener(WindowManagerEvent.MiningCoordsUpdate, updatePattern); + uiEmitter.removeListener(WindowManagerEvent.StateChanged, cursorStateChanged); }; }, [uiEmitter, windowManager, uiManager]); const doTarget = (_e: React.MouseEvent) => { - if (windowManager.getCursorState() === CursorState.TargetingExplorer) - windowManager.setCursorState(CursorState.Normal); - else windowManager.setCursorState(CursorState.TargetingExplorer); + uiManager.toggleTargettingExplorer(); }; const getCorner = (pattern: SpiralPattern): WorldCoords => ({ @@ -140,50 +135,39 @@ export function ExplorePane() { return pattern ? getCorner(pattern) : { x: 0, y: 0 }; }; - const minerMoveText = - windowManager.getCursorState() === CursorState.TargetingExplorer - ? 'Moving Explorer...' - : 'Move Explorer'; - const playPauseText = mining ? 'Pause' : 'Explore!'; return ( {/* button which allows player to preposition the center of their miner */} - - {minerMoveText} - + + {targetting ? 'Moving...' : 'Move'} + - + - + {/* button which toggles whether or not the game is mining. this persists between refreshes */} - - {playPauseText} {mining ? : } - + {mining ? 'Pause' : 'Explore!'} {' '} + {mining ? : } + {mining && ( <> - + - + - + )} diff --git a/src/Frontend/Panes/HelpPane.tsx b/src/Frontend/Panes/HelpPane.tsx index c23710e9..d0eaa1d3 100644 --- a/src/Frontend/Panes/HelpPane.tsx +++ b/src/Frontend/Panes/HelpPane.tsx @@ -5,6 +5,7 @@ import { ScoreLabel } from '../Components/Labels/KeywordLabels'; import { LegendaryLabel } from '../Components/Labels/LegendaryLabel'; import { MythicLabel } from '../Components/Labels/MythicLabel'; import { White } from '../Components/Text'; +import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; import { ModalHook, ModalName, ModalPane } from '../Views/ModalPane'; @@ -15,6 +16,7 @@ const HelpContent = styled(Padded)` max-width: 500px; overflow-y: scroll; text-align: justify; + color: ${dfstyles.colors.text}; `; export function HelpPane({ hook }: { hook: ModalHook }) { @@ -30,7 +32,6 @@ export function HelpPane({ hook }: { hook: ModalHook }) { )}
- Official Info and Announcements
@@ -50,7 +51,6 @@ export function HelpPane({ hook }: { hook: ModalHook }) { Some planets contain Artifacts - ERC721 tokens that can be traded with other players. Artifacts can be harvested and deposited onto planets, buffing their stats. Harvesting artifacts also increases your -
@@ -63,7 +63,6 @@ export function HelpPane({ hook }: { hook: ModalHook }) { from the universe, plus additional bonuses for finding artifacts. Artifacts of different rarities are worth different amounts of points: Common are 5k, Rare are 20k, Epic are 200k, are 3M, and are 20M. -
diff --git a/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactActions.tsx b/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactActions.tsx index f112b4c2..a95d5370 100644 --- a/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactActions.tsx +++ b/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactActions.tsx @@ -148,7 +148,14 @@ export function ArtifactActions({ hoverDelay={TOOLTIP_SLOW} hoverContents={() => {a.tooltip}} > - {a.icon} + { + a.action(); + e.stopPropagation(); + }} + > + {a.icon} + ))} diff --git a/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactListItem.tsx b/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactListItem.tsx index 1a128f54..a4af0042 100644 --- a/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactListItem.tsx +++ b/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactListItem.tsx @@ -1,6 +1,6 @@ import { Artifact } from '@darkforest_eth/types'; import React from 'react'; -import styled, { css } from 'styled-components'; +import styled from 'styled-components'; import { isActivated } from '../../../Backend/GameLogic/ArtifactUtils'; import { artifactName } from '../../../Backend/Procedural/ArtifactProcgen'; import { ArtifactImage } from '../../Components/ArtifactImage'; @@ -11,7 +11,7 @@ import { ArtifactTypeText, } from '../../Components/Labels/ArtifactLabels'; import { LoadingSpinner } from '../../Components/LoadingSpinner'; -import { Smaller, Sub } from '../../Components/Text'; +import { Green, Smaller, Sub } from '../../Components/Text'; import dfstyles from '../../Styles/dfstyles'; import { ModalHandle } from '../../Views/ModalPane'; import { ArtifactDetailsHelpContent, ArtifactDetailsPane } from '../ArtifactDetailsPane'; @@ -39,22 +39,24 @@ export function ArtifactListItem({ } return ( - - - modal.push({ - title: 'Artifact Details', - element: , - helpContent: ArtifactDetailsHelpContent(), - }) - } - > + + modal.push({ + title: 'Artifact Details', + element: function artifactDetails() { + return ; + }, + helpContent: ArtifactDetailsHelpContent(), + }) + } + > + - {artifactName(artifact)} - + {isActivated(artifact) && active} {artifactName(artifact)}{' '} {' '} @@ -78,6 +80,7 @@ export function ArtifactListItem({ const SecondRow = styled.div` line-height: 0; margin-top: 4px; + margin-bottom: 4px; `; const ArtifactContent = styled.div` @@ -87,6 +90,7 @@ const ArtifactContent = styled.div` overflow: hidden; white-space: nowrap; flex-grow: 1; + padding: 2px 4px; `; const ArtifactImageContainer = styled.div` @@ -95,10 +99,9 @@ const ArtifactImageContainer = styled.div` justify-content: center; align-items: center; width: 45px; - height: 100%; box-sizing: border-box; cursor: pointer; - border-right: 1px solid ${dfstyles.colors.border}; + border-right: 1px solid ${dfstyles.colors.borderDark}; &:hover { background-color: ${dfstyles.colors.artifactBackground}; @@ -106,19 +109,20 @@ const ArtifactImageContainer = styled.div` `; const ArtifactContainer = styled.div` - ${({ isActive }: { isActive?: boolean }) => css` - position: relative; - height: 45px; - background-color: ${isActive - ? dfstyles.colors.backgroundlighter - : dfstyles.colors.backgroundlight}; - display: flex; - flex-direction: row; - width: 100%; - margin-bottom: 2px; - border-radius: 3px; + position: relative; + display: flex; + flex-direction: row; + width: 100%; + margin-bottom: 2px; + border-radius: 3px; + border: 1px solid ${dfstyles.colors.borderDark}; + background-color: ${dfstyles.colors.backgroundlight}; + cursor: pointer; + + &:hover { border: 1px solid ${dfstyles.colors.border}; - `} + background-color: ${dfstyles.colors.backgroundlighter}; + } `; const Center = styled.div` diff --git a/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactsList.tsx b/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactsList.tsx index 52bdfe10..8defed86 100644 --- a/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactsList.tsx +++ b/src/Frontend/Panes/ManagePlanetArtifacts/ArtifactsList.tsx @@ -37,7 +37,8 @@ export function ArtifactsList({ {sortedArtifacts.length === 0 && ( - No Artifacts + No Artifacts
+ On This Planet
)} {sortedArtifacts.map((a, i) => ( diff --git a/src/Frontend/Panes/PlanetContextPane.tsx b/src/Frontend/Panes/PlanetContextPane.tsx index 1cbdb9c9..75c14b3c 100644 --- a/src/Frontend/Panes/PlanetContextPane.tsx +++ b/src/Frontend/Panes/PlanetContextPane.tsx @@ -4,7 +4,7 @@ import GameUIManager from '../../Backend/GameLogic/GameUIManager'; import { Wrapper } from '../../Backend/Utils/Wrapper'; import { Padded, PaddedRecommendedModalWidth, Spacer, VerticalSplit } from '../Components/CoreUI'; import { - OpenBroadcastPaneButton, + OpenClaimPlanetPane, OpenHatPaneButton, OpenManagePlanetArtifactsButton, OpenUpgradeDetailsPaneButton, @@ -58,7 +58,7 @@ function PlanetContextPaneContent({ - + , diff --git a/src/Frontend/Panes/PlanetDexPane.tsx b/src/Frontend/Panes/PlanetDexPane.tsx index 95d520fa..d58fee68 100644 --- a/src/Frontend/Panes/PlanetDexPane.tsx +++ b/src/Frontend/Panes/PlanetDexPane.tsx @@ -1,3 +1,4 @@ +import { RECOMMENDED_MODAL_WIDTH } from '@darkforest_eth/constants'; import { Planet, PlanetType } from '@darkforest_eth/types'; import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; @@ -264,7 +265,7 @@ export function PlanetDexPane({ hook }: { hook: ModalHook }) { if (planets.length === 0) { content = ( - + Loading Your Home Planet... ); diff --git a/src/Frontend/Panes/PlayerInfoPane.tsx b/src/Frontend/Panes/PlayerInfoPane.tsx index ed706f5d..d252e1c1 100644 --- a/src/Frontend/Panes/PlayerInfoPane.tsx +++ b/src/Frontend/Panes/PlayerInfoPane.tsx @@ -52,7 +52,7 @@ export function PlayerInfoPane({ hook: twitterHook }: { hook: ModalHook }) { const updateEnergyAndSilver = () => { setEnergy(uiManager.getEnergyOfPlayer(account)); setSilver(uiManager.getSilverOfPlayer(account)); - _setScore(uiManager.getWithdrawnSilverOfPlayer(account)); + _setScore(uiManager.getPlayerScore(account)); }; const energySilverInterval = setInterval(updateEnergyAndSilver, 60 * 1000); diff --git a/src/Frontend/Panes/PluginEditorPane.tsx b/src/Frontend/Panes/PluginEditorPane.tsx index 2fab0f46..12fd68bd 100644 --- a/src/Frontend/Panes/PluginEditorPane.tsx +++ b/src/Frontend/Panes/PluginEditorPane.tsx @@ -17,7 +17,7 @@ require('prismjs/themes/prism-dark.css'); */ const EditorContainer = styled.div` overflow-y: scroll; - border: 1px solid ${dfstyles.colors.border}; + border: 1px solid ${dfstyles.colors.borderDark}; border-radius: ${dfstyles.borderRadius}; width: 500px; height: 500px; diff --git a/src/Frontend/Panes/PluginLibraryPane.tsx b/src/Frontend/Panes/PluginLibraryPane.tsx index c07966b0..f301f7bf 100644 --- a/src/Frontend/Panes/PluginLibraryPane.tsx +++ b/src/Frontend/Panes/PluginLibraryPane.tsx @@ -172,7 +172,7 @@ export function PluginLibraryPane({ } return ( - + <> Add Plugin
- + ); } diff --git a/src/Frontend/Panes/SettingsPane.tsx b/src/Frontend/Panes/SettingsPane.tsx index 579fb2be..dcef6516 100644 --- a/src/Frontend/Panes/SettingsPane.tsx +++ b/src/Frontend/Panes/SettingsPane.tsx @@ -9,7 +9,6 @@ import { Padded, Section, SectionHeader, Spacer } from '../Components/CoreUI'; import { Input } from '../Components/Input'; import { Green, Red } from '../Components/Text'; import Viewport, { getDefaultScroll } from '../Game/Viewport'; -import dfstyles from '../Styles/dfstyles'; import { useAccount, useUIManager } from '../Utils/AppHooks'; import { useEmitterValue } from '../Utils/EmitterHooks'; import { BooleanSetting, MultiSelectSetting, Setting } from '../Utils/SettingsHooks'; @@ -27,7 +26,6 @@ const SettingsContent = styled(Padded)` overflow-y: scroll; display: flex; flex-direction: column; - color: ${dfstyles.colors.subtext}; text-align: justify; `; diff --git a/src/Frontend/Panes/Tooltip.tsx b/src/Frontend/Panes/Tooltip.tsx index 62291018..76c5586c 100644 --- a/src/Frontend/Panes/Tooltip.tsx +++ b/src/Frontend/Panes/Tooltip.tsx @@ -1,8 +1,7 @@ -import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; +import React, { useEffect, useLayoutEffect, useRef, useState } from 'react'; import styled, { css, keyframes } from 'styled-components'; import WindowManager, { TooltipName, WindowManagerEvent } from '../Game/WindowManager'; import dfstyles, { snips } from '../Styles/dfstyles'; -import { useControlDown } from '../Utils/AppHooks'; import { GameWindowZIndex } from '../Utils/constants'; import { TooltipContent } from './TooltipPanes'; @@ -38,26 +37,13 @@ const StyledTooltipTrigger = styled.span<{ display: ${(props) => props.display || 'inline'}; `; -export function TooltipTrigger({ - children, - name, - needsCtrl, - display, - style, - className, -}: TooltipProps) { - // the model for this is a state machine on the state of {hovering, ctrl -> shouldShow} - const ctrl = useControlDown(); - const shouldShow = useMemo(() => !needsCtrl || (needsCtrl && ctrl), [ctrl, needsCtrl]); - const [hovering, setHovering] = useState(false); - - const active = useMemo(() => shouldShow && hovering, [shouldShow, hovering]); - +export function TooltipTrigger({ children, name, display, style, className }: TooltipProps) { const windowManager = WindowManager.getInstance(); + const [hovering, setHovering] = useState(false); useEffect(() => { - windowManager.setTooltip(active ? name : TooltipName.None); - }, [active, windowManager, name]); + windowManager.setTooltip(hovering ? name : TooltipName.None); + }, [hovering, windowManager, name]); return ( 1) { cR.queueCircleWorld({ x, y }, range, [...energy, 255], 1, 1, true); diff --git a/src/Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer.ts b/src/Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer.ts index b567abdb..fb2da24d 100644 --- a/src/Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer.ts +++ b/src/Frontend/Renderers/GameRenderer/Entities/SpacetimeRipRenderer.ts @@ -37,7 +37,7 @@ export class SpacetimeRipRenderer extends GenericRenderer(); @@ -169,11 +169,6 @@ export function useArtifact(uiManager: GameUIManager, artifactId: ArtifactId) { return artifact; } -/** Return a bool that indicates if the control key is pressed. */ -export function useControlDown(): boolean { - return useKeyPressed(ctrlDown$, ctrlUp$); -} - // TODO cache this globally /** Loads the leaderboard */ @@ -210,3 +205,16 @@ export function usePopAllOnSelectedPlanetChanged( } }, [selected, modal, startingId]); } + +/** + * Calls {@code onCompleted} when the user sends a move via the ui. + */ +export function useOnSendCompleted(onCompleted: () => void) { + useEffect(() => { + const uiEmitter = UIEmitter.getInstance(); + uiEmitter.on(UIEmitterEvent.SendCompleted, onCompleted); + return () => { + uiEmitter.removeListener(UIEmitterEvent.SendCompleted, onCompleted); + }; + }, [onCompleted]); +} diff --git a/src/Frontend/Utils/EmitterHooks.ts b/src/Frontend/Utils/EmitterHooks.ts index 833429e4..5a8981d1 100644 --- a/src/Frontend/Utils/EmitterHooks.ts +++ b/src/Frontend/Utils/EmitterHooks.ts @@ -9,9 +9,7 @@ import { Wrapper } from '../../Backend/Utils/Wrapper'; */ export function useEmitterSubscribe(emitter: Monomitter, callback: Callback) { useEffect(() => { - const sub = emitter.subscribe(callback); - - return sub.unsubscribe; + return emitter.subscribe(callback).unsubscribe; }, [emitter, callback]); } @@ -53,27 +51,3 @@ export function useWrappedEmitter( return val; } - -/** - * Return a bool indicating if a key is pressed - * @param keydown$ keydown monomitter - * @param keyup$ keyup monomitter - */ -export function useKeyPressed( - keydown$: Monomitter, - keyup$: Monomitter -): boolean { - const [pressed, setPressed] = useState(false); - - useEffect(() => { - const downSub = keydown$.subscribe((_e) => setPressed(true)); - const upSub = keyup$.subscribe((_e) => setPressed(false)); - - return () => { - downSub.unsubscribe(); - upSub.unsubscribe(); - }; - }, [keydown$, keyup$]); - - return pressed; -} diff --git a/src/Frontend/Utils/KeyEmitters.ts b/src/Frontend/Utils/KeyEmitters.ts index 8cb7485a..4f2b09de 100644 --- a/src/Frontend/Utils/KeyEmitters.ts +++ b/src/Frontend/Utils/KeyEmitters.ts @@ -1,15 +1,39 @@ import { monomitter } from '@darkforest_eth/events'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { Wrapper } from '../../Backend/Utils/Wrapper'; import { useEmitterSubscribe } from './EmitterHooks'; -/* key emitters */ -export const escapeDown$ = monomitter(); -export const ctrlDown$ = monomitter(); -export const ctrlUp$ = monomitter(); +export const SpecialKey = { + Space: ' ', + Tab: 'Tab', + Escape: 'Escape', + Control: 'Control', + Shift: 'Shift', +} as const; + export const keyUp$ = monomitter>(); export const keyDown$ = monomitter>(); +const onKeyUp = (e: KeyboardEvent) => { + if (!shouldIgnoreShortcutKeypress(e)) + keyUp$.publish(new Wrapper(getSpecialKeyFromEvent(e) || e.key.toLowerCase())); +}; + +const onKeyDown = (e: KeyboardEvent) => { + if (!shouldIgnoreShortcutKeypress(e)) + keyDown$.publish(new Wrapper(getSpecialKeyFromEvent(e) || e.key.toLowerCase())); +}; + +export function listenForKeyboardEvents() { + document.addEventListener('keydown', onKeyDown); + document.addEventListener('keyup', onKeyUp); +} + +export function unlinkKeyboardEvents() { + document.removeEventListener('keydown', onKeyDown); + document.removeEventListener('keyup', onKeyUp); +} + /** * If the user is using their keyboard to input some text somewhere, we should NOT trigger the * shortcuts. @@ -18,30 +42,31 @@ function shouldIgnoreShortcutKeypress(e: KeyboardEvent): boolean { const targetElement = e.target as HTMLElement; if (targetElement.tagName === 'INPUT') return targetElement.attributes.getNamedItem('type')?.value !== 'range'; - return targetElement.tagName === 'TEXTAREA'; } -document.addEventListener('keydown', (e: KeyboardEvent) => { - if (shouldIgnoreShortcutKeypress(e)) return; - - if (e.key === 'Escape') escapeDown$.publish(e); - else if (e.key === 'Control') ctrlDown$.publish(e); - keyDown$.publish(new Wrapper(e.key)); -}); - -document.addEventListener('keyup', (e: KeyboardEvent) => { - if (shouldIgnoreShortcutKeypress(e)) return; - - if (e.key === 'Control') ctrlUp$.publish(e); - keyUp$.publish(new Wrapper(e.key)); -}); +function getSpecialKeyFromEvent(e: KeyboardEvent): string | undefined { + if ((Object.values(SpecialKey) as string[]).includes(e.key)) { + return e.key; + } +} export function useIsDown(key?: string) { const [isDown, setIsDown] = useState(false); - useEmitterSubscribe(keyDown$, (k) => key !== undefined && k.value === key && setIsDown(true)); useEmitterSubscribe(keyUp$, (k) => key !== undefined && k.value === key && setIsDown(false)); - return isDown; } + +export function useOnUp(key?: string, onUp?: () => void) { + useEffect(() => { + const onKeyUp = (e: KeyboardEvent) => { + if (e.key.toLowerCase() === key && !shouldIgnoreShortcutKeypress(e)) { + onUp && onUp(); + } + }; + + document.addEventListener('keyup', onKeyUp); + return () => document.removeEventListener('keyup', onKeyUp); + }, [key, onUp]); +} diff --git a/src/Frontend/Utils/ShortcutConstants.ts b/src/Frontend/Utils/ShortcutConstants.ts index 06b0c0a7..ec2cf41a 100644 --- a/src/Frontend/Utils/ShortcutConstants.ts +++ b/src/Frontend/Utils/ShortcutConstants.ts @@ -1,30 +1,24 @@ -import { useEffect, useRef } from 'react'; -import { useEmitterValue } from './EmitterHooks'; -import { keyUp$ } from './KeyEmitters'; +import { SpecialKey } from './KeyEmitters'; + +// modal shortcuts +export const MODAL_BACK_SHORTCUT = 't'; +export const CLOSE_MODAL = 't'; +export const TOGGLE_SETTINGS_PANE = 'h'; +export const TOGGLE_HELP_PANE = 'j'; +export const TOGGLE_PLUGINS_PANE = 'k'; +export const TOGGLE_YOUR_ARTIFACTS_PANE = 'l'; +export const TOGGLE_YOUR_PLANETS_DEX_PANE = ';'; // planet context pane shortcuts -export const MODAL_BACK_SHORTCUT = 'r'; export const TOGGLE_PLANET_ARTIFACTS_PANE = 's'; export const TOGGLE_HAT_PANE = 'x'; export const TOGGLE_BROADCAST_PANE = 'z'; export const TOGGLE_UPGRADES_PANE = 'a'; export const TOGGLE_SEND = 'q'; +export const EXIT_PANE = SpecialKey.Escape; +export const TOGGLE_CLAIM_PLANET_PANE = 'c'; // global shortcuts -export const TOGGLE_PLANET_DEX_PANE = 'p'; -export const TOGGLE_ARTIFACTS_DEX_PANE = 'o'; export const TOGGLE_DIAGNOSTICS_PANE = 'i'; - -export function useSubscribeToShortcut(key: string | undefined, callback: () => void) { - const keyUp = useEmitterValue(keyUp$, undefined); - const lastKeyUp = useRef(keyUp); - - useEffect(() => { - if (!keyUp || !key) return; - if (lastKeyUp.current === keyUp) return; - if (keyUp.value !== key) return; - - lastKeyUp.current = keyUp; - callback(); - }, [key, keyUp, lastKeyUp, callback]); -} +export const TOGGLE_EXPLORE = SpecialKey.Space; +export const TOGGLE_TARGETTING = '`'; diff --git a/src/Frontend/Utils/TerminalTypes.ts b/src/Frontend/Utils/TerminalTypes.ts index e29e8d7a..561d5add 100644 --- a/src/Frontend/Utils/TerminalTypes.ts +++ b/src/Frontend/Utils/TerminalTypes.ts @@ -1,11 +1,12 @@ export const enum TerminalTextStyle { Green, Sub, + Subber, White, Red, Blue, Invisible, - Default, Underline, Hoverable, + Mythic, } diff --git a/src/Frontend/Utils/constants.ts b/src/Frontend/Utils/constants.ts index b985fceb..9b69328d 100644 --- a/src/Frontend/Utils/constants.ts +++ b/src/Frontend/Utils/constants.ts @@ -1,12 +1,9 @@ import * as bigInt from 'big-integer'; -/** - * To code reviewer, make sure this does not change! - * - * To developer, increase this number to a large power of two. This, in combination with setting - * `DISABLE_ZK_CHECKS` in darkforest.toml, will make you mine the map at ULTRA SPEED! - */ -const MIN_CHUNK_SIZE = 256; +// To developer, increase this number to 256. This, in combination with setting `DISABLE_ZK_CHECKS` +// in darkforest.toml, will make you mine the map at ULTRA SPEED! +// To code reviewer, make sure this does not change in a PR to develop! +const MIN_CHUNK_SIZE = 16; /** * @tutorial to speed up the game's background rendering code, it is possible to set this value to diff --git a/src/Frontend/Views/ArtifactLink.tsx b/src/Frontend/Views/ArtifactLink.tsx index 3fe96d6c..3f445d1c 100644 --- a/src/Frontend/Views/ArtifactLink.tsx +++ b/src/Frontend/Views/ArtifactLink.tsx @@ -1,7 +1,7 @@ import { Artifact } from '@darkforest_eth/types'; import React, { useCallback } from 'react'; -import styled from 'styled-components'; import { artifactName } from '../../Backend/Procedural/ArtifactProcgen'; +import { Link } from '../Components/CoreUI'; import { ArtifactDetailsPane } from '../Panes/ArtifactDetailsPane'; import dfstyles from '../Styles/dfstyles'; import { ModalHandle } from './ModalPane'; @@ -17,20 +17,16 @@ export function ArtifactLink({ }) { const onClick = useCallback(() => { modal.push({ - element: , + element() { + return ; + }, title: artifactName(artifact), }); }, [artifact, modal]); - return {children}; + return ( + + {children} + + ); } - -const LinkContainer = styled.span` - color: ${dfstyles.colors.subtext}; - cursor: pointer; - - &:hover { - text-decoration: underline; - color: white; - } -`; diff --git a/src/Frontend/Views/DarkForestTips.tsx b/src/Frontend/Views/DarkForestTips.tsx index b5ad05ca..c0363a8d 100644 --- a/src/Frontend/Views/DarkForestTips.tsx +++ b/src/Frontend/Views/DarkForestTips.tsx @@ -1,26 +1,15 @@ import _ from 'lodash'; import React, { useCallback, useEffect, useState } from 'react'; import styled from 'styled-components'; -import { HeaderText, Spacer, TextButton } from '../Components/CoreUI'; +import { HeaderText, Link, Spacer, TextButton } from '../Components/CoreUI'; import dfstyles from '../Styles/dfstyles'; const TipText = styled.div` max-width: 500px; - color: ${dfstyles.colors.subtext}; word-break: keep-all; text-align: justify; `; -const Link = styled.a` - color: ${dfstyles.colors.subtext}; - cursor: pointer; - text-decoration: underline; - - &:hover { - color: white; - } -`; - const CYCLE_TIPS_INTERVAL = 10 * 1000; export function DarkForestTips() { @@ -48,7 +37,7 @@ export function DarkForestTips() { return ( - Dark Forest Tips{' '} + Dark Forest Tips{' '} incrementTipIndex(-1, true)}>previous @@ -71,7 +60,7 @@ const PrevNextContainer = styled.div` const TipsContainer = styled.div` margin-bottom: 8px; - background-color: ${dfstyles.colors.backgroundlighter}; + background-color: ${dfstyles.colors.backgrounddark}; width: 400px; height: 250px; padding: 16px; @@ -84,10 +73,7 @@ const tips = [ 'Beware of pirates! To capture a planet with pirates, simply send an attack large enough to overcome its current energy.', <> Navigate the Dark Forest with allies (and enemies) - join the{' '} - - Dark Forest Discord - - ! + Dark Forest Discord! , 'There are many different artifact types, each with unique properties... try activating one on a planet!', 'You can talk to artifacts that you own. They are powered by GPT3. Try it out from the Artifact Details pane!', @@ -107,11 +93,7 @@ const tips = [ 'You can import and export maps! Be careful importing maps from others, they may contain fabricated map data.', <> If mining the universe is slow on your computer, you can try the Remote Miner plugin. Find that - and other plugins on{' '} - - plugins.zkga.me - - . + and other plugins on plugins.zkga.me. , "A planet can only have 6 artifacts on it at any given time. Sometimes more if you get lucky. It's the blockchain, after all.", 'A foundry must be prospected before you can attempt to find an artifact, but make sure to click "Find" before 256 blocks or it will be lost forever.', @@ -125,17 +107,11 @@ const tips = [ "Try running df.setMinerCores(8) in either the Dark Forest terminal, or your browser's developer tools console. This will make the game utilize more cores to mine the universe, mining it faster!", <> Writing plugins? Check out some documentation{' '} - + here {' '} and{' '} - + here . diff --git a/src/Frontend/Views/GameWindowLayout.tsx b/src/Frontend/Views/GameWindowLayout.tsx index e883cf77..9be96a2d 100644 --- a/src/Frontend/Views/GameWindowLayout.tsx +++ b/src/Frontend/Views/GameWindowLayout.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import styled from 'styled-components'; -import { BorderlessPane, EmSpacer } from '../Components/CoreUI'; +import { BorderlessPane } from '../Components/CoreUI'; import { CanvasContainer, CanvasWrapper, @@ -26,21 +26,20 @@ import { TutorialPane } from '../Panes/TutorialPane'; import { TwitterVerifyPane } from '../Panes/TwitterVerifyPane'; import { ZoomPane } from '../Panes/ZoomPane'; import { useSelectedPlanet, useUIManager } from '../Utils/AppHooks'; +import { useOnUp } from '../Utils/KeyEmitters'; import { Setting, useBooleanSetting } from '../Utils/SettingsHooks'; import { - TOGGLE_ARTIFACTS_DEX_PANE, TOGGLE_DIAGNOSTICS_PANE, - TOGGLE_PLANET_DEX_PANE, - useSubscribeToShortcut, + TOGGLE_EXPLORE, + TOGGLE_HELP_PANE, + TOGGLE_PLUGINS_PANE, + TOGGLE_SETTINGS_PANE, + TOGGLE_TARGETTING, + TOGGLE_YOUR_ARTIFACTS_PANE, + TOGGLE_YOUR_PLANETS_DEX_PANE, } from '../Utils/ShortcutConstants'; -import { - ModalHelpIcon, - ModalPlanetDexIcon, - ModalPluginIcon, - ModalSettingsIcon, - ModalYourArtifactsIcon, -} from './ModalIcon'; import { NotificationsPane } from './Notifications'; +import { SidebarPane } from './SidebarPane'; import { TopBar } from './TopBar'; export function GameWindowLayout({ @@ -61,8 +60,6 @@ export function GameWindowLayout({ const uiManager = useUIManager(); const newPlayerHook = useBooleanSetting(uiManager, Setting.NewPlayer); const tutorialHook = useBooleanSetting(uiManager, Setting.TutorialOpen); - const [sidebarHovered, setSidebarHovered] = useState(false); - const selected = useSelectedPlanet(uiManager).value; const selectedPlanetHook = useState(!!selected); const diagnosticsHook = useState(false); @@ -88,34 +85,56 @@ export function GameWindowLayout({ useEffect(() => setSelectedPlanetVisible(!!selected), [selected, setSelectedPlanetVisible]); - useSubscribeToShortcut( - TOGGLE_PLANET_DEX_PANE, + const setSettingsHookOpen = settingsHook[1]; + useOnUp( + TOGGLE_SETTINGS_PANE, useCallback(() => { - planetdexHook[1](true); - }, [planetdexHook]) + setSettingsHookOpen((value) => !value); + }, [setSettingsHookOpen]) ); - useSubscribeToShortcut( - TOGGLE_ARTIFACTS_DEX_PANE, + const setHelpHookOpen = helpHook[1]; + useOnUp( + TOGGLE_HELP_PANE, useCallback(() => { - yourArtifactsHook[1](true); - }, [yourArtifactsHook]) + setHelpHookOpen((value) => !value); + }, [setHelpHookOpen]) ); - useSubscribeToShortcut( - TOGGLE_DIAGNOSTICS_PANE, + const setPluginsHookOpen = pluginsHook[1]; + useOnUp( + TOGGLE_PLUGINS_PANE, useCallback(() => { - diagnosticsHook[1](true); - }, [diagnosticsHook]) + setPluginsHookOpen((value) => !value); + }, [setPluginsHookOpen]) ); - function onSidebarMouseEnter() { - setSidebarHovered(true); - } + const setPlanetDexOpen = planetdexHook[1]; + useOnUp( + TOGGLE_YOUR_PLANETS_DEX_PANE, + useCallback(() => { + setPlanetDexOpen((value) => !value); + }, [setPlanetDexOpen]) + ); - function onSidebarMouseLeave() { - setSidebarHovered(false); - } + const setYourArtifactsOpen = yourArtifactsHook[1]; + useOnUp( + TOGGLE_YOUR_ARTIFACTS_PANE, + useCallback(() => { + setYourArtifactsOpen((value) => !value); + }, [setYourArtifactsOpen]) + ); + + const setDiagnosticsHookOpen = diagnosticsHook[1]; + useOnUp( + TOGGLE_DIAGNOSTICS_PANE, + useCallback(() => { + setDiagnosticsHookOpen((value) => !value); + }, [setDiagnosticsHookOpen]) + ); + + useOnUp(TOGGLE_EXPLORE, uiManager.toggleExplore.bind(uiManager)); + useOnUp(TOGGLE_TARGETTING, uiManager.toggleTargettingExplorer.bind(uiManager)); return ( @@ -157,63 +176,13 @@ export function GameWindowLayout({ - - - - - - - - - - - - - - + @@ -231,16 +200,6 @@ export function GameWindowLayout({ ); } -const WindowTogglesPaneContainer = styled.div` - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - position: absolute; - top: 0; - left: 0; -`; - const TopBarPaneContainer = styled.div` display: flex; justify-content: center; diff --git a/src/Frontend/Views/Leaderboard.tsx b/src/Frontend/Views/Leaderboard.tsx index 466e224f..39299199 100644 --- a/src/Frontend/Views/Leaderboard.tsx +++ b/src/Frontend/Views/Leaderboard.tsx @@ -27,13 +27,11 @@ export function LeadboardDisplay() { ); } -function scoreToString(score: number) { - score = Math.floor(score); - - if (score === 0) { +function scoreToString(score?: number | null) { + if (score === null || score === undefined) { return 'n/a'; } - + score = Math.floor(score); if (score < 10000) { return score + ''; } diff --git a/src/Frontend/Views/ModalIcon.tsx b/src/Frontend/Views/ModalIcon.tsx index ed125fe7..c49cda62 100644 --- a/src/Frontend/Views/ModalIcon.tsx +++ b/src/Frontend/Views/ModalIcon.tsx @@ -1,7 +1,7 @@ import React from 'react'; import styled from 'styled-components'; -import { Spacer } from '../Components/CoreUI'; -import { IconButton } from '../Components/IconButton'; +import { BtnProps } from '../Components/Btn'; +import { ShortcutButton, Spacer } from '../Components/CoreUI'; import { ArtifactIcon, BroadcastIcon, @@ -24,52 +24,58 @@ const ModalIconText = styled.span` flex-grow: 1; `; -export function ModalIcon({ - modal, - hook: [active, setActive], - text, - style, -}: { - modal: ModalName; - hook: ModalHook; - text?: string; - style?: React.CSSProperties; -}) { - const icon = (): React.ReactNode => { - if (modal === ModalName.Help) return ; - else if (modal === ModalName.PlanetDetails) return ; - else if (modal === ModalName.Leaderboard) return ; - else if (modal === ModalName.PlanetDex) return ; - else if (modal === ModalName.UpgradeDetails) return ; - else if (modal === ModalName.TwitterVerify) return ; - else if (modal === ModalName.Broadcast) return ; - else if (modal === ModalName.MapShare) return ; - else if (modal === ModalName.ManageAccount) return ; - else if (modal === ModalName.Hats) return ; - else if (modal === ModalName.Settings) return ; - else if (modal === ModalName.Plugins) return ; - else if (modal === ModalName.YourArtifacts) return ; - else if (modal === ModalName.WithdrawSilver) return ; - return T; - }; +const icon = (modal: ModalName): React.ReactNode => { + if (modal === ModalName.Help) return ; + else if (modal === ModalName.PlanetDetails) return ; + else if (modal === ModalName.Leaderboard) return ; + else if (modal === ModalName.PlanetDex) return ; + else if (modal === ModalName.UpgradeDetails) return ; + else if (modal === ModalName.TwitterVerify) return ; + else if (modal === ModalName.Broadcast) return ; + else if (modal === ModalName.MapShare) return ; + else if (modal === ModalName.ManageAccount) return ; + else if (modal === ModalName.Hats) return ; + else if (modal === ModalName.Settings) return ; + else if (modal === ModalName.Plugins) return ; + else if (modal === ModalName.YourArtifacts) return ; + else if (modal === ModalName.WithdrawSilver) return ; + return T; +}; + +/** + * A button which allows you to open a modal. + */ +export function ModalToggleButton( + props: { + modal: ModalName; + hook: ModalHook; + text?: string; + style?: React.CSSProperties; + shortcutKey?: string; + } & BtnProps +) { + const { + modal, + hook: [_active, setActive], + text, + } = props; return ( - { - setActive((b) => !b); + setActive((b: boolean) => !b); e.stopPropagation(); }} - className={active ? 'active' : undefined} > - {icon()} + {icon(modal)} {text !== undefined && ( {text} )} - + ); } @@ -77,190 +83,328 @@ export function ModalArtifactIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function ModalHelpIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function ModalPlanetDetailsIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function ModalLeaderboardIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function ModalPlanetDexIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function ModalUpgradeDetailsIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function ModalMapShareIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } -export function ModalTwitterVerifyIcon({ - hook, - text, - style, -}: { - hook: ModalHook; - text?: string; - style?: React.CSSProperties; -}) { - return ; +export function ModalTwitterVerifyIcon( + props: { + hook: ModalHook; + text?: string; + style?: React.CSSProperties; + shortcutKey?: string; + } & BtnProps +) { + const { hook, text, style, shortcutKey } = props; + + return ( + + ); } export function ModalYourArtifactsIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function BroadcastPlanetIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function ModalAccountIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; -} - -export function ModalHatIcon({ - hook, - text, - style, -}: { - hook: ModalHook; - text?: string; - style?: React.CSSProperties; -}) { - return ; + return ( + + ); } export function ModalSettingsIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function ModalPluginIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function ModalArtifactsConversationIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } export function ModalWithdrawIcon({ hook, text, style, + shortcutKey, }: { hook: ModalHook; text?: string; style?: React.CSSProperties; + shortcutKey?: string; }) { - return ; + return ( + + ); } diff --git a/src/Frontend/Views/ModalPane.tsx b/src/Frontend/Views/ModalPane.tsx index 20d61a52..717f6cda 100644 --- a/src/Frontend/Views/ModalPane.tsx +++ b/src/Frontend/Views/ModalPane.tsx @@ -2,19 +2,20 @@ import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useSta import styled, { css } from 'styled-components'; import { Hook } from '../../_types/global/GlobalTypes'; import { Btn } from '../Components/Btn'; -import { CenteredText, EmSpacer, KeyboardBtn, Spacer, Truncate } from '../Components/CoreUI'; -import { PaneProps } from '../Components/GameWindowComponents'; import { - CloseCircleIcon, - MaximizeCircleIcon, - MinimizeCircleIcon, - QuestionCircleIcon, -} from '../Components/Icons'; + AlignCenterHorizontally, + CenteredText, + EmSpacer, + ShortcutKeyDown, + Spacer, + Truncate, +} from '../Components/CoreUI'; +import { PaneProps } from '../Components/GameWindowComponents'; import WindowManager from '../Game/WindowManager'; import dfstyles from '../Styles/dfstyles'; import { GameWindowZIndex } from '../Utils/constants'; -import { useIsDown } from '../Utils/KeyEmitters'; -import { MODAL_BACK_SHORTCUT, useSubscribeToShortcut } from '../Utils/ShortcutConstants'; +import { useOnUp } from '../Utils/KeyEmitters'; +import { MODAL_BACK_SHORTCUT } from '../Utils/ShortcutConstants'; import { DFErrorBoundary } from './DFErrorBoundary'; export type ModalHook = Hook; @@ -84,30 +85,6 @@ const InfoSectionContent = styled.div` color: ${dfstyles.colors.subtext}; `; -const BUTTON_SIZE = 24; - -const ModalButton = styled.div` - cursor: pointer; - width: ${BUTTON_SIZE}px; - height: ${BUTTON_SIZE}px; - border-radius: ${BUTTON_SIZE / 2}px; - justify-content: center; - align-items: center; - display: flex; - line-height: ${BUTTON_SIZE}px; - text-align: center; - vertical-align: center; - font-size: 1.5em; - - span svg path { - fill: ${dfstyles.colors.subbertext} !important; - } - - span:hover svg path { - fill: white !important; - } -`; - const ModalButtonsContainer = styled.div` ${({ minimized }: { minimized: boolean }) => css` ${minimized @@ -137,12 +114,12 @@ const Modal = styled.div` background: ${dfstyles.colors.background}; border-radius: ${dfstyles.borderRadius}; border: 1px solid ${dfstyles.colors.borderDark}; + color: ${dfstyles.colors.text}; `; const Title = styled(Truncate)` flex-grow: 1; text-align: left; - color: ${dfstyles.colors.subtext}; `; /** @@ -205,7 +182,7 @@ export type ModalProps = PaneProps & { */ export interface ModalFrame { title: string; - element: React.ReactElement; + element: () => React.ReactElement; helpContent?: React.ReactElement; } @@ -270,6 +247,7 @@ export function ModalPane({ () => ({ pop: () => { setFrames((frames) => { + if (frames.length === 0) return frames; frames = [...frames]; frames.pop(); return frames; @@ -279,6 +257,7 @@ export function ModalPane({ setFrames((frames) => { frames = [...frames]; frames.push(args); + return frames; }); }, @@ -385,7 +364,7 @@ export function ModalPane({ } push(); - }, [containerRef, windowManager, push, initialPosition]); + }, [containerRef, windowManager, push, initialPosition, hasSetInitialPosition]); // push to top useLayoutEffect(() => { @@ -416,56 +395,41 @@ export function ModalPane({ containerRef.current.offsetHeight, ]); + useOnUp(MODAL_BACK_SHORTCUT, () => { + api.pop(); + }); + useEffect(() => { - const topFrame = frames[frames.length - 1]; - setRenderedFrame((topFrame && topFrame.element) || undefined); - setRenderedFrameHelp((topFrame && topFrame.helpContent) || undefined); + setTimeout(() => { + const topFrame = frames[frames.length - 1]; + setRenderedFrame((topFrame && topFrame.element()) || undefined); + setRenderedFrameHelp((topFrame && topFrame.helpContent) || undefined); + }, 0); }, [frames, api]); const content = ( -
- {renderedFrame} - {!renderedFrame && ( -
- {typeof children === 'function' ? children(api) : children} -
- )} -
- ); - - function getFrameTitle(args: ModalFrame) { - return ` > ${args.title}`; - } - const modalTitleElement = typeof title === 'string' ? title : title(frames.length > 0); - const allSubModalTitleElements = frames.map(getFrameTitle); - const isBackShortcutDown = useIsDown(MODAL_BACK_SHORTCUT); - useSubscribeToShortcut( - MODAL_BACK_SHORTCUT, - useCallback(() => { - api.pop(); - }, [api]) - ); - - const mainTitle = ( <> - {frames.length > 0 && ( + {visible && !minimized && !showingHelp && ( <> - { - api.pop(); - }} - > - Back - {MODAL_BACK_SHORTCUT} - - + {renderedFrame} + {!renderedFrame && (typeof children === 'function' ? children(api) : children)} )} - {modalTitleElement} ); + function getFrameTitle(args?: ModalFrame) { + if (!args) return undefined; + return `${args.title}`; + } + + const modalTitleElement = typeof title === 'string' ? title : title(frames.length > 0); + const allSubModalTitleElements = []; + + if (frames.length > 0) { + allSubModalTitleElements.push(getFrameTitle(frames[frames.length - 1])); + } + return ( - {mainTitle} + {frames.length > 0 && ( + <> + <AlignCenterHorizontally> + <Btn + noBorder + small + onClick={() => { + api.pop(); + }} + > + <CenteredText>Back</CenteredText> + </Btn> + <EmSpacer width={0.5} /> + <ShortcutKeyDown shortcutKey={MODAL_BACK_SHORTCUT} /> + </AlignCenterHorizontally> + <EmSpacer width={1} /> + </> + )} + <Truncate maxWidth={allSubModalTitleElements.length !== 0 ? '50px' : undefined}> + {modalTitleElement} + </Truncate> + {allSubModalTitleElements.length !== 0 && <EmSpacer width={0.5} />} {allSubModalTitleElements} - <Spacer width={16} /> + <EmSpacer width={1} /> {/* render the 'close' and 'help me' buttons, depending on whether or not they're relevant */} - {helpContent !== undefined && ( + {helpContent !== undefined && !minimized && ( <> - setShowingInformationSection((showing) => !showing)}> - - + setShowingInformationSection((showing) => !showing)} + small + > + help + )} - setMinimized((minimized) => !minimized)}> - {minimized ? : } - + setMinimized((minimized) => !minimized)} small> + {minimized ? 'maximize' : 'minimize'} + {!hideClose && ( <> - setVisible(false)}> - - + setVisible(false)} small> + close + )} @@ -536,7 +525,7 @@ export function ModalPane({ {renderedFrameHelp || (helpContent && helpContent())} -
); diff --git a/src/Frontend/Views/SendResources.tsx b/src/Frontend/Views/SendResources.tsx index b5d0b4bb..36caf0a0 100644 --- a/src/Frontend/Views/SendResources.tsx +++ b/src/Frontend/Views/SendResources.tsx @@ -6,15 +6,7 @@ import { formatNumber } from '../../Backend/Utils/Utils'; import { Wrapper } from '../../Backend/Utils/Wrapper'; import { Hook } from '../../_types/global/GlobalTypes'; import { ArtifactImage } from '../Components/ArtifactImage'; -import { Btn } from '../Components/Btn'; -import { - AlignCenterHorizontally, - CenteredText, - EmSpacer, - FullWidth, - ShortcutKeyDown, - Spacer, -} from '../Components/CoreUI'; +import { CenteredText, EmSpacer, FullWidth, ShortcutButton, Spacer } from '../Components/CoreUI'; import { EnergyIcon, SilverIcon } from '../Components/Icons'; import { LongDash, Sub, Subber } from '../Components/Text'; import WindowManager, { CursorState } from '../Game/WindowManager'; @@ -278,13 +270,15 @@ function SendRow({ )) || <>} - - - Send - - - - + + Send + ); diff --git a/src/Frontend/Views/Terminal.tsx b/src/Frontend/Views/Terminal.tsx index e77cb9d2..cfb518b1 100644 --- a/src/Frontend/Views/Terminal.tsx +++ b/src/Frontend/Views/Terminal.tsx @@ -5,7 +5,7 @@ import { Link } from '../Components/CoreUI'; import { Hoverable } from '../Components/Hoverable'; import { MythicLabelText } from '../Components/Labels/MythicLabel'; import { LoadingSpinner } from '../Components/LoadingSpinner'; -import { Blue, Green, Invisible, Red, Sub, Subber, White } from '../Components/Text'; +import { Blue, Green, Invisible, Red, Sub, Subber, Text, White } from '../Components/Text'; import { LoadingBarHandle, TextLoadingBar } from '../Components/TextLoadingBar'; import dfstyles from '../Styles/dfstyles'; import { isFirefox } from '../Utils/BrowserChecks'; @@ -77,7 +77,7 @@ function TerminalImpl({ promptCharacter }: TerminalProps, ref: React.Ref void) | undefined = undefined, hoverContents?: () => JSX.Element ) => { @@ -104,6 +104,9 @@ function TerminalImpl({ promptCharacter }: TerminalProps, ref: React.Ref{innerFragment}; break; + case TerminalTextStyle.Text: + fragment = {innerFragment}; + break; case TerminalTextStyle.White: fragment = {innerFragment}; break; diff --git a/src/Frontend/Views/TopBar.tsx b/src/Frontend/Views/TopBar.tsx index f6b03005..fb942472 100644 --- a/src/Frontend/Views/TopBar.tsx +++ b/src/Frontend/Views/TopBar.tsx @@ -1,7 +1,7 @@ import { EthAddress } from '@darkforest_eth/types'; import React from 'react'; import styled from 'styled-components'; -import { AlignCenterHorizontally, EmSpacer, Spacer } from '../Components/CoreUI'; +import { AlignCenterHorizontally, EmSpacer } from '../Components/CoreUI'; import { AccountLabel } from '../Components/Labels/Labels'; import { Sub, White } from '../Components/Text'; import { TooltipName } from '../Game/WindowManager'; @@ -16,15 +16,6 @@ const TopBarContainer = styled.div` padding: 0 2px; `; -function TopBarSection({ children }: { children: React.ReactNode }) { - return ( - <> - - {children} - - ); -} - function BoardPlacement({ account }: { account: EthAddress | undefined }) { const uiManager = useUIManager(); const player = usePlayer(uiManager, account); @@ -34,10 +25,15 @@ function BoardPlacement({ account }: { account: EthAddress | undefined }) { if (!player.value) { content = n/a; } else { + let formattedScore = 'n/a'; + if (player.value.score !== undefined && player.value.score !== null) { + formattedScore = player.value.score.toLocaleString(); + } + content = ( - {player.value.score ?? 'n/a'} pts + score: {formattedScore} ); @@ -50,14 +46,6 @@ const Points = styled.div` display: inline-block; `; -function ScoreSection({ account }: { account: EthAddress | undefined }) { - return ( - - - - ); -} - export function TopBar({ twitterVerifyHook }: { twitterVerifyHook: ModalHook }) { const uiManager = useUIManager(); const player = usePlayer(uiManager); @@ -68,18 +56,19 @@ export function TopBar({ twitterVerifyHook }: { twitterVerifyHook: ModalHook }) - + - + ); From a3320737cf0e97b7742035944aabae69d75d270b Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 12 Aug 2021 04:15:32 +0000 Subject: [PATCH 14/68] update client --- docs/modules/Frontend_Utils_constants.md | 2 +- last_updated.txt | 2 +- package.json | 20 ++++++++++---------- src/Frontend/Utils/constants.ts | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/modules/Frontend_Utils_constants.md b/docs/modules/Frontend_Utils_constants.md index 061eb18e..8bd4221f 100644 --- a/docs/modules/Frontend_Utils_constants.md +++ b/docs/modules/Frontend_Utils_constants.md @@ -41,4 +41,4 @@ the algorithms implemented in {@link ChunkUtils}. ### MIN_CHUNK_SIZE -• `Const` **MIN_CHUNK_SIZE**: `256` +• `Const` **MIN_CHUNK_SIZE**: `16` diff --git a/last_updated.txt b/last_updated.txt index 5c1be995..66458363 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Thu Aug 12 04:02:26 UTC 2021 +last updated: Thu Aug 12 04:15:32 UTC 2021 diff --git a/package.json b/package.json index 2ad25986..9ee15f54 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,19 @@ { "name": "client", - "version": "6.3.0-staging-aug-11.0", + "version": "6.3.0-staging-aug-11.1", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.3.0-staging-aug-11.0", - "@darkforest_eth/contracts": "6.3.0-staging-aug-11.0", - "@darkforest_eth/events": "6.3.0-staging-aug-11.0", - "@darkforest_eth/hashing": "6.3.0-staging-aug-11.0", - "@darkforest_eth/hexgen": "6.3.0-staging-aug-11.0", - "@darkforest_eth/network": "6.3.0-staging-aug-11.0", - "@darkforest_eth/serde": "6.3.0-staging-aug-11.0", - "@darkforest_eth/snarks": "6.3.0-staging-aug-11.0", - "@darkforest_eth/types": "6.3.0-staging-aug-11.0", + "@darkforest_eth/constants": "6.3.0-staging-aug-11.1", + "@darkforest_eth/contracts": "6.3.0-staging-aug-11.1", + "@darkforest_eth/events": "6.3.0-staging-aug-11.1", + "@darkforest_eth/hashing": "6.3.0-staging-aug-11.1", + "@darkforest_eth/hexgen": "6.3.0-staging-aug-11.1", + "@darkforest_eth/network": "6.3.0-staging-aug-11.1", + "@darkforest_eth/serde": "6.3.0-staging-aug-11.1", + "@darkforest_eth/snarks": "6.3.0-staging-aug-11.1", + "@darkforest_eth/types": "6.3.0-staging-aug-11.1", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", diff --git a/src/Frontend/Utils/constants.ts b/src/Frontend/Utils/constants.ts index c685cf63..9b69328d 100644 --- a/src/Frontend/Utils/constants.ts +++ b/src/Frontend/Utils/constants.ts @@ -3,7 +3,7 @@ import * as bigInt from 'big-integer'; // To developer, increase this number to 256. This, in combination with setting `DISABLE_ZK_CHECKS` // in darkforest.toml, will make you mine the map at ULTRA SPEED! // To code reviewer, make sure this does not change in a PR to develop! -const MIN_CHUNK_SIZE = 256; +const MIN_CHUNK_SIZE = 16; /** * @tutorial to speed up the game's background rendering code, it is possible to set this value to From b75476f9ac8641e724bd561a814ebcb86f2f79d6 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 12 Aug 2021 09:06:44 +0000 Subject: [PATCH 15/68] update client --- docs/README.md | 1 + .../classes/Frontend_Game_Viewport.default.md | 17 ---- .../Frontend_Components_PlanetPreview.md | 2 - .../Frontend_Views_LandingPageRoundArt.md | 17 ++++ last_updated.txt | 2 +- package.json | 20 ++--- public/round_art/round3.png | Bin 0 -> 3414139 bytes src/Backend/GameLogic/GameManager.ts | 8 +- src/Frontend/Components/Btn.tsx | 9 ++- src/Frontend/Components/PlanetPreview.tsx | 68 ++++++++++------ src/Frontend/Components/ReadMore.tsx | 6 +- src/Frontend/Components/Text.tsx | 2 +- src/Frontend/Game/Viewport.ts | 20 +---- src/Frontend/Pages/App.tsx | 2 +- src/Frontend/Pages/LandingPage.tsx | 73 ++++-------------- src/Frontend/Pages/PreviewPage.tsx | 2 +- src/Frontend/Pages/UnsubscribePage.tsx | 2 +- src/Frontend/Panes/BroadcastPane.tsx | 38 ++++----- src/Frontend/Panes/ClaimPlanetPane.tsx | 39 ++++------ src/Frontend/Panes/HatPane.tsx | 24 +++--- src/Frontend/Panes/HelpPane.tsx | 16 ++-- src/Frontend/Panes/PlanetContextPane.tsx | 55 ++++++++----- src/Frontend/Panes/TooltipPanes.tsx | 7 +- src/Frontend/Panes/TutorialPane.tsx | 6 +- src/Frontend/Panes/TwitterVerifyPane.tsx | 7 +- src/Frontend/Panes/UpgradeDetailsPane.tsx | 2 +- .../Renderers/GameRenderer/EngineConsts.ts | 2 +- src/Frontend/Views/LandingPageRoundArt.tsx | 34 ++++++++ src/Frontend/Views/Leaderboard.tsx | 24 ++++-- src/Frontend/Views/ModalPane.tsx | 16 ++-- src/Frontend/Views/PlanetCard.tsx | 61 +++++++++------ src/Frontend/Views/Terminal.tsx | 2 +- src/Frontend/Views/TopBar.tsx | 6 +- 33 files changed, 311 insertions(+), 279 deletions(-) create mode 100644 docs/modules/Frontend_Views_LandingPageRoundArt.md create mode 100644 public/round_art/round3.png create mode 100644 src/Frontend/Views/LandingPageRoundArt.tsx diff --git a/docs/README.md b/docs/README.md index fc35c123..f6d7fbd6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -232,6 +232,7 @@ - [Frontend/Views/EmojiPlanetNotification](modules/Frontend_Views_EmojiPlanetNotification.md) - [Frontend/Views/GameWindowLayout](modules/Frontend_Views_GameWindowLayout.md) - [Frontend/Views/GenericErrorBoundary](modules/Frontend_Views_GenericErrorBoundary.md) +- [Frontend/Views/LandingPageRoundArt](modules/Frontend_Views_LandingPageRoundArt.md) - [Frontend/Views/Leaderboard](modules/Frontend_Views_Leaderboard.md) - [Frontend/Views/ModalIcon](modules/Frontend_Views_ModalIcon.md) - [Frontend/Views/ModalPane](modules/Frontend_Views_ModalPane.md) diff --git a/docs/classes/Frontend_Game_Viewport.default.md b/docs/classes/Frontend_Game_Viewport.default.md index 77bb31e6..7b28eb2b 100644 --- a/docs/classes/Frontend_Game_Viewport.default.md +++ b/docs/classes/Frontend_Game_Viewport.default.md @@ -46,7 +46,6 @@ - [centerChunk](Frontend_Game_Viewport.default.md#centerchunk) - [centerCoords](Frontend_Game_Viewport.default.md#centercoords) - [centerPlanet](Frontend_Game_Viewport.default.md#centerplanet) -- [centerPlanetAnimated](Frontend_Game_Viewport.default.md#centerplanetanimated) - [getBottomBound](Frontend_Game_Viewport.default.md#getbottombound) - [getLeftBound](Frontend_Game_Viewport.default.md#getleftbound) - [getRightBound](Frontend_Game_Viewport.default.md#getrightbound) @@ -364,22 +363,6 @@ --- -### centerPlanetAnimated - -▸ **centerPlanetAnimated**(`planet`): `void` - -#### Parameters - -| Name | Type | -| :------- | :---------------------- | -| `planet` | `undefined` \| `Planet` | - -#### Returns - -`void` - ---- - ### getBottomBound ▸ **getBottomBound**(): `number` diff --git a/docs/modules/Frontend_Components_PlanetPreview.md b/docs/modules/Frontend_Components_PlanetPreview.md index a67fe439..142fdaaf 100644 --- a/docs/modules/Frontend_Components_PlanetPreview.md +++ b/docs/modules/Frontend_Components_PlanetPreview.md @@ -19,7 +19,6 @@ | :------------------------- | :---------------------- | | `__namedParameters` | `Object` | | `__namedParameters.planet` | `Planet` \| `undefined` | -| `__namedParameters.res` | `number` | | `__namedParameters.size` | `string` | #### Returns @@ -38,7 +37,6 @@ | :------------------------- | :---------------------- | | `__namedParameters` | `Object` | | `__namedParameters.planet` | `Planet` \| `undefined` | -| `__namedParameters.res` | `number` | #### Returns diff --git a/docs/modules/Frontend_Views_LandingPageRoundArt.md b/docs/modules/Frontend_Views_LandingPageRoundArt.md new file mode 100644 index 00000000..99739d1e --- /dev/null +++ b/docs/modules/Frontend_Views_LandingPageRoundArt.md @@ -0,0 +1,17 @@ +# Module: Frontend/Views/LandingPageRoundArt + +## Table of contents + +### Functions + +- [LandingPageRoundArt](Frontend_Views_LandingPageRoundArt.md#landingpageroundart) + +## Functions + +### LandingPageRoundArt + +▸ **LandingPageRoundArt**(): `Element` + +#### Returns + +`Element` diff --git a/last_updated.txt b/last_updated.txt index 66458363..143ce420 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Thu Aug 12 04:15:32 UTC 2021 +last updated: Thu Aug 12 09:06:44 UTC 2021 diff --git a/package.json b/package.json index 9ee15f54..4d117471 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,19 @@ { "name": "client", - "version": "6.3.0-staging-aug-11.1", + "version": "6.3.0-staging-aug-11.2", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.3.0-staging-aug-11.1", - "@darkforest_eth/contracts": "6.3.0-staging-aug-11.1", - "@darkforest_eth/events": "6.3.0-staging-aug-11.1", - "@darkforest_eth/hashing": "6.3.0-staging-aug-11.1", - "@darkforest_eth/hexgen": "6.3.0-staging-aug-11.1", - "@darkforest_eth/network": "6.3.0-staging-aug-11.1", - "@darkforest_eth/serde": "6.3.0-staging-aug-11.1", - "@darkforest_eth/snarks": "6.3.0-staging-aug-11.1", - "@darkforest_eth/types": "6.3.0-staging-aug-11.1", + "@darkforest_eth/constants": "6.3.0-staging-aug-11.2", + "@darkforest_eth/contracts": "6.3.0-staging-aug-11.2", + "@darkforest_eth/events": "6.3.0-staging-aug-11.2", + "@darkforest_eth/hashing": "6.3.0-staging-aug-11.2", + "@darkforest_eth/hexgen": "6.3.0-staging-aug-11.2", + "@darkforest_eth/network": "6.3.0-staging-aug-11.2", + "@darkforest_eth/serde": "6.3.0-staging-aug-11.2", + "@darkforest_eth/snarks": "6.3.0-staging-aug-11.2", + "@darkforest_eth/types": "6.3.0-staging-aug-11.2", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", diff --git a/public/round_art/round3.png b/public/round_art/round3.png new file mode 100644 index 0000000000000000000000000000000000000000..96eef2f9d335608c9f605c2f3a4230ec8084713b GIT binary patch literal 3414139 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%0Dx$`9L4p1BR$F!s- zqMM;j-A%KvAk$=Py-dd9wmI>W#^o1glHYGobySPakM@cB+O>Y~Mf1uZY|KyhvCdX6 zF!_}y25bdWmkbX5=`VISCK^xd*)n_=G$39YGjVU>(>k|y|90i908NpgGM)iQ*|bADb9h))YAoh|n*IDzoYu&GF6zjKc=CD~{H zqq$^7ue?#MLFM91hm5R{H^5*kToYEkhPZVZD#o!QHT@bo81d=jrvr-e5PHzm>b6Q~ zMp4{?=jUzjwG=hAZzIUpifG&uJBhE~ZX)UFoI`_}sE9%}a)yL+-1T+!{nl(JN19{K z-Jb$wc@cV79|f23Xo!EaCDLKi5_-7i|56nggat2`Qg0<*FhL@ebt)Z58vN#$wKZMM z0xn-Srqh74WcJx{iPox0@Fd?4vbwXa^Ma}+Zn@2Rx8{bD@RoVy8)aDr>*rER3MR?> zwV#1RA9k9J#)~WExoJIvh_;oj4{Gg$N+a^k^(+42Q z2lXhx4?oaOkk6D%DAhuL_=k7eq=z9k($ZYxn=+SL^NhW1o1$_Y=lTb!O_dAn1;-rQgzRZyf+E!uOiKL4dUnK&%Sww2UJq)N1vi_Ut)F zf2Oqul2eJt3x2^%#h96H_-L&5RkoQ7)A}#91W_8|oD+ci6%8C)@2|Igy>F7-FC{BO zeQk%=B27Gfa>S3}YWP#Ckn*Zax(V^fw{r5%&3qKEE!B{ZvE>2B>bb^naf@@mJI1zh zd(ma?%E^L>_u=ZN^2^WZ&DXN1Lwy{V%0jfWtm@ zU7P<>$&i1-_dWHl1C3ZX_=jn*p;dvE#Y+VOQ2p7N9Il^X*t`HaJHzjFBo>toi*uxi zX>r$*+$E9Tj+seWx7S||ELXE6V({dY|-p zOKUKfO;4sb(!Ifkeoy%KuCFI8w5RRt#@)Xy_$2YMYpRlK@U^}J1+((+Wy@taQNjOS zSY%$iK&5+26?3i5KDcDu)ukZ-dngN#K>69QO%$n~3Q{+maWb^u6k!h8S*Ixu1IepW z5ucV@TKI{Kg2*4-KnCElh_LI1k+%fL@=)1^CDq!zQtzypm9<{4QX?Ar?ii6890q>f zeneD$`tkLuxp0r)st?-`K#pO#cFO*W_cf=!=4l)j&fugkr zBoj%mV-QB!Pum>THtC5PCsfV=Gmf__P`~lN<%QH8Wjh~rZCy2%v5zAoF!h3V5wGF^ zKSQ09trxs^L+*4ZB4f7Ycx-=vJ&?hlJpSXey$2PAuVCp%n#!9s?fp9AO`HF$Czkg@LW-T$wOn!i?bii!DBa-7U0g_kNLM ztlIEuam8fwOZt&_qjG*Bu2;6i&}&UBz}jY4!DaETd*A>(L7fEQE^D<+m?4-qFJ2i0 z;(zMopPy!amHpJxHeKmTS|tCBGFc@+ZHs4gSP^8i&#r*^C(-`uj%LtS7*>DtADt6@ zw+s$x$SXpUAtK(1r}fl0)lO0ZP&@qUu(JF;kV@}R_EiYmQS#3MWPc9VaEP2j_}44c z1qhv!n{MVU^p+YkfYS59?F1Sp2#o(#>rOvl*47^UW0SlT30<;B1dWB8Ce}N(cYc>-${QD4SmAO@> zaYL^iQUBaF?Ca${jW_6^l~nId)@Ve$eOcMbW#$yrg4>iSQ%~7HL`58-C_*&`3t%`A(-DU`(df@Tok8O2ad(D`xV72SG-4y_9d(?HoMM!52@%H=3qZxrU*kI`ptF1Yy7{{r&@A{u!1=P#Krg0F;6lyyENG1%#mfS_t~q|HS@oLEX( z!N!~}tT|8sBDG13^CR!4zSUyXdiq;%vf&5Mfz(Dgr(*aa0s zm&G9wc%K2)>n-6g_ zLy>vx%;i5r%{7V_B@sulL6*o?2;YLYtAyV=j%--pKADg3xc;FZ0%m}b5rpvtz!{;Is@V;m_?f3)D< z`&a3Oir<-Zse1X+#afXlZLSDt0kAaQc$d4j^Rc2sS{={z$RIz`oUdxH9Q=IzgZVSJ zY&oEJ9Y~Ov?B6aS^FN=y8KI_istxe=+?EVe@9o0elJ8Q{BwZ)`eP$+26uZz>TI{Z^^BZK{xMtyo6Zjn1qO*>q_ z5~+;qyo zx^sJ|M=PDStl#}PlA%GGP|_8cQokxmT{xr4=3xI$TJk2ngM+cO>J4Vx_R!Mf%($(T z;;V2db>rEDh>SSh&<5&0+)t;lin05I#>-LTjQJ^zzTK1iOe4Df?RlL7HQl$}BQBbj zHzNxaa~9{PiQBnPxW0Dux56JWGAvw=wt9dTz*(mu6GTq$QZ#Zrx~TuGv482x8zWlg zE@$l+yVcKLin2~O0mJ@kJ1dJ9IZls%@aEQXX2iSqj+{3;KO)Se*+Uz(wkH3ML`BN& zCn{$1sb5dCgcNuaGKybnqeBc)4uch++w8x-jQkB+oOGxSqG%9x!@V)6}r+Q7k!tYsG>+wystME-y+ zGnFs4H}Fm7NHs?~vt(CnRnJ1vuLqfTKeIekx$&{6j3s1ztOGN`zTr0#2X{|!Yti(% z6!)qunC?`~p7(U;0{U>)fF?-u($4Q7hnfAU0H4jv=VuezvnjNP2b(NgThn*f#%ide zk6H9ShYKUuzt6c$FnG8N%o4A}y*h;LO5{g}{c(k!5t#b^j_o&dG47rboj%FE{apc} z2xXt0xXN&@Ug4ITHY9O^xm}zq9OSXWxmawdS3CKT>CQ(b{3Bq^%%Gq&}^Ba6FV&$+NxMflsgtn7DIXn2#G?7LA*3G*Uf5_*xFU^N3v?uj1 z66t$#!raOG^M&LuoWJioM`H%2Z=4%7H47rsN(D19#lGH;jCMCt*qdPq$^022VRLSshWRl|dC{*wU^ky-uDKk6V&UksEV%f2X@?Bj0U#r=O2*>zat#z2%=ESPaA3 zeI(?0i2pc#`q0jK9TGV38SuO$=XE*J$Iw~uoj{i=(G{VI+;C+^1WxIQH&87Zl5abQ zB}M{P^#&cJIwuM*(1aSp7Y@L5Dpo~s4VUI``BC5jMqy9IyG50)>Pacz{HOni!O z1|0K-)sh_{6iYy5xak6DbEW~%)-~yhia^w0V&e~e9b6<;`gP0D0oWxwW0{~s`9wZ- zW(R%4o=mSQX}?AJL_sAkj$%{07gJBf6`w_KiHH4Myc?>J>E~@n|8|cY{dn*!Qz=kAg=)zy*T_7A58!26)N8yC zIN~*cW)C{|{&_5}Vo3mgju`X{7Zf#--7>|t*QokGy+G+zl~Lrv#ndevBVUJ z^mWk&SkiOg2bosB@R6$tsmZbfG6X$_FELzlV>m0QUn%NL&TIO?XuKUTFgVGdpqyXf z*|Rri>KVQ1-g5{8MFby`a&6pyqfLuu@kFy?E!J<4RMa5W~f{_&fzeCY@vVVC*O1^2A@h}|4BLWx0&C?aU34c-4JLxR+9`l z;OhBdBiwg-J(5&Zw|mA0Q++TJxNiIrE%T_wXGdD{PK;99PJ-ySy+N2yrr1q1dk0`P z)ZgU-ofofh#XcYm|K}>~{0$1g)~C#<{I6{vs`TMC=fO37y?1yJWXvTja3iJ2ot!_~ zVS42FA4zRTSkYr{z>Aoa&9j0r!co+V-9*}q z>o9P-$DNwrEQ|?Rk9S6#^29r|Jbb%Kk*eXC34OAjv%U4}x$3;4pKMyVr2;z=p9lIwMf^epsamEcF57WD_PisUQk{)uY9EGh^opWMkod z4^3y4d_UOSSU`q_k(`@8c(~<2zPD}e38_*eIanbv(>oTg@plw6QtnnibAfJ63Mh)Q zPKT_*UN8PmB>>fPTut%oZU71wp zxw?+vdz6rjz!~RJ%T{+ZRkHD?CIra(hIq3sWfiGH7BrscXfPuamV7Jmcsfd}Bu7)= zFa2tuk{gNEzv&MaiH+4fhG0vUF$?7?yXkx6gb|6-!R}w=q>v?{hC zby$UpWTRWlv%{}Il>ZiS{8c61k*pbE#S6-(;;WU((e6g?eW z$yZIJq!m5gkFLGT&6W8LNd@;BBGrRl`I4(H_44A}tM)3l2h+aqP&_T+vh_59tYL0< z)=26yVfm27iw>rGkVJzAS}879xDUkd**PjU=C04#PO&R+w|`!@ow+RIf#T)nOQ~jH zy(l*jg1a4EP%j42d0g81b>jGs!78%;kH)o#ycyauCr zRX2|qi|%9dpF`+`pGjU*&x}eY#avTX<@HKVz7O}l_tu%VpSh65m<|pl;@{E(3yAg` z%aRsq87l1GUcAe`)s?Dp)k2Zyv@4ow%OA9qL)gXUr*Bv0wyN|rr$tVq#gg{~UwPW( z#miL@7hw2%XCbNqbRDFRw{suojj?^Y{bng6D{|uv{e2c@J)~*yD|8M1Fi`YcI=rgt zUY(_7;|E;yMc(e)L!*<16^rD7W2O#NZxwptw9lz)W88=m}T^ zuneWc{mK`{d=>id{?Cw{AhFr&Wl7Ay}%1J6Gn`4wK2R);OWzT{fkJ(!4#3nZ;F*o!K2%8Onnia zC%2N_SeWl?|Kp}qsbXl`hkQhud}^0BtfUco=OLp_Px+37+dD>E52oH)hgbIbkQI&1 z7G@Eb_e*}s0h>l|H!WqJ4?_F%0?58iE8i>}H_aQ2CRK~I=tA|3mfAU3zxC;w&&lro z{BqCUQR@7RO}rQzK;Cd$5?R=ZzngVhtj~zO@m?VeHDaG3v$!izFVyw?V5YVle{dc= z0j3%d-ANZ#voNyff8*jP1Gp=W5=^_2k~=E+`s684M`*eYn1PEol6y4l^IQ6$9V)d^81BEwG0hvaJBWi7v{3 zOtSXX!l@mloXq+T`n3Mk^GmyT^(rjMGv$()rjMC=Vfzj%S6(cy6K{e3qKL9A%Me>& z+?%!du{g>5apIc)JXKfj^3^Rlym!4PjTzMnn9-6K?XnrRr!Ooi5aSju=esWZc|m=^ zt@t7MOF7zJA-A)vK@~8qzfJ0u{Ken zi!-1EYIS|O^Lp5GX^(F843ogoQ-&><@7~6P$c+bZ$yymi<Eg-_;+gC3S_-Am-T?b_$8fIxe$VvjRU zx!RCqnWE>m?LV`4HN5Y1C#Ai0tLZj z@cow=1B9&=p*tAA`b`lvH6{LQU!?jTa94uTV=K^RC#V;dPV%}WyCS8wv(*LJ8p-KQ#AUWh99v*&IT z<AY0s@?NG;>K0&3U~gPz(6M%b z7-+o1OssbB?L5F6H7WjZg*fIb0h{(WSQJU>Kxp=sA3eqiRF-@-pB|Ie_&1hd(SS@u z(D&Z}lkYMkh<}{V7c%tW@ASz)=9NRWqzVL98C|UV{6J(6IOWNR)rx2C%pmO;g_s$p zgNG#-93A|zvQ9A8xYF@9rv!dFX*%n&pXQh)^w&Q-|KcM}M&iOqPGBgQ)klxCQ4fsM zXZ(pj`qisF3BVr^-KqNNkp>Hmk!vL5zjfZlmrbF=q15j$e9SaG<4rZJ`eau3oLwJ> z&&4gtmSpY^SJ!zRv!)0Z^79j^1_wR^PY6aS{_K04b4%zxnF}g^sxSR$oy6JFY{bXb z6?V{0KB;D;fR3|m@%7ShQA|FYx1Ox8fhj^i~F|yv;r2Hx8bYAjP6%yqyeZ9r9*0^=YV8ZKS-fzgtx|ZW0 z2{6p#2g_(Z6ZHOZ+YJgl;p5Snvg|L&Tw9m>;cJl*YUyyZ+N3rm9DxNz=OP(|rM@2i zw03)W7WT%mWZGNe`e@#3r*j@q?U{eC-3u*b^X#}6eAd0tw~MV#1fmG}5%y#GeD4hy zo7ki?;IPa^iud1$Hf4hg09=qArv(M2tOhJuT$(zmKIbTUqKu_4=ri+o(y$BgUz>J=6$3n z&jtA!DOGR9SXB?`_MjtHLh`>O2E@a{3Y>3JsQ#YY;HA$oftI_yh~<{DDC$a(u){?~ z1o9u&?&&3(^6p&wJt%jR$4i|JUgaOt^nv*xySBoE`9J|R>43dL@bhr-+@?e&u2@96(Fk5Ma}Lr`N*>;7S}LLM3&md>SQ z2bsI>_1%*BDZdhrf`*Z;bs*Z(7vk3~u%TSiOfok|NQ+wP)b#c6aEo`UP)>If^hKSz+&D;?ZeI$yQqB^sSrhqEA!p9U-Vg#F0@ znR7YZxM+uLs~jKdQeJuWk0{-~^z!P$W)k<7udiNW3WTA^LFQ%&Sygblz4Zg3#t~;S z^(#t|C)k#}s;4Zy^d8_IS+VBLQAb$XFX5eMhxbWn)%x}I^sjpo#i^6_z1ByEk8*Gc zPvlA&@)HG8ZaCr1%tm6tx$?pJ=B;fqTK4ha(yQI}C;(%sS?Ow-__*~*HU1?FcPldD z_Fk?OV@g{|#TO>5(mR!EGL?qi)|HQxN;M~NZ=OHbd2Th0296EhX6ay`A5v3h=a7|4 z)r6C>_hp{h0(;H z&FG-|FZ`j_7J}B$`wPhk8e+u*-rUrv$S$?F8V;QEBmJ*7mL})|!!MuqWL$N0f#`hd zy4H>3qldbu&aFg&;XUWU1!Lz*SDzF#pA6U!!-e0>)=^;4B&2fx?HVgGuXqR1&tcMN zvYZ9Eqs_S1lidhuamJLM$WE9*;pqL|p1DO;fsbPs{ep_tGVB_Lxk(5Fap825T2aIQ zDz-l>C548mJr4VV_s?zWCU%a;Be&_by{n$E@$v)$|Km z?uSoRqDcyuY!i?L=rrkmAS%nOvm;5xJzRa0&nR&d%GHsjAE?E96>B}nAu0x(T~zjF z*_SvFD)!!C?8O982WxZk>3mg&RUS<1@r^2J=K!03^=Ui$zT6Fm7nCO52)VMBI?_hV zM?SaZ#d6Q~#7yTHetu@y<^IZ$P*z#d$!SMtDOCqqC7+ z+hkzerKDF4(N{u{NY-VZybE^DcQw)q@8llU3$(TibL{t@GlLt$ZKY9jfcD;EP12>L}na6|RGQG6Dj z><$$YU=@i(kEmX(4y|3=usS<#xwuMB|N5fDGp3H|6MZ&ED)$L)x_0gEe~l1B%99C+1FZ*C&u#Xo437=FeZlCrf`+urljPaZJ5)Q19do;!nS$GrWn7c32s) zM?FfvZPuV;p0I&wkYD9Gs)~JdK^XkYY`%H#HlkuY>4V zl@oB@9@)YLr>O;Ugz{2u1*e@bR-!N`dgiXKcu zc!vwn)X=dVvLd@FHLIlUb2r`ULI60C{nP!gbf&^Ci3qSr>VEgA6yc+hGwMkwMOJ1_W&i3Dbdjj1<9HG#UQ_LqP z?{S{PR{;BfE7IUU3Ux=-=@d4Y>V>*T0#7QBrB=*W&$7qyNNb8tgp6w!%Bb_lyg*9y+QY_4k0HMCh0hnv1fvqG2U|DHVGtdVTwdk0} zSOj#M{|H*>(3&@0wt+3EBDjRZ%a6NCC_1}%P#_H=KzuHrZyZlGP+g;B#UbwumrO#4 zbcBp{yQew`ba;fgGh`cdz;r6XDj3_`flS;voA9@v+0Pwoao`z<%x&<3j|vK0{|4i$ z?05Cw(8gdx3oenets3~iUZ8AR3^e6|b(R3==d0wH>Q)d@d6Dz27#-&f%;9R%AXgbh z==rKOczQjD5bL#*`O!&o4mdLkTYz5xLf@YXp?mfxRNGZ^B8 zul_2o>G1D#j%@WYGI1xcK=RkfA&zu9s9X z^x_eZ_y~od0(uJ*a6gog0q}f%UoUTo;m}%+W(}Gs3!&=G|x(!z#!kSag<`gI+n*cKHvJ+i4S*XlBo zQT~6OJ57f~_`tmgTHT++1H#zC6PPM0j~->r6GYR4srBRsS$0zzf`mWul9;;(6+2oscRo@1}jt} z+j6mX?O@&#_tRI6ts#p?JOu`D(_OmtH~-v-X;S?DD!BhkA2No?r@4o$iK%Ei?ox~P--V#5qdH2TKUl|SOQ&R3n6sg>>&{9L;$7av0Sl)1c*xPXPxy$vKvo4Ae-E_1veH}p z&T=U&;kSAUiFD8PTgLm$Wu94k=SV0@l6P%A#r)yZ;16ty;dfQJ^LvVylMt1!4vPJ| zcs}7D>I9R&Onad-vzOiJ^HgW~@n^=KpS$utyQC-(!CNb}Z0p|99kXnr5~5Y{U9W zYM?oYHJ5{yGXQHv_%%a0HItDU?O(($qju|F#G&w&k*;F9aC_9wN5-h7z(d(0+GG~q zH*&_#3#UkG#XiE(wYBg-cJAG^H&<^zxMdWl?*$Wo_>O&0O6-c#lehP`544}EKmx{b z1xZefbz>IS`f+^EZYv!Mx0qHjg@rykDI9&e5VCAJCKpbx$HUz|+{chW_!m(wqaw`JoNwsF6g%~~93o-;{m|H!9Bx?8jjjZJg&)y}2;cGS!18 zIakzqv-yy>xoq09Xz-YJQt64PtLL-@wvdywMwGO6!zO(tu{-tQU8=ilN^EcEmX~G) zsXSApsZKr#tAC~AdmzG>M=Wj-#@dLs>sWyex=gD!@vP);%bv1Si~a!GZSHD zD_9uCxrK><`9v5Xa%~cdrg}HH2Z}tvyc1#gqZw_Fb%z1cql%qfYo9iyNncda`Ob7S zTZ50J{jXSWu=INedG1axpUDW6u&}W%7Ux?|%T-m+PEI27L96f}j0M}lzzMgGSlXiK ze5?~3z{4sJAf9%JjygLK-_;Arw%=N@eiPGyy(c4jy|vQRCR0DLnUt1(F+O@?&#-N4Y)dkHjDg#H)b?!(Dm~oDGaP~@mJZcS-iWWxz+{CgWy5>cJcgqsnKN=)Y zllJ)I(6S_8PfhY6`hSNVb`k8tqk2`K0cuJl=246QeeWl`|2}5J=AJpm;wpRD zDXCk)mijpS=oWQeO7@%WcwZDP-mxepyW2LmA5rQH2$a`WP`|_WKu_B+yldv^4lHJg z3j67WjKtX9 zk%`+x-G{4yH1?E~&LErORLqD`TBn@w`(MkQGklr~#6zGJYmQl_!+`_p$RDEt5ygkDA3 zGt`xMCudt|!D&N>qCqhrB}JP%k2v(b&Q(_KXe1iUfV2`D%rOosd?t;(FiS9)8I6M? zl3mK?R*SU)B{~;kS{pZ>GOs|Nt?IMly2I?q0Sp}WgOdU{#=>Z1`koe%f49}b#>a51Hhg#$&Lhvxf9q8B3s#V z;$X8yd74T!+$T^(8=-C1Jl(3uQyvmpB#Gd| zpr!-{rmw4l45{H12;==#fH3y1jx4v;3x0NWgVQ(V`?@9}j=`J`K-|QHN`#d{e)Lxt z09m7BO2FZ?g$~QF`#mAR5BQ)py@B3ki&o94?b7vE^38<&_43%MhSG6~~QZ~7k0x+ug%R^Z|w$)7CQ#U@#U-(+@X6ojZ^F0_D| zOtH<2{?m=MeOFPDF}YbI?phTb(VVI8Y}|>_1^d`aee;N)$e!GH@UpJ!fMpvCdVu|P zXnnQs$A*xfe)*PLI5zb<5<0cMi=eG1w%1zSag#vW4gY52mbfywqsu6`YN7yAHAz4B zuioED(t7ep;TK24M^A5~>$IJ%Jvd5i&3<`}%WDONnk~2sV~PT*u}Pr!GL!CCQ&Go5 zN8uR_p{eMg!dw5+b$xWYBLIBI6nM7wJAj$CPliir(fekD<^}Oao;yC2(x`=i{)hQV zXmgUZ=(mS_hPy$z#4jy`UmUSH=#_*KAR$LL?ib*si9><}aBl4E}GN9_seS3$nq z`#+47uZ1WhRO=%;FGArS>V>&$o-%B1eL2g|ONj9PAQE$s@ssu4Hi`|%0cH*}I4#A< z7A9M%#&3<9b8%Sx8IDNjmav=pO8s5jq7~)qdI;c_i>K6es>7=)vI0%YH|>3%U$S1e zid5rpUKs1|I(#{Dttk|mniC`Lb2*Lm;nhIJB@WO_v=8O ztHgf$?Jc9OPVG?mA(@ovnE2*Fx3m>S{q7wdm%p}(=!v50F3_LmPOnj-5a+TQ#p|r^ zSdX?-2+zEC6#V#Ha+)rsC!H$Zm1pE=j`PT0_?+gDlJj<;;-B035+tTlh{O{LfgTChG~si+>L&mep{}S0kx@-@kW@{(&&P?kC32adh`-bsv*6(lPvgKOIc} z%(**Cj)LLU*SOz0kxHYr8z+IAO*3cDX`^JFu@!72H+HL1q!gFEgtA4hG5*1xn2NH3w^n z)E%o8LE~oMgG1R(ut9tSf8UF=&*UZrvy_auY!aeQ2c*EtT(oWQEMJoCy zU+x=-X`V&!foP7*`dMCfJ6Uc4I)ZdeKKyvb^K$*-Uy;Tp`pB>+bSw|_-5e!l)4ris zkwxQ(o&ufLz-hDheqnr}L5)Se*}ugttVK5(oUT0TA)5Q;qwQao)rdL(Qf2@|p2&c==`dQQa!Bh-u2KUcBM#(PkvU zq`c9*uQ7ugW8JGpVDFQhU?1=hE6fe*=K>@bN+V4IG(vU$kkf(aRQoTxh`h6kUZ%p{ z_HO!Y5bm=n!}u&Ty)byd{MN7V>=O*5%AS^;HFLbOvA{_*(6$hQZxG>TElT=7j30ps zCBWENgzHksxW9kxiYjF08>FX_Q8=SC7N5fL-auR>+S}oJ1F$*DLn44I?PR3giYD_W zCsK6do6pDT`rNe;GX2zft6J#Nsv+sx7(&NmZC0yQ8PNc1%QNwqOP5oqNz*;eQztU+ zzhO+D!^!pFs1zsDbaVtrZrAEm0cWf=qqOKP$+v5j)bIO>B@uGsqnhX=3)%q;;7ZUa zJ_12)i<)L&v#E-=F9X%x|HZRnUF~o=V@y-@1jdB0oJDFXb&#~Av{?G~oYlldAA3*{ z1bV^Wtvr$rQSCS#>gZWeA_YcO_VX2sEg%zpqRt%)jK8b2A)Io=s*v+zqDlEluQ$be zqH5D;@fE|E|H!%`cga@pi4Sh@w|Z4(F&qMmXAp3k)*(?8HWj&FuK(6$+~@Zjs$`^TkbmW zRYnmnOFKVSxAD#BGiSl>4T3CG#=V&O{=FFVkZi^!1dido<#FF$I=ZtW!OmlneL%8e zjR9F^r-@qgrtYQAV^oCX;J-F z*678^`>Jdz>I#2tBzSs2h)!3$;CJzJAE&AOwO1624_0u;-}j4u&SQp}`Rxh?&9}9i z?OGD?xi$Ud%9~@Qn&{S@4%)g}WFanP9oJ`qCPR=fQeZJdYuR>^5wI5e_ruj>ht0&A`3KdqxV`{X~ z_Sd)p-2f9u)co}IQ_}LLSd{gVm^~fGg&w|9{;!{*Y8XtY-d+m{=K)93b^tx~@qnO) zANL%YV-%fjo737L{vYxuJ}F}c*1COHASGr8RTKR(YY^;ut6_H41U$_Up=_CmsOcSW zo4fBD{|u6%6l0}{b`y~n6-JTORrdDYGDR%3bHhZdU~-t2mPSU6yB^&**ZjHu_2D|d zz?90NWiRIJ8D-}+MH^@8o-Xkg-2FkMuu>Kt1BwP04Fx?zQr$fm6E)TZBN5rp2q1Pf zZ(@Sx?vP9|U)P|+(nlrS@L+C{Xu|tTnJ0QLAlz&wD2RHGQ7QMrRh^e_)Q_cF;}pM~__Yp;Y&asq2VS~Ski<6U z^T!_xoP^ti@mw^j3bni#+OSWX5m`ND*vqwKiS#}Dxo|=G1eC*xXV~ifU`h^Gi(w(ol^W%4UK@EhzbzBSuEk}94Me<0$vLUCYQ$kG(P+ziD&ZD( zDY1Wy^I!cNZJg{0w^| zpKN^j=|?e17_vUl+VotN0e8iGp0CG$db^4A1NtE@>iG*DjG7e(SDW8#xvWyhD(t%q z*K@6{TeMXqT~S3|Vda>OMaI$jBqr+gEYU6M=@&|?UwQ_THRfYn9KV7q&`rlU9=`Mo z_jlBJ6H&8zTkehA_n|S0%vSuRq=mA^UlpstJ<#rCo}2a^OBv-sog_1bLv!)4AYN`} zfvDG%G$irM(!8520#Ph^e92te`gY5y&f6wunvEkR$#dv2Lepx!2u~lvxU{9V7 z>wEvYzD{x19zM<1yG}8?`jUmG$Hc|8tTiw*R?M=33QOC1Gw9fFYbLZ1lsHZ?(|9l5{YKR&bD>pex+CHQn7yt&W#A{Mkf&=4K-P8t;L@Bedi zdey?|Ty3a@4@?!_d=YpM^nF!>B3SfM&yW&H@$1mB*b~u*}b&>h)mP$`(3;q zDg6=x5xx_1K+;2Y4#qE(|Z_6{>esg88WV3Hc!&WwWhn(`cSJ_c(HdVS#$I3XNS4&O_g-P>_5H+~!KPMnvk79aZ#N4R2gKhirgM~4xlMznRsMIRpwW@_ z=~M!3uOf`Mc{B-TCvLV8tOl z^fGyUX>d33XLWpt6d3FkcdrJ6(<4akXnsn18QJWpv|L05>!wzVHxwZoc><>vpe%f@L9rO^`SW@`>lc1 z=qT*n>_`u0tWvTS4{my~UXI*!Jb36&EB8b&i@l4h}M#p2X4hQD+ZxOH2Bp+45F}YBdoU z>9Wf)>Z%<>CGpRBk4=(VBkGCU^CV+w|9uKo6(5R~<3xKn06jBak_Wd&tc1~Q?^o9m zkp!^%G2ViBRQ7k>@$@kERPxVo^#eF5YBrjtxs_X~Z3UptdKGd=Pkg0(+MS4MFVvlV-oam%kU?@^c?S{n^VZv+k=o>P{JreuRi5QuOalxF8YY zD&!>JoU5}T6XTe%xQ^?IeD?D&5)i?iWj)qZMW139%SJ#~kiHfza9g~;S`PPj`fSt0SV7A}; zvU2|UeCkpEL5uP$Pb2x+298+tFp|k93O^HyBU`y^Itxp9=~+B{y7q?VF;j!rddUn1?4*U1xB}Ba4Xt#ZO+7qZYYi{8PeX3CBhqROJGsub8w$KS5GQoX1fWV5q z@MiPhnCU({@rM(qC15QVa$)u1S4<^Cv9ri)xUzRnVK0T6HJW%d9`7E1QLFQNnZlP1 z$mdqCvziE!)!|%2?xYRs_}9U#GxIwewJJ(eP}vi=kGPYUD~_nZhM#-nj2Jc>?!Dt+ z)zI!%>Z;##oH*^qUAcUHCO#kYc7>{&YpEGmXGKY%YUGk`3G?{2A7q)mo7wk&G@W%= z({H%O=}rM@K|}$Oj?p0^_yY-1K^Y;9G^0Bt6a*9`M=PL6ON<;Xu>m68;5NEONT1hp zuJeZ%mwEx)clEsYbKjqPXlg#dpxMFM4NGY!=rSBXwc2+!)86&R0D7N{#x6-k|5;1r|bad#A3qZCTQdw zNpooLxo61j5XYymVvjE<6X7+ILyhwb(Aesy8?mA^%wkiEG7C$ znYqxUos@Oj)eRg6lBleieLPC}a%dpVk}1Was2qPhSP9LO-@0l&kPT`2ZmCG<6|v|m z2H_bkC&zlWhGyJ5tltv@pSBh{0NsUo2m=N*8g)Wn)M(L1cE2{|! z5l-q(Yh;?%kftG8t*cH9D|obuy#FBC@rFT|kNFGts^b_VCwg$B23z1Q4BQOe7jp>1 zjMZ$zh}IV^1`GMDr%sE_Mo-B)nj;t2Hi_tQb-TX!`(cVx*m;UW8nu^a4^jkD3+#hP z?=F8cU^nfa!!Wm*v+JnA3H(3ZF3Mh>q6B*R&ii+NskWu#tCjTZUev;Fn zy$#8Y6(Y5XH>H6|_F^)T@>(^lCW{Eh0-y#=;zmh6*L+Z68Ew+*{r>Akx}g&Hs7}#R zS*zPpAx^a`^J{5kz`mz*dM%kvj$5!d@i^))8%(P$VY=Y8*MEce18lBco9^Z9SEb3H z-(p;RRJElJY;@7N_H6ghKPIt#OLVEa0gLDM(L6hlzB$d zinLSMM~qSZ#Su+IxY zcHS0bxSG-p_Vc0dWubJ3oc;j6$zeFYYm()rbG+dL_QoOs`j*<=UE*^Q{SuIBOqmp@26P#zEL|k7!Ur;g%1bC5w8BEbW}{ zKL701l|vULH~FDp9J7-%2s?ce1qzJDFdmnXWQ`+#%Hyn^e$fujJ;(HGP8~l?n6Uhx zUpYO$NoOle5c;FxS}r|TLTG$e{OG9N(!meoy+k3YDxY0vtEuA^2jPnagZ0aMt8amc1o;6 zLahnw^m5)7Q&Tf+Z_&At;jYqLV3O#yP)M_~QY{^f6iu2M=YpPiIfTFfQ^;>hIFp~i z3>*n&OVI=$iX*QcDfvgvnQc!$MyBa}^3Xd%RHI?y`AV#?oNry##yQsRdgCX5Lq2Ic z?+jc88#*hF-As9-m2av`wH%quz?wM_E$=JDMDRW@!8HP@*-V+E3UR)cz@zYPVH--k zZDtI+BJ0E})>kaA<`erB9SQN*#)S!qlT^KWr2QXSqb%%j>T9VM|J` zHCth5W8GXmtyzVF{_*`VeYTEBqa=n;iQoUItY#h;aMYoDBUYvK2{D zMxHsVJ(`#MeEVRS*FW4}-~mh6!$kztR95|vkMy>69MBGH3^1o>~wMQ4SY%`C6+vh2uh*Q#eB}RmtH@YS$Ycx9Oky>P$EvI3<4F zD6$|hP<5h3j}3jL@D5+wKMgPusrcF^P?7doGka7f1G`qCcYj<}Hm?)6kyL9<`OCQZ z?eD%77PdsuF}0Qe{kLvuLvBGAp%|Gf|Fs$|BV#3Y9LZ0i=vI@2T1( z8I`Y7e$ic9Pmx)iszKvro#r2Na3im(8YLBQv$vpjNw*5 zESRBAV-FW#u2vaNA2zr;Mcro`ya~+c`+ycHUVL`Cp`{G8QTSmCh6oMd1nPOv!F{`b zqrPb+nAjd0n5$5<^pocoG_6ZOKpPwzSpM5jKXgY=u>3Yt8B|L3^LcB>(~ks%5Ei*& z<&Igm`8HQ(ir4|=LR-;cc!)Xuz}ok=JMMbObHhCO46IcaASjt)FDxvzMJu6gUuJ@a z!zBFdka#8Vum-jLoqek7xAv@A{Iw+K63I_g(z#=Gzf293crCzPZ+Mmhys9=J;joB* zpTJ5Vo%ddeNr~h1@QmLk;Aoo5ukg1FctiBa{+Ss$e{n&$HYqCZ6a zho)ijnl%Hlj^O@;$!8xf&Q2=`bOwpq=>`zjDWLlJz$Ll$9HI74>1`ZvIZOi_(`?ez zp$r5vC{+a(XLc!j&)zl-JW0rKZW^a37p)&{F{Bk@Hgezxsv$1Vk2vGLBSHAye`lq| zKW^{FVOp{+x`r(d`yvunh59l8-Zf~$J(c;3ovKlksrZYifkAF85n3cE=nJA33Vb0K zn7TZ~yeO-?Yl58xf^0)DBKS~2*d0v}j0qs^qfB?wNP;gSro^voq+~bjl10CnH4dUo zz=dw(Sb3%r`O3$hrmQc>o)#O(q~~WYNIbiB=x^ zfxibhi1q-Lo)mSw{ByfS?muMEjyadoudqUaHssq4R`*$`P1vmin0hv46=cJgVpWexu7Iiz*tWLzC9N9qN34rpKTWNPQv#q8aTQ8ox zz}T~=Bx{B|?XC?CrdS9LPEtg1>T^YhkbE9c30wxj{qIe5@Z7Vro6_W{DM2^%-QvH8 zZA=99lNdXP5FoMYb1x%2zlDdN90T2zJi%rmM!5KB`t($T35@l*k%{0NVn(UpM)vZZ0QOhhC%5q4Dbp6n=$_Aq zgCOO>^_;3B4n81X!?bHBu6JGj5MC3kXNLLxxHVhEYuYBcbn5GOJd9*w460gB3*qR~ zUI@=+k2X3`2=|=MG(_E0>X7{0%N9~@F`2NzTEEy6^}azf37&W2ufq&%$<)%t zW$4_+>zr7T7%a^Qr)p0&{uI5xKs<1$s&7v^O$w)GuCFaq^Iy5E^WdzI4U02gHs+Wc z5;U0q%_|@$su7m;>ICzN*Uy!<*?4h+`t-(b5ka$jYki=W~>wCr)U>q@bAtg79r$qX8u`^51WkVdsHd&EHdedmaURUuN&wkL9v&b z11A=AXdarjPw({}Hil3Ke5B9TzLY%L{^Fft zT*#M-lp{R&@8He=T+JWqc0+PdJ|}zIXh?p+c*q!>jAjB0?^Z#G52ioAq|s%MRcDVB zzZ=MGj?S{Q&DZbCjdna?#(=jag(4PRV+ONRl*}1it#KV(IGFvS9^;PYsCbzrM-l5F za&Y-Yx~T;D4t*$3t}a-bIfAKz_f%li*m^5Iac}8wH`@z&8cj#U&sf=;UxT@<&N~>F zS!hCiRs9er9Ro51AvrfG4)vuc&ZYj}3-ELVJIho49VXe(J$OA!@zKWh`Y<2bYNthI zp{MMV`!Lk@FyA(f08%8W86l-y9;zGa(ma&A!FX#r>mpu+V8<$7cr_<+GD(l(fGQ@= z+H_l?Uf>MAcemwK{u<1y@K7`F&Ml^z(}Pa93YE>!xAN}q z>k5M<-#Sa5)%w-wt2V!w;i-5w@yhO*2!% zOQFGSDT0de-%HOT=4B4k)m0~&t{Vw|lc>_V-Q&Fzl{PRIFSZj-ITyHpVH|MO^T+&I z`h1g^-PrGlS79|Fa!U#G~qUc&HWZ zPSNwQ$NJm2hv?$@+-F_qp}Sq-3AWBm!UW$6>N!36i?V3Eyxm-b6zEr(J zib%7yy6SO_>GjB~w@~OqY{*Gp`Ta*O#RYJPgjqZ(hut0JEmb9-Gr`Bqm3|CnAD6a} zarqMcV?p%WZ~$5a^i<$FKh_KjOOhFy-*C3Acfpe!!vhs2Z+3UmvXh{LgMQ2h5@Gvg zi_2lvL#n#yb~K&lxh<74uiHq*%H=0By^1QK7HYfRV#_C9e0DuwmV=GxeC${X@{NQN zyvmR`;+Q2KG5wyeUn`ameoyR94J7ZnngJ#V#>&!1_8pVe2Uec<5r6no>}`3al$bx5 z-`I7pj4ag<{sD7}^LUY6_4#uT{I#0J-Mo{Mr&}y6#Fe&PI&uf=oO1ocK`Nbiee=xN z1c?t6WA^}k#|Cc1im1`xqzwyfPiqCZHhwvS^9BT8Ij&B@q@U=TF>LaLTV4r1h_UTto}lG^vN2MN zj}sgxPzc{Ef9V|PnC7u+d_t&Im+YWOCM`U~+JH7f3 zJ{gH_ZQhdWMzL?wgVLAdl9H!sZ=bNN&aF7otgGID6_sfwx?YS3HIafnAs7?Y}WywaMywokPY3z`kWBzzYcn;rR(n zZogog*SKn|8>(wZkY<`9m4Ze6X_b-BkuM6CK(U7K$7}y3&Dt|aj<-f`_PG3%uVLY) z6VW;?^8KLVM)on8B2!q${3@UhO;hD^BHLG}Kl4-_DYlo6D)AM7^(s zBjx6p)I{xDo{8EMV*2@btjKUypQzP9@aXtnD&io+)a|V$#5H0$n5GbvE4hdo8RPG* z%d9}%(gscpK>{2{ggQh*<6+A8AUV10fB6nHBsQgoKzG#-BFu9nl)NuSN%^^EwbL<4 zDrY#D=L1Yc?ZYwE-~@|=c2~pPPTb3ef*MHSQrZ*clyJ_9T)^IZXKxJJ6U@pNY*K;E z6WuMyYAIR-#Ag;%xte^trwphHt5X9_1fs#%x-cLTU*t&cd9T`^3Rgrv1RVHb%G9>6 z@4>_(U0-XF_01CT*iyw>#XL)%r^bHJI4tNih(Rt_%36gYb2LZMnvf)O1L)*LD{d`E z31mNS=L8eZ2W+{_HFtV!;_Xb`lzCYJ`QDQq09;4U=OC;S_blW>DX*h%S+<(EC=87T z41O7c)(m!wvYNF1Y58JuUQUK)4S7S)D%$xgibu$@)q!2*A ztt|T;ns`_W5mak^eM>gz`wMJtiMEf#AbWbn6baD8MPW6ztszn+P0(n*Nr=l#0{vw* zy_@+tbB$Y2IKsEJXQTcq0Wr~vG-XxkJmprbvR--4GS}K3uruAj(gbmBcb%t7-I;3U z2HniaoU)m+hk4-APLT|fW>O0p2eNYbY}$;%3nl^RM!wNrEMaplW+hZPp~BUy>jOTt zcj*?nhu_tWI#l;v@Mul+-vi`?;O8Ejr*!zCM6NDe4E@U~4AG!%a_}W)FY@pDC>b99 z_kck!$cMrr^kEV-+!J^=tZDn{mv}(d5^X1}CINm^4e{9I z@-eY!F29MMX?LX&^V#tN*WwM(A6OAo2oA2E7Yqz-egUeYA%PUEL&4EIt*YUp#;wRt zJ9H~r@2pi3tg1?x*}Cu45DrIUv{N8)miWWU(I!3G=GMcO=`Tg}w3yj<~##zD}VJwrI)Qm^Hx`e|D2mUG*ol?8%! z9#hAo8oH6e!XbC$<{Ky{IO~^j_$K#_+2^wbIH!w0Tzw&~w_M>fVVplWAuDz(*Jqt) zzw=FSejN>Bnpxp$2?=4+s=OM^3nCZ247dRibL-ur=JYu0AOn?4H&VcW-@ZSCt7Y?f zXIjsK0Jf`^J?ryd4bw`#=qr^h=wie4b(8Wou|?>2*fh~lS=hY@(VX(?s4jTyRACXY#AU<^xn@G?lsNYa@_)nO9c+#>X`Jt3|+l8RxjoWf&EhjF5nM54VLAn-1*Tg{S-+iZiuSUR6_ zP^3$390(x^tkd}H#-^(-q3xI!_Fvs#Q(?kmJk@XS)xP28JB6H*8p(?j<4owXf5!Db6A7Y}J!#R)1 zpx7L=u^Kl?=0iHY$2`oVzCDP*P4hp;d*^`Zt83GLkf z9tPZO-}~yEDy%VgZA7KTLBZjGd)3pfq&&{Q_-r(;c%}A6#ZpW0Lbm|ZbL-CUwMrZI zLGfQ!Sgl7UefQemM6sDFa+pc&e_+gx|Ljv0dqk}f3u(s__#qgSj;)E6yTo$dzXoy$ ziv6{enwXui8KGD8C}sL6o=TdaJbNvZCos15lEGb6{Nh6$-N6+j+ohmt7MpqOU-8oj z!i?1@Z3;0pXKm4f8DF(LUp8p=?4t7yLGQSa`)g}*`*k%pjXS4I?)ie)x}#kWkNb-H z5PmZ9Jfo-l?^c#4?^kH+Ywg6-9Q>zGo;x}^A|lUz;!(wQoWscyj`lDVl)9a-piDf* zo>8K!ua!&pqGYH~^D4pL?=FNMkYjKKp{_SxODgWd?*95UEG+Y>*#7n1fTAxEJ{3Qt zhpj(3I<7vh$jErxxCs#J1D#2tQL{rT-%3cV{~G{9KB;-xcAPv3#_3ezbK(I$+ImA3 z*6W`&uFpHtNgCCvB6xJDF@#i$r-3Gx*~7aF`pp;^)SuYL9tg@mNLBSs`GFZaMx9yW!MfWkh~xOJzn97?+1w zIyrEQy+knx7TXZB(7IVM1qVN5<=TAuZsm5%9%giC`S;(iv;LQuF2_mPegAu_rg4lX zW(FCl5$LLsRX9V;wRf)i|Ec|V#=EWHTN`?9Ue9IshYurRaz5{scrE??hGNdEgz3o(3n@8Ymkn@5d=t!$@dsd6V&smV z!*UG(Ly<~O&aOKwDvoK4^~WoiS@>T8##QW_*;Sv_jBD=;8je=4jnbWrYz@oYWS;xj zF)Ss|^~}+bZMKi3dc^*B>QW0U`Kz(-9wxFF&G@fES}ARuO59tE8_x8nXIt0VBj2Ul z*hGC;GAoIE7hv@A&`6+{xsbOQB6xkj3zxfc=>}oTj4Z=%{Kd`X?p}1)n6&z_^jGUJ z@-W9wE;@8++UEx*j^wG}Lo&VRL-VSKzHS5|!yH#t-N{~W2;}SFI3B#oWcb7Sw(>|Q zHm+aG&XcwgYpAQ3fdgk2XGQOvwl^QqVg=0(RAghI{-?Xvtvjjlz27&x+o#9o(U&c0 z1s0f?*8!oiA(EeX3R*oW*M+YamRnK24ivp_JGJo>#nC^v-nWO*ek7r*7tKrNTa@EiEBco!G}12Sx?K(>JvL$*ivUVt6+y^vM8|b;XU8# zca*z#@Ob9)$AKreZEl=Vu;+?u^$6gT_AZ^Yx#g+eKC;#R1-9F-E}W#~?l4>>Ip9-O z^oFxWDZDBk?PwiSG(7q4<*DcPxkZImNUW8@2qPu_K1g@3MZ8>dU^IzeNG6u!7hx$f2QGi|M{GQ-{<>N%giP;4;QKaPVaCAVLb*x z^!a^m@rl!^?zH{wEI45R<#8EMUB$E=a<$Z5N$V)frAS!QT`%vy52`9!yAC$@D#gx? zXe(DdF4z{JEbZzQ}#XB4JaLkVt+sp{qEooL0*V@NloU@qZARV3;%2oZS zEL|8%7MM2L$TM|f5YAw@?v_q7@rm>JKk*J)F!^-?8m%zMo(UPX1!mg18|ee`s`c*( z{SDJX1UI3H=g@cd7587^)?+|?xEL{slU<%-PX+x)&5N`B0Q6lRgHtGkqwq0ZRn!ma zNzpu*oJ()#c29&r9@OXf2@!TW)*Gnr9O64uTaMA|R%t-r6wR9*zi!|L1RT197-!+s7I{n2agd)N9XMQsqftPz#0@Fycx*~ir2|D! z1(YKOXuB#UzYx6zw0B_LeP<7}KIClOzx(f&$t2F|R}L8fiz_p9;PS@#RbrMR>g!O@ zFD@zRdZcGK_H~x}$!~~6a&O}Vu+6w+U;(Lq0(r6_g_Gg}DX_|*BAI&v+O8WplYgqq zULi=~^(5&Ka&(yjit^(I@}$6DC(o|x_Q&9Ms{}j9QMy>5y^xAYgYF?9gb8$>E0YeS zwX|^!To3L_mDjAUF!>Q-e`3YbR~`efR4mdKb0olrJCQhv!I~UloYeAyL{MOou6fNp zUj8!CHqdu@tAhU3RJn^ubErV7+gt>#&8Ld#*h8Mtd8EAr3S2Wn*t$eo6)6CM4LHv= zvpD(gAgfo-Do=-R3|?MJ4W699zAw}=ar$ia9KD}G4F{#&{AiYe;SgW=ku3ridS&_Y z>Rz|xfQlml&Is`K6Z9Na=FXFmP39pqP(?sq;8Lp-R7 za|~I>YjE|J|Fg}+*`gmJ2s4fN6(7TRv$p}RAP;^vK$+@Xb5^O z)+&&E{)Z5HdL%9y?8|1{_e8ap)!3gRb4S)ILwEr0f_FP!>;-?ml@FX3?;KUXKpSpa zWeki@VO5>%iEy)~uCfE4fCW9T6ryu~ud|Br08c?KVkbz^6+RWdf%C0?b;;{c zz9Yt(UcR|s6fGZl05esOme;_;6x~-g??77`Sl_D#zvU6z>hX?V2KMUobPj)b+mDA$DnW(YA}$L4LEq(a{h zF=0*7N-LBshkPT+6L=~toc+pQ#y8)TH$dha(>KFpgF+uGmexk`#Ujx{#6&^gk*2jv5fG=D}tBik#&3L+DK^QuPc#7=wVKlU~6^=WQi(| z=|LiOpXSr1dvE^sw9kyuyXuv@!@Sf@wd{X*yGN83NtqG@46b^p5K_} z-0>~ziTM&-`Qt|-(Z<}m^zc{0p)2~Kv7OG{z~M;PX?1uQ{sV^`kER(;Xlk+K=%)i& zX?wX|UIJ`FR=;B=pXDQHV-2+Q^5Y7nydNfSisM?yed7zPDz~M0$bX0#Dp5%ncM)CS zg|^%Bt%ZEN1iPjWME#V*muHgqUIyKLUWBmQ`G9_8}nR{g0eHqEWi?R-CnFsKz68U zY-wfPzH%k%t=xX&LDo<&dadHs{l^wv7rP~2Ol?ITN%8sw*L4vvy)cqSWu;Ci3H7_RNI z6Zx4}|G^pJW>=}mbfCh`!6uPwM9N8=?6Lhn*y7hdB>Fz2?fUihmc+%^|GW~YqkU&& z&%48US+%?T^$O-n}+e?2tbXu2nhes_5s@ z86^CyUY+1#K0DWaeWT497)O(suP081`NYyl+`QGo>`h#p=eEU9v#R*}6Gs*jrk7MaJkXS)eAVA{He-WIr=>!F)r5PBhY@I04e7tP`~pVgH%o@?)Bh1RoZ7WOvPW1$~L$C zk(3KZU7fAs2o7isSFha|Zt|k@e6s$5>sf)i)hYKiaWOwZx#9(}aAmRun?x-Z zK13y%qfzfI*i7KhQ&;Zla%c7Nh37Y67c<)2GE|TDZfClfTSo649CufIY4;3K=3Y&0 z8(L`kB;iV1PFW&pAh4@_F;G*?>oWa-KW(g?*`gyiX8E#D1)@1kw3HYybb8@(1yIac zfj88xPlHPrz>@#+LP}g9sXS(lD38b6Gz=k>s!$quOTLv{m*Y+9@x_E2*wYVv_D-px z)lXDrgD11=t7V3&+BKB%%Je4MAKv$@Ak_ZK9sfskOuJyhb~Gy_A)spvmPI~)-Q==2 z$J(FAU;mQt4P9)Og+-jBanlO@J8gHd>v z$$kFw!1+zUvFU$rN{=Q@F9q0(yx#rlGOYz$QTxIdq7x)NS)4?FPO`s?0RM0^{@aIK z)AvN{(nA{qO-U|b9=e^-qG@_2U+4kET<2|>2?cbhzEab9JQ8fB%6bSunn9H!PnC+x ztq(?;G&6tkEX_Y-UE2QNt@`u|?XmSZ4^bQJ`UYc_Onq;{g7YQzMlum)FoifXy&2GR@%51MS8?OKz7BOxLR98_XypA!GT09L* z&o&vO6yn7q!?Ro?qCF?PETdrJZg>x*FwY2_XB`>VDupv2aXHPASDNm_GB)2Od6kWv zwMx?`_0HQ6`FD;eoqgSAGiU1>Z!6%ZH+-(XI7>4i#7EsMJGFVSK59Tbx+e{lJvHdyPDObY>#22LtqBK2UF%xt8tbXq)a!u*F>XP z^RFSOJWCUwruKf^w$)PNI6clq^a8`vT8acSuh^Fo048S@nh84Tz?ifqArTQc8xUN)KTmlWqzt53i(f>}yIkUo|>V}hXxwTsB?xgvkVlXpI?22WFdm$1tQ*Sw^ zP(27L$=1DL;CH;8hUk0@5R{T+_AWHsHdmRtG{7 zer-<06`ma}{mhSa_J9S)5CkPxLBaw=fH zz|r*izMR7LD=j4C_T8JnD!4Uj)i9}AT+%?cFXDMzL&&$qRGY{lXoqP36`$Dxsow8K z@W%Cf6Kn(hI5ctoxG6CJGnc1Qwr|vc>ynUqWw5v3I zvD-LrCc@Q=mUm)IEmrz(jHMF(zZZaBad(Dv3xO>o#~n<1hM?QX<2eDcc3M_WfI!p$ zTF1gw?BHFByVvRVQmH9qp{=AIO_{E$08)0Z-qNLrk+u|td2jSGy928ePo;jPvErl)$75**rZNj%dmj67`3q|7#7@CE;Z~;UMbxYa4V! z)VLC=cA}UWEIRR;S}v`Opph|W$k=e38HbjlKfanOrYb__&%j8cRgt>JgvHR3o_tp46 z&U9DbHqUrIh-|LY(0}^*(@oVooZNg*7&cfFEP-P}5z#(UPP>`&SL&tep1s`kR6D|( zQ?Aw()dVtn!*VmDK4CB?a=F@~t=KvrX*%~>-{|^ef%BQuf|fuAKIP7&Rn8b2RiOhLfl3iM4dc~w}Y&kN+!uj_iVB`Gj;O2t@1 z=jC)o)1769*xztEd;Ys)Cb)y3Mo5b#hn>M@VEa>DvFrrInA>9Kh)!k5w7}%SdVq5} z;`)FNG8P{0*v54Y0v13?Z(`jM0@4aP>#>!_o zZ1)YBZJvN}X|}qgDIUd&WHzTbRldFNa6Q1mzN>cNp|1NKzQ|vU*V5nkgj7)+CETxc zqlpMEWc=V3|Jq97HTF#OJDqM*vv*Ym`XWB8UiOPZW@Eo?%M{A`WOv?O z$akB3{Ka^DEAGfc@MG^O`j&fj!3)du-`!b3gs206a*8K%RxLe7L@qF;LgyFZzj z%yP!*IH~Pz{?ck`Hsy9m<)B%*deGE-JJgP_;{bZf?fEp&N98-x|Fvv%kxhY?4b5^( z%P@M3J%wa(8cXR{=NL6yN4L7T_4ez?-PG)YDM$XI;DGOx)E^})C29tC$Z!w+^gdjX z4Aa~Ac4G(c59$nd{aNL2{?B4oyT1dw$rm(UNN4fhkI>?AdPKB@7#{9t%kf-AnGI7! z@~7uvAyapqKu^Ao6;}aK@Z#F<=qu+}+oI_oOkdXxt{p#+*g99-GEbE8)~E`cWo8)# zG<+D=8lS?>W@w)9XHhL7&~0?R4U{7j;m`?XOKVsn9(rFt1fsonF1sBertT%?CZ$v_ ziB@h|+}b9C*lUrZwzlN;i0b=&u_4=PI#Q19&@!Df1DupP|uI0 zh*xuddVN1`-Qc+_$+I!Bg4V022K6Ulgx}7f=)=S0k+K0(P&?Ccxs~N)Px+6Ke3gv{HPIEQA;_cPvatT{UDs#9(qf<30x%zXo zvnjUjMk4)A#G9W%hrUVk+z&EMc|p8B0$Ck>c>Y2BO}#Z*8HsEDM-PPJa<<&O2f2$|lZ@ z=T^iBA2?O!gdHw2YUf{>f9xN$YdC4?zGtsvwh5cbo25$Nya!vceo75AqMgsK+Cr;w zDXtfj_aRw0=5{^C?NdFx-94DF!zBUWJSla427_Ty%a^=aib0o`fEtxWhyy?h60DaC zh`#j-%NPJ%#ktXfk`Qw$k_7h&Ng%=mxsqj;-oU>uHStjv7ie&i$?lV`P=AF}5!{?L z-cr&@Jc$I+le$ru_afBX)Dqzwj{QLzR&PViUySR2K|i2FnYuyPNS6~wd6_qNjrTGS zHyQnhn8sske7L#Ui-00!K>Dry1fdtusDYV44b0PMOb&skscBwA84x3HFjeng*YnOkO z2OrXX08imCjq?@a@+I;F;M53lsU?Tlczn_BtW{>RhwEEgfzIYHsfhWzX*EQcQMSxP zPAS?{!walcCeyv#yxg=Df6=0oLIPNe2QVUA0?%@$X#fiF7akKTu;ZkPn+e0QvrZ~o zj~SF$!+_u@`vUvRq8wnw6JCd!*{7Gr`cP}9Y5T0yMPsQ4=db}A&6MJ~c=HD&)Aw@K^#lnr$g>a8(K16fQR$LqmwSmIKxF<{zNN5c80 z7c9yH24ze{&9Dz=09p?~ucms%Ut*n8#Vk6bPZ}{K=n1QfcitxTp4`tX=3-e)>#asC z=q%^!dn-N9WWQT9g`W*V%FO9AX>-5h*p5Va+>kx`vgs%Q1hKPh^5W6%tk znnl>?Ghg*eSk`U+-EE5-T}7yM58$S(nU(wfO0*`cU0(Bto3*=WCA z4!i?F6RuoEH-RG^$2HVyPoJQ51b)=c4az4>m3s5zo4wU#953DeU&bb0HzT&5J{i`e|k4@&za%`C7 zVB3>CxFv$d6yzy6`6fa9kssn}S_Cpwp`(_xgMH$v2p;D&h;=%(QgIGUVf1n->*DVv zKY$azy6mhE^!OBxZ~+U5O`Eh)=$Wfnc}Bi`IDW37XBX<70mzmhcGu5x&sbt>J%Bu9 z`4Sweemj;o4px}U#nw#dEuNX$@6KFg{l#n#H3VJoi&`keaxNHtK9fCvu(wIlB;)St zq?3zKvI}27ZQU9zR=!+nKq%xQEl$`2S3rgws<7#VTPms_1OgLu z+74u?e{RQPX&f>O3EAlIEVG~G$W&FhSL|?@+EvO)__q)`5GWmm4fwY>31Bj?_!g}W z%{4)FWXsfX?%JHR^O zCJ92hrdn0PmaPmV{p_h0{FN@@>qN*g*Lm5At9S)fB7Qfb;o8Zg0g}ElLIfM`ShR(f zqcL^f^TL&51ndsNJy$O4AJ+CprR3|_g{Ju2h(BofkDGsD6Cc*=l(kXjDL(*=APXdD z5N10aqGnj1U~F~u0H+#6$JbiU=Ijeb5JF>HaOWr0yd^J3Cch-Knrad@|Mj+@&Uyqq z_GuT{gKC-WwM{bPKmoFqBmKILDf~4Uua%hTrKH9DBi;LSW~@6nVJI1;g@< zHx4@#(Q85>kABjwz1gmsGhnpH@2)TXdGtDB?X7f+;U|Nyya7a0Yb3u)4U$bd4Y&2b z&~=q;j<7A*65V0dbF7*fj)50V(yJ7LQ*H;s8* zQQrBkPe%f_`c%nioac5%)G9;nyOd$MOEUoyO$le(eOGcZRyW{SHVbC_!}69yvO%T^ zs=H58-RV8I(0{#{&ePlCYO*t|mcTW7J5xjytUV6qd+1;n$}B<)%)bUUR5mYohE}?1 zP{|#XIl}I)RJUTwqqmu$z=v;B;;SA6rs9}Cd@4^LL(dXoopRs*Wtf(arCp1S&GY(k z{8%kXU%I#T%%7~iSD9hn^>Wt-Z#1Kvv~$uxik!&4!>}bOX?f~?S2CeF@y)ToO}l-H zu6WM)yrYrbW7kBroul1Dnq}N+07=KtEsBsE?Mjz9TMUb1HwfqRUpL=pTx5wRaO3b6 zOR6&#Bx>nA3CZ(SBs&>te?{T$JEDNTBGGD6y>$o4!yOd-VPgw5IyFN+cM&NeEzQBS z{82)t=9W48G*9w^AE{0>O-GOUm;n+hHB{5IOrTkd^Xgvz4OL=gjJ&2A%6vkW$6LZ3 z(A|}bE^Rdr?GrTCg83jF7&BsfD$eyRQ9S98c@vc{95+#U9|!X;;pl|7rGB) zW_bQw<;6LkD!?k}IcvNwiqJbN*+u2945!9NsS)A3*M&ktD12_YUy{sDD-qJ4J*V)g z(@Lmk^_?>sYI*FQlOF!KjR~IYB5KjffQMdWJvm;RuN&mMCxNlFgHoBleblk}S32mU zS*(63*&^Q1+QVj(go_ixSX_+iC|-~x7%5vW{B`g2B zf4&QSb*JZ(jkT`f^=RKm-HS?00iPf6_2gdeSUAbmo=9z)URfN$_K9F)7VV z-~2U1JM}?bFxDlJZi#T$%axY?atFm|HXTza$H&O1{+3K}n&=g2Pc?8}#NRXWrCC2F z@^P7qS_nZDd1o(>Y#Z8~4K?^3Nf+s7hIhsKJvgb?dZ5Vk@tR_Rkt^vw^=X0I9LWJs z9y^Xh3E0iwx$c-M5^A0hGxB7|RQd?TQlYFE(z3@Bm;B#epFodnA;ey*1=9pD4|Pca zLTxZLFsPzU6~Ow|1iXk&^QIFGjjJdkUr$&qe$QsB_Ec@mo=F@br?(!TE-c|zBIK6T z8I~xd3l110566S$j&@P31HdwwwrMz}yS@{AXk|larBTDk@-gboPf;4r$B!`m_r$)b zpU%`I?RQX95o9*?#IaQiyun4jen@hC;0zMgBNB1R`vc>h0WMK3wdlv(J?-CZ;^)UM<^F|MD3)uEg~>Nwh|M}c#V3s=px6PS zl?BQH@F{ekw6_%5){M;6PtP;7%R@N&_5f$O*q`zVMW&Ii;^8M)uKZzU8sF{Ku34u` zaR=bB1iMe9zkf2I_X7Z0){Is9M*Sz3dEHz@>*#s@a5FI>_{0WI>>DYg8OR1_ASYvH z;kF<(wqwHyr~X|xo!zHUJVKzLe$bry0z7naz$3H^RRyNeR92iS$2~W?64P*)NI{Fd z`z5c5YtW{;<@u|BGPf{bz|K+(poZb!Vcdd%djRwsKwOxzf{(h=rH=+jEED~7q~+&xT2nQ|{Jl`?>x3Q~H%p=KyCu^C zNr3YjT8R;eVy#Vx!bl9CJc6`GV42m{?9 zR-eS4E(WoCXNnck;W4vrdM#LzA)%b$vE^qb2*2CUMPI!A#8aXN02!q!Ke~PZofsK} z+Lxgja%7U806l@TZmnb+&&%7RpE*^TOZ6LX&%V1I%W9;pVTlty(XzijM{N_{{wrX`WzZ z99S{_3S8z;mr45IL|{a@a4!b-eDXcahe$HZc}uB}b5*ktU z#6k$uW$ELynbQ6re>(dOqu3@-3 zOT=u`0ZLsuBiSaC2Z;$Sk?5^<8rck(0q$;VUGOy6(ci)So0$cUmpH=lMuEGXYjc11 zm^G_*h_tG5pI=~XQg!&x#-svoDr1d@HVu*Iilpd@oVoX zOA(PQUk=<3*;CQNX>==_TMuU&d})ub{Hc9+7J6zeLXlIYz3M)Hy|-_Jiz)_bYRUE3xfBD#GHp;Oj*r9boOVKV z=jkG7I~sE7D(iVqgQSc|Hq*O>guCp+HarSFlsoY=xQP|k1Xs|{L5gDGVr_!9nG&Gn zKbm=Gm|6n-a^jHW)u($N?2>4}jgHPoJo|AII*Y5tFTJC9Ekcf>llLjCGdA| z`sTUUv6l3uXJ-4E7*~5M(cONtIGc&>S}p)fJSq&^O;t$?LtH9n<{U0Ie>HTa{ds72 zGN<#;;*KnI^4uOsjvoU{1^_BQq$ z0fSbVZEguB_0g;2$E2x%8vXDvC5v|de`q?-pr+cc3)7J%(yLTyf}w@pyNV#{gMjo7 z(h0qHP^qHSP(%e3rAmo(5D-HW5HR#2kcc!PK%{@S@67ju8D@YCIdgLEz1LoQU84RS zp6Y7EVrwfLDv{7mfqsX9N1|@HA$nk7XS4;mV;@16cVzDX2NiAw%uwTYV3`g8r2UXJ zwOx6?V>8eSm=`KKd(`nTI(-aQ)0(O8G;n!^o!mXrPx(_wa$*Uc%@&OZwcwl@>pjg^ zY5P7|f6Fhqq+An}gmR6YJ9_LaGy1uQDh|x5kI{z2#*lq13)9sJYzJu$zrn%$nDVX| z$F`#1&U&iZj<){aPkJxxFFBp+F>UZa{TnB9jpDn$07QUHHfA|(k4EQ>MWlXMi(a++ z6|(uLW&Cf3#TL6i0ixyGw2Y}O{-OT3U4MVqUwq3~pHeI;yR;&8J%cRv(>GrA2Fi_1 zW(S~cf4P*4z55%I8Fcr(p>5y|DtG!mx{|@AmkGB_B2dGSR?3kZ#7e@7QyJlmY%)i) z3ePLWcdYs2j$Lv_-N%8->5clpZ*n8tstn}F-)7khG=;LmH!nXSk0*QqUPvm#iq5+f z>a)i^^8+lU5KV9WAqsqf@GRHO2Ouj1FGzVaQ(V{W^ul>ZedV>(c+17vv~B#p%X5i! z*XMVRT|^7_4KI1_bE{5~va?0TNWuy4&W?KB zNf82vzDD6soF;}ZGU9hWZ+mS^aM@~Y#-0z2k-tTB-Yb|k*-#hb>3o~BO?Th8=Y}Il z)+2sb_ETsq(Mome^TH4g_%4p+$#7(u#@gsn^|z96sIP+^HFbYbKsR;uID+bjPv3ud zFYBx1hj+YGhB~VT+Z{4Q(@F=gX#8+7NSAo>s#QdY3iroDf6zK->LZ;TK2z^}_^tSn zuOzLO9W{OfBeapcoA&fpf`|}z4%0muE-7^;D)~A$y=x;W;+7u2n$u;|po2o+Ia9@* z)t&Cpq{)lO%7_6_sK$aW)4D`j!!=>Fx50;L+6NxuiK<$1=(F=AeP;?uHfF3{5VkBsM?amZ;H~# z6mWv$r2-Zt#eM(&t{EuW+HT*=dy!_TCnJ<_$_aNjD)P^No$Yw^)K{;*amXywJCq!? z-9Kk2Gvo#Kv$G#O>ie9wcaiUiz%JGvd>Q8g(Vn&uj!psY+e+Qt<>@E_we1?`mbmWD zCwkVwK_NkP)(J|!?L|_^Z&;@=S7SbttqlL)dhbOdc|i5$6cN`}iu zhn(2ewP~*EkzswShul9i9O=;#PfO2#h}C>{eCbx4n{zkd&?_>lXCqWIt^WajX|*F+ zS!KtdL*>H28xCbVGd4E!Hdz&q?9PmhiygYqEx+)&M6<7_Zz(>Dn}hkvea?V!O>Vb< zjD8+RXp#_AJnog64lK4?YtM`6=3TjDr!Xss9^uLSH<@=0>BL-a?q^befEBd^Y70Nv8j$Cd-lw;|Pb%m0(z~R| z5uK+J4A-Ll%q|eE&i!7@$*hi&QzNK}Y-Cuxd*Kq&W=^c<=+`T2e|$OCpIDD-gZ1%n zYIsRULZ#$=%^sU_q-We^hWLuHubA@c5I-4+Bh0Ht+~$c}{tlLz zua!}=^-w*+_CWS1{Hto!Utc3rMpDyv7dFp4iC;Pv#l^9Uv0i2Kg$rq9Lzn);LJWhk zl;ZyMYaStyZW_d_@x_6>sP^)pjltGU`6~YV%1x0%7+H$&!}zbrYm(O5!89K(n!RS1 z;0`TOvGxwdswe~dF!KHK!X3=0)7%#&9~cV)4^+ums4QE75l6zC36 zhWBq9?k-!Hoi0SMYRWT&2N^c}@*aNHZLm!fQ6tmQ+?llcdu8uV?fy=zo!wp5IU>o^ z&>M!+?L213yKbyoRtXhW56ni1rmLQQIjKUwX!8b_5y|C|Hw zvnyJ=4$VJl-}%!M$o68x5s@EI+Y`X{0@=AB2c&6684HHJ!!1hi96V1_te8E`p{{HM z*jPkYH@tR8OC2>IU~2m>Qw%FtVM~eo1R(1HxOuPhzkjV9{A&%GjQedu3Tj59j#sN* zkp%{8ojpMmoPUuoIQ%khmjY0>6d2D^SO4uNE`FXx&xSr#A97(5;sCdR0$o;gpgtv2 zwk11qfSqs$&I5TE``))R+|%%FQXJisXlzKPrN}i43(rF1o2HTmjf9a%u8%q}djNZ% zrpb;3|GIiUpfDCmTeXoH+p~gu3sJxpw&q&&(z_U@e)4nD*8|k!H5?D>5OHhI7N$}} z>ih=3v2Ab`wL*b~VxE>1ZEw4K-Ol#t`s(c^n`Gcep3M0JCp}jEt-Kg#vZ3Tes3}&? zED<=unbbLtZ&)`RD1e&!kLt%F+b-w+hohqhmnn;k!_bmCgd2TOa4j?4{YcRohbp88 z8Wbb;i%&GH7r~NVX?2Ka!LtJf-YL^2I_i)x!x!N+lu0is;g z1u1+Kw|ai293B@3mN3cSxxq0{|0%VJ^yo!Zsd5Aq0EF=nm~9zgw#911aPE{UkMx{& z<{AkcBeNcFFh!Mb$Z=GHFrtN?)7O9z8Zn|Vw&_y5ab_@d^8a1{@OpuoCmZ*ojR4yrV&ON8Ejcdv6;<;r_4^M=Rd2Tm+ zi**^d8EmBUKhLEak5%sE$9HQamqB6@ye>MDVr@=nP+HMxJ7~TuOQ({*1s5fpX02t> z(xsw_Hks0v5DbM3$e=@3h5p=I-)cKm*lJxq@nc+?dwbXa9837SzO(Z))h}yFm%w)# zGmxc!345!o*mJsprgk4#!msbwE#eXCvvKw=?g-xlIb`EhS)au51jv=K4^<@yBZ@xel`+udK(tP04a%N z)BoYT#Mqse?XmDgF)pl{OkDV5v**oher6 zbj4XFAQf>#j`UEu@yB>}em0o>+WhwhVP=qP7l-Cb{sp&-`<<@)-;9m8X+XKmbY|lx z^&r%B1IOnjf@(UU2|EvA(7N5hoBAmRar7a-?=$WasRz1KsgndmzobK(*p3=5PgG4- z*qhozJ(;%1;EX*zbEKTBoN1!e18sDYC1@(OBAM?Bw8Z>{tl`OAS=;zExx9JuZw40# z4)MCTO;-MTAuSm9#%Rq}jJ&0)8;zogE#}8jOI54G+5Ti$;7CxqH*b1v?R8dw$0-_T zq~WFU{A&8uutJ2gQid-5m0Jr&LJ=r=T!*YTOf?EWV}|!?_451TIpw2-MCY_v^p58e zzt7o4EkOKhdqX`l==$NuZst zF-sUpVtymWDx?5m9Bx3|Y+w^;vX-9W=OjN_rM?&D&1FMvryFt6b#wcEh6hYYC}X$Y ztS&l?HEYa)Dx;7jqJR@t5Q4(9U-_?IXw!$TA7EfP*h>tbrh7LIu?XL z3xxZO)ShwW!7xFglyEOIklqw;!bU${7;$z%{Jit}UX=ZQ$@2lNs?R)wZ054cu|4J~ zC(X44wJpemSXB?#YcBkG#md|-Yy21$KJ#^Ia$ z^-Clalp(q#g}9j3hF(7AQKnrc$7PdDE;XRwQuq<)xd+t?$)%ltk*Yh7g5*U ztmXU6f!VoM31k)wk2ee*e$`8O7qCc$8ntA>hu!;AO!ZoiPuj%P6o!+bUa~|Q3)Y29 zs^6-0m2HOs+|a6R7}NYh=LQR>g8$1j@2X!1IX>weW*i~Mox+s*9G&>t0fN!im*~*# zFJG~T%gJx6>Z8VP-6{LTelQu@Q#wXz5N=ZaF^ZF|Hm97QRXKRE@Gsxw4m$E~xrQ); z*J^mJye))m9Kp3e@1^x$c^aXE&tEmdgK2AqFuu{oSfV;c^Y^wHq_@S!{A;viwG`6O)1*z1S;tg!^QYi&OH`pZYxY5@A;rAFo{oYddtU)uN5 ze#fG4?fkoF>Qj{|Q1KUH{FuHOkIr`;u=lFOyCvX@l1&#`wrEtx{}3xnWX*8$V@jn) zv0?{tkzAV}ZQ4)zM56rGx*pm+Bh?Ddafb?A97f)&U-f(u)j;`{BSc<1G$Z5eQM(gpyE`L3cU|)SCa8VUB{Lgo0--mt^NMiu&HzjRdZY4J=|O( zJ^=GeZDgQ19SDpI69B}kyT?O{w~e;KxjeUEm`D$F%rlNd%WjzW$>FOH(Ru>fZEiX3 zb!&*7<`xi~%ya>HrT&q3>|70C=|+aN-92gz8^=p~5b)2j(#jU`pehO9qJtZ^!+-oJ z4=>{jmAgZvM7y%KKZe&tvK1IN*^uoXe(?2Jh)ri7hEz5nkNL34)eQ(K?Fa$AEe-!;l>^i2H2y6dJt7zZ)3Z|Yf!S5)xt@NvQ8k#hGtTu zEI$s-F@SBj4oXnXpUU2}+(v@au(k;2QeX@+pZ)@F4r9@HbWnG?OVvTniNy2h>w_A~ z3@!yVuT$|9$VrfKOoN(jL>cIxNPSB8h-LQCA$aDNQN3VR-Q+n?xL+1LP-`rl2Om+ghq38+WVlf2;KDaFN(7~$D}?Neq61B{`7z*Pd` zEX;fMGOQb5D~i&yb61g|B{(6&9m{)`JkVD=C}6pk?@oaZ^@}EVDS_Q-XGV3!&hnHq z0XY;E8XjC^Y*|~|1>hv`9gQV6Bw7PUeR&B*PF7T=UeD;qH-oXoF&A|Q>yyCbPZfM5|bh$EQK0~wgHT?cd-WaTW^EQF^4m;E6^mANP~v`}*NRN5$7j}V$A zD^q0|lIa$E*Al!K-O8!BHBR#t*!+$4|3Imn->}IHFN?XjV%jZTepJYq<(~!WS$VMY zB|}bNA3YV`xeSg5N@X$ah0`%6D%^ziHWiLy6wwL@E(X`stk*zCqI#iEzFKzm3(=mp zm(iZDmsl2gJksrKX&SJ_IvzuU=PL4gr~+cFJ!5p9xe`JCZXSyaKI~BXaCygm8~nw# z>nwcfh_Z3$rANr5Ox4Z9vQL6xF}p~Ow*58VfI+GwU&Z0|20DD^a=Wqp@+|l|MUeaU z!z*SyA&s|cv%JIvw&xuezRN9=Zp&4rg_M@G{Z$yK-TCr%d_twmME+ar&r_w7KW9fP zZDAoC{rkqOW9J8oHb2usTTxjD~BZV&Y%Zyzg`SIT4{N2J>zfT>nRa& zv3{Eotu9~B;&x0I;7HoI^0p`8Hm2u9BiqkjPcOaKK>x9R;)J!YAwE8_$1sbFrPT(P zg2cA9?I4L715TSM@CfKjy54j)7^UbA>T^VX!c_D0;1 zif2KM8)6Pw9TI+nK?Xl3+r26JdwkM=KJkAZ! z+V7+(4fZ|GG^&tg-(4O{Q_>eyok;rABSR5P>tMN%v$c2m(jjA<2$W2gitf2dz)dlE z4Rp#}8+6Lq$6wU#mGZ!oKx@8lKBg}!Rn3Zi>nGpff9ZKteMef`{4)vur6=UYTimN_ z1Mza!eAmD4-Fta2F5!*$s_0ZUS8mcsfxgSoBgd?}I;K&yWp5uj<#?p)|7WS(N1k}) z8%c?(FS+C8%c&?AgIi95$E*7R#L{PfK}y$*KfL{yHizvmlet*U&tXu}hbDit|I8F> z5<$)~bq2+6`CpoRC^L(tBY6tU5M*#rqRw#^j@9`Swe`uoAOOos|9ghfJkzPoJLH^i ztKr>O*Rawj$}r|Tuh{uumQd!`jX61%RBFK92Idmo&ZEMXyL*o|=T50g%LsB*&;7*OI$rH+AiHECGyw?oeg=DW^rO8puv=d95b8dRj{W;CQ>Qb0-o6KZ} zqbR3dx=hM_xp;L7LY!%=lRpO^YXU_g)8*GW%i-^)zx;udL?jQS zr&N3Fx4JvuG!fbMSC*9;ds^DiP@R=&*!s(IKmCcpPJv}m))Sq=>4f{wxD0aGSqJoC zsfSk)$!&|~Pr1Elnfr7dY4_b%=6o9*?$|v6t(QRU)OY$XFZq6(Yos{cnkSL+ew`-ibS8gwA$# zM0XQp7&DjuGaq_h`1=R~k+)p4nAy6|k#;?)zGwEzD$$7IXnwF~jv1F)Uw&DJ>O@c# zN;2K>q<+vvP~+VtM2jk)Qrp3FC}hc};kDRy`-W^s_@=To{_mC?51w^8W^Ip>cczu2 z#JIhWn=AEAwaXh3wd^vBjBnq%JRTQSgITh7DP5dquJD{uCOkg=OzidhsB4YhY&S(V z)SH=;5oc!h3YltXp7+D5Wj$B%6XB35zm*4Vus?(BCAiW|*mQL5K$CGBx_o|ClS5-& zO~!5Y@|;qD5)P%3xh7rG*N32%jrdDfeVuz)b`KKC-_{sO6XuiaFz5Wscyw;2sN_2r z=+&83LtSAd={`?Y+-t1;8s%3-POQ7ih}V}JXgk)XQ6GN0SK*OfM~}8Kx3VPkmTWlj zO61=TFrEx)HF%$R0+n*pXJO337n1p$X%qR{R>p`{ z-%qUc$INuH-4JB@j zGxF(Qd~T|wIU;Jt{e0kMb~veM<`QYQbI*U2@$Q@H+93D?{&rwHjIF6NCksB14Iivj zAr^S+*{9%>r8S@Q4czTjaH6-FH2I3z7!KGBXNEs$MRZcre${S$RuEFQG&fD2 z3kwRke8&~27me!@n&|{6 ziog{7%ykeuSDbsx^ald^ZT3<0^lDId9ZWUX!KT(%8x)ibr8O-G3Y>RtXm|g-r>Q?& z@H0Dd;h{P>7(adMOv3G@KlCgC*%8sxIPXFtf1>DBC`Sp7tQ=&nXf2$Fh0uJB{wVa+ zwgAU>b9-Z^9SJ1cmXY9ko8+H9TfOFcc_bNvmBw2(`Skk&*09 zzi^oAI6D*4bm^3h6ypk2>kZ^W*4DoFsqG_}cq#UhkF+`3!Jjb3y*i2^MZI<0wqle~kA1KKb@wnOIs2-U z=@F_&XrU*pr2gTv!if!Z0A4g1NbV4UT7Vt3Hsom=4=5hM8!kItqtFb;QvjsgDH!Y# zo?I@9J;bj3-JEw;FYAhAh0>#3p(oU0`ugoQG@0Eyk`=Za%2+^klLHsBenbOU!y9uA zwt*Q~;Nu>94H-HaoQSZy`=2R*k7RzF`x-C_l>PgVuW@uKOZ6OaxRmg(s$3lDMBV*! zN+AEc+|>Cueq~ysB3cU_+rW>fDUA*2nRkc0o*ssVk`tuC%3|4(T^i@1#$TOh-WSWp zJAANKTT=%cQao#O%&sKOx6sGY0PFz4?Nkwe&ccj#eF(BPE=^Hl5YM_^>lr;Y&(etpu4%pkH9i$9S_eY`Fj8Yy2XS60HWgFMVV&>%R_V7-$-Iwhp7Xi*{p z-B!psYABI(VE9t^wm%k>?RCANa2${U=EUu8cqBtUW@qqj_gUIbEp(;tNaOFp2>0ph z!kzc8Zygc%Cag`wHw?+f9nS2tSX7NBJOCgi+lha)c(+xC#D{25BC);Ok$Tu(`eh}-Y8&|4;U*#T&FW2K;Wk&p%(ri4tfyC}@g`9jHhA)lN>B_suspv* zLyuY!u9#w1qD<}Q;eGK&^`0Bj$m%`IfJDfuh+AWHDO+(uIwy~JgH`>&bPjv|v;8T0m!ao{rac zICL2$EY=W!Vo$#+OFCesp?!7nde31efT2GN25H8JGouUg6T!6$M!TEPy;7c?hs3k+ zM#8=brvb<4mHW5c*n2 zPNq7aGTP%%peLN|BqM}z(QPoW1dVU8nIVbBb=sG^4b@Md=uld%v&-Lxs&!6yQ_LG< zMMUNIOxRbA3$T?C_z}oXYQ#-VSOR zV;Riu&YmohKv_VHC_U!eJ_)L;il2&A`-&CXoL7u#eO12W?`W%a2U4>PPCt|ZCS1bM zMeSZ*Hc7Dx8O;Rw_JtS~zB2A|eJal%{m$Hn&2X*C(z z{L)>f?e^P`8=!TpNlf*6CQ|{W&IpmD%@xjZpx1pNc%{-z%d+p( zk$(M)2EKC1G)*6wZQcVoc9$_BaNLV)hPi`{y;-S1#J{M_3iCt7idQQtmi_OR zJ1IJr#TLH^KO$qyjOLUG*k6Q)UHkH;uhcfBq9S5{iy)A~SXOI^Z<2ZZf(mVf`cm&G zKiZC0e!+TRWcXO(`}1en#a5}`D(-ny^VN}p?rnn$K0d9SY05u$B4RdotRdX8Q8ANj zh1QPxdpVt}f!sO8uisWrap_Q}&S~Ti_9$jso!_)!OYKYgRD7i0;uBAn%TBv=evZ?9 z4+>-hlv4I%s0`4gU(5NGMc9Oqk1j`EKfCgtE^vM5zR&5exGt^poCJ<5Rb8;-QpzBF zCtrHI&S#46d>$WCr+9ctGWRLsoEUEsh}z66w~6KtsMPg7 z;%jY;IDdH1>FZKftYg@nCg4X?K8X$?YumTI8D~4Bc#Ps)FU1P zN2}%SF8&FAf*%l!(w1I-KrxA*=PFp`_#89#Fd{R`k7iWlPCk|_kM8vx5BwSN z4IaNfG)Z?fpDNfroqgB%ooJ63vF!7K8t zrFO6ZNS%nkCMyFV0bACR60Aw_U9XPB`A4H(q&feiUQF{CWQAjVgF@PQp0fz#DUGKLY?@5 z`9)35CzR{8c3PC@4%ONxY^_Aayu46FNd2kA6}Ly^kIyV<_@kikdc-tlwOFX?ebP zJ5(wXRR1G^jY#YjD0s9?)-A8u&i>h3xEi+n@hq(J2vcx!L?boZ!scaXmDS7*#oG~H z);XPBXTtnz1oHDh0gP~;joLEIcIU^s!i6S4Iz*MZb0JiamjB=8tWv zg)aA?ZI#<#N|&A^ffn4U++jSDV;dPf8pWR}3th}&Ir*xn6}Q3-)r$Fh#gtbyX+>$8VAl9(;PtwDn!N>R?Mab*|+|&2IEmW!*e#nZ6xx@^nQygIa?=)9``nq3P67R=- z2iv1kyvB>#Za@KR%s4y_@d?>HDaK2rL@_2rAj7|2yVw_ifLvs)sF(r^fa8k|A>q)} zO5?xuJhqE}F}5q~1o;jmB7>~H#Rt%nd}@J{k=Vb1T62T}O{!H^)HzX_rsx^qUprmw zB0JS5tk8K!`H>wupy*vI6`oyOx^(!g%GLb{a;hImR3Hs#9EnZ@Mg*s*-oVDMo*;CN zr*V)bop34gRBosB=bjZxG+%OdEvV9~WvtaQn&zpT@o2a^c#l z(>U;UkM>1dP_gGlJx7M8i6$^6lxbvXozfD&dyrlaykgp~q5t&T^g%X(aav>HvJ50W z@FQUkd*=Q2fd%5n1BmnNQ3OMb3h{bOhd+rH2r_n;?#ig4_=c$+dHSyy1_g7Q@g|(Zi*`NZR>;ph8Ie8UtYo_Ri2*xw)!o` z(XeTO`RE`J^KqISv~^gcre|QebTNW3H!I^edo3T6PhuMft5Xi88NuB9bRt(;gU?%j z+{8(?_B)I`P~o{PSr8+%3LTj68(WnB_-u`$Cx5vN1;v zdO;{Q5Gw5~6q*6t^N4w%I6&Lo?I?Kgc=n%VD7vti*OrGciZ3F(7OxNyqOTAg#FQR{ zOyBs*Z{?4)l`bFMp@>N2zatycbtZX_@4?0)_T}?)XESTd(uA~gTbtAr%N zL`^$dtv5^!xZ4-_gl)9FpFSpnIeg<}zynv`ExBC)$ z#QiXizQlee{lgl2>Le;kL3JqEy;p{Bl3CQ1UKjkF;Yy>k5OgV?;NVgq%vq^aS?Q>4c-e4< z5a1U>!*`>$&-txFf%$aYk!{4!X#g0hZ{g3IV03BIeEptp#aPw(cK8ik$a;J}pa>eQ zID}pxW(_U0TR+vCm!q<$8G2Hm+zcZdogWCBm+bv?qHxia9!k|Sa%b2PZqgI(L>?!1XOO7(;a8wZ{NqSuusqc+}JXsz@Hnv zh%pE4Yr(}2{%fbei_!^Yh;D0&wSjPw`17kvbt3Ac1c_1&h!DMbi~gMT8uLSy*;Q6# zZTz0^+psq+Y3??*vZ7a@*v}Z6Y8Fc|e+Wht`oiJPOP0(<2^ao<5OJx=k z?`^*{Ul5z0{ayP`v}}%|KpWU&Rkh_n}_S?yzQbfJ=0T(+RhMB1e;WnhVjF;_i zJ^rP}Armb{O6cX0{jexUzj?$9ttaxIaW~OcI$0FQu+To!t;pxxw?5nuI zm$ta?0>mEJVv5SV7|2l=0T@Ec)lWM!RLc1Cz-?K63j5tng-6iH*`AIk%WY|1{F^X) zBL|yx2(h^iADL2Ki*!&@7E`thrDNKn_+}v0{t21tnFmJl=pTqQx9(EF3tRTFT04$> zYinA=lWlCa;B=6(#{3+36&~S%t=O;7*u&Iou{2bN5d+LK)HrM+Fn-q5P^^DqR?dHj zp#3&^R$dvY{o1hMWTuq@$EXdK!5ya@$nZoxZ36X-jk&`%C35!HKbK+B>fRl@$cOfo zM-+3>Llo&-irdqh7$gf354i*>py=?3AY5ZKOWF-YJavyvu9(I?(g`oyqmjBPQR-gw{VHUru zqAmb5rB17y{i{yK?;a*z*j(1z|R8vU0|VpvRI8g{V42R*zO1} zMk`=!D4_ml_ca~|#$Vt$2-x(_?~bG|>)u$Gzxdg?B9vLu3kZ-tP>1tL>Y?RA=fAfb zMy8<`+Kk|hf)fMYw?<@ebH+ZjxpP>^^{M>1V47$aP-%P6vjsVX9+%(F&dWW zoXzX%96hI}L)3rfK`bG7w5Gho541! zlDI~yuQZt_+)B#%Bqf06lL^a5#2f?_L^^<)TefI96OS|h`7VjNcAi8uu9FcxFgz>GmfrUax6M$y_36Jv98Y#C8;xd+KMx8tDFLw zd|fm6I-4PRO8CL{%1so;Xx zCRS{h)zjG0*Duiu{^&nZT(!-#s973hw04kVp*>@svHt>d5jgjxJS0 zwN(4$q%l&pQ~{OhNtA;EqnJwMTwh4pwk?URg%|Wk65?qohG@(@xkLcCn z9CLKD%xK^pDrL(}u#p>Ck6N^8COCC{L&TMhh&hK+Ke6e=g}i#^dbe_Q)RXu0zi(r7>?#;qsx6sT_*m1^${n^H@6u-( zCO5Orf8UUa^C5_ig_{b@n=aXWX?Z}c8eBS_9+=Ui=gR1GJ72;sV9WOe1U##bg+nk= zb!3&8#|6pm#W?2!VaeU&P1Mxk$i|eMyD+=@p49d)P5P1&k*{}AIw2nzrez=*sHs?^uhp z8@=JRRG+}QLNDU3e8*Li(}$&as-N_UZ(Jc3WWUJX7#G}#SLzS4*4X>beJ^|Z>VV4p zy`otj5k#k%_YSFrn=pL;YUPi1dp%8y?)QI+`Bt!QmUXRIi63XUI0TW9vc(`i!A zm{f8^m0t_rE6tAcedozp;5lU0&JwEftgR~2&_JW|<)ovHqsTVw<`bu!OR;{jrSJ z_%W|S#eb(HIX^X1JFCM6ic>KwE<;A+e~1eUB}jbhAb;N9KdPX@H7@zP;r2-{WjtZa zd2qSf30_wwLqm@IW>(;xENDiKzpCKRH~PdRkVQnCGee-=CIM!g#55@L5u>hs>X+^` zO|JR`pF$C$+aW>E25M3}oI@gE>4?*_4Jy^?Uo1RGZIZLn#~ekp^0L)3bkR1RX>^Q9vTefYuj13P8U+Ov=|X<1 zh&lMy7#QB?`XH;K{=zbcH~$&E7uRMBxAL#<=+a@gL9v3PsVp8+T-KZLY)TRoP~Lw7l&;RuW-gE;M^ETR=k5(~F7+@!M|zRfiv#(^Q+U>v~trqOqO9m4Hpefpq+JqF= zJVea3rn_>C0*RBn4a8od)*ty56RZq!sb2t>g__bbkpw>%jIKN?-{>b4_0prc3PPD8 zf%02D{%H})krMt)6UH^Ro${Nk5-EPz0y1am{WcykPR`Py&2K`8jmWv^k6gGdGJNO$ z(kZ0XXPd4FDbJSP+6)|qLX{;IGvU=3u=P3NrRgt4HFgEseOcL$p@X|3=004IlODsgf7@-_Xr@ML4I3*?wL=7cT)ESJNBgZ6r0v+-ywCv9{ zzB1+1S4SrCutuc9codZm;oWz|vS%RHw+KTh601V_0iJ?*Y^EbEXECiy($Y6`p^z?u8%s3X6@VF8)_FdY0K4goj7NSpT@G1rBKXh88B z9Qibsz{ubY46tLq9$gXZ+#jr3*lY6Y`e)vHHMkwAey~IE5wuh?t1$3BxPU+g+^-#v7>>90{zw% zqH{Dh52B{0n~liVBLjjM3vrPFQFWkRDnM!yoMTm<5WBT97^Rg~w(7L{ipx&f#55y# z{JMfioD2Ec{}HZ5WU5{Qze@Shu5cKBRZs~SeoxPGT|lpNRLqKm&=VNH%2;d$dKNs$ zNAMJMN2kXl)QW7MxpVy6hGCHbW`qd{eb>NgspVk4k2m@ z8RC$_%MXB&JnWyN8}`&SzZ1vPu`)Fetk%P8b|Hm}^iYeRQ^0ga7br<$tLu-5>9iw( zJ;G!+)Xvp#;U;_*0x6(kVdut#nzlb@kkdc?_fn=Uim*R#6S)6Gm?n64-iQ&-p2K!t z-)E2f{UG1WW@>w)4zj~ic1v@+li4NKU_@!d{}6xo&&rX{-{$bEi3BfHP4DYM{CCAF zj}XU#lZ4e{c}5Zo$2RvJy0*wf*k_BuW&)vz1|CTsK!Z8J->B0_0f`!SJ3ixW;5T|F z{f5;!T8^6i*!9xWeXGnL;glFr2I`TZYw`mP8N#hV2^lQ-NEharZQKsp*+6Oj2Nnri zJ_#_c{B0}wpBqcxekESV`m?$cFS4ldd@`o7iD}^$n2y7VCUg&6;Bx_maSj!#pJ{41 z&LLJtfFh>;u0K? znybkV)oh-qh~GgQ!~|->Zw>g1<_q;d%4{ppwHyhtyrWWI(Bvqp?K_+((ReAZAW(k@ zE7Uu~^F-n-`^9(uClcfiCRgKLd~&>rapH-?!xGYCd|{lnU?lKI?~ znQ3k8F`BC=_vJQN@){zsGy0se(%VQa^A^dXxvUbu$8{UHLGVF}H6fx|>c!K+>~0F^ z!GvYH2H)?hU^|;~wk+Z*k9%$ZIB`VxL9pKo*Y@n&D|M^4s zUSA@r-WWV1HVs>!jQE<>l70Hd`+xQkD7F^Y?g};#q z+x68WpeoqSj@3cL>tPsmv* z!-soxgz@xV_~NVLct?xWa*ip779$)P6W!B3Ts^sF_?npk7*%Rss`NkL6vHWrs{aMc zZD+b}=4YjR(w4=uLt5BW6Rm4~oqcM)B&BJz{`3weUiaXfTTh4LkT~z;&^QVq%JJsT z^n#HRdKE}g6XacUR}+|g%MI>2X&A5kn7%LfUsrbumwXUov6=6<4~(!Pd$=3)dF!eH z!C3Wzc1E0iQn)=U%b1q8%<1%$V#(wp(Xqw%LA45NuK41SUK6R%(J}X zBawoGSl021eUUQtX6B5nadp*{9Y*tM-R(`C8WvZZ8aPr#-Q+x|&hREG7L}UPCw~Tq z?s-%XGy=k61p07-JcsxvL?{prr=Spy#$%T%=HyK*5P)>+g#Gb9Q|eaiBi|i54Kj9; z!)q1w3`@~Udh=+2tA6P5e6ar)W)kUFFFp;Ga6M+U(!aKuV788e81W1QyB_nf@d@EG{I>yK<8vVT9h=m z{I-%&JNS{~JADeT!F^FN(@oP~tWo&7R(e9o;CSHs8bYhSpo0<8Y*#k^EuLa(qWi9l z_t9Ql<*^s_%vEt6T2=h5Eif#aIGR7uJ|5gop#SMyLOUze1KX6Q0~oc8G?q37l`8@D zqF5f0j%6>wyb#%ahOJR4I*|jagXO4z1|5r~u`>Fw1Gj~xM!W|BQ4~zMSX%z#+IU1` zs~PbU0}UWo#o6x_yV&$POir!7r3Skoye9e&KXsNpCBgD{egUsbd%k4fR7)NV;~#Vv zoP&Ljy#)RSrYPNR;;*zFP*BY4C>5l*VBOw@dW1HF9h~&Q%<9@k6v|m~CejGcWlM(| zN%wa;5n+Stl$Sv@eF}!9Kkf{TP&QM}`bTZuY-Wc$e&W;G7;!jO*P{d=h zqvt2TQy_kEFs9_BH)xr9IA62bj)eOoscg?(xA_H!hYES&MV+$ zNS-_!b@_6MCjzYNgTzyh9idvh)zvs)1rN@cn%5iD%lkghKEX(HKv`A6#r8iuff;CG z`YYlHR`o*a_y{m1_C4XD3OQ5~g&*{$b5|{QY<1BhVaX0)J_Iue4vJ+8OvM0kfL{oj z57=R$x<|WUalgY{^$(x`R(n{W-IsbObQ;VjTK+n9yO&2;$SM%o0TSgjF~srR=zGq& z$D_a+D-P0D?V#4pInD8389O>|zw8$i*x+6Htk1q&zh+OgFG6q@Uuct4PY*RHo^A@9 zGfvtA?{ADF7>j-vU%dD@1w94egjCz2CpQ~tVdw9`W5tuoU{j0rj!M9AXvz_Uzzm;3 zVo_orUH7*h8}>@?g)pGHiZ39#ojB5cGSj7Vk1duMrON$JcZ~n()Rr()u+8VA)mN2e zKoNC-a8YB$O7K>ntWt9*0g8K#oPvH z6TS$nG&^C8LI)hMd`l$Br_Zb5(W@p=h9ugA`J6cWyPn|HI(FG{YSaVFQs3Wa&XQi` z(muJ}U73wl)$16cAhTNUx-6%S#d^w!nz5ja6QP&Tc z#@nAkSbIzXl^U^lcs(YuWG>f0lZ{Apq{-6SxgMi6RcOfNoPAWlZB)J2z4Waah7Se7 zKXaWO3xJU-@7D@SpZw_q#*eHN(9n1-c_NPiX`mo>cy($yHqxe2qK;hpi18e zrZ$G9vGIgaLUF}bc%gXqliGji#>2}jDC@yTzCJC`{EsR6!#kFE-QDC5t#bQX&E-K%oWC|U|f#9#}T-reLJ z&6rjibzXn5Exv)`ZTBx8Ez`mJ&VJ<(u?W6F?%rPuIGh}gGtRqz=k zZdYP@Z54L*s$pE7?e0}21aqe|9PAt5mF45gVY2dWNuw(7L}+_4F$s=$;=^^AR}TD` zu&&*)b2r&BL*ohVDQRnxSC%N(#^7>}k|#n5qH;X2z54nCL^=C1+!B@AMD8;T64=o9 zr86=ne@MsphIhp&Gef2y5n7Amy+-e0prkROig&@z&4r=Qe%#%Tp^A$ytSyOm5i$5} zDuKjDtoK9@bJ|)3o8c?UXlxT|qqcl3kQ%_ldu{X|owi_2f9A_Y;cl%*0=skBoJ)M) z3jnLzMeql7&xNq1NsMr`vsh|=qs_q=@9>V{2I(^H94prwa0z4*1HbEjwfFuLFA;-) zE-t1z{;0pW(iD(L!`u>L$@gzRefF(K7!a2bkJvi_xd1W=(Q#Hl+O^l#)#h2xeer{8 zdqmDj-W!;Q+^yE*-RG~uuR3NC$N#=v*ZzSvNNd}pwO+P)`m|4MvCUe2d@1Kwxn%PK z8Y7mPrdZ?=-TPC4cXsw1vg`oLz(yY_%fT;>f%wdOtU21V`(0g!-DoNZr#Us0Uc*j4 zDia5RdepOhlvWZ{Lc}mh8;yU-UcAn_T0@VDO;@6S5(z`e^^t$a3*`05y;_dNP`p(B z4x(9SSCeE0(R;2*BA|)^GX(uZq=Soy%un#!2X%&Vq1~gS6x+>Aca?<4_ZTKuYtYbY zB6jigomndw{_l&rl{aH@30_WQlm#hiw1_ZX^4NHOMG|E%Y+l>oF;Bar|S`@Ij*?Cf!2?p{DOe42cH6n+_nb>eA$wS(;% zIc5`>qyv%2*^-}?D2H6MHum0S8iEv*{@xwa`kXDDZ0?5m^>}jNE+1}ukJQ2ZZ3#w% zhcu9N%pU%R={i)?Bfq*Lg0MF3N%2gXHi66q>ep;093W-?b`0~a&Ac=c!fXQz_Rd!k z(t9s0bglp`z!F&L&Sw5eL;YUc;_i#$JVrtqWCOpPCoP5A#6%$tZBRCA|(R&1F@hG@pe4mMKfH5$(EY!NldSRC12xHkNweqtqz1^ z8z3lVIwE>zn|B4KutG@O1-0lX%8J`3NB6-LRQ)(_94bL3-tb8u_$bFV-jE?Wt!D|d z6y?zYEM!tZrwv4#rr2c%Z9fLlSfD7rPl0?~Hk|{Zs%-Fein=?${1R z&b;1(FYB%4ZD}}i)I1PZ?)5(|?na(#m)8-0OvFQ-KHBEhUvF&{baD=Mzo zYE74q+z~sQ}lCgZJSVlk!0fpqfGvj9EBfEq!3^ptA^qQ_FIVtnQ&FEIM6& z_uN@1YOjB0U>67Me6EFmbOat?s9!4UpgAD`0enMGXT~W3ozY8f5)70IY7Ip{F2|N- zKFuOI-kQZAMc)>zP21wMgDXIdG?`j6E3PtnoB(Q21Y?BX7Ajx=-`oTT!W)wjE1hX2r08&A_s`_M_|-K1?JC|b* zgu(sJ+}#t~EAo$*P*^9SxFTfeg8O=X2VOO^!Q{EIi)Sj0BFY0}GuwHJ&d$Vwy?BuG zKk(e^P63D`z{&YKPh&ZWaVfUoO(Uv$e>FIJ?CmtQ4(jjkNPoRSf^ysD=!I!>wYZC? z*MYCdhPPma=!f=%e}FW3ub&Va7Iq@n)qTob9o&#*Jr_3B1H33c!xD5E`&AL{k*k!c zfJ|4oWeJljf7xk1eYV%3r zll;eHxWad+7FSGg7jnnWlkARnh7%o`h@E5uX40ukP74MSrypEJk8>JFA8=*wG@Mt> zHn@v@Em)}+Zj%2EOLnEhxG~4>_{bbuQE_jmrn^R&(HK>CqM7m~Vjw+&O;HT%nwa2N ztcU(Su0d@^(3r|iBsoAe_8xnv#u=wOB&yUupxDxXm1_H_8ClBlnDz12M~6nkQiXO( z8itP^MnoApdP3i0c(p{vXz9lEW8zaQlx(~Shw7L(epuB1;pof3Q)#8i&{wOS!xIr0 z7tFy6y0x*9<>||kXXIl5Q68pP@hc-6X;$T|bxXW$ST)azKwfIc+N{U>F}2W{Qil6Wu2-9Hg{+ zssCdgzCpdR#^SHC-OQiLCqZ-LNBrd`_LUG3&;BiKMkN>4dd;rABU6RTo2_J8%`a8- zUjfPtSFT837F%rl6Qtv+BNSb?T|zS>V^7sA-@sr3ES!lWqaI;*b)S8+dUK)h-vO^o zId+dm0NsG?fvA21g40q$m6M+Xb7WEnU`)9ThNOBSqWz9lH)lpGcibKbVWWhQ=_t>Z zy@KaN8i}=I7t%jP3STG5F_aX(8eh5IFIlf$$sL$!uzs{8bIZM?aAe;R@>j6q2FVBB zOwQ3q1~VoNF^&dxDgnh%kU>D&^w_d1<)dLy) z86n+!WNIDkI3kwH@q~mnRC#0GSX&gz1>`I<6tUr?3ooDjmI)zE4COJ9|4p7uT^14a z>*3qC6Y_%CQ4P%WI|75zrHK1SI>p{^d~`crOtU8K;NP~fb;ZuFOK^C2lneZKGY*@)@%vk`zOq2=nlV5 z-Is>=3%NITeqjqkH=pjo5o5PfI~_sF)Q61heCXAL>fLYO47Y*1<7bg-j{%n99Z2GE|hm~>e#8LmgsszL&#Ys=+q|l zjndyIeYD9hM_KCIbrF34jj@^1AN?yD^_6zRK+oVjSUVbK2a5R`PH5_Nmw&}=XI43U zH7~Uw=}nK6D#)4cR^)z{Z5=Mp^mumb^O$y=eD6Jojc{MoWr9sq@}{N~WoB)0DWUVo z4677g&6_YWUxC-LH)L|L*kl4j5HVDbaeCaJO@io)D>fzXcUt5KW|SqnjlDq{ENxSy z{I2W#v{RiPKwi&wqS7(U={cWdI6f|xkSC4uG7zq0qp=p97lmo#)Gt0U zpLJ5yo_h-?mxK}!Z6@i3UFxf_M&p?hseERAPFymal%%W@OJe=B!9znP0r3K^WN;guzoi<>$%EJNdadSsoeF4Hy z!7q{JIG28{!%($e%R`8BhR2aS$M5UhZF60 z_%OM39l0(@UA}xlYnC>XqiUH?B~C_`N=?J}>9hX_qoj=YFCINZzgU#YCSMGaYv&<9 zmE&O>o9^gct?1+q?A($!n<5C>Qu?zjjC+B$FS9rmh_`>AtlxV!Wn1Gh9 z`Zyql46)%`kL4pEEg;VQ#snw+V|RD?^zF{#-7*%UfHKuyN{s^}%6$&!$1k*ENM-oR zQV#OMm>RC50>o5%(C!KCm2%$}FJIp;hHZ*XR|32eKku2`t6q?(Fze}XsEtOwae=r` z?*6hB&FT~rws%+p!yRyeGglNZpp9@r@$r|Uj*>a-^yy|ohg)4-l#eUcTOvIjj}DzD zXyj{#5uJ$zv9FyKt*394A(Ep&v>+TK^q=xC6vH^!v-3do1cOAl!zMHZGPj87<$l(o z4Cxx2fHw2+8jiO|f#vT@-lfGl7P!!!SL9l?4#ZIPimSzWsRt;+GXFyKr0{a<7xUsG z3ywmPxhP3%Z+vBt5(4@DENOQdsGnm_T0W+(gHF0>C(%n;X-$Ly%(>bw{}dow~~YaU3KU7@V5F1 z+P!6kr|n-pNTF5jKB)L)M!rE!&|U{`ntAw1?-g~I^ZLSt4Z+s}q2uN8-;Z2d#PFUL zYYSMSk; z(@y00J%62^>w1h|KTNyZ&h{CyDl7`DW*rG;%%x655!Z)|LWTayj0ZftsRhK|xOtfo z)kc3rBX0trt^U;Zx91F~P=AI6>)ZJedu0r>yj7g$#}1(`B-IlHO8X?yL6|FUz5!&l z3%C=D*0VL<&hNEMOk=i1ofetc4lWr_pyt2Z5H-*rffH&jSNE!jZpOpW@qJRUoJHktzHmn|F2a=O>kq!K?WEig zno{ehh_6PgL@WwyAAWzOyM=<-_#wM34I-=0Bj?lTCO+n>2mPgeX z9CE3ecjT&gddm>%#422eXYPZC&=QByl2EjS2*;pVl1n)PO^9nPQs#t5D;pi_&2n!Dj8OizRW``9)Egh0lYma@U|H02Z zz2yF;*7Pm&?M=0^Ubh0l-ZZ{tXoz^j^=tZJezMKDR<^J|(J>s7a>Tioy_!TMPrNkA zDG7eZ;IZ>@Xn(6iF{KQrCeX@n*{B%2kX80E@CXlI$Jyq@BK$xlT;6pY8c+OAub?L| zx|^)eaZ@38UpX|Mgj6ZmU-$=becFij=H^5aO2_0Bnx{(J`WU@ljI{k#EZxsH}>_8+6CJJ^K66o z+yB1s3Nxr_%ihf6UHm8PO!9ZY$b^#i)4Z)}P@ux+b*S~+0b;oSGLqj#&~J0aRIHc5 z?ylji@Vnh^rNdxWJvYT-S9d76!e%RGKDX{br%Ie;`E`Bb(n@`$G7*U(IFEQzho;h5a!u)yqsz#4^EJ;{=7t z6shNj9$XqRy>5x>CA0BAKWiRY=U6Ci$B-$xcyrXhb&8fZdnrYXwiD_fDT}i;y?QU! zr*L<(_Q>B4z4Mv(OQiI7JnLv>?*g7d`@XGKQfu|)2b^<5g0#M1(VK16u_>QDJ(yxH z&_2#1Ft{m#UUeyqhgLfMeD_SfpRW0G+hG+MSU93=in~)s z)`zuuED&d0az!$TMFk%JQ1nT@h)-XBsYWMP3-jP-e-fxcb_mWtkI~}~96T@`CAX)P z?86UlTe2{`$v(mEMgOvYX;G=rKYcfrwE_hS*k?7_OvdXJ93{ zVLyq!dpX4bHQ!sFf7n{EA1>cOgL|saJJ!u|G0VvneB+Kk?&EQ*2wRskInD!yvJ)sc z;Jy&ZN1&6JB7B<1gRtRfxndv)RnH-b$IMLX#u$o0h6q0&Svb)l>j8wnUlKLE&$ZFO zJZ*vu1hN`LK5tQ0YPtl3fW1ap&~u5aKxJyjMq#~8ayXTc+<}(O66Q!ctSnHy4Jr(p zLsEa#QCTS{&vac%@kBIByIW>E4@#dwA)qK}D;SX<0ehHt!!HPcm4)+60`|iDdxe2; z5@<^+P!T71ya~sDDL{0k_V+quEp%$3aeH1gi9zk3md@n3M@e zRutt13I-}}Hq4BXAQ5Ygg(@sIl|Nw2gHX5g2p3fh)Peo^HCP1pLoi40#D!6S0*`jzKZ0%eV;{Z0c`yLp)b)!~rGrC_7tN|O_$-k525J0U9l)m12Mu~!%%s*KFM@G32*}4utsr@7jypo2LBCDIr>EWkF^AnleDu*-2`(ba0rO$PZ_C?+ zWLscMWLB#WYbL{2{Fq_3q0u#$W^LXb*Ka=2xp=-0kuI&dPFj>Y9&o#V3l;E^<_8W? z;76y)Lf1Lv`r(dB1GX7##{8}EKDcsR4Yy+<_dQHofV>T!S(W02$6-_Kpo?}Y&p7n5 zUGV%!HqeKI;D25KaIwil6ZqdQ%AQ}WWCb5`gtMHXCC!I&eUo6Mm0)&W?zQK+AQc*_h7NQ5!)&$t1M z6QJgC1eZ;*je;)KsrkYZ56R?tB%Hg!;tNn^XosF_t8%#S#jm0IJKt;E%?8Y+a9FEv za;0aYiTQzTBPj%L;3HByCl%2px0UwIO5<2#lMxFZP~)`dXy!h8XT&+43NY0x3{o{)8yqPByD~ zA1c#6$N|L;@kD3t`n3!mvY@xkBn@0I_JOSxux}S-(BVgba!`j63=v^|A`iL-4b75Cr|qRzu&zd9*SQawa#;RmB15iyiYp%*dx>` zfJ|K)+tdBG^fG#Z7+!+~5O;Yg5YaKdwt~}cA*llr0ly&i9OQ|n$aF&dDO*@sIPwPg zLTb&4Ik2tBcbVeDL%Rr$NtANJgsrgpEs4a~`DApo^Vlf{j(m^Dt9#=)cm`jlemnVP zEnE^P_tk68GPz3KTbr+x#5P{!9mkvzR_6Q5?^m1(p2FH$PW0Ng!X{1`c>(fopU;!C z6eh0}dwf&XU`OPIfB5stW@9m8tOHg{x0F(!_xQ8pY;s~7%HokRfAaCW%8__oHw{xP zpJK8n!9U2kKBcHXMXG+7E$0+FlMrDz-O?N_jDA;{Fx;rCp?nnlj&?D!{`lUXK~!Wo zBz88@JCnpwJt=&`5h?XyfUAerDKbJ^^iD7O0+)@iFR|?#KQWvUOLTlzfd@O}Lr6}% z3pj1eR{h7m6p+*p%?g(<(nyu>1e#uPSmvX5_L(|}E6U}grnB8BSFTfRYt}9jQ){wxrJ>~IeozwWHExYH`%(Hvq}EgJ{`)c)hZoA^i?kQQS z;ymTx)Td@(znq%t>rba;NPUt?NaC6BxoM!}yPZnzKxC&B(yO$>9w--ONoR^Z-ccvCSOEVPlkn-1@C1?h9&CnW?7 z^y!$tm`%QNzHBdDD)LOm8R%?hK;5xg!ghjqmo3el@mZW16We)9J8PeZdrdkDX+s#M z6{?DfIr%;<+NgV}=A2JrJ;052Q1lN>+^S+_@)sJK>fw5X5G$5d|!ubZ721sU% zbp~77Z*Io%kjJ++tp{Hm22Z{4-#m2d`Sez1w~9GDO)@P=`>}K?hvo!9j^$2Md|buv57_x-D>GpS1*-|XKquhKUwW`e4II3v7R~W zDKiSX68JgaU_nAg+cP(gy6bB>xO-2r+b4ixeLqYJ$wf@i*_6fMUiIH+h}BNQ{N?CL zZ=nlF=J#TenmuwPatTCRG97{LIL5?b(PVKH5y8@~gj}pat?z4moKybdh z(EeexN+)MYjE*P&latK*U$TaN2T4F3-VA)QRt<-6UVgacQD5W}3it0%biCvfA$S&R zIkV>$cM24fh>X23Q-vs91vw0jDD2-3L~CWq!qIB|R!^18p5e>LAPGHy(Blmy3h(+! zv#bz`)eET~&vsfwfkIa&h5IB_>G_M1pSBs&eJ}P(&rFrjjE;pMkGJStRTQVM^2+MR z=Cd5}Ku&Jo4uMz~&u#f4@%?8DyjBa#(b0eQix;Le%OSB_Wq67)9b>P)sea=SjkcQW z$CXMWl;oUz%X0+}BK*#f9@J;i1=ew0$cx<~X<+3lmWuKWVq}(0HxVbeaHYy{K6tb? zx^**fB3`cja*|{I&KbBYQFpoBogkQM)isr$Q6xr5^PWh5>X7THmL2;e>*9Fl@+xR zG{HZ5A^^lRuRR=QmWLEFs{Yngu>xJ6{k7+qi-t*h2t7kbeCB10Ph3;}%*#UDITTF5 z50VMM&NqfaxYN|=x`;;f76;m}yCxnJyhh@;&`z(KUj z&GZD?kRhftYXi_n>cQv)+;AWw1LEp|m4gjIk)GpdJ}P_b?G(tj&7)nv))jENx7&R$ za0@~11AZz>w7MYGCmfWyo6T+zkG-7g;2B+56f&<=ZQNPukes+qHP*rr2UADcEJM~5 za38RWN%4SMD}`rJ zE}I@%+~koMJ+hjc9yK}z?}5%%tQ>bEo~tpwQV_lN%gMCduZKVO*iUpQ*FghKb4Qd% z7@=|qRR#eXIU$GYUUW-`cb=HsS@a+8Mf7X;9+>1PxSk*eVWbEj3&h|Bi|E+$EQiLH z_*wJ@XsZec1| zn{pwD#F(1+RUBnbgCk;c2WOz00#K=(cs%y;;CD|aciRUDjBaP&1eY@)1GB*uF)cI% zqns=xx+wLQW~giSQRxg>XdRI_=#vE*aPe%mg5nF(`?m{=qKbb9bnf4HY0!D@w)fOR zB~^f+NYd=PeX?oHOOJb{V5oiU!NUk4jjeK>yCxQnfG6C z)~sJoPOriR4uYRyL3EAwWfZxUWiWko!L{y~NaM|9_{Ar%*5_5L>*n|*CV*l=SEN|_ zg}r$K!9((^PN(s0n;mCXOzvzS=_fu7Q$`$-wElE#i(Op`Z@brXk#qVW(O&VXFPN22 z&YvCU*U+ITUzx*E*PttTUVmRajJ7;1lq_yMETTxad!uuHp&xX+1sBwg>6+bQ(g_s| z)Ft72{sB!tVW%PY?`&m-3TKK{KZ{}5Ywo)SVWX~1?JW>`g*_J=))gKb=lpu*FsIZh z5lpleqnuy&&;*nXJSRW3gwjre3c;%pdRg~B$W2=2L(hw!PWQXcnRN;nwIe~zs zI+vP>S>}DJI8$et*AOR>CST(HO-1G@W&^#qBII_?*c{0pU`rN zQ&T66*fkk|VQkgC)P&Q=30%G4;%ez}&{WobAx=DL8Q-AFF8_cifiH?YTNG==I5Web zmHuOsv)(~49SQbXnd2eL3t5S>*0uj;h>)C9p-j(3%h^PHh=E|)Lphy1 zW}%3aFydi--oveIfgt};1vUH$6MVG_)(8Z*#$KR2FQE1?#?S3T_OSQLakVF-B^^XF7GHDbCMV}oS4 zM8_vF)=$}ITQnPGh&Gm&A6=QB=k_o&6UU*_7=Lor^Mx1AP<#@axwS`%fMhc2y<7b@ zd`ng5b-~!t5>ym#55i;-*x<0o3~s%X??4aAwz~c`<82^&PVCG4uHq0{9QZG`u4=DY zor@YFZ8b+-g;|NQl~*ZwU&?MQ&vA9R-{$Bl$ZRbP2;a1dH;&(yOrRum?|d^_wybfnR51XH_2~o5BZ;ZS5Z-anDK*X zvL!2H3geyklCQ+^hM7~`uqa!|Pv~Ah6HyKYocMl9#`x9=3(U==XX?b7|Mi~)sO9Lt zcwp6eP{YhNc1)AH%7HAf>RPl~q)Fc+ak~?%(XYAq;l$(i=<8eGfKX{JshS@61x=q^ zk;9`W22b7!Us8=A$p}?jPgU?$!pXjtm3=fTEKE~#gc-fdNc+eDGkQ|D2mUqCixIRX zrFgG{k#Bh#Mw>@Pey}C)`?Ap?WE(zX`Xk=w;^mBX=b3uhS;@o(;>nf~@ua78imk=0cEmcPJ#W9-9Yw`w%W_-pFelaB zl?3btI~%*V0*is<`S&1+{HbE`U58o>`@sFE zw>C`oXaA$m(E=8%k^nyXtn5gNm@hd-wnMwfdt;WMqGryvp- zZIl_+X+9ER6j3qZLg>|6%^zO=90>>9Q&VSZJS6w(t8F>=PiGlyg-cSk37Uzd z%7ub>wi06Zv_&+N5>=nRkV?#4*U!vMz3d=8K}FTr`zE!xgAMImZ!7X2JL44(S#C^k>G@7-CRI(HIgH$lgEP6klFP#q@z zhuOu=jt`!W+Hp!+r^nYHz<2IM#=Y@}+S^gg&^z6Isc}SlCz2RptJ;n&-N&6xd-+SX zkxINAxTyP6fDeEPVe#`2`nRyQ6>oRTn+nkVCp;03cQS1J&0Dgp zR#?YE{j_`|{hWRq2Vur3fTm#N%?4+Xw0rEIK3*PRai5lsLc4+g8MW7^?I*8GvDXx+ z-EKYM;{bD}$aBvn(TIu$-o8#>>O7{wcuz15AB5Y#0GvvlPUKU7#GG=N2*KOr7cfj? zNERbM!}%i!x9&aj7ZU)(2S-)`M%(>yBVW9&PSEH%$dDx_2MVj0ED(pLP2Vq!7Kwkz zOGbE|wzC9j zT@>Y8uz)5-1Wnmj4>pQ%ffXoQw^=x73*Z+n@?R7%EC)cNS@G`I4v3ZDIWFcb-2yrM zsZW~d1u!K_T7;rs_;~|uNVI-^%Ts$D!Bg@CJ;W0HeGj_t3BETVk-do9_$P&2GgO*( zJ;g_+)liy&?*zhi#lQU+Ovpq~Dml=8i?^|DXN1Tv2ESvH3iBSK@k+V|%M-jx^L9*} zQIIhoX!7b7Xd5%94M7SybluW)G=ewno&_TD<;DoWq{JLzcngNpLud<+IMBb&qETkb zkVT>8${b|=5rRqlr*#*@K^M$82RXkq13uBLD9}_3_E7Vt>#E!YC@@p30K>%oUv_Gjo$S!K^%P`ny9^V1O#f^?FT?ezjx z0#*6QA42w{*GXr;98MR{pY8}x@BNkU;{}YQhi?no#_rnimqY8P1+&0SF5b?s7qTsx zeX|kQy^xf-+?h5Nr|@mk{q#Q%z!avEDi4J)XSEMC`eC8Wcl$*0+^l99-c{t60BLrs z=bBorA*_>#N4j*8W&oiF^|dcspn~2Vw(Ol}s3({MBks4luoe=<&=xq!TcYr4&{F-? z*>g{kbpcQMO)`WeucCIrXBP`xo;G}qk#VKC_SIB$#i1jAT&LjojL+J8}beDy~L%HwEQ=Gu2Hz*OO~BVO|iZ?(Pa6xDN4!!x};Z2-jI zxM|P*Y4@Y4_eCE2V?nLw{p#0&+iFK4LKy+oN)VY(^ruASZ@$5%m^}ZCDO_J(8D9^* zPdYz26FXm>?q1!z=wADyn}75Wbk1_F+}M{$cV_hjOiw`f&7^OMg;>L0kG)@~d?Q9s z4qxdIlQU0vIJB`Dg6!NAKTCGWwz&TLrQGws8RVn&!;hR&L0iPBcOBStx)~`;nU>W{ z2QK+q>kG{9{I(yTMI+53y%MeL$@d9IF52!PE*ST!d!)@!8RI_lp0_pk27et4q%X`r z?iv!={bCmv{^twM)HBja$3jLek-d|?(zKK@jd1r5IbgD;SaT0IHxD~MIZ;+x4kb7v zihR6)oyW9h(PG<^YZk@lV=Xc&O@mDo*JoFy{z99b!|GnNqg#BHdSw#>!>Qx2U||w8 zQd$#1k8kZllRWr5XY9S^D3l;*(v<6Cs_N^fEQwxI>A6-B?4tDgtIEPmg7Hl+*cBYv z1PI}pPn}iVCe3)O-$cAd&3|UCrAfhF28HR^9>fbtNaZX2>1*2WPKN9){t26kx}$}O zKP#Cs-YL)$mhJ@8uVuz^um|J_FI!hN3Fkev5Y1-){X7;Yisoq0->A$go!Xi@1jS&t zt*lFqu}FVE)xum6=lq=Q=Oc3IPsGQ%epdbn;pE0N9F6A8m?byXh`NBi)-SgTUHd!z>gx z@yA{*&j&U!36@-&g8X$Hr4}^?avJK$+8#aC78Mt1P*JIkYv83Wb3me`d8pJUg5fyn9aT)$dd z7xdmy5)r&fSk3`5SQL@|?;k zF?JQfaAq;oPCW%oK{5!%cb_f_J7+F`(=N!~>5CisD0O7lwk`q?Ue!g8WuPG{xU*dl zqy6uq+Wp$_4a)i;EdKzZJCe-~OIYoW)}xadIM^NajXl3sTgAYc>=$zY_6 zR<to5n)N|cn&r)&U-1J)GQtc?f|GXIclG2eXm^55 zKa#$it6oZ43)G-TER8Bu!JnVR!dgNXnCs7IW`0M1`eZWK5OJpao zcJ4#fF7T0PUO>$akf`$&S^3AWi=|J=I0)L%avs;f){8#f_{B zMFg*wsI{uTjGaWb^J(B0|L$4%Mr+;Mx35a|3oV|!v=aDUY4;~Lg;%S#SX3U91lPFL z(u0cj8GR(vc9LG9P2>X(rJ23Zu4y(dDf%O%HYPvQLz%-(?1zW*F|08@siUYvRzsnc zKO<4}Vm3H`t*QY2N<&+dzO>&u{r#&Hc5Hi#1*6D~JYyk@3rfpeG0n5)t&7ytfX@QV zxEgTR`uPs^(|n@vH!65Cy%4PJ;1G%XzkWPn{So|VFvXuXbEspV7Or5syTd5HoXj-z zx%k>gn?lK~Ws)Z?l&0xprsd<0?4s{n(3(fxxs80E3RZpn@-ZJNmKAF0!HdmyRCIrp z)cQYjDm#^?bgHPyKKL?}kCyIrXS@*TWDUbJ%hccd%g}`|+x1@F3KTqP96d{4fi4@| z8ilX4Uj~M{pWIx?9yZ8h`iCxsKpsgehu&Uwx?)wxE4#|xIIvX_o)Skw_jpGN!moEF z2r6=`%TKRaSOCfX$ihSUA0%Xlq#I6`(B~63)bCF9l}O zG;lLOL0S|blVIa*n&dKl2|oekZ4_mp)>N>R)AzX2Pm$VaiarIuI8>YK8xs*quQn_c zNL}a|vX@9HL+Au*-U)ZsS#deY)ewREh5bHmVny*kGvbL1>lraZc0#pt9zUG!_2;$L*0BS(%ZM6}hrkRz)Nk86h&VU3-s= z%q08Tg_2ENd*8U+OO(uO-b-X%d;Z>^?>WDJoc;;-Uat51^?E)Z4`S4`FJv<50d!eb z_AermKrRY&?}>8KD(9)j+tTHS*X1fFXV+Q90!P@A0aDc(B($Vh{buz1{tIp}!K8Q` zJWw-?S>tk1yJ{EJh(cr6Q>!wIPQ7q1GTdK#JeZ2%Kn0$=Lc&7HSWS+59Lpx>axGAb z1Wa_O;*=i@)HO9dA$_8K2FZLqFX{C)^U_NxKTj3jFyP+(XDr8QJ~ZLCyD}$;&WLVR ze3xU#{_Svc!Eu4FY^8E}-$G`~c(gRtVACbDl^sMAoIvEFQmZ~FXO%Z5ulP^;t#Jzi zP@#g5ApiSk^oq=rBD{iXu9}=XG3iRfU#x1(=FTJx3Q$QRQoZOs1 zLKXKS5*#pcvG}cKay)MSU%VYyfE@L}ku__mv)i%-es`HsR@nOt`6_Xmc<#QX6S`NF zNx4p!Jj@^*=?%m0{?w#X%WGv(Nes$RBtk!#T=B*@hhpZCpvZ5RGmZt*{5dQg=8V;! z%j~eZVT2TNcKMz(5SD?{SG@cQ3&| z^q6M?7o!eWyj6{1f;|TQVp|F<4M;~U|AUk@U32U(S-%I!3G7(!HX~NR|LW|t6;b|E zOT)eOacuJjS`WXwmFIQ1)rC0oT_|avS>2r3`YQ$Qwr2^%t7sr43;_Wa=)ynfpcUA05EWq+51%3v^pf>Vs*f;;ZSocQ2|2vq=fPuO4=3i`sd!|#ap`C(e4d{rM%5f%C_E%Gt zSZqjKtuM?}i35ep`niHqM&9Z0um3J!`Sg|+M}SHS;5TLt8z41&4SjNazSy}isqWsY zD)$1{$rbn{AF6RSHtBKrW24z4?$wMHY4=XO_LpT?%+@+6+p+Zh;DVB^G+1W9Z~oF- zn6(X6dhB7r$%ee#Sj@EW-0b8Ectp5-cd6JbbZ7YNcyZqtrgF&}%CrmscHU|4=6&pf zG7UCCr8MYV=Khc-q?NfJHR%s9`xQWUg`X#cl1*q;( zUi+PJmpS^y;4<|U$!<0|`c{w5GG51G!lho7CKGtw>W?VfqA9urqNT+Kv5 zL3Fs5cKEfnLKO5OFpUIfwxVdMFY%kF5B*kEh41u`GQ88BNpuI5IiDP6sb0B6qI@z9v+GhdOy&+3aNQbv#v0U zJ#bsh`%#A>DuI(}*-}!MK4X0)ay|1;{Kx&Vhq_$XY+VRHFf18ZWk;Rvar9-E&@){p zQh$DfI>y^{ImfzDy2tK|+N&W6!WpU|F0I#dffG$G+T&f8j$93N$!cd~iXL}iQHMoN zqoDzM2x8yDs#US)GVO2oT8xCMLaC$EkN7$_-Rzi#)gA=0zpA8(Yy8D0o*GE1T>@z& zfP3EgQ8&OR^;?*CR7%YAheUtxO*hr@P8FiyDyFf2yNk@v1)p1Mpd<)UcS_rp{79xZ zd&k_|5zTFqSw>PbOp{gK4CySQ&c>?t{93eY4+)RPW{!R zaQbEZ<|oLf9I=P*8hQI)X|~wsIpi$AXLWtx?I9F-aekfoM$DRo)NtzH!z8hB1(fuU zIi@)51~sZ5OtqNuox@@IyO61MGhZT~d6~ygxzLik3{_HV0&!Jb3F6-I9|W!QC*n5y zv`)B`x}c$S)AL$H%YjZ7&ZF5~a&(>0kKyXy!4I7`8ukxpel9(xXS9DiWsq!b{!s!9Q)ZjEeT0rQ%RBGtcB}FJ%mFxl zQ>yr3drz*Lqxz=bNzA1lM2*==bhFt;s=G+#B-Jkcv61L?g4h;LCEnNJ$VseySmwV| z!}D|^@N<8>=L^!T46Ec^Qi;0=@4rjpAABMGNtkEP-_2YTiQat@GEuMdMxv>hi%Nu( zHO~prHQ_xhR5eii*M9c7X@tQGIBQ0J^ev}sR#=XBOWT+6wmY|8{Q0}eEb@4yR!9m_ z{D(tC^q?(^)owuJ)-6$z+MVR;Va^&5+@z#GPAgG6RB(^3Dtc2!5N7(uBQY#=7tH2VCE+ zH!JZo`h8xt_5>G*&$z|QVcu^wnKrI&a{0)LKAq@B|H@Boois7qai-Lv={w zh{$Z3d)Fz}!D4l{nfbLSpIztu3J9uMv%&KKQ#>p1-ad@EBa1n&7Th(yQFKh$ckT-GL1?+NBqRN>&iKCvfw&)fG6$QPo?+0m? zktc={Z-#ltY)}UOsK?p~p&bIlcuy+HS3fu)#`;n9ZnPXmO(k&q3{W5*$&;>+j@~NI zC)7T0Ew9cJ*h;y%|0&Ux`$#|_WhU{FE#{}alt5AdV;Z89zj#J4C5RndB_h5o-%l7p zk2wo1U9?=^FvwE6A$i@n67ye7AXmHFUU!2@)-M)GUA}66EE3T~);vyOEcIUCsi+!6 zse;%uX8b%9RMf~a8;_W`i#lWG&BOFhLJmThYm zjD$r6s|0NQ`!nO`*Q~pf-z684nP1qbWEm8*8T1#T@5httd-vtcc+l14tb@lEd=;Z< zc|a0PxzBJuGGgt&MZW_hJPq?>ozLCA8!m@v1d=U)iptTM0Z=Ut<;m~YP?mXE>Jc9g z)adLu1WY@rV1^p4xi)%-aE|+fzn*x&&}<)p!?tOdT%EvM#zUEv8X3SSQC)hc#Q)Hy zT$pny-bv8orKJ}A+?@QR4JeEr`TPD708v>|T)xNb3>(O^n*gTPjN77xQ6<3m zrW&7w;DmMkCO&x1(`vhtb4*Jmw-|UplA=qlNFe$hq!)gbQPAbbvZpDUh8wK1Ir1dW z%YOLkTcZHw`+GndWXPxsR2CbmJpZ{O`?-!^9o-ABW zwsw0)u2cVDOZIDO*R1m+A7V=cV}0-Hrf`c!5L;aq+jj+LfIc8{ zIe!#@kg5ye%!ql)4E+}Mlvf3TZPH};kq+Of z3&B=W^-BnujCjRhXKlcuIR^Vv-oXO^H5@QBEE1EVAd>yMKrVYV|2v2o0YVy8^lQBV z@H;6l8}@?}cDL{)p1i;OJuHRtLq$m>lrszHu41wIlK-ej*gjN@!e{^~Ep-$$^)jgZ zfn@gP0B#W???ssV%tUHwm@V$N9C(Jo(bt=x1)zclv9n($2< zd30>8<5ZWOa)XGm-cSBuC#<#zk-&^WHewZc_*rih);hcz%Ems~c{?2R-XXqRa}4go394(EqdW&4d8e7Ua9I+#V>}`X;*qNQSc*Ay<3tN_CUx z7jr!RfT?W4y*Z$bQ0~>%R_S#p;C>&1<=*O+;r`c+QJ$uWcLb}KqgF(n^Fo_~(~ z&<>|hW|)8&^snUAr4-w*OC`=Qaa#b@W5KV}244-*_Jh(qJkGAn^bqYEUU*_~f4K8c z^s-f;%!pC_`LT&YQ6x0k7Hqbp#pzM1Z3-2^3Zciof}zJ5`C}#1Yyi3pVj%!S(CT`8 z<_8|-;(mAKacibHc#S&8DRZP`S$Kd%MZER=tTTK;4vp@)pSf^8tVWk$Aw2|NhW*3q zajpispJc1MtI=k!-shS(4l1porhg z3n%(Jb8xiBnhMu?`htx zVDuRpyfAo@5hqlB@O1<_G|{k=vnN_aW$8TKYNyv-P-EqE3}3K>OO9l4+W+XB4v|{6Ykm`i%rY2fhXo5CPPD8 za3vyMP|VHfO^niK5DjDKELgjl1Ad5uEB!$Gbop=XHAJhtZ|sVans>*Q$~D-AH7r8T zJ>E7mb@NN@lZTQr5u5l4(-z~D+lHLQk!jZ#7|B!$o|2quE>A08EI^a!g3nHQM-eQP zW1bJCZ}aj`$E-Mtd?<0PL6jCr=N6t&P!GGS!6aF_Zw>CyHSh|JCXT+p{ZXlPDUAsO7tvn(h{L zM}T^jq3D{$DG(|BFO-fFVDb*&;_BgvNWrdd;w&8QoMcAg4R zNZh0B&ecYax)n60nB}sMT4rrvNs96KN&qZKf%((lA_&p4A#3vdpa)j>;m~Ffay?x%htK8P;D^`Zzy~pww!eH`!n|LEq7`%=x<~7ypKP7D9-3w~9e=*bItWAsU2rg_8#!*889H+|zSID(GY>qnQq z!11jsOR1&!>(_5atE#AsS#8Z6-F&JKPoeV>uu7os?2sTK<>8aR#?MSORB8O&v{I^FN$!4jPW%0)tFmS@5G|nl`7nxCH^7b}?kKTF*oM-td*@ z4W*xo`Q>OxCO9bv%aapW=sPD~5l*f5+e=+b68K|VoXWsP>umZy&O@-=?b=~%1oZ&{ z_uGW|{m{ZJKlPfzo zT(;jRSzjkhXxPckXf?MJaeC4>ac!=Zm=s~;w7C;tk!i+`3v!Kjks`1oO;Yrj!p)>-DXz^jc- z%|BNQ%f-0h-c2~`vuBAe36IWABfA1>thgyWxVBPayxGZC1Sm^_{a*?@#;o!?8_TJC z9f^IzpWkR;`E29$B)_I-P$E-(6t?sWN%FKTBsLuL`6rkAmoBj<{LNLo?Ej)C(()sJ z!!+z(@X|9a@tq>?fHCDF!ephn5Z*9_l;}0!EuKYwNbC`)epDZ~t@2r(+pocRd2Fy` z_q-?D-)73Gvy=}1L?M%?$odQ(dB42zU027d?1=8N`l2VesbEi z$Pt50y8>jkFxb>R2%||GXpeYgD`T655Bkj6A?i-(AfuP$b^#w50Y8WFWDb5_MWj)HXeys{xVgwm*H@9)Y@I z%s1$U*Nmi_`pN)VxeLqWb88er+yfMu=N+nib1HT>`{BeEp8tY%b7Od?*)s6HaqYcXI+498MF6mM!k7&*?fWu?&9ZpbTUR_~Gx z{c;wDT-6W21$F)Ut0uq0)x09Hd0hcXZ?R8EkWNCrAq%n)j2w$t*o&x3?#@KQvibgn zlI>Sr$p?;84cDG8Jv;|d6V!%H@luUvF+C~h#VF=(W2=Vjb(Cbiu3dN21H6j z0Y}U*DUR(x{RkkVl@N5SN(l;sE68@box5hq*;Fju1(j@x#p>A~y++_TGK&}wwbsw!62Dopn^2lG8dxOw}m-st= z540LEi@%NLIc34B-z6u=EpjEl#5YGu$mG8;%FTQL2rE2K&bG@%ULOtq{cQNNqc2T< zP=dn|2@Zsv7c9JU&{m~>*`Pl@@*lML-bf~Ru3)Ft?F3|!<@3cLK#AJ|i<;%BJ0Q>mmv_m+OUpa7TFePU z!XB&Q)5ZS-AtNDSubA>f9}Ltp-UipYQ=Rq7uBQard3AV%Gq zgM{hy)kDibL_AC<99lO72;XP9?yWQj*{#G-&YV_J5N6u$h*C12kB)OJ1GV`POgF$~ z2zP-My*$Z?A)YkMlWb89YH|L|W|*_oej4w`n&5=-=+`;XYtG-Yv^k2PJ# zvFbF|Dzur-D$JXJoBNEx>ZNS5e%Lu#L9h>jRhW<%9t_~4tCgqURV&Ya?uPc?1NdeA z)!?H+uF*A4Y|v{C1<;lRJU$X!tH%yLPuvvcxyg{VeWMG|?0!mMNbiH~0!!*>6=7Qy zEExD~h+Y`};-G1vKzNX*;@Y>1=|J>z8wZi&0M0r0{3y-xA1VgyQ>MdU{%xRJd~HZ6 zr8ROj_yVm4a6VT$U7#%d*R~qK5v%5*0r}SDVDf38iVvNPDMWW3^-5o1qdG!@7jVl7 z$3pDSUNOAC@#K3zWH^>B#t!nyXr1M`wMgD>vWU^G!DuQ#oxx{I>E%>em`Eh z{pl7uBXaZ4Z9BvOl~5jMZXCo`u{f%ier24cr~`l-lGNapB(8Aq9ccpwZBtXxh%yo9 z37_Pb6)k$O@)z$4NK3RYOU7#^QPnm(eE~Pw^25(GI<*Z3#2ZNo9=7W=LJiY4RAtQ; z#EFZk5*ivj^VS-^UJUV4QU)K>qKgx$Z3Z3s2KeUe7%|c#b`f_HPp5n~6z3g*L{&`a zYu>PD=G>DQKNfZLYs4c0aZ!&tPlvVsh~4;q7{h!<+<%@);P4@sm*%~NgTw7d)N zo}XFreKXg2f7h$`!6F3Iqq4&T5-G*V7|oK%5^MfQ+)-weN~@RX$p}x3leqnsEUL@P z@Yy{9T)MSx3#U=-{Tr-F#l6ALGdL53b8FgcB#dRXt&J)YWy7kj9KS)oF9*bn`T0^r zweU&NN$*lF1+B8tIO;yU@x6&kgDNQZ6v6Ky(0pz;E-^+J>imdlTB=S`md`M1?T&{4 ze~I)hFqs*Ab(1mescS-%#DuMw(67Xx*6#3z9~6IjB5kfw(qF9Cc7yc$$t~gVzv8En z#q%ZS!Ssv^BD{;PMQRV@C^Vn>3&p>B!V1d}xBk~l6ID|Rf1*)C^#>!tsxKGQDnC9Y z3%F85Lje3Zby-r|BgcUJYA#X#iA;v&&Gn;(1Yr`5g7=0zp**T8*Fd_4IVRZ4pY>U< zdMZ5#7|Dg0m=~&S+SvS{rPH+cr>Ij`f6p%5q@+l)Drr!jA{j>#(QQwqW#;18)MxXN zpO*7}wBHr4HBfGgarZqIrSjOF;|T#h5S*}?;kyX-oR33`^GiG!~?}+2@=r14wkQt zS?P_oSITm#Q$3TAkh%Wrj{U@EGt#HqLV8U16^QXuD6e6k4BL!)62>8~rx|vt0r6}! zY{rSgBR6Vy_BWS&1@rTznC{L73I3kR9TS$M z`G+$`Tcu2W!!j^dkwFJsoa1Nj#6A1e1K znt<}7CvID$Bg#JNiZ2mLgqS$c+uc6rBO*K;ggH>K4GNKR2W^~W>A%@Tn*z;E$c+iym!(IQ^A0(aF9krePe-O7aZ^y zOi{hx!N5r$33~zsa?TCr0Fy${&k9T_0*9*cEsil|5+-qfWsTYqa0K&(v&%ZP!VW!b z@)8VD}kEmkRN<#bvPjbBy*aL?f2(K^v@v$)ifER!S8FXS9Gk zR&SE5nSE{E1xki%GwOvU16V}(>!vq7;ZmAs*I?5dMR@J*@Au}uK|K-8xBpn&)x1uh5- zsHolr(BZ6?bp7d~TcD`jG|c3$`~(btN1VK$>WyvwZDz+&k4)VM4aa=X%`54JSZAk9dSY_R{0rGb`Y+b&B5$UMqi zQKP}X7%LVjQ6>O6(x_kA-@-KEB#xU(N57gIKUEazI)VCMX5%c!HUX`VZyIDcZ;pYY zbTl@2xC;i%R}Z!hBz1i(y`8wK`8zHh3)W<={_;^G!Ss0;Y64Nn z#+oSxIamXbg=PWVKE2*@Yr0^)eN|YZ>?L?u+R7NQO^}@L{1d@vwYm1a7wmNcsCv(J z+M8hA0h3)8GKeYOt3~sB$fo6qCU5-+EXD;vhgnPABpC`j^^Ikh@FQQH(C@I^&z2I+ zv_CPfT!t0GTWz-D?NpAdg3epWW&NgBF+sjrol#Pljf>Sc90~_%QWSvc$7-_u1#o#l z-v!MXKm{h)(Rl575;m;eM`Y^nV||vC<>6YthES+eL4neqFlwA5loJ>Ix+-^dYauwT zW~f~aY*{+F!kAdV89zv7So3)+xdg~|IYo5FaqD*^_jYo1-wivDV>HoQ-f`F7xtP-T zJe=6*xq<80+ad@!`VOZZZ;f4{9uE4BtY(h9%Erxg!%3#8;nnu_23!B6Go^RLwhTU< zUh!=!_AZN}8!pat2-wXnZ$26i8c+Om=WlzHLH%v>I+sDt8P=IU))EVDX{5S{=i^VR zOWFL`>!wu0>7Vfs%KUKSVWnWLoAjGKl0pwFl%%>+v?A<}5Fv_a^U{aYU0ks3087MH z|0IID4`VtXrhK*X&O`C6{TM4tlZ}0)m)FcqGTa{r#f0n=9A$-t=+5f12EPgA_zBp8I-^h!}oHnK=f-7_nkdZvkUOOvG|g4X?|3a-99q!^b&s-A8@tJ)c1E zez;Ik>7c^E=wnV&J1+>!lmjG~VFgSQ`ZthOZ#O(g&;1qY%a)HFedUuo^@;Y54`PX- zY%`agWUv(XT%8Szs-An9WG#jm0;8{_PJ?e?Dz}&z(K5iNZB)ta{!Yr~6jaU>!d8d&SLD(Ye?O^#&I zRnw{DCafma@*%6cXPBD198qS?_4Q_xn)|odc~jz~B8G@1BOzhS6zeIn8zz=fUt`Wj z|Lk&@1sxVw>i2k=m5g&qj*`mKJ&{X1yi|AGn2VZDE;D%ko%!ShYUASz)oq)%pzQ2T z;LT-Ju4huN=e#kqB{gkeUDN&k^MmP6?|$e$jxl#t4|*w5dKSx?rBA2VTN6gF9`PmX z1tc-OQG~bjq|`Uw8Y9$#nvs#z#r%0J5h8W}yXyj;WI{XMp{K$}EjK4=c7obbs^0pS zqk(mONpTH@Q3US1LLVxdm zEktLIn~({$_ZKH@Z5T@bE|Zs*0hj0<6n0m=^_ln&1&WGCzZ8x%B}^zKuuozUXrzka zP#AtAqgZ56 z+#ut^h^}^hjwqD47sM~;0+mX0#G1RddOlYLf7>OKn89lB$dH#NLSja4WCNh+2W!%! zw6qJC;m6TN>8O~q4b)j@*jk;+D_jy0L=gEi^9q>1elc zeo5cGS5x^!>wZd2{orVa3S`(`zVb#vsKXh=!W;v%Bmc5q(04TusmRX-Q2(SX^&6F? zC|4M>hZgsXhs#IodzD;&9Y`E$Cbs8QHzhk+nii5z5)vq!dj?-0{85y3^bt?`l{rv^hV2pM;sh`%(;V+MIU{C3bw?x33f?M_rB*P**5UExbczu z)Y+A+5OdkTd0eH1L8aLws@(Tq{CQqRF6wq*V&i8-L0+Mms1UKI-k3-9UdQ_7c(>9T z`NjiTo`2r)P{HLkTl#HLI7#P=PST*emPwhJm0dx(SETJ~+&O#Y%d_u_>KLBORSJ!+ zbfu+5Gqe-nbRJiDI_s!#<;l}kf3t|1tZt27JXx-oeB}$3%AvaUKC^@<0zYw^5H&LO zWo=IZ-UMo_wFyc12nkt1Ydv2$$C#_QT1#&CiRP2q1=!NWYXo>0Ui=<<&;SQ%057e3 zO2hmsvj(ng`XTnkFJ)18F=Bw8RSde(kZ`shQm&t8t)zDNIF|OwODSd<=7h<&Uu#1j z6T6wqv!}Rp5T%^ENLS^lguh28&+b2Rf#I(XrS93tkf@H$DOJ|*?%Se?!mb!5JTK=a z!@6@j{b?>L>ldU0Y=(y)Xzkg3;uloQ`>YmGPxwR{FDaY;4NA0_D~S^Yr&=5o=Vs%f zcjiRwEb%!=npx~m%v617Ow6>+N0x)4qCKJp8H=6;SnXhS^~XBGQAh zFn!cCKzuiUK7l7dB$8`)p6G2#^x)W}_F}c7piL9zSL6c+zH6|9AAS>iqxs)FR6_Jv zf#|-pv%npz9&J}|n^c{hxp+lqIScGFJ-JkjT1Seaapd2=vsx9A z&O>c7oI!5R=EnUk#mquj)!@a|uu&wm_Ox7nU_5!LhnCv=Zr863_kq{Q`!>iH_FBjJ zH{OsW54%W$zMWSg$wE%vj(12QT=g6S0gGIX0=c6MnIw&2 z{P*8%Yry2(V%1Dlq=_6IQ;t0RZP3sZ6A>^jag-lR@gYUVC0#oSa7S;$_*&j#$No$3ztV_3@e*2|DtZ5(=ix4!lmiiN z=%FtqI(@-ni=Wj5z}b*Kln0r2OaC+ddR1`{qtUc5!5FMaMpbY8XXm0syA<-3JyWMF zk>x+>8Sq&VSG@l?@Lb%fveaq>23q(Br>eKB4VhgQzFGh2s~ECGj!00eLM2mZGMLU& zuFe5)vV~^?c?S4AdltMNp9kHAaVWie2POn)^6o-iPxkqE;V60CwNLl*aZ zY}3b*aNJ|0A{oq3_l&)IInQbn;eMG;y{CRWa<}iaA|)*8s8c?|uTwTY?ChNQe4`*N zp(*r8$0qY?k6`|4_11a5?F`+LpF3C2_PnAjSr#G^YLmq%nlexe_%S=D8{qJ!z#9on z=Sd_u+wha>BPqp93B|F;sheZ?GmlM~Ahq`v$&g_uen-9Q8)KnfY)EB56i_sY1WzRh zF0@^`(S20HHUKm9I2}b+fhrl))j1ujaUobZ>+ghzX^1ZUenJxK&vn(nTy_ zaMHCvy0@yr0TTr3An|MMq~`*EM(j^^$#-_GeCu69|NbH77(^+pBDQ*)sQWY#a-I1$ z3fVYsE7p9x5re2kGr`o<`XnQii6Y$riqAn-2OMtehWR07 z9r&<7kI?U6Vvp``Z}{2J{n{}~)9_uxZ7~#GE*6)kaGepA7e2`NtO&W+`=ugwW|X3= zgE^q(mA_Ab&?v5G*7z-h39(Ct{mM!PuhMwJHyF=Ej@_z4Kr2g8GhkECuX zG?9=-Bs_iEb~9oxiQ;2*Z2uT>Wf8L+JhU8oAhGuRhhMhD&&fC+q=WVH=Xy_kM#9dD zlCvlB7fW%`0J*E1z;m`QPb&_du420l{RzL`bdOcDB2N1LHVCa0O$9${i=fP#LyhlJs!cuabrDHhx=cUQ1o%YcNVyuRluj&J1;zm- zk6;QH#S^Do;Ye2H()J9DTwZe}+q%#Eko;#?U}$kx`a8+gsP&p_6|?DcGRL3KpO)FH z=H-(mm?b^aR~9BFoM6ec4Gf}4vGgMsXM+={yIQWfJF36y?Zu2c)Ok$=cMKA#8{hY< zcli9JaPVGF5nYe|*qRNMMI>&#k|AEi1TH9IG0=$17Pg)wUAULg>-;5Z(u}Hgp00g} z@JT6KjxOjmWq>1Hxuj-yuF zCkVxl8W^6M|n!B4B5)heO1N+h5q9G0Y zJ&jL#@+?!27#C5x>aX3z<-I2ys$Fg&n=iAjs^<~QSgc>6g4fo9)bijPI;e~a5@g$DSe zeJ2QoBV=dQ4*H)ytLK|;K838w>tc=14{9Gr$IrSC^}nSane?{FoY0t-&7Qb_~)@!32Cb5Gpa=~hx*VC(a1N*!Azf9 zMC6*C?mWD*XsdCNrnL%U4DC2zR`fhE6LoabjKv^!&%WLu!r^X-tt+w`-C5g_8#P(M zUN41{U-TPTi@QRT9ZXo)ymbdo*1O?r@?gOI`&XV_5|w|4{PQRy&h#uR#y;zJP-!kl_{%A;m&Yc|mup?5&HZYr|Vp`Z!PW|MK#h7JOShh6jk!2$+2sJ3{ zE>goQm~_duXZUGUU22`JhW(sleD0YP=h6Hw!R6(M!!g?ZGJabxBnIK9m>9G7vN=gP z>jb0nh#IxN$eGf3ZMB2&ty!k6zdx~kUN@%;3m-Ko z0X)!EpVfbE*r7ErhFRG?^m*1lb%0`3Uj!J zUOmcCG2g5u`L|qIMvj|M=Q<0u-Bw}T6c|_Rs@<$5nAWGGqYuB}#`uVL%DmVmX&WqM zUT9VPlMwS&?Rh$NA@69yvoL*uJM{)Vr~a?|BNMS-_4 zUKx75NtvCv9WUuT@QhmD{Ouh}=-3nA00hUVPb9A4&>OYdsGxzUzfL#2TKn@}O6;n) zDB;PvF+WcV1`!3K*$?m<3l`HWL+Qg%`HVt~O%|I|h`jd3hqrv-X#IFWG4!La+&{`> zq!Hy%dJuRI7i9q_rUE5iK}lI|svqD)K#F_p2wWMj#7SS^fZf9b9Hd`o0+D2T4S2w! zCRIeR6w=k9ABV4PkiguB%=q@Met1weoA3%Tr9F7CE@w8yRq~yNURX+JHHq zWvvE~8P@|((PMw{?vwR!aBnbgnk8aG=xt1aM_FhAK8$VN`(Wvm%P5-J8*?J&x0u|V zY7f7cVcCNZ>H+LxNe`mo|Wqd35KosDsY{g!e9*(vY?}jtvAc%oaS)?0C zwhN|rZ{*MKLeNsn;ZVvUC!?FV-3&QSoqDj#fP-^!6+`lP4h2kv5Y7NdA>yy5fCz-N z?R-{GDB`5zZrj^A1*^n&_9g=jI*uJzn*6dLweKm)H%%8^B-aaQD&k-hPzbB^szdhw zko9%S1(%KqTP{*ur+nMp-}k~?t!{tKD+JF5QmG&C!u9Z5cj>&sPJ-OI2HY{S!=9Vl z=chhxM_YGy=FO`Y|6$HKIu&=>+b$4($DoxN=8yOI1W2JL?ij_c1q-$jy`abymyFnw zDSavwd?Q#z`DvGzQx=t@xN3l|=$ZSWNZ0Y7i&V_}cO5AT!{C+sw?_fFa^*D*4RjQ* zgu*XRj)Hc!uOY!_6y*4IDXe_b>vk?jmPOSHBLMpo)2HHMzy>r3F`34e$qcI)_0@z8 zaAIqX14!NjWz0`mlfGIJwSe>#ZqK22U78V=!Il3bl)>LXx|_>bTc4$|5t&>-XA@(RSd@rAz?cu z?24l6{J7*8dt4%`xgqJ4fjrm@KM5m;2zG(jKt)+J)5H7$G(cD6AjOdTL`HC{7o(>b z?w(>$AV=sKZ(p{tbVg57_V93fZFcux@WsR~`R>8)nc5D}p&miK&-}ETmT&mva%04k zZRJs68Z$6Z-cwZh&WYh_B`+(-SmYCbzbCKN?yfAY0zI`zuAX1`t<|E-vR ze|*kL{LiOnB&&mj$#SMgjV-!=2dMp#7u1>8qvQTmdQ0pM)71J+(?(LEnu%H;F6-R0 z{iiLnGZ9|y4xgf6ypyXN6#2+ODWmRhs94F#etWo)IfZQ%Bb@D~-RIYQQqok}U$TFo ze!M4<{xF|Y?k2s2x@i1-5>GT?f(7U&!s%c3z z%90Ojo`_rVbrAbx#+J-{SJ(uJ~XG?m!Bkse03Kw6vVhi34?O9 zLWX)VD%2AIf;RKUWt4VQ-5dgQE#V=ry0N0MqDkwnxT$!4Jv!~W>I0IR z?hS;1`*miyxiyLGMdR0!Hw3#BpPBXxkTBWoWIdw|=M}aYrg? z) zzeQz_EmFbv^U@52o8HOE+-uDC^6G~*d7&m}Jcu&G;WII@i$Bvp6Ldt_N44qdvJ!Wk zp^F9%-PyU6t-@*CL_E1LE+Pp}!9Zc}^*cPa1;txNgCC!(HQ%p>|9=+1at~MAt)Dlw zo`znw{X1GpexqFbWoAA#)Ly;~E(aq}rK8mKT(uqDKr|?Fo4M*un0+g+H66oxc#?y+(xR<>1tRyu zqlBq6Uu2g*!+FG>cqcIN39uu!4c$X>jZ?HLX=!e9{*{)WcymzxYs0`_HHi6`vxIGzUAIdDCyU%% zp&q^rnd9khAe}GbP8)?6*Q9HSdxNo@OOCBrUyOX|!pYhb-?i7IZk!$KqS7?91P#@u_=6x?+R9j<0WtyM3WI4*c^{Fd>iH$L5=f?Q3(kQnESI ziRV3|Fls-dzb^IlKJ#zcar(VUpkf(+X$%Pzd-_>VKDRe>9y{R21yj#ic<~ItK(1l!l>)l2TAYlu$YZr5S2y zkQNvfkQ!P=q>&mrq+=)vkrEg>2kH2p_rKP6p^FPHo<-<6XYc*nc8X^(#spXlV$8>~ z>e^*stAR4}322B5y!~DK75Dr3n<-zI&rBseevFHL-`+D8=s5BkZ&%Dnfa5n6WccRn zz$Nor^)cD2)}lL6>Z=jACnNs|3X%RT5*N?a!u-9>ob@3+p=#MyhdDPYpZ~QQg~FkG zknJ+U-Gz4aBR`AsXM*7t`L)1G33!e^OHO}v`*)1Jj4rhj;UC+dnksS~S9=6_RmZ>8 zFo-S8eNN){!+|hMVGNRJ5x@%K-67PY7{VbU<-2Q-1F`MT7|U*Tk8EBWEdAz{L58{Q zUlOUMv>IPHwQHp4p@M4~Y4GXCu3GrNn_Y3NVA33tTT;URyE2kD=q=OL$c7&LZFhjm zb7Tua`Jy57_NC#A`~G1|$+vvx-hKb8_>4gpFB4fY(0``(*dPDD2xkb^_M;{xd`HwM z1a6g)Xa~#`1|!epIRa;K%&}&o$F#(KF;?hkXHM!YZBa;z*10KJe=t86GB^|Z3p{&< z&E9$dN~S#YVbcoW+%oT~jY%-&ekqy)Y?u;>k+}!^J7Xi$u)Z4#_=CLsuJHsbOD5Qx zn<%b2!quvej}(U`I8#bYkqtGo?=oELIG6@rhBmw4^)@hn#N4`E$%NCjd%XT6FsasR zn#D$)+D&kv)~)3L;Y2IW?JtDfSk`hV{R3(#;|@AO+%N0D!`dCBQUVFq69%sjS*Fe6 z3tOW7*#A6z1wV<73#=hiE5N8bKqf>17b@Zvj@2tvmr64YIxziHCft&BQjjr>v1!_K~1{ zxkzlx!s!<#*N{;uu!>|;il*F902+b=gkXTq^S^>26u9~ju4YV{WAwMHo<^Pe{y>;H zm7QWKCso5d!d9T;`lTqf)w+%V+zIy7E5kLEHY=M_27n%agX*lKO_%Pp{|@0=mLO%= z9f4i+J!){7p%OcG%RW`8)eJ>|!}PTo^#f3js2OrLpl`UTuO-TYa0Ep$y=5-LBNQYUn!%B76tD0 z|2OM?!>X}c@e^W(4qcnzj->|#N&(cMjHPUg;C>okD@54(a>-%ns5_6c?m$)BD- z?^GG45nL@juz<9J$^ECl?RyYBT%wsf|Ap6hJYm%sxIF25d|A5}B~7*D)56_xK@)Uc zA`zLcy7p3`Sbm5nK9GD6aztjLD7``E&W8;&4FG~rcWR? z&?IxVW6tg`?UdHS6#t4T@>Gcm^tPvTfo`51(coa}D|Ts6mI%{>DCml9L4y&&Oji%| zw-%RlF*N-{U1)q1`480AK?*I#q#g8Iwckfdj&!2O{*xQ%e+U=5hhaT>xUc{6haMKV zAMj7FVHTI8Fbh*goQpqP6+3I^1LJvu&*>7bSD0iFhw2ycmZu-=_j%Q;f)6Qlf)2-- z^+4d39DhqQJAncZ)ZAlOQQdgBG9-Ws=l@YJ4aZt=+_Jp5;}y>tNN>S0A8KRKge*%i zfSoU$%3Q9BveVOK^)N{3Dkyx*>vcwA+f|O} z2=bP1O3f*f0{nPqYPOz=g^i2nDX?~4QLEw}er|{c#6ulXn2S#4RM*65;ga>`&PgUX zh*u8Nwe62(YEulgC_o}t?8C7!tpH`O)cjvXXDwNdZ0O-N&jJe6lUbo8WL)iL{(LWd z@ZuwJ;@!`SsO-nB=+(zRf0EsMn1&+AsQI*e%=}_evWg4ykYhdG?M{oMrcFX502q zAyrB+o%jSiA49F1(AOsXQYWJH%s<^M<;q53*|$;?-hKaM8QAX^xtzgWv4x*r=2S=c zFX09AH+f0P%x+ZXTl{?p1>~yGaKJiXS;**$jM4T%>Ld3-rUoT|+%j8`49JUV`N?GLe% zdRvqbE<{4nLxKGrWJj4#RA`O|V*Ji#WmVM4NZAE{?w~$=e!u(RV!HIgFYJiEbJHR0 z$?EF7yVmHPnm)cK7i4#{bw{>V%Mn>0J`&s1FnT|yVxOj;&gA_&9q+dzR>o`TQX~4U zMDnFfEXoO2dP-a|rvu`O>6Zh;7qmu-XF}fe z%ik=GzI0^fx5I*2TpV^fyf+SaKJR$MKI80iF1f7Bt0Yr!p=O)(+acEtm6YIkA|+qy zyhYsMg1?$6!Qx^uHWeSFtJqyQcKn&tBU>Y0Cxva(amLNQ8~TTXwf)jISsPGXIr9RU zKf@{HRB*#?6hId+=xT%@byymq2arqT{udca*M9FdO=l4F1$C%^%kvHnqonhhx z>UEBK?*-yKW6!*?wqZGP3hX($x{-=PENH?pgS%p)m{eFOr(RAJJ?S?(%YtT4&~c;m zOxZBVyyhm+hAF*+$LZzzD(3*T*+baLwf9&o*>``DWzXSl*)o&BVFrSNUW@ugHHFOVteen;}xM zM+dtC%LA%Ciw}C7RFQ3Q=5NUY{UnGfUIksB8uFD22)1cI7m|4(X+SSE_Aa&mJ(HtIrq7?Sevr`{ z=KYS+jEV_MtmXd1KpL{a(K&|uWW5`iz4)(0dTBvY`tOytu%?j-nbwoLS1(8ABjVuB zuV`O1F&>i4QVgBfE&ZWn`2{?l1&k~1;qoQo&6#HyO@RYqm*o*H;yrfqSy)de}`>&3^S%#YV;-SQL6Gz;j5029_;h zPwtazFfYr2!A`n7u$X^ZRgKK6|4z=ZlKG8)Tjfco=!=aM?(r&CGa;kg2858V(b$Uw zk20Z*cN-t|pC!lTd<~$lUV-ZwNRcG-O6YH8gjuRE-BgI*lM%3zpjXat4!JvXBTDQB zrvhw+n-n+%5y5`^5b_Un^P6xK&cC4?4*3E1AOe>$K zVC?>Qs#0~BWc#_`^MR@XVT;7rD377+zskgax`t>uO-y1&2}!)%45@P|i(EB>Uv+Y@ zj$ek6ptX3*CaLb9)YQiR%&*w|w}0(5WOOh#h0L12lC)04MIIgR!JTWyV^*kQN+LOw7{ z%l3wN__t`Btb|CHS*=ot5Sxp#(F}k38+Fr$@MYW2(!Zi#m$E$29^^`Q{5FZQJfm4N zg^3o}kPRX%lt}UCX>+<&_jdg+s8xXbftqb~dl3H<9XnF_u*<5dc0k$xoOE6j*ioT_ z*5B~0D4^7uH9q$jKqiZ9X}V(p7^Ij{24%7)%Y;L#af01VK8n$A{e5h9cV?&Rc3x2E znz7dmM3@ZyC+FK{z59@3itmorS~4y5%(6s#fUEh)xj$nZTd&RyGko~U_o{)V+|x8m z^e7aG@4*X2hT(i4X6^Z|NIiJFed zpZf2lu4OEoi@t$PvAXS(YLO6uQ%^z1S*Nt349R+uz0t4~(og--NAH9i@wH#mwt^NH z!a=$)obkgf=JYZ<2OX)?zLibxE(9T}%otOSDz)(2*Ps#9rN;zK_fhKM<4%md!L7e2 z&LL&9Za9E_EMS`fKdW067w=fB@fgl4!)F{M=N9zu45ULY|Iw5KdLs)4yeE9w<2k

fZtbZUC?3Yb+(+pq=Zf>%G{^_{qJQS}J(>xohx0x!vI7PtmrZcc->};ljB> z3tZF>sOJ<3WC|RPWQ>I=aDgX#nf!v+dmM6eeAd(R&o#=x3ItQ*Yq&@SafbY9hJ_28 z2)m%aKK>p1TQNM-MC=9rv=)30L#-Fo4YHpu=Q|>S265d@;@_cw)mJWs4(5N@w$0US z144t08~6t8i)|mUn_%@Vb%tS7s9;@V;dq>{n=lgadM8`1Vl2_&>-Z=M*!3EM2+DWz zqz287zbL=oIkLJBihbT9n`INqn&o43uMXe=-f@1z+1*TXmDRW@E(n!>sdqW~`O4+!|OG=Rp*9-fnQ?8y>W!$r{&a$!u@+}1&O zC$a1FxOQ+U6v!%$mrg*{X{{y1dOY!T9cNX7SDj01a<&)dQ-{>|biaG9w1n_;9@xwu z4uI*EhObwFvigLVd^4u(iS9ZfsIn;e!4`!pu5WCYn{?DMlQeEhL7X}f&K~v0oB7;% zmkm6}iy1bynf*by|9~wD+w&YV5ImqnUF`Dh$o4lMH0%qhe-DObSqbA^tmm9=(`cNU zedzH9a89;MdJNJQg>+2mKK|7G7S1w~MT*Mqg|^_$a~QF1cnX^1wk!5?Pn9HPlxCuj zPRtoE;UX2B;G+R0`(W0W`^pJ5_;1W4DZVnwm`dmySKe$ppmYjeCHd55>7woz zc`J=2ZFt#MxuExF(vg;__afIs33KPy=Re$!y#)3SI$pXhtZ%w4q?O3*9U5*S{<8k@ z+P>*2^(n7%ion^0^&@bh$nvr=z9bcz70J*2=T1*-*zWK;($EMmA5CP~edA`Bz_e$< z4$gAgPcP2jy^}HNnZ>(<`Wd~k11?roOx_oNrr&<;k*`xEZGNDnl!Q(FWnc+Ve^ssb&s!8Mpd-nEgM{M_F1g*GW=GdE!g)k&OG%~If9w#U=x z9<4`2CUfXCzXXHh>2zhF4kxHk`(!2tI=fmk>wNWjWG+vvN?vggCZPY9tZmf+2@)t+ zijnO>H&!jno*Eu$RdR-zm9&StS}Gc&wzhYGOxmlXYljo%xfgS7qc|N!&ykV!m}4vP z{Ui5@!u4Uh6#(eGJ^w63OPA*jdBe1?h_~kL`ja90RpG~;WZ4KidD9TL5fhz?P42Ty zu13Q3eSw$Q#T{JgF?lu}mpo&Fz+%mTkAM)UGg|H7K(j;FW5ZZqJ{2=iIf$AsXge`U%_>aXQ-WwSm`diOm z(S7fg0%Eg-Ph{eD@e^$gzfr;j)>`||<(Z9BJMH&VM1iKf#OuDxoz%JUcO{exb)~s% zY@2eT7>ho=mS2l%iGy7qHoRU*e1DS1*Q8cv|05eBnq%y5L#z;;_;Ys6R<`KlU2b^< z_jqCAlxaZ}dCyR-?dQ-joJu}J(ZNkO-EvmlPtt!seDwRX zQPj$s!r9MZE?CpR@*VlYDfM-YRjb1ybMS`Rs;^HxqmUfI3ol|Q8-;^(I*oYRh+TE= z_vaFvCE%fF)n}rCH zep;;m3K^b1i%A2SQ3f{mwa5(jh5C$gn_tPPFP_Kv)sm-=_dWzH2Geg6ck>l7g!ou- zU<*D`UY2=-8apkdEsom8v8nS*AQaH9Wg zB46g);-p^D@6d9#OZGuCmaVP>b;rFK5QvD$=d|3!)NmW?k(K4M3d6~YS?R8SWIld{ z-@;guLb;JsK=A8J$J(}O%!f2K*~-knQwXdJZ8t@qwDpeDhE%~f?@Dl9eRpeB%Id1I zsKTsi)_Fh9iz*+)!7=9_xruz{;SowEPO_v%+;J1R(f+P?o{-fb2-b+#hRpc$D+SMZoo~J zE7}G(Vhh`mI_VWGQ0R`S(-wS9&_Fa__eH zp)?c)2`A&9d%=ali&oc9i&p$;;)i4%5KwvRT2yhvw27jJBNl8RB$H z71GX#*$YeMLf4zV_yoWRl=pLzB-ot1vGj%S)-N}ceoM*aj?eu|Vh&EjSk~OT!=J`*ak)H@9tos}X zVzWuSwbw3fO7*!EA+Te83wai-xj06C0Ygo#+2|8;CH*J|_RxLTbC7N4Cbeb@IjM-b zK&apQ(v>LiDeC4TWtV%^nb)q#irLNft#s#U>Wis}u(?ACLVlr;`t^HRv#P{RCuTjn zY}X2e&|NkCAg1FSIvEjR(%Z(vp&u`F5`Kt0^-e#hHO4mUB%RjlVRu#Tbykuz=rL}o zy}nhVKrsq9&R3_#CgbsydBV>kLJQTn*OCn|DN!O0Q^2x5W5Fbw)O<-d&KC3`$H1y1HhC z>iq!z7mA^mn!_V# zG_fsHXD{vDQpsji(#)zF_-=$Qohfvg`+Fc&*IV#j-Su?j+z=usStHCHRFGyRo{xp% z_ALzBua?5n`)o=~tIzZ7AVk%bsS&SkFLSEXJhQeT%*qlBvz(zBMY0 zjKb0;@x4g?D*N_8ov!xmW2x_?+a)ZZEbPM5T9HZ1#K(8!Bo zQw^U9%TJsbsD5o!GU-4^Ut?mVk^gB%@{C4CaYF#^?m39Bd)eysi`z? zIoKE!SVw{sq{>>dIMqJpn3if;{^!EyllkxOmRGnz80~w$7i4)rPg(liO|Z7V0Hf^> zn%&OBT-48CNC(JJ0#D#O;w`6;o@9XjtiG+cktZ02b6~MgvKy&$P)x5RH7PT9I=kMJdJu99bxT-xxM>2Ta zr2O^t9nGfp2N~}#RzZ4X{T6`{@`K&@I3w9S1^l7o?U+^%ma!{WlB0zb5^r3iyCvrw ztWHTT>PQS4e7+ad`0ot-!Cm@pRyX;s{tNV7T|M6)YJs%Mx6shV+cC9*y$uA7Nk6t| zs(w8cSwDFn{U%t|^!zfTZ1LC?!sva<7PaSJIWP|kS87Di1fTp;=`lV!o>vS%o|i37 zb%33p@3M!pe{lyTzem(S%{g7DgSexVHj=q z)m%{Yr6TGiGtMey^F%KIW-L6k+tu9?%#eK%Bu)CM+cT|&lX#hPt1WmhD`BNa=4kDH zD_D?&kJ^e(wvY`Ss{31I%HFBLN1Av;O6PPc2gZ6=(3&eDsxb}&UmOXb<=m&$A@9l_QAM}jn+}6t?{iNM-;i^fN(2b!x+34u* zWJll!%b&?8%3lfUK)?zI2}G^BYC;Hr6p}Dv{)q|GmKX8cFcv#B{H&*U2luM`ewbRsl=FI#X1zF(BV zJJ`p@g}~TT6tRkt*gPB4)CIy8G6$tQa(%k6o{^3DaHEmu08{eYU`s9(&Pq12(zomL z;4nvv? z%u!6h?cY($bF-gr8$$uqV|Qr>>%qf)?&*7x3PGO(gZP@08RcGL0il8pIC_SMew_Z)8Rds`#qQ|cntvxS~kR;K)dv9bEB=qO6WLV|0)Jp**2hpJ2k|)Qd6>Ptd3tg>>wCJ z5Be89s@qm?=0HU_SF#=?tuW;DtZOun5F30YMvrS|eIk0Ng=Dl>AWctnS7b&pPGdwe z-%7?CS=nsfb^08AgpFTwt8PbqSvqlY)?j3R!*Mg-Flp*w_~m$rKt0pK*ZiJ%p``w;myqvG16fi?ueAPw$T$o|hs~kv7ZsCluu?-}zD9Y9|q0G!a;?^lZIzJB%WB^8AvF59*?3zfW|0m&zGlevsQs+@R4vub=n< z@2wV*K>{lR;NzSlz6}*Ua8?nx-*lV4K`uOE2rI4rMU&Evr9`-RpWoqbJ`9r7&G~M! zt1BBxG+(h`YMye#6w)s_f%$8nfdKV(_(QtmyTC#e%}2h>s9rkI z)5j+h{8#rq^fmYB)2CC6&+Ok=^-Z*=<%bFwb$WZFN20ZO@Zhnw(qf+2Zy<&J>ZJM& z^IB-s=NPA{jj@lzpU14ycsLz#7gK9OHwkcDQmaf>bn&&M@DiQzH(uqhKDTCNhTeR8 zi|x&CH;aeLPEw6_$G($~cj)+R{9nJ8{JL^3YlwQhg<5{Z9xt?jCVI){U#hs;2~LxcJ*x)O(Kp;K>GM;>=hCcZ+PUa$QGh87Bjli_vG{LWYQ zC$p9nxf8aFEl&#DS}QgVZxG;loCUt99F-xSOa0JCW0v?~AaEn0m_mn|i!L)VZ?n)K zOS4FwtPTDaullaUSL})nx`o1#Tw8@2R=j`Wp4$;m?nG7WhHy`7pdl|7K3t<%lV+}v z!yu!y-t51zW1|}Pw6yS&H!pPQfUi99ZLEU$5DS#cD)kHpewvPats!wnakr+cfUP9; zRb`H*t6G#!)T{W&Tsf6PsuBo?2AyC0D^KS5wfx;z;`!Z{3#=h7O%MYLjmHwHVq>-) z4>H)8iAYZmMz*~2d$%9xmeWX6 zQrZ~UGYJdavmaLM-|l>-tH{Wh{PybZp|ro}?|{a-zgp~beso7>aDp0(fO{IOY{MG@ z%k%L2p}1w-`%Jl8lEMmK2|3t16{}ONfA`7&5>?*x7cbB}IsO;+a1)h4qTOU{%*Q3| z75C298?UPO>=W0yr+`=1m}B8)fP3JrS4Irhj|?7t9y9GKA3Il9QthgIhgm+hS8ZZV zsWGxtF}pF=4_hOz*V`0tPs)r<>RsLcHuiL3*m$Ahx#*Ul&|16RF85a5t{4oxbkDPf zs@3W~p$YInvk0=%DOITsr$CZMUu9TIoS-=yWm?E7lYb1)|G1eiA#F`X;1RY&INW=8 zJ`4>n>tg>6@BZ&-9W88m_6PmaZNKx_YQ3^S6t<-0={=-ru*CJI$Y0;=*W2_B#qkNM zoKhFo^mL8kIVsM6)gAmo8!B8a9Om`}jYF)&E5iOPsH3Mc&YgR8+PC(8< zl;6O^1!z(p2(J7QFkkp)vx(Y%MK-|TzNNS!Y?Os@RLL#61$oJf!hUI0XGfI-J8YS3>cgrNrelTjQlW3O~@^?sO<>A>^P;$^Wr` z(^J|aq7+*+JX=X+@VmzH&8i`V*L?K4Lak+2l5^^GuzaMyYgf`yyhE{R_(3a_p5aKG zMrgoMqq%|XbVtM2>>t0Ibeo+()GT|*quo%IB^qqKmH_uGd_eRKJNxF2cuL;zt%y~^ zniU!u`x|}KOh3asZsA>D0>8_az4*YjkA*G;hFAHOXlclB&~G~5A*K-6f-}SAnrBwS zXeTS)8U$~Wta!{{3~K)k5{X^>cJ8ZpshV&}c-qlw9$+XRY;?s!ni{pJ6zXxR5N4xj z0lPzUeX8HzNY{2j6;vJ`inxvEDL&XRB?Xolz@M;#`4@r>5n+-;vJ&c&MAD#K-UyqD zzZtgL1~D&UNh0qD3UTaTeo+uVUXa}d7v_ou7%L`=29R%&U}P)C9kb zYcb0Mo4St1YIARtF47Z42QBD1`sM{hC8B4153?Ky1+#}H5Vo8fw$SLDRPe+3uG~z!`*y6%(O4Mn$b@1r!W{tH zEGA7&ecSFkO_wt`me!>=44v0wqn4)aQcg`3ceYXedocXIhSiEkI^Fo+>7Y!jXZ7F= zJ*^BTivHxB)Aa$5FRz6cPPo-t5%>* ziS}dnE)Z=RO{|O|#H(8Qupmy!0kRyBM+H%bEiohsc2p|G5CK?$phUy20HpAXDm*LL ztUMJ;%0K!VeA8iLkh@erH(F?2xCy+~KV4-%xl)#0*q6JbDT_L!aJFgss zLuE^RTxS4^G0rw+v#GZG0r)Q~MfDRVe#;K<#4jcg*UZG%kO-{q zTMBrVCJ`4hYMC|%geg=b(S%D*X-fYB+J)g^iwBC}wMJxv;P~U91B$1HY=ECii8J99 z^-F9Y6+G6CX=IBwy#*wC4b|RinDd5jN|8wl2S-5S^D(_*WBr8t{C`IfsiR*zp2ho zVS7Euj`^koSlJx@-q@?4d<7HG{>xB^hvTgFa4|}Gs0nzAsVKQp3O+IQ*Q+y!! z$;cLWmcpDA@&WFfGlXD>0aWIuYFeS8BMe{B?V?C!-26@_S^9kE&^n&%zhq>lQWVf( zpx_tuW@oP;-?vieK(hbq4DB%(V|q)UH-ft(px6W=H9(f7`FGl)?NQifupe1=gfot= z`}l97$b5IVML@I?r&63QvN5cMeL4bjt)>TK?N`itegzg6CijDUraf88mst7zl_;RM zXv**J^F_IDEuYI=P1f#ncKcMAU3Es`qkh;8-P#_RI>I1f{al&cQ!MX+uS!w==;rRd zkC*RwMsOBEYBlH^tNR*g7~{f4VY!JgC5~Sdd6;T&arU9x{qH>W;?Hc0PA1LlpOc&l zp=C;b>=v9cM9ZU4rP)3(ov+W&i}J|`=OSQStB&pqz~P9zTmmHy{uH7{YIXg%YmNn! zlj{bAFZFUThGb7N)TOc&NvGU`ynW^~ZW6Sm65tazWN@e9#$;92O`l|t;pXHOWNL-o zoFq%izT{s7a+?m#^-TVZO;mj!;tp3qGB#^1eDMs4H)vyprp*fGbc5LEXGepdH(-&x ze&d$aBYaJgE1QNDTL2^^b^xi6ISwX7X@&wLW7sP9SF?C{kOySwbe-_AObUgi0_sd- z#2z9w#_?M&)g#t&;+Lwclcu2#naB9b@EYs;qC%CLdRp0Z)^A?%dYc(JBhsoi4v`}h zltyjVC)yL-#`VOE{+yMS3Ja9a!iY`g0uTPD&|7 zcTxGZm^p0DL>=85j|#exTSx+~RWR4I1HnGWGBq-mJE1qn3B$fo(&zqO)vVy5b}3l%4%56T4O57j%M|x zU_2>-B+1381Nn*7q~| zR}AGGcO*8WNgY3R%)NQaV&%Xpb{hZXD^}0fkNCybD)@~VFCnbr>;-|~o|GgRp z*bK}8gVp!$sOCoe@w5_l`>YJ{m=Z_l4cqb5fx55F+BZ%>mm?j&N=pA*#tZ@k`u+|h z-zF+<(@V0XuG%?-5?<58a0AsQt65D>r*L3KufO9dY>hIwM*sa65d2v>@NUM|QWHrV z!jF?|J>s9Rpx1_FOOp+aH1zoI??@NZvEleZFAig)naFqjZ^V9ZMZ2Uh33+S&d|D>O zibggY7pz2aHlnB9UfH|{&bq??2!2I;z@J0rwv*?9yj_ zCvzncU+U^}2sdFWrr7&GJE=rot_h${jn{j+pEi)-iggCWRHVXR=B_OxJO8J24{uh}=oXG}9uEqm!~u$@p!Q_C`g~ z-S8#?3Afb&eTpQ)k@W1S1bphUZAFn+&yuWW_8!B;WWt=2DeHucBN!q&nGYDP-Q9_< zIo5Vh^sb$@Og&i48?YK%a~?uFbq=zOQ4dHNNUSh}*5`6O>!#nH-p%PM)C?YGNw7?b zL<`^#vE(sD-S%^b5XUO4iR3AI;*Dw+-E?<%lx17QccBwy+TSQ3!1g(|!^+xuof(Yh zo+fDjj)>7YCLKe~>4NxP%~+pXbK(MmLD;d(`aCem`9_Bwl*T zTHmKpm9@o(6tUn{ep47XQl!+znkSs{2rOWVtR2!_3lcW(r@{wwq6&LtFpv8~LTo%MX-wZA}~5P^nj9a^d(N1wzpt!6T#c6|c6* zjT?ga7)8(wW5h0g9Qe7Xgd*3~o^qe)Nyn*SyFueW_}lNS~1=GXjUnQ(kvg~n1= zUv`E)?5~_2&IeEIl!yz=6L^_sV_4q4T*SC8MiKRV{`!Jq-%|PBL2)v_?T;6?nsl(T zY!kM5WAB}3@yn_|3I$aD8+^euZX%aZhI#m8XOpYFF%HO|vSmoMYwX-Q^)5pQQ-NFPX=KR^18zts?#$zmc zLC81|K+6;di;v*JSdXmzFqS!^0I7@!gao8xt?FDXe^-Y>cRF(MUai%)RpLW0r?#Yo zCu=Sy@ASqP9KM^xp2ePiyPp>G^!gcneTJpvSx^A)0$tFY9{;(2q!Wl}Trx}mEbN($DyGs%t3 z4aeUe9GE|&|CjSU+E9F;^BKKQ{>QWaj*6}Q1ycx;WGG*38$>(P!2ujK5ws)e%FL7s z2286=I<;)Z$R+$d0g$$^M@Fo~+&J}JebKJJO*r^+Gm1$0T7+a(-}mY*1qchosgq~TSoEC7i>31cy8<+9o-RGU^vGn5Y;bW75o@14 z;e+?qRjwPnX53j(+UcXF3WD2L81v|%@T6McO3cu`Z4Wdc!K?%cLXDj&Hh6RBRLW~`(A$$d{Vfb@u1>`dTtZxbA zM84QTBnRz~vL*Wc7fv~{DjqBt2=xH(LuB=!(NZ2M;A#rzAbtv`d_wpFd=uKDd0ERe zVC4B?ZtBrmQ0J&*o$oqpHW0BvX< zAQFv%+5f*pY0JJvjr+3(pxoS#$L)h+i~i&y@pQ9x;E?c{qmO^XH-^eRmBJffNuLiA zQ7e!Q^^iSYYIcJ*fI=#$k#{->BU9UG)=ioMyV!pmCGaFt6dc-s4>v@j9zi$ZmFaCF!Q;G!}RhxD@;;UZA0y2ji{S+9BnI`hG-I&^e!hSGfYdQn_$2>XlY83EI z4J$SlhWr;!@fFdmYQbGk`(s24zk6<9pUX?!AO0|8ChKFgx=}hLYcHovC-**|l>a`r z>^&1Tq92xAJoMS+&RzWIazD!I60{+A5;q5B^~DpMOO_FL5-Z?QiI5HgpR^$I|#E}@He0AeY>$b zZddxV5&*W^4~B{+fdTC_B^zR8xf8k)P!a;~l-j+O8tlhhphTytzeW4Wr3YW|O<)4e8awYKVhJYT`!l9ugCc>|WiK7T zzks2KJ8i&Km#8j$)+2&a4C&`P{(E55z~I(Qp0ak<$5iKe>2G?m4iz@P)(`CK{4T|VF1F=OFHi53 znw`_82nUAm4mE`qjl+X9hz50?yMHClxW}LOH-%jME*z}udmq3S#O> zsWpNA-ru;{>_`uAsSt;tH*}?_nON7BK!SPmbG{+-OSU0%KPIE0-Jc@%Qgg%NyO6AT z_D|Q3k7P5}&9VXcN)T@0w&Q=<-_j;}EIG!@wfnm1x!YVP_inH7F-joEH0Ei`kQ6XR z5@O1-^AiqI_Bfp)`|T}$?yhEah!FN*K8oomEYqXsGWF*e@``fhG#ln=0dQAX1?{K% zVIwoD75)3p_4by;`;J$QX9#4B4l%;#75XeL3ypq#wHt=D&GFfgZ}|eU_HC!ZD1Us9 zpk3Pxr69I0gwHT44mU%x%AJrY2$v=7;T3GzKbwc3y4OH%$T{PkqpF%*$H6r&_$p5R zYLq;v>49ZTUxb0ChF@B@T&>2+1GbMh@(c0g43yRc%&ZzGZtLJ(qkuMY`_ zv~wk%w?d@pAMLz;=sEk2-&rc`oOPr?_r`;>v)j<0oa^_fs-zf}avMmjhMKmy#sY?( zS!K8)yrrmI%)cwcW8YYmhQQInoz0VsHv1hmdZDXrX--?>3itmBMhSf^Nt++H_@Ad~S1jZHfn^LUkz-1o{9{!T zVD)ZP^qEhZ%?FMp4R>p@J~J==hsCPI-E~F99u1@Kbly)3+x&ihoU90!gdG#DHn+aS zKggOG!W=u5&eNmhzjNjNUhz-jiI5wxvxV*UTTa~Jx+6+|)wCNv4{Ea4;gc41(u#tj zH1)%7#yoje@9uQKSYOK#c*JQeGgJPt%5tsYFCsgAMRzbT?kv2BW|6(iW6k~G7IvOI z@N#E)ZI3&Xiq3|1N)X)qDB$RVe=bFIcEkjSZC6ejDaOUddZzCrpA+nP4k|}Zzk9bS zT3dee$AN&TKp8vyKtN2PmOkG!%^@yEGw?C{cMcs}mUwne$j&^QRZx@6-HbWp!s+jg zP-c~dKZ~}inaUOS?vRpwxW#UuSep~8vbF@eYz=1HKWvLfUVb_A79lmlb0_OlCu|5= zfjle?@upTz>1yo88E-7+6hQ2-gyvBb=U7hRR{g0E+h)`pf&zzwz z*My1c$0Y9Qf9Q#geGqSm{P2nd;(0f;nWh3N_SXK<135^%ZfCpNh?UaVx;5KnXsX&D z&cu+{VlkZF)qcA2JPNAiRCl1Noend$!9N~L+$hUMg!|Qsbalc#nOjA z)9r6j$`QPQ%Kev!9(|*q|0`F=eqjg~(;l|~mj^;mF zTfIeHeHXNkg#}d2o^s!(`>U7C992_H0Yw{#RdP}59&$!sK6zVFP)^+7abJv2h)FeZ zR8)+ITA+{ZXSQ~So)f1ei{`3G+m*WZ{^;dcx$m+A)b*ENp~K z@l$>ryyv7(x8Nz;znD;_652o}TX?xpWlQSjBBItP#Cb-l5O#S@)B4+(utQ*3E*PCTC#{iUMEn4Ka(g826MMQ|9$dm9wdR0WrrR zVL_84VMbxO@U$P^l@W6z6*ry?8tA>0CVu|BL(gP7v`-6v70SUc;;ibv$VJaU_27{{ z$@iiz>+!YZI@gWWuBD$D=O}rxZ z{9#OqA+74SA22p5)%%Zs%Q)~nCf#N0^y0-;GKT-Z7l6J^XJivk>rifc{W!+27XbH| ztU@2LQD=-0MagpLI7-p7N3cK2TxSgl8~E_;em&>lb8@lrAfgu;6FK?UKbRFA6f`KO zLn@qKiq<&Gclk6Xkg57uwhw1A&sUHyMU8I#3{S{xOkk@gr#lI#t?OQG5G}Rg>!O_P z+LfsHqSK&8Q1XzpgjorRD(6_4wlNv1``Uv~qn@8MFY@3eUd%Sz`VdG8*Fml5>N)qN$*Y? zI2Sb@HF2Yk|M8dn0VEz2 zZwY)oUFy%mk7vyRz=zyZ(5tj;BhCfhE@J>cT+8 zBLyuYx?9u#r(24t^@4$THA@l4WRCMp*B-mjSO6`*DYfNxbJNiIFy}Itb&5f0myS&~ zwU+;8xUGY0>4ku(QRimz^E)sw4}3*e_6g%u8udejV^p4}L_E;--vkbHcsj1xIpdVn0h7=)B~kPUw^ySh|54%K*p zoewUozxoa~IS~J8ZM1i|A}$S3zXf_95(}G2R)qs2wF{2O-(NA{?arQHFJ?{_3x1re z96O%upD~!8Y~v4^U(wHJ{*K~=y+?(BuV?^M(C27h&{FWIX{Et^1zIBSw)6K^z;VZF z-4U*~?&@6fBDm!`+#;wYw!g)q%g3mtbw#3K3ew{7Dx+ZcqVL{@{4qXUe5fq*Pi#>^ z?Y^ukZfx8haKjwwN9OX~0T{!>Pjs-b!!(T(iH~(RtqKe zpmc+@l%FDqh@jG)5(CoR4bm_)0*Z9V&`8G&-3>BBBi(Rb&$-Tz`3IYrch7!et#$YN zoS(D`W!(1kfYX|V4vw9UVWJb_Z!_38)?fO?bNIzx4NktfvAFibPD^z1^(ulz+XJLX z(IxXQkd<3Ji3uMj7iiPAQf~*GW%c$Ouz32`;9Fn%+L!z9jUSo>zYZXJIiZi3o^Xr= zKd!dFE0$XfklNpj89`%Tjt*T<7xppvv!leL8FMd!?!jkL5mp2hNX=!f$J z`=tQv@z7P+hE~;iva-Yw`Ck6=jX-ZLg@|Effn7F#M?%?P)%m3A;btehW_-FoO({+Q zx?9A|7@087*<&+mnV3l5FwI$aqL5_z_=H~!hvi;IP9o18ctR1nST$uNB$nI^PK+-c z7ujBijJ8kidSI>H~< zBbMDwWFC{!#->!;P(J?VMCz5_5vUYIJHT8RxY8z3+6QTut|i`3{0n%| znjg070e~qb|2k@D6d#X}K-usfEf^ce@ln&DnQ9p~>G`{QlP}{~(r=_NCwNfm=NJvlnDXek4(6uQZQRr8#QTnu=uCFG^T^!H^J}F2dS)N z#TAt5h9lfoKW9={Cyqi-zI?Bb*@_q#orpx`(4x%3%f61g6-yZLK5B;asnbt*FYiXIsCyDR+1fM1; zA=D`(geECHwu$iQulonlv*f9DD`Vc+Khs9a7J~cg@Q$Gyf}drdSKDxRcBCr5Cwn4L zYa?qLGqSd_Q;TwpK?HM4ExgBL-Bb=Tp3K z?DJ|?20l|P0tQc!!Wqe_78xn@^CZpY#%Nn=v}W#`vyjcPN5d2{TXk86s`6P&iJ@ml zw_UP1>kHoxykB}e?DKZ$4@Z@M3A_oZQjw_33&-0IX_rls7^SZdcPva_Pk5;Hh{q;mF1H zS^p$yxm$Dh#4j%B29xXoW;NcIoW&ejO$y`*~~91 z*jLmQy#oKPwamPCSdP?GH0TTu*clnUVZfP`>mfg!wN{KL(*k~|i4b+oliF=Ic;)uj zi@^sGXBge`z)?Ag>ld|%yeC9BP(Uem)pMsOSf1p4<#mo68iq`-tm5;!ThEgH{3MOF zjw4>clGxZ2BQ_$21Fqkc|& zY)DL22NV+`gzc=28|S3|-qB}&7&74O25r*e=gWA&%(#GfP zm70nNq4MW6B2&vzp`q7rbfiLgkLf~JC-nJDW}4cM=ni1J;uRH-|JAYSbH*hVtl{ck zE*+^vsP#86;^U0yv)E=qwV?gm>2#a0XDjYH(5M_|{WljgYD@5(4(TFB z5`+_tqFoSTT1syRMn8mC@Smsgd;yIDLk^4?*Z&Ii^9k#vtbh34)cEG6N%~>+_60&X z(DP4@=n)Tk_z|{4*Jo$h02mFT1V;T{ILHah{kkE}W#OPQXQ9DjwIf7JVxhI{E0=T) z%||_!6M!!6I$9+P0Qyg$OfGdf>4Yh#W4%wOltFQ*iq(Xx&HR%DD_0wWO7S}kl zwyl%nwoB|H%STtd0TAot(lW^D2RE+@5B2&>^?G=}MC#PP!bL)-5l*^07ZfCokyfez zThQvgTwQE(I*E}1nYOBegZN3W2LF|H@e5K8YZt~Dw*w6RSjYnk0UaVptc_0YWv>G> z&ahP2VLx~sdZ{|z95AnBRmlAgV{T#RIbK&i+&U~Eg3BEM2Yfzg53c=>Nn_Ut%_TB! zD^w59+nDwq465hqkpwuOwh~I9bk7Qybjw4LOR~p`Aiqjx)70_MaW9Xx2J z;3bC8lZbVw@PW7AoG<(R9-gjP8=Lf7yRHe7{E;O!AoF)&T7-I9r>zKalyz}P*H1uG#6XFi5IJDPI|I_G&&ml?Qz8=C{StP_nJ#f zp#vryC;nH5Rhe{@4h=NXqdeAXIY01^f$rV-*6S6?Nm?kx0h||MfNyxe&3At}WP5S8 zT`b|TC+zKJ%9`V*s<#H9BcsROimYHaLC*&*hD>gt_`?;0Bw*KOnceLQ^ny%ZF#gmoMH-ifZUGGw z(9^BY8~Soj+y1?7BOCV3@`MkUo&9#+7j9!T0>nI#>R!D$FlrDm3|)SPe*8%s&hhS^ z84WS$-3|-4Cf%iguiV7Sod^0=yrE&Qrb+1q_p(U|y;WH->q1ChpIWd=gK;f!aQ`TR zOuwf_OQ{KKlYCAuShb0qDFMr`4e#QV#J??vnXU7R4N#CXLki>Dv`zvGqp3OnaoS|L?$Kc-Y^VA>gwM!4x;Jhg$q2Sn!R%DJbtEjP-W{K z9uc0rkPWv-K=w1;G|Bi@P;Tn2_E^1mn=i&E5U)-PxzG!^EYoKn`XT z%#Tuqzg;PF_d48cKKd+YN&^h$&bW z3oP1EXKmh|>P3A@M-hZonk#UbyQ__~x1E#Lo=aos`KQmskCRBdx{f+%bcEV52UQ=6 z1zNl_rT|Ss(5hsR3(TP_{-=$IWm3L`Y)ps8kN#M*AmRwm!25@VX}b$y`xDz_1*1Z5 z;>2g-P5zU&Pamax^d6r#pc6+^mts&xd(8khULH#@^FqfD(j8}-jDM6Fv zSYkX^wca2MBXkX`4?pG8yM$d8j+87!H|0m366da51bI|fAKtz=Dd}d+pAs$?i8X<+ zJdYon!Wv{C3?q~O<%`ZAf7FJeA*_#i(u~EG1Noo+?53c)g{@z2{RnVx&X)^139Ei3 zz`@SEJ_ZqZDoVkwPfL@W(Q&u~M_?s=u;;3uiMJJE6=O?kLiGC<_gyrEzabN0&Pf4* zE%Ji1$dnPIKXk9HG+tt&U#eI#{MaLzkT4m^hW3zeVr6|lhpvdEuReI+raS$#aafyi z1H=7SAlqclPa6LXbK;v>REgT9vU1&merr*6$nvY-p8*Ac=hXG(MAJ=r^V@Tn$gp;4 zLFnn8GD5DN z4fusS%~>dGI^r=AtZCO5<6H6Nqb$PD=p;2Yxgy6Z4;SqOOiKDgzY9h%tjqFubnh%& zyyMXr>e^1S!$I0oTHQ4_p;Z)8n`nHIjNO=CDG^d7uyK6U_OSQJ)=8p*PO5rf=DDAk zDD!#mqqWao3_TxB1?Eh8@uG+eewr1`k66?TbvX#pXqIZV!#aY+60tjnuom`cEMq#j zqA*Q=R?(Q$8;1*%1dT6R4GwiR7d?*V9q3&Q>9&IRwRcUp{2b`(Txx#Fz+KW2(EL<7 zTPrplw&DJ>8GmQHD;4ORy0|e_jHdsDIhq|3G{da$>*3I_)nuxYR~m{+Mh;k)x7c}i zZfvtO0Twz$S52lg&&0Vy!SlPxbe5;$ziQU;9|4Nv)X2Z`kG48BnH*GV<|6{Osy6#x zwQ}ePp6AB20FSq&mLfw+j)1U6Gx2t>tt?bw2*CvM#5-j4g_n7-5;{!v;_*)cpHOPQl!JXQH2<0u*lF=hbcDhpuAoyf=As`;_RjZp;}{l;IxH-fEwTTSD=U zdA>fz@4f21<;Xi&IItXTKJ;Nz{iPaeP0m;pB=#GvMl80?CEkqxVOueRpzs+!r~sS2 z#sS#q|C$c1B*~7=1{*O1jC0{b%tEb=7(BtTWDHW@2E)5(pOJsv8~GH%hug;T6$_l{EAR&LwqMm=jZ9{`jN|1fpi^ zo+ULRs&+vxr1nXAl=|^AGfgG0FYL}zJ#6RQ$$c$uPmiABu%@ohUbAwRWe0d<1N^VN zK04AY4OGMn%XmKS(aHAfSEl@(e{ZVH}I0kI1xxXi1WZ_c8LOogze^ zy$FJ&vK36nMJC?Iksa=0!5z?{!tX4NWEU_I^js+|DMWz5EUR~tJpI*NeFf?X4~yDA zdNyiaj)SyeSz2%a>r!<~;;i9EMybOWKwLEDGwd+QM{SgqdnrK$`Vq*SmLF{3@%gNm z@uf^;gzP9qH{bQ(Kz>8&U| zALC24JoK2Mz8=AK*$3guT0+wWAxMa#AZrUsNe^)D#%vuzmr3Z;qmofIous8H5 z8>{jqLjU~`6kCc<00vwN6Bzi-vVbaU(GbK^JxkGVIY&EAe+6=I9}H#H>B=9^z8dKl zNnO#~5|JS*w>ue>QA-8Gw8#-6S&9eT9*&r3Q(#NL8$d zJr#iD%PF0Dqn*-BnluM5`&U3EW-M8@VBYE> z_2q}WM{&!Kb#K%ZV>S~&!!9w>w2jg#fQxb(fijsD!q`j4;d(N}gAnOg04$cF{?nC~i-cKmmPTZW9Ua(~VT(30l5rCE( z-=^;bTD8_tNqsLKh}b}gb~(d;(=QKzM zArVW*yD+xd^Yv@~<#)>9wote57>?KTiQ_pMG;A4FRJt~}kxv1oK0kiiLHBGF=ij|^ z=GD2=L5bV->5Ho|L#O>4L2sWeQ}5$r551d9X})`B^67HJ?#V&F&g4Wdrwv<-b+fN- zq(fUbPic|G29}*Sb6ZuTv^x;^=FxTnI>730MAS7W(Zd(Xag(3%x#KcDbz~2=E1=W;qcrbq(m`ys>40?Yi1c7}jI{S~ zk+j!o^+;3i<}+z)+uvutIv>FK;WJ&Jt>^yI=q(4k6V&DN8g`f#qizAI(TKxc%WU&w zXaI0!i(?{Pme14WFaXECjY`6|!1AuaTzv!(r!!vZ`U-dIWo)#TVr~3#NWBM@E-ED` ze-=M2(R^PN?!eFwgjEOsR8Wbcd}uZZ|OTpyQ@}Jb4#GPOh;<>k@x0 z!vKj5QFTR0yNu_-*coIi#mbJ3L@r2`%`(bygGeiT{0g(oFjaFliLMBL7R;-QkOH>@ zql@!HRVzo9pG8)b8w~=r--v{ZYE9036lVo;ybPs~T=ka=*I_2`wf>pIF>i*sYRa%* zV`L(n<9Y}Jh9#An2deeFraL!(r>JJCe3_VH3GV!W@q&RRZU|7lm5NOPZl?0vUtG)$iKvN<%s&X%Jlr z;jfs2{!CoQXUH<{4@o*&A{0H(q|N^DDj8qCRLv*5|9>q&Er}N`DO}oLHKipEmuV@o zsOUegzNdz?GFwo z5_gJBVmW*z7VRdCg2^OE9U0N{SGQnm~zjTTpqUu z2VAIJKM>+2`Lzt=2j~1if)O9GwOtnXINsYbd6Ed(jz#!9TO zg;gk@tTgA+77%0zHin}$n&eT7n$%)U;+LFj@NaB>`86A$)Pj%iDa_?8n=aqjABq)( zub!37>mr2?a*ZN9g&z=oDU=dQuozavxn*z0fa9xN2Rbj?ib@h%W!m2T%~ha3Yx<8dH{^*fNFc@cse_M7Zs2n}``#fzd6 zSM(vctmZD|=;uGekyhtukeYO3*C1gM`~Udj;m~j6tV8#FN;oG9A6-O3yL(JOKc}Nd z5hkfaA}x#E_lxxr2ak0d$>(J+uJKh>Qdjqr2XJ4we`{*0zg;ec6m23Y7r8i;ET*D}gib~wC(vJyB zD{~t{*GE#5#aEoJnv;3mi#*A)%NPUGJ*d*4AHt3Mw`j<69+~{v6D+Bfd}AM{&^9A6 z;zj!Ezh0jY%DV5~1zFnQ1Q<(x`csy*=PWigFJHCGKf#@_*9tzL7qk=hpGxV|9iGr` zO$$hKFtTfn9m=Z<_Ixuh@Y8$n)Q;qCt)o4dl1M|{GFLrEa@uNT$z%IjvD1!=iIv7J zijG()zaXJ3LM1>Y=xGaj5L_&}uG=_67=JvgKaDOCts1d4_`ocq?GK{2bW3>#`eERW zx8G-~ATTBA-+j2!tb*nWwy#sRRkAH)!-dE|&#@<0KFz#1rb)C8QQcUX6zo4q-qc>> zMKLOZOV`f8gj?Wd*y*T=3_MKQG-XZvoo5M zi0z|G*7;||U&=U+K&1c!p{xY*jmE^Nvw*dJE1iw=!vgC_$VDe5Q#es64)J%kxfTxg zhn>e?59Q5cIqO@vxekcNzbW&v=}ND2p_7Kn*ycU@L7P} z^cT`uPW;qWi!L-o;d^Gm!fQIt=+P$r#{!fRk0%MmMh%TN2)O+a4_27GG z`@ke;<>qKhNhy7lZWFy{4Dov(p$C`K{GNl7KV<74{1^MSeiWYJPLppJP9p9|>ErH5 z!`X~=p{070mCG-UeYF_UijIy)OrW6j0;@JbCC$Ytyw0K{OE)b4XF>^|hku@!!Zr{o znW*hp7)OzEU_w=t$`TJ{itL3|h&-_OFtaU77Io|JTsMR@Ke+G{)TpxdE&`@B3DdSB zXOMXRhe&rX+4~_Ha7X@3cbuzE*enmWU2!aYPlQz8JfV!t{;cHbj5(G_pO7O+tb zg(yQv8z2A1+qN&}=Xitr%(Zj*sRSy`Ek_-qf%|K$o7WzBPrDOSFn4(_T8?8)G{P;p z4ZT8)Q|$|+zpEtbik=z_M(-{X$>9vPiuuqjOj`F$5F%bZS6K% z>0qQoyWzOVOv5gHo*%9Y(hveg_}au%KRY^2Zq%kU5RXyO++Z+DKg(CMx&J*R{l#J|?ugXfP+ z7q=Bp12tAtj5YNc4Di~tX*PrcTZAR}f!ljI@Cd^*R$dZr`lK3k@LW#>s3)W2pc0rfYjL1U=-GXjIafrYSnd5)vFgE_G)9>b?stnCH*hiV|91D z^S{#3UXO=1MTigw*%AHH23Gs%sF!{~FysuZ8|5~RAmLcbvAn+Dp%$!ej5ECyV6~ue z0DudiLrX(OHG<@({(VBkWNvd)OEAhVokAd|hVmH2qZI&XC4@WPl4ivo)Z+`d8KtYR zIg!+BRUeaCANIK?8Cm&rKnQOHGPv=f6(6fZ!`dYk0kMLr1_T0+`hXcevbyu;yS7G< z3h~h7bzPiX6nOR4!z#@0cD49dV50nMm!cDvOR#Z0|07r3^IFfTpdrYz0R$iMuUXTx z&$#}G%$%|}F={owRT;rEYQ_I#FdGc7uU-RO2r)tzzt=3Hf zgOe-XH6V$rJWF+pm($T#>hFSW%0b`)p%ve*vvs9aH4VkJg8%3*)AsjqL6HOKLvRu1B|F==&4MK>+p6mxy8b?mKmcm&vT0WORj0!mfc8UptIC z<&~BC&em`rkIvehoK$elgduQxG&6P04tJ9Y$esI{GhD~)f}-A9#@_*iFl*XDNI_&A zgd_HLP3|m6B?DP|zt3zIy^MGhECr{}ees2M7*R?9rJ&L2bcUfeUB&txCTv0AFEdx{ zZE1^y+o2Ei{*L|TVxCmOZNs6#aUYK_#~YIx!PL=B$mzJ6>E?KMP3m}v624d+y9aJ{ zB80h;mz&@o)})(roMdlp&TNEjamlnE+F@z2VQ=zy#rpPl#s+T-PCjox4C*$ij$F`) zjhkgSbZX}SOc#PffSTJi!=YQFxX`>6TP|xhGDpLKTnr=}$C{l70xkz&t6wIGf7Q27 zPc-HWxX_p|_dOHU1CJh^VTTS4puZCifZ%LyH=KR8gT!Iq5#YJJ;wleaI@(Q{RzJAR z!5^GnPZc(cBMfSO_0N6eyoU~T3s|?w-48%jXF}gQ0Nt5Us-?^8m7B~#ht;9s`>spF z;q@_x<<%xb#M+vM;o9%GoYk?AEHX_L{|c&RhYB+*+J%mMhi^IVJw9BS@|v&#z^xxd zE?c!Y#lb`dr7GBbv+Ry`L@cedsq0}FaEH$s6n~2n&~8C;E0EFsdU)?tu!aBAuLkG7 z0|KThy2u9^%X|X&>lUzGo&yhU%;WiAz`$=Pr&vRCFWMm)WRJ1-ODK5&@|#Uub%V7} zBTVjoOa10j!>zqShl?Qtc8RF>c3SnF;2fHCL|41_6A}l**v@(UuN8k!pcE3+(}PLc?I-#>C{v_Q8P}jjAa@6r zy%}C0#uW<-3mQ2&zT@L)fVIFu#b6CDuYE6B4huXw?c;N2*qV)F85PBUuS%hYd`a`# zoMG#8ZBjswNokOb1)9m)9C@n1gNXk1gxyxsty$qW+P{bjdRxM`YQC6u6!Z!lW?O0+ zh+$o(V{;+;o;#`F2tn~3ZDPQ-#auxB48}3xk6|lDm$SDg`0L~C=U!y(SnKlc| zVRj1U=byA?evCm9Ho`6cxjEKJPAld8ur4pzMYu3R@uZ-kYK1d>5*1334?5MSDJQ`i zXD^YrHidQ807uIO<2lAvwK5IeW|%I}>k0OkK&bL%em!I-q!X<6_m@cjBVxjDcdQbM z^sXq0C_5g-e$6n?N8}xm8TJW8`U!%#;sh4FR zj8kJhh$bo29g8=Chh!GabKj4*OLiAS3O%VE`4HVc{4NKyX{Ea^LWpDoNU0ck0xR7< z-vMMghXu)xw>wVHimnj8O^;)$O9|Dai(NvD?a+o&e<=J=u2iWN2E!PbT!HeOm_$)c z#?la}y)Ze>E#LyaF{cFf($Xq=_l1?se>i$w&wDUe_0j{N%AcN&7QAO|q(c{sF84 z1WNHJ#vzieKJPw0R)xj6d^>*mCTr+i@JYIzQ=F@%se5%Mu}`FEF`m1ZuA#1C(5#(! z7*^HBXA=BS(OP~J_TTY8CjTDLc6Vtwqm0!Rs2)C?G%;6B43E%3lcZhe@9%S`60z)D zJpYKkmu=uN5%y@jLnZ`Hg$bdTk!?sdEt#c-xC*1l%r-b0;dW9t0NrZ zq<8Jfq0|9~>ft%*@DtzJ&l>VJ4O@P|h&?p4pDFbWE= zA(oEo_7TJB>WiHXec0_dYPIZJX{F!l zTOL|TI?Utac(bXR2*x!(+!I#c5)CK$G%y@86=302-+D&9(wu&cFnyD0r`RY-clE|k z3F|bJ_i4DXC%bY>lc}HpJIQ+Ff_q6Q+l;c^b<7H^vL9QG^9^4Z!n#l8JbPn(e~jo( z^7WQe$!n+FM~L7X8ktV#UmSG(JuhYoHVF-V$jE1+;GSA91isec6lOd~FdIB|@rF$Q z3Pxf{eLs+{$58*oX9A~v5yNYVDfLL;#eZF!gYUn5ZNYMy(yJfiol}}2{=Pu5FM?_> z(g+ay-IuVWZcDN~U}+?OY)3?2kCsIYaj-xVr|nJ{D?|g}V^4ZN z0HlEozHq}qnq?jzb5`1%hPgW}s_M3$xV}pw@n3|Z=_g@hT~pXyMmnia`Ctc~=t3Uz zG(NKW9fLl0qQPjgp14g(_M3JP(G{ ztUdP&joEYBn@>)2jeJk7sB*qJ6+C55Z{OYB&k8qKg$?zT!38Q<2~u8MdoXmVv^sDj{a%5t~)M z%ZTmk5nG}WYqb&OPsV~H_siN56G}pXI|<2RG?%oBlFwVE{RnJcGCkLtWW%}W{Akdg zRv$w%T}8Y;S8wb-`0S+OL-g;Vgzze}=gjt0ep7jL`_0oTX~x2ZZ2fsNs4BCp;!g)miOR>f=Mqw8yArnTvLVBlZFnP+U-XsQ$5W->>Jz^hv{w0O z!9KFPfMCZ7x_VfXa||cpq~FKP8F}GHTBUKiZ#)yy@WLr}3YA zE7ZtA!|bf(XkZ|Km#z5>-qe1)rf^^F%7+Hfb7du551sZNfc~IsOAW~Gzj&6b=^||$ z4fL0A=wfX^tZVWfMw-r-+@fkm%Kjx?IecDTLIInYL4zGkVA zR3O8fBXk7k^`Ccx0S?luv~IcLwGrb2AG<2X>lTD1imy$Rwr+mXrMxQ8%OSyqM)(qK27d?^5@N|~I^XOC8lD?L^YRB#=hJslCIFwe@%>Bs|&ALF|1c2^{<|JCPd_VpqN#M zRN|mVgwqjG>3w?a{t-cuKMstwUIAcGv0&W_uzy(r;12+E@sa{?g|@33TaYEb0(M7} zG&PCBr8*#yRzPKDUI7e0LPK&_ zR}K<)t4<8>gN|jqoOEf$;9h}9hgNhU__9nT^8pjt|0>S%E+Z7Loz^PFGZszL6YcM& zSiLXKSZ_}E6#o%L5}o#KGuyndn0^0>ElC~I%CJX}ov}3AvUSRIe~tg!h2canvaF5B_QSu4?zU2=(Fa1E?0y^|0mlup7}) zTVIuSr&wEXs-|5Iw9T6k2v0s+!d|8>Ao3LXhKfH(#SEL{hj%V@1y28zMsC@VZMfN8}IxNx`S9+znQ4`Ij zdW8F$@ww9mjv2B--V?!AKT7d-Ka{r!`|&GDqM`?zG1w!Sk;b)2zwJr`d5h$r5uNeb zqU5KqYXpqPqSBgH@GRh76lIKr@i{tizlWYvTAJmzZv@UiB>YtSa5Vru9FO3+%Nx80 zwIoT;j>#*kI>@b+T;2!}8IwD5tu(Wi;nmRfc)dRUVhun}V0U7Zwj_vY+l%PU-q@-1 zgO^H_=%TKt?YeBEvfCT(%1VZL6%?R^--~D-(b+p%orLetQ+M3m;o%bnJRZVpnhJSj zi?3Jza-ZMQNS!Qe1w2n|Ill6mzo<`U?Re||cjZMrH0bu)vBIN>mr3-=r4_psB7T9s zA0g1}Z{$Ita{M%ZPSx`YPTv6iuU%jsU2-IuvwOLXWs}-U%VRvB3PUXK0!dpGQ+Tuc| z0|{62LE5jI&)>d##PuVq{cmoX#L&x^y*KWo)~ynfn8S^Pl~Tol*ZHI<9aA4q^2maG zBVzpL>64LOLPw4c7U+);uaQxcS%XH|jlG*?D8?yVLA!+^Y(mSx!g zHycgXr@m^Rr+#!k@vWc)EA6CU)r(Q(PMY1}gyV@SCfX5t^1GIq_Tq*MG9lI5eWhht zxBQA_eLLishr5x3Rp8AE9-(sUY@n~86X;k%K42&7zMmtty{IATXrzmbDt31_mT)74 zC(m4{FK!dea9pVCZ<&>A)m|KZ^(ES79(d9bG|NFW8dlUWnhlM#hJDl3l8j&9%K6FA zo^tgk+Iu9&;oD+IWlpRA8+wYUo*9YyEl9Kq`2pW+mogICXEN0;AOCFEa!pui7LMkA zv|N!m$2EPRu((mG|6#%0m*p2h7zl&pfoQvc0357oj(42gSw>fP%{I+nHG@T;NZQqE zxZ)9J?H(VBaXy|~n-TkGbN?wGu=WR+Mvca}&Q$s3<1gc0^+et5F~lXW{!_}(>@-{( z!M$Q-6$v**ZM8gkVr=uAU|(Z+1J5^hO6S?;llq)HX@fmE45@?k&|fLi;Pvx&3N1vi zxtU10A0Ll&H;C+BikxbKQ2W1!B7zKYrjFn<-xCi?p<7(nWgRFggqIiK#>TeE*QJD8 zAcA<*-ZUREHG~BuV!u0os2^poz=GGduU)3}i!XhsByWWEUiLmy9_rocT%8F1P5%1u zP+=qthfU~(Jml*7Gu~E|L=5?pBBcg94?RW&@;$ReVF{gFj;#McIN_jTATR0nDk_#l z2?-YeJSVdkB5OPz3#9559BB5!4KylRq!Qh(QoNE20k0QPp;oxnZ$FK^lVem2LudsY zhY*d0k>vC~yu#al#w^C1_*gCsn~(%3!q#IDcWF?G(PLZqpx0hgUMrf zDf_h^TF%I5O%yJWGB&ygXr0~m@)nE3B8P}(c}Xu6w(Xy1WP&C<*2 z4Hw4El>iUvREWZ~UY{XduJ3v4gfUamYPe^C*hBnSj6dJpa$D_iK4xZjm9SO>5;^ZP z9mK0#?$~8&bzQ~xaE|KMk!dSyX{L$NeJEET!rAiKO>xnU>93@DU@ZK&+5FpH_n|D?34IO<=9r;?- zD@zHnd+8cIG+xZE~%JZBDg=O*)Z{YidS zZXI>4*RE4CzOR%eQ5S`c{Nc_?>slkh_u1EddR1iQf1Yhvj#Vgl)5?3}aD2=*n777K zD)v2A)8V~J7GLWaVRWUvp0D-(=z|B1qcJu@!|(8 z2gSQv8GuZOI6notp+x~}~kw&hT@z!?k&3^*TMl799LQ|9M=rGT3R$n~ew@5(XqM=gu!^);$ zU>^DxI=j7k{9x2g9XMUdbbvX9=Uo4Cw)%ang-&k`App37st6QE&mqrBx8?Pzlz+yl z=))g z+Pu?y;xDd%P1n0<&^S^sj#V{D9+@i{GNAWj>6ScZcR8NN%H)V=GYU=i5Q zn$$fEPfL!AJVuP@(V*h^Io!+Bkb})Bu*P9%G{^$Z`4j$y;|CxoT2@*l3&qJ{iVf+2 z^-yU}r?7@}oMpCm0BV*q2X|O&IA}$(yC%_Gy%G#+ThBO}8@@0acz#UVFmMNfZ~}0d zl^dAO-=pJ-l?{|q1uWXq?=(cGYPFj*s2h{4T$69{9hjHpFWd&g!p_fZ764h>`vAeTD><({$ zHjKds!ta(2up@i74vu!$Qn+WUEkOp3cTB3aT53(d2BEo^*JkO*F9vVOWZicJWW9ID z?yf*%Rwy>4Ex5;)oy9h%tajadz}y+pmen3XXt+{g=o_pd>mJ1mGQTt!$bFE^B^{T7 z-iIBZ7>4;eV8zon6$XQVjv0tF$h;Yhi(O;BcV{-dxy8D>I~4T393}Ve9^J(nid(Y{ zMFASA#CdeDkX&?P?R`@Itg`g=)-cKXgk{()fYd`(Fd)WI<}R??BpL+yYg5CdPewpb zgE7?hhJK^fE7DvC8HH)&SRQG4e|CVoQUwP%N@j;@b3XgygF6qjB|ga9GRXTTfe3<- zw+M4fE50)-GTMRJ!<6D6Tk1YlY zBbtKeeszLx*qwb2B-D@YIyV1BX?%;(s`r3nx@j1pvI?HV>x6k%@?vryHJPXasKW@_{hoytQM`Gme`zLiljopDh*;k)ad1xbt`3V_U`$mmH@4{_54m;kCHaWom`f-T=N{ zt4p~3iQy%TdX~Y`ORv>H5K+OM;sHWGr2UX8Js_B3i?+JUVab-y-g%p!vkAQY=p*+* z#E@+h>gnlWxv1q?Hb3-fkalNFZP+us-25lPyx7YmTQj?fQCEHV%ecAkXZtu1to&?# zQ~xJ~Ujl3lDAaWPFD1YA-rU&e$(>6KAE3PRU=AnGI-E|^pGDrrbytvJYs>|X~V1bWqu-0MW*~ZNxW^_FvA?jlSVC!V=3~@W%`8G4#&Auuw3en z?|G|6Gu7@0RdcL|AM6=9%4QBh_Qk2EDaY@2kFF~ri_drGD`{}W_}>Fpl9gO@mONOO zd=t;MAH0x3s@p62C_fX@|B~jiibryy_{N_(u&+=oxg+^dAo7RU)4w-q)vb%CjfXUm zrDANQD}oJ>l4Wncw+mY2sUiy_D1tgLo@)>{o>XnHWNuDK@zPh__+Jzfw6)svc3cOA1{4Y`B#Apz4SP262~ zGM5J8dE;b+QUSJ;r*O0}<+QrsjzTzzu(Kg-JZ%Si$}ErK5q0O^1$D!RWb*Tbh(TquMuN}6E;`u- zv4;2~$_rk}y`L@HmB^rmJL9$p70FvW>w;H~1_4T+(0MYHa0GljZ)sb+ZqudUnAa!I z9pzbinN>rA6{#N(cq!3fs$=}&c*q?D88uhW+5mfLliBX2U};(5yb&-jn;U6+Xir>6 zllmza?by5i8-8}2#-K_cCTdL1xmaNXwvwx>&S^5y3f|jwK@XKklu+tr^Kqi@bA+uyT3)_juzyedLfu ztc}Af7vpy?AJUnuX(GcF-nu*r+QP$_MQ<@CB@JQc!Rm>ZmtgM{5a7ets=4z!TN0KY z5ZYV6yOAxeJ;@$=l-RE}ptfD8=6R46Plm^lJR-%#Soo^qe`q?(uqfNE3)3Op-4ZG- zARUs@h)76x*U;S{AR!_(w1SF)ba!`2cg@f>bbi@1%e!>jQJ#$}sueHvF@?--2 zJBJ!kD3VuKLNjt{$zEkiX~`iXI1$lw=m5*<*IZn>yg%MYtcjQIalcH7;M`w3dbod# z)JxJG;oG;Y8Xe^74qN0GTF@n*GSk=MB8Ta$=HDp~4Rdu5?Z3u2+nB7N+?>f;H^V&+ zE&IUW(|B&CM87$gE2R;{Eul)dJ*N@kaT#>%c7(%Id%MQBD(Q3fh}wkp!~ZOLc_xcx z?59njp7|3teaK&qR+N%hhw}X2$XU;`q?`9htwv9d1-WK*#Nz#DS?_GbvWFqa9#cty z!Oat)rIh=m(XI7O$xIURQ;BN*UFrW+AC|q}6Ik@Amlfw+PJKV8wD@j&DW_R>7t>{_ zI@;F@g}#ligqd2JKc^l#ar~~WD;kQx-IXPnVm2y~ao1%0yn`H?WGb+SmrhKQ$a?bA zN1Thm2E40K65Q6$CWD%W(x>(xE=A}{Mo(I#4cU`|m>Y3FaOtNzsax_c7rZLar)c-O z=4~d*#)x%IY>&Z0Ws}bmxi(c%7J?O9F{>5J{7A&?y}_)%+=`|*4`{k_fZC~dkwTcQ zi!IGQ5&zL3U~nZyk{Hq~?%E@8>>Mxc-`20e;Q6x<|5Ak>R(Emp8#m(S_BdA}V=mH~ z4#RCz6d5w-$;~{Ao%d>7?^(xEynzbtTjnsL^+|@H!$88#rQD5$!F86gbo&lM2ToB4 zSGsyh8A4p&Qxb$$oL6gB<}<_@v@hC>`5&_8+$&M3xeVm_s=`e zxDpM!$1P^uU}w?kQr;4=IKNDB6V37%=!rk+$&x?bJ3gs>&0zkP6B4XxBjTCvkGqZI zUE6XTH`UqXjuOz^bbULHK|}OL>k`Jl`MtKF#hhq9df!@4y?JwELEZHA!kc&(vHrhJ zPJJ7c{H_wagA@gv-pmz~2BsfhZ0LDfL`2H?evzb7Xhz2{635LSk9i{4HuUiYk&=)C z6YB(;!xwCkBHJ%r)LKLop}){jf04xhNGMKCV9_KiR@65~dou7g`Bsztv_>jq@npEq zu0+A!jhwi^g3u{O#x^ErEjTF{3kAF27M)306GzQe7e9A#n*V6HhqYZ@jx{64A~4Ibet_yhyHScg;l>>L8$Agoa{tgT z@n@v>Q4FvJ)+UP5dfijucB$~EedMbdYnAT9zC0n`pOAKHk(Y441O8a%ySOT|Lep%? z@U`lYwNxS75#9%(qZ9wO`ld9=w0QSjEB0`x`Ly<+0*9*!-%z&XC{a34k5`+hrz5B> zi>C{I`Vqq79eTb^w*#%B$d{Z7-roTj134K6aYJ81`|_4g|AqD`eUE zuWU}lewAMi?I904uVhlb2wfZmZS=sOYW$Eo{Z$9~)FB{BjTxrHycU{xi{Hpqz3{3> z+cqcrPX}@O&xrjUT~<@M%}~81#uOL?2g1m4OP$(3?_|%O98>PE@M7Fff9e?#EadYx z$Bddvl+$s;8Ni{-2WfYd%?obGxiRPwu`R`2@uxsEK_z>=5`CnIhQacfxxk1T=I)6B z6H+p^t{u)k`st25+|OIaP4h9c;{69ek%mOacu`FmPl14x;G(yBHjK_2V{7W*N3oXq z+}6NY(^tRYZUI6{;Ec0c>7#=eN(TaJ^x`<@5qbH({l=noW}+ERHW-W7tCTg>OAzHv zLf`uFhqHl)Ze+`sXizfLV(thCYihtqmR&?4kh@(mx=58?iHehi^kUj>+dgaLZ&L|iwIYwuAz$MPGbGyQhHBBFe0?c=1Pv`6p`u*6X4LSW!SzV= zOHvF$=u-~D>i>@Tx4W|zWFyu4{fqKF6836zJH#4ErAJ^RoQ?xdyXt{_mQjban;~i! z$~(k9-0MNj?g|Db_s@Rt-Dc&jGj0xD5ahfPf-?NH^@9Xjv-@kY{kvml+7d zf&Xb^j@l|IcRf_*%xpbPSOu~C&*%=0vOOZ<2zdvpFFgLX*)cZ3wtsjBfr$io7Ektf zogq~9L5)+Xf$HQ9fcVx73Q#g(pfhrKfJ+Z?{2si9wt$yH;!WLl^r2h@*&){k<8~v- z`+GGD7V~72cgc7t=_;;=V|Fcem^Cgz|IEA`eTT^VAGY6*JAj%HqeSrpqs0B1;f)0} zAdLkyBEcFNmZBvR4?CB8FG^PH_k1o;Ne5ft*tD~OgqRFcSQs$>gSJKTQFRFzW`zF8 ze@Y|2BEF_TBOR1M%mYo4fUcJ>3>KXW)APdEicVa(nBbQ(i!%$3@*mcq3yj*B{W)_- zYE;^ijV1&9LYP&-l5fAK`HUrMUDNxJ;g%n@+PvQavLHjB2U!x84K>f(! z8rePFGo`D$e-d3c;77+NiM6ih)6qUB)oBrS4~tZ1P>FDrDq>#Uw(C?lIwyq@09cf-;8utZ*Z>Q+T zG}A!8hr_Go?ga+J$R&P?vAgDyw3C+S1=+WQV04kt^*qB2>ODV_ z>^@I4?p3rOy!$hFwSPb#aC3nka5{n>aG_2>;F(!zq#gyx*Sf29@n$xr56kjN`k*>T zJ;YGLGIJ7Z(C{o{0S}Qi1FrgeJwxrAA;7kvh6a1kuLNA7wB##!v1S4+dN0qahCnW~ zv(`Iw3vKf8t{(^F+J47aKkDgAxzTk3`NwW6!QI#h6@qfmA)R&^D+$4Leb})Jc-(o0 zv5D4CmA8QFZufa|_j#<*k`p-efeM*2$8;Q5Fw&sF-5-?43N zxJ|`EJz^~ZF3$_}29@d}_f2`#hiw1z26l{rI=e2ogK(Qj}$qOG6{Q^0&(K)7wg3+s?_rL?8jm&X_}dYMMT>CM~oGw$v( z;mPL(zhNCX6zIP!8q8vaPgX6vGXpi%xliS-v!tMGUIN&*3)RrvGRaVfPaXg zSIYUYy{y)@6{mICFCHH3ERkU1e9&_lEE+Erc#CWD*gM>NviHY`_UIwYo#792#l7+S zMytblX7447+AYIa{h zhKk*k`zX1ryo_`hkVwvN0LURy#Cd)8-14k(C7fmc=f>jbODM~HKkuu(=kmSv#543I zB?=z4$N>Ag2YaEN*nE-D%rxR^hQ!Thp2zGz-N-mauGjOsv7 zxKK@y1?&NRMv@O$uICGO{^*I6(O}jNcb+VPuyUL+=5NJ394f9N8uy69?2;UuenPxbDVvBEhcA1IL2l<)n-Q&6!A<@`oz2o%$DM!}?M2i#mPWdU2UO+3AwEDDPc-2pnEDM+?#{ zcMQ!bYHEvNpx5jC=zAtDZ_Qm{z9B3rKGsX~K!1pJf-oDSQg54FA&6Qf?6Q@W`RZXD zkN&bmtlVwW@Pn#YJ7NJD;v1xLi?Sc+n$1;kzgQzHT!wTur47%o_9Of?d74B;hN%)k z^yWq>!Qt}qEF!Uyq9csiY}%&%+n{A3G|$cb-Op|D#OD?p;*lE*C38Xq7dYW%#jjAB z#EA;AWz8G`od4az&EQV}dK2lbc%+dLZDu&npTr&g^*WW6#<%>9lAs*Rv&EP?UbE~E z%*@I5F=11->uR0h z5u#L^j%6Tta#>t7Rf#OmE2*}lla{=PJ4%+aXq~IFJ#wUvt)eP2jOQ#!GKK(Ou0;}sEcu@u9X2)~))e<^pJz-4dNlVD zhGtT}3?H9P4j-3nA=!u#6wi|jZ*usZ>sw>V9V_F z9YxXs+~INs2_{wD`T)zLs+C|!=7Dj0o-`|_{HH#nt0b!g!}&kphT^uWb>M-o$P ze5!zQ%I9V)z-nr1$ZtUWmXAY-$g@aTpqt&y=QV#6>(fFJAtKpzuDff?41fH*Tz`h7 zC3@H%c6ciR^RrTkHUcf=mY64b77TLNw_ybfvi(usM>sBEw3>Si3R-P1e7wh9wm`YB zSAqI%(3o$`UC?KL4*fW7s5;o!i>fc5o~<3`OKOp8(moa}uf_GAY{pEjU-~d|I(>e%EI@79ukG0m2o{hDm{?|a9? z5P`iTV*62}qp!>I0g?CM8+MhbgV#OqSu|dKST3!5K&trkhb<{p{2eb+_jI&>BMWyM z1*@4EB?Dcw+E-QD!RNrRi``T9!wE9=pd5;{Ynh`Ra2t7NpP(g`Y7|;H$Ld&mq&{dt zDJ3)?FC_cafQ4CREFeie@rIX9LraNwK#<9HVkenyJCS$v0n2qSTKbhTMjZq4VPM|L zexm9pjO-#GRh0^Jbp!nO6#qi% zfBzuV%49^F=p;2pO>)MSK|O~Scbh9^B5hjc0jyCtB-X8XBQ`>*%i;d29Va-k1?%jP zAf<=E%8lqpwVb)FA8iB9ByY)cno4_jzD6Me2qiR5&r1{rp&fNj^zbG-QiqA^Z>J2t zOt!;~lx)MvZ#l$5oQL%+;I)4#YTHO)bkRV&MU$o=MYga-Q6<_@isgRi=#HM*`?j^V zc_T{=B3ayG99h>#d*zRL-05YRy(h@0ELFEJ%kIz&9R?Utmd?+nSf3P?Lf-E@BuG1| zau38R<~LhBn-@(hs8o@wdMSQn5PJb2Q+ozcrH4A{VvoY_|M+4%%wR(T1iinK;HE8Y zS*FE-4ZWxG%JsC<%wO*nvDwNaF2~uk=kzNGA@%GB!eaHN=$h%1zAAENX3p5gzGtON zlwYxAZ8>}6F>f&3ZepW9nA8#EDMKZX^PWCYWAq4*O$x9?KTGY7DdkW!ccePy7aKFI ze6rL@@FIJQov(C*w8s$$9}*9`)|oFw3gOP)zP=ui!uK1s4w zwknZe79cm9SBi+D%*Vr5R5GOu+aBeT#!<^lxLrMO(4#zmvzYDtu|(S0?}fbz%(N?S z*w(?1w3-!ieHo|vFlLIn06&v#f5>O_&!x}H!+g#$o%?|2iM9pqf%Kc2;a~>>_j2WC z^m1`M3@{FZls80;qm^<^aE?+({Oho$;bh-1Y`c2?O;pAayX`R}bvaHAAxt!<@e!j# z+WTH`V6=`-n0*1ty!|r8K}%mVv8G3c@~uP+7vzN}$R?MbWoV20zgL#1c#HJ~$22E( z0*M*}{_`AnymEqCIz_GXJy@(y(&g8`Fb(Rp^`dBo0k2|L<)zRFD{b0plOEY9h_olf zSOChKFv<@SG={L)JMwoF1hU>A#HM-nI}Xn+PP%%=g_}G%FI;Hj=w3AP`3GQPynk*4 z2l#3O5C;k|Eae_u$g6X>ZF(gP{uZmuG|l*?C4O(K%!Rgk;>knY;i>X{+Fp95vltHR*D_}S=B>}t%uLSEfz=K8`oRVE_Dt9KO{0f$Oub!x(qSGE(eJugdGu|cg z@lr$GPPcR8*X|(pR2Odu5=@(?dd>6g_1aHw3EdWPK8wjB@=45&1VNID3I_ZlQ+%Na zeC!cWI?!v3c(!fJ>MBV`hc>c+{Z(VFx-t+W+`~rmFhKlQplE|w5%{PaGVTRnD0n^r zdI2bGOw8=&1AfWDx(nm-{pYqIQnd@X(+d|H@Q@G@x<(W@Kmim1?+FR~*(&&Vrr1eZ zO`z}!=ZZ5-vf?D}|Nz#4Pg+Lyp?91Z_K#Ikb8X$-0cLC+)+uSG_%2)nOh zCD4D<3PrHzbd1Xa7Q^Zy{@~PCVCt;l@B%HnT~=U`{IWPz=K2j()Q`A0@#lN=yb`l| zzoRGVBu{}!@(`p0JE5la{Eiv9LGMEllcVlw*Qo@hYxB9SZMssAR4z+*SQN&sVK{J* zqN%iTO_sT)0yT94!6*BbjJE3K`@8gD2<_*VvdPi~=lu>GpZ^{Q>%L9X5c)DBQ65o% z&&}=K6S56TR)f?G0}B!=B8_ML06gd_hE1Adyp8wT8_SG3z@uk@p*7Td#aAZ;!s>T_ zLz8y=KyzX1B`BbKB;^-gFoQ1ecy;gscMM(Fn`k^}PgL^uI`QhNQR8^ISl8`7W#;4r zK6Bh3UFL2mcAfz))-)IGr~U+z!77w6V$el6*BWqy0uppz#j;=k#}NfH*C^kwvAx*y zvJKj+`ASF+q z(kKfVx8Rnkb8uBpKCpKk@w#UJmF|TO&gKt5gsuW9HK^E-lvH~OK!A*C#0YzlJ=H~p zEabG;J%K_5fCCg*yg*1U{W1#1oU=rgK4?)f6nwY-=B}>>I4fBg2ca^e?H-5x?1NCG z>y&|CauqKwYFT*Gmf*^UU=9MH4Lnhe%O7u&r7i#83t&FoO6+f=S1Rchwb`7A{a0mj zv0CeJfL}MaQA~Kn+dHW=Z1WOj-xWAcB7ZGZS^7hr%l@?E8#27hdolx z$wn=hj}S=h-~QGh+D8DoxeIV02)fxo4!B;?JszA%tn>tzc5N0~8+JuXU=U9m*fo^4 zUo9~=A*p8EYKRXXm~Mu^q>4Cslv;(Z&-aVkEZljALc};gQd6W<71(JX zQQPWyM+#-*2sbTW=SrRR20l(v+~4}iQlvAtiF|-P5w?jj#)s&kcc7$5ZERM!G1lHJ8%Zu0oFCvrkSof2|_RXRSt^fIj)5+_mBF5LJ!_dx$e8oOF2P z7|P`LLWr9#QFZ~ov2B5KvPkk`98vW=Gkf)V(!uTI%E%F6;ozG5+auPsIN{8qq}+7g zRbXZ-zi24-+pKGZ!yVx^9Mxs_{rOqALRRRvDokKzvmax9$Hxc~7Qc4*e`Rs>+_S!W zW%T+J|CE}<54(mT?Ik66cZ;_ilmqbSf?jba+tpD;^t zgyi@RzX*IgWG%og;G3yF&IlQ^Y=EDvk#)>rFsw)4$WkoeF2NG9julDV`~itgBFMvk z@2wGmK`cC~@J{c!Ig5L;CFkq6mVBJaR$v9DbWTr-__Nn#E8`xvXqj6wdOye}+THXr$z_xBva|q0z$Ud&fQfEy`~-K5q!TY@YKQPAwpn9K z8#KbhLV(k;faZz`UG^_|LmqF}_Gj>Pa{M1QCeYHXh1=ax*1T+U%zqJ2*P}G-c#_xj zy-1?|qqkAyuD8(3#0p8eBDhBzDU^?B^x?5fixXs3P-uu7EeDg6vW-kgtrXUmOZLg8 z6$Z*4LIHx~Q^h=ukPuiW%s25=9L@n zD;bE(rR1Vr&JSz__a7KP&padSsltjQBi-eK3^>jQ9S9j{(JVrEIs%)8mve?7mk*ci zlb@D56OX=2l{q%kUn{UE<0f+mD&+s8{8-V)A+*1<_d7u-e}ptn2If=K{$ZVKTdBfa z)qtF1BuL?XK8q#KubzQ*QBBg`o(gwV`-EhlM1e6d``&6?(cg=d9{Wd`@Q(;?g}Xw z_eo-#s0!NxSmj0989T&Tz>R^qe9+bld&Z=%to>x)eZQ96Jh7V4GNDYl!rbmPbx{`a zm{q(&2@`QAGwu%@97P3F#xvtXtaHk?LeHZ_>C2X58ds?R%tg#xjmi_xq zN@@ZV4Gj!9vgAX|cyWh0Gl@~=UI(SRP->@TUkDQ?{#qu7rm7g8j6LKXTP%)ZL9+!F z7Yc6ue?L^PD^x<3Uza09~azb%(Q>+ zZsSw%laen=K#re716JyuB8d%)(d*j9Q^K8L7GWl((pu|#DPJJWO-yz|LU}*` z&MH%DJ8Ce^tmn_u{&wcq(_TzOW7L_HFz`v2+=0VXkqBVoWf{ z>pQ_aBzYxijxz(2AF???-e}?!tuBw4BdkxoouFb1@R43(017QUko;j-irI28N~#t+bk88@Jgrz1p8dX0HF z{xb>f`Dzx&T}9)wtwFf-Mj{vpHcxZSR0mh*@J)HkXfbN|Bd2f~hjV$m+k8nPD+efd zvEg0Dfu`ZrcGs=oXCi!oV{m;==f8Vdwax)!ry)MwpxH)~0o^dS-{8;2rk2c$4xzNa zP_bd1ul1nk<=8NzNObolMK)}=&+~j4IkUtRRBd7puoAK>l`gB;a*t{yf?~wD=53*) zK;ttgkTsrX-W%s#ALpYD{x73rmZhS3_@toHs1!UkF65A#fsd@})MHd`4~oA1RHexi zV}7AHzr^A>R;G8=sI<-PnQ;_&bYviS8wD!v=EvVIDUEb8JaOJ9G;rGm%OV z$KBZ`1Ke<;g)hn>jP3P!UlJj7!-u#d?1{OU)F|*8Kp`@{7GF^PE(u}pgdUvsz)`*tolL zDwxC00ceF1uA=NerzECH>eE+{(T#ct&tITviJ~Gbid|uS&%o^Sq}c8U+^~GiuI!MH zqL-cOvluGqMBUm2(w{j%eP2^SrS3Vob0otNJm;(H=OsRf#N73*T9e*LIJ$t%p){ieRLJCP`GZmmZd_5aZc4FQdr+TypqO%LnxO*iZ4$b&q&y)?Qb8*1NMK^9E( zD;(3EC)VC-*h?88nty~+>Bc>=!=zZ(uhU`YQ6T;=nCfgg&tQwsaze; zThUhxV?#;6u;YZXy^9ZtwP=mesDn3Q9tE7RwOpMz+?^Z+_nfx|MS4G+QY}BOy=)5J zpzf{KF1s#1x>!}gfEA41RbI+*HUeDw#%%Uwhx8G^ZWAg6ABoQjv<4xYyagApxK;ta7^@96cEUzw7Ws0G=W55}RaJ|J{FhM|eQV>w%2GPag67priFzOr# z=dBI#my(T{Es^>Ghk=3ey@WACy-j{=qf*P{!DfX0E0Bcq{yPW+LY`cy@K#OEMt&jb zAh8foB*{PA&kfX`Y#88g6kWr6Y0c;S!2!xHcy|P`rTt%q4H9shLc1`M2W`9lBztuN z)4KE7AZ)pXkv`lFS6=P(q$s=8N34SMu1@(dn1ydfQz11v^}v0X*4*yv!dr@RV86}1 zCZX8!2x&9yfB;w{T{HJ>|B+?>3X5>-3tsOqShGyMMCsDWyyPJ_sFJ@hX7Ll(%szLS<6xTgES`tnh->*%yOoP=UluiGu|0*{209~FLaZKQnhqfddUEMNx zZtz1tB)S zRk5%bX*F_eC|4=wmD(5v^G1R57u=h?9LW|N!S+)@dhmZAwZ&Zk=>2JXpw5SVqlxw= zPt^w(tD?KgzcIRvRv{afKy=_H8tYUhT~&i5c}Sh$(fUYm**@5b7bIzXe0ly_GmoId z6PZ^&vV+)0&e=~q3#Q$R+Y@GoHjGXQ9Gzj?I7KN&V9=QmhPNOx{`fc!dx)2N;*Zek z;nx7sA1Zw%im?ucMeI70q87vk+B|k$S^I9}k}Zv4*spa`%i;_|1`-UXzYGCQ&8r7H zs0=P#xINUHq)v+Z2X_CG?3R5pbcIH-a|l|x_znftKq+Ao6pV+-hTDG7xF8@7*Cg2>RWmISwP`BB5QQ$!t&{(aAu9U200OXJNZ| z9HvOBB@;I4HT4sA+@d4TYL?ox4*%6JIrq0+odu{4@wETFPSFbX5sWI$jGV^oF?;8L z!$$h`360?nbMcJkzF$Nx#lRWS>=)y{D3Q>yoG^Ps&O9BDcaTM|AUq*98&d;N+gWAs z4HJX0XB5X;isv0oJf*{%Ufk}AoE)7PyA1U7Oc|n+`gBJ!x;;`m$>$;@;T9>H&hh4Z z;veZ_v9MupaByUwW-LEQ@}l3cJa1zt%0n8Hpc18X?>GkqB}thV^?v@UfnIg^)4W`t ztC^IF`rJNY^c!&fZs4`tImZpdwtnkf-|8=gvFv+iyw>+G(ruEc zNsWyqSQw?a+09WmHF>=>)+;9`5F(JtXQgKf%E29Fxog%;A^ixeqKw)=8^QdbhVmJ5 z34VAm2SS2DB3GLUnB1#BJfucjjxYDarAJ$M9qy8eiNZSc=%^t2qeVzWiI=3*}|tkwdd5q<7p*aIR#c`8Xb_#Fqwn zB{HRPEZqG!PS^{%$#?YfXIn#k>?8j7AbXTN((%KCwVvB6rQKI)MGfY~i2GDr1(w%p zSU3r$w(237=1mrA`aeo(!$(HQwzmsnF238^n6|{<4vUF?%`34GDbiR8-y$&S$~-SK z9TuIl0QD**dX;NBzu$wE?>EG6lAi0HVcl~7qYsNVLC32Lv(0cdsN_A-2=p51Wsy|G zT@!J7p|-FjRCFHoKCJ$EXXhUVag4LjXc{#W447mN{qf~RIQKJb>^L^2`)#&Oqq)S1 zXD@hd`wTqrmZGr_G%Q{(*u}e0&;h%NWa&AjXr^~z(UnYs&@1^Omgmgq$(HGg-x%kU zVudaEe~*9U;O))hR8Ne0%A#Q1Wv&{;%tldcuJDnpa$utTuPBMiuKV9AZVHt>JDnm) ziWj?(ax+&VdY3<4Cw!=G&Tn6Gt2?!K+X=|J+S%i9YdE#<_-4wx+%$*{TD2XG6HFoqG8 znT$@r0G1^^wx}cCI4q#cyzq0S>1ptfVF3ySk@NJDV)XCV?oY)TI;MSnA2fl))BP>M zi!<1jw1#W1CxNW+uhlpQXJ8(QEauzA1`E|jx>y2PUm~?Q%IIw`e^oJLFTYP{Yu+EG zOc#BRa0jvzr&bM(8|iq{dVH&KY@JbIssC)8qha=XrON>6CL8@9X3Mr#v4TVz;K0s} z6{<-DTz(zZe0uq`HUkb+gw#N8GvI(D{<^ZGhXT<>S_)DRaTk|tddUx0cEtm%< z;LS#b%9J8M)okI!jXCUiF&Yq20`%<{N{0c5#-L~vu^lCxZkLBOLwsC7WVrRT8svN#8V zJOD(m$i2UoKE$Kh;-3yac!l~8>lnc*X6^u?4CR!7XKoc~6dbt9 z_dQf=>Z#KQ?{CPwTw9#KTW~hgeI?-yj_@D)Ik-4&)8Z`VSR-V`gq4Ru+#qO5T% zuD6gAlL6B(I5O^f&Rj@%R}Ejfm(>%GgCtEa8Yl4Tx^9bHMvOT$UynQ z&Vdxyg9&Qv?kb-}{GUZ>&cZybV#P2FQ8>EVwPWLUc<{>gx^hq0_d*1@H&-%pvR8d| z&Vo7iKE6Vf`acpK{up-AWr968RhREq^g>l3A|qqK^)m`Jvkf{KqN*7goxHh;+pZ5F zO3Tq{07?xQUOjW`V{D3*y!gBZ?|hrwPdJT%Fs%YV1_Kks=hH=+ahpS#an}nM!;ZbO zi`88f3gMjWjoC88uB?Af{|!3Vr}9nTK|X0qNV60PfNj$d%MKJL4-RQ{00KT(*6N0S zRB0E4JyT}f5iOw1**MJ4Zu$UYr3WdaD>alYz}A}VlT zS{K_^g07K+?@nj}^pEWMuYJu7q~+l-Q4V*ccmah6nZV??A#8pqt8n3bNBeYrA1LoNeC@8g7mOub7BVeG6?j{>@o;;ScXV$lqR5z#54?$Kd;+hcbzd`l z!B2d6sCy&`T%E3!5(o|A1&m74pR!H;NF}V)*BRIxBPt43ZlVTRgM1F_uAI>6|NMZX zV7YJ`5QXDfdX~+THI)#UWwS9`8tuq;V3~m9Z}`z(N?quB=@TMnV~;9*vN>%|(j;7^ zcgB40^kcgCFZ$v0`X3ys3d#X!%;z##lW1)-3lz)74_Hssy8;KeFm2t=BqOqM+lKGAKRgyH<1}$9i*JN;4d1jk4oKJ?w(hh0s0N5UiAZ=IPWEz zy*+y#V=aF5cflV6BjJMc5!*?;J`IUjO? z!dcPQnFPe}ADm;Qnb)-X6?pI(I%^;9!ue4rsd#ydqJr`~Ty!wxyv#HmS8V@{7d@Rg zy?}o99hjbnZwF+5bJ4|&9vzJefJ&8X5W4LijNQ~*r0P%peEf~HOfksy}m1bHd zPs1>owB)Z4#s-uToP*Un6J*%#Ohvn~T=IdkqgcCdx1-DO9~nDyw$mZ$S74`r%H+61iy zELcS}vySwZ>e9N(7;O3oKGs4c5=88nLz(Zi$B$1b&+MDe^_e?aqU=jOp_r8g$Vp0~6WoLRNT~gkxmH=Q_^Dko3>b^v|j- zqjnryQRNlP%5>!v%AHJPr~Tro&SAm=J*=imuZg4B*$TOykrjTPZLs|Gj$EQ$0*2aZ5@EFzp-`L|SdF(&tEi5p*QEJNFNf0_A*?Dr@B@1j+F ztA(?)KW5uq+rE_R+}!&_co~G{brdIkDJhQZ99WmQ+*`kG&`yF20>|$eJ>Dsv^MGB1gJHDsjZg@L4N3gc#`N8#M4R2P+?l}g<=4*<5 zuqxO^^;RqwK?&EkpiEEE8nLc7PXmGJPLHT<%beZ{Pmp8hmn0@a&N)VGqcSAkiacbC z_HKA0_wm|m5<5t%Sfj9|S@Da*(?L($l$X*W2;oZSen^QE5fn-Pke&GR`ua{2Q-@j( z1Eb@&iriaOzQ^XCVD`C(1QNzY&>|-eQt`S>k+_i)U6G%Jzh@U|3&oG+PoKTG48g?^p{jJ!F<*mla2{qc)+kJ6;SfFG1{sm^% zT|VAFH1k{)=((tjsMI&`O7|Fbb87DI0qIg{J4jcE+LPW<9 z_tT6xQ~sit9En1DL=>s0DysMsL+`&BydBSU>aLpb82a_sTuV*p>%T4YH%2u`o97~W zZ(o>RS2WOamX3Csx8%fGdE{I)!AyMvxrJU)Y-lQS?isbG-?%hXsaBp<QWGyO$YA48L zHLFbsFWh67QG>9ol4I{c^6?Uy#=A^T#84LSiF*j5XbM~s_TQd0Z=>V@X=5ya@%LB1 z1nbcPaFuO86YR@#{;$U-qZnUK$f)q}^qpCjO%X7|Fm753G8Ow^xkIwRG3{o^cY-FV zw+6UbP!d3mP{h`*F|hL=f>c9(eZyo^U!)Z%6-|hDNGloUwTU^TohilGCeEzQ;|vz= z^gMh%>LMe*Mu=PL&|No8ls>)`Rny)nUkmcv6nOF(6K>$NOP5B0FYlWS{c1d2FEDXL z2PHA|jyHd_X#>Z8_taIxFn41eaI@~8l6Bi3S%oqJ+B9099gl8(v4zmkR9;gN393Vb zBOPo)xL60p9j^1*1A7E>Cehl*8FdSxZ(@Cm441z z6K^zl>CMm)Uix4VL`;~yWO0r&t(V`=s8qMN}_DShXnpp5O;C%n5GYGJtem zsUlf;B{f|#X{Z3AEY~bzOriC|0xK<;Xd_cmA_r7ok7nZn6AwuWk-*fsQqOQp_TO-m z0ocX$qjzrp;*Alo=u3KQ&C)2q>VwXpDjt)50wIvRYb{zSkAKrv-2YL?ZA$K*?Q%=C zcVdWMX5_YEgW4PQeE7UW-Nn7G@MF6mwD}4pXRkhHl3g8G+s6;sX#rqQ8dxfc^8gQV z(FQ=-4Mwv?J3ILf*fk)WjR3Mf%%fR$ZHGKEnkyMjkFjOrwsj5n<<1Vo#~mPB068|3 zptav9L!&45(J=V&KsWr@p5Qz~Dp8kIZv^T7)Yp)8^6op1&rWvQ@ox1C+<}$1%s`T9 zz4(j-b7`JH&8)S1_g@anVD7*6cfno$qjDOUi=lbrUARM<+kIxCojPN-8U%Fj0=|el z_OM;G3HF=tk446dg9>x05Mqsw%$5AfjI*Jr75Iv*{7LefogB{rNEeKPZ* z_xK>!q~o$RAkiiG8lyJIhvL=4jga%*mSBP-{Kt72{>Bk)Bfy<+^R{BzmL7^eu48Ap z0or%-??-1__38R>H(*f3&U+LC;!dFVp}=FY8u)5 zTQ1)x{@iH5%9&Qu)a#r9EONNxE=0n`&Im=SDDBbfmDc6(vWG^@R}ZJm&JRFwIb8_e zm?k({?YV>>BN+OX(_En;0ESZ=4)7`Wr3%+-sb)bc)SKQ0E|`Pe*NvzM{{w-?SJDU? zhZ7oE_c^UnGETw7itSd)35-uVkORGsXL zRtygk6_U(iXc}Q1RXzdFxupW^4c)P3f z|K1@f+vmtwZQwX&;P|L7f%*aLZzP<>&BQa3SN!3KP%fT)|A{@lsynXVOIO^}jtvPq zS(07rI%TFqSBjeN{>6XppcY7-VdmkZdK0B&8xXL%wag&td~b$@8zmw@JID8iGRFv= z|5yJ+j-DiK92pQ_L`PnIf)ebCNb!2J0N~~Doal-hW@plUJ`vOhdRiFm6`$w!;bt$tgenl}3Gy$}Cd@M2k`6d!l`k2sERo z70er&7X9rpi`3Bo99n7h?zXjCxR~RrKw-@PpWJHnQV(j`()qOUJ z-q7FD%T7-i@3AFK<~xLkKQ&<>jkZ0OHmCLi`b5h-xwyeg(!_T{7EX4k^v{2E{B}gy zMjJ(l3}m+~*F1f(aQ@FtU1CE)YM1;{KBA0(IiNWoaq{{{Ejt#Jc!+ER8DkGvrcT@y z^NMLu#BX2beLFm5OnksPp=J~v0<+6kf2~>(`M}0Yvsv}Ond@`?U<=0Oc+9KU>G3z} zb2EL9W)`D3@OE{0!P76KOr;+m*PB}vrO@i)z+qOp1 z%I^@*upP@e_UH&+O0{uY$L8ZRxO@r;{YZ#}ZrSg%Msr?wLkX%q%My(@quuLa%8nci z5r4MSnu34)Af_3h7VZHw{QbqZRr(WSq-haEAD`L2smhzS#E?)W+803zrN1ZI+4%T5 ziBOz0Egn*zirdEX>?0b*PWzLf*#ZnWj{Vh5|8IWU;pgoqzu!WKxI1_DmBrJv+h@38 z)2pwY1xMhz?vK~1+RWyG&4jz-4AhB1SQp#Tj2PR2MC*J=eo{OSRR6Nf%Q;%ZS`Se@ z|1jIPwCM1`KZtl4cU2^|As-5YkhHWX3cQ*{nlbx!)j@InV~;wN@)60{u$d@r#-%4x zXKzmQl`RU<`rb!E7w>O0vV1Y?^OO5tB8oL1tPC47%o^&r4~cjs$WuRRjbXm^@C&~3 zKi^pCM=A^AwYy8Eq>tw;#Q0>#rpoaKzI~xTh1Mm%QZHIyL^tWYF!MPhC-I}mT;D`w zT(lq{T$gE3e58IS)qb)=9D(y!ZB<;KujAQgqcFGf_l&GHw9i0*IKi%LRmq9JCs4fU zdL^B)Ra%btTOzmBhWMNz?AZ8gI_1{Sze7c@GjJ+_+1V(MmwsbLtLKmq1x5c@NUI4H~PK%CPox7EVq_rvitG}fw6^L z)pA(G_G>+o-K5;*gv^eNAAd|jitNOA?Ptv}wn#vG;muHQl>}%THTuCFL}-V79`n5q z@q;tH5P(|-WbF-~4e(R*3YTGYR=(t`pZyhbO3V3kP@B<*{_D)vF(IdkL0WHR`h{iI zi^|_ZI4XM;<#p<97gp704TisI-o;4#nG$~4@_#g)WmuE%`^M>zF6mZKfzdF!1r>>} zfpjXM^yn_>6eUM1h#)PaI|T-abc<|sjT-sC{U68g#a{4+gN^$yOA{uXa_#WW*?%xSaQe~vY^{tQR;37LDBho-d0+}-G6o#_N?i)MR>veQ!c}YFf5<%PIP8Irz-uDpyKn=O@Sl_+?I5LL1|0FDm)HDWb@x0KP-t2 z)vl`Nu$B!KYdoBpiU;h#8zy}tP;A3a>{0S!Bjc<|?;PFj;h^RdXK0Ul1bFq!g)ndE z*M5$J}k4f-8tma6#d1sHbdeWW80rtbxepkH{Q%Uyb@x~Ma~kN2hoZW-z6i?A^q zv3vpRbeJzy76jrqDh>51rdsZV0fz$Wci6Ft)Opn>mnXrpK_EffK* zr(|kg@fjb|T13ZX-p8TRgb-P*>l$av5BxbUkiwZS8iB&4aW-B*zWEJj=gW9xg84GF zfejBGi~8RAfv~jdV8sL48YGnC_g3LVv6_ayr`4|Gt$eKoL+Z3PM$$j0oYdmqN<0K} z{OX549mi5tTH$x#0!rM;0=+U|@T;BG#@x-SwAy&6nCiL>4r7eKgw|jJ5ZqBVfQD`0 z*wgsJxboW45)RxlzocxHTVJYIKY0btv3VxDARq&>(H(%5<@4egv>bUQ*xQc#_n8r) zn-F`iy&=I^#q9-^{dpSr-kcAP+sPhnQ3D0MR2z)LZY1f04MGwI7Ba_~u};8oq!eMT ztC#z4`c0=3Op9nRVgECeC?7VinbRSzne#?3@Niw6=R>yDRANs1MzQXnKR*oiSC+1$ zsDjQ|oC9y}nl&7g>YOwOk8AqkgWNX=>yL?~fkC$PUxXwCxGYC<<=1eAu=C8g!@{`= zu>!WatGkDT=$x)Eun{q6@v9Sop9c)U`LrU_>~;-A7&B!ca}9z5P~b31rxR(L#o(2< zx{+3x2hdcsVa3YL+G3_!eHjgu8Y865+d4h5Khhvj;LIEX4!sRAuYbJmpqt}Chs-wJ zBtRXMhSb>W^s)7nPop|z+rp{JkC%Dt1~nuuvfHuz&ZeR19L-l7FPaZ}SRGP>E+^#b zv6x&J%$)AQSd+rpb~f4BQ8rnU0xGu+cFkegur3MwVWBALk5$Yl0O$356^OY)@7ZOg zSb~aQ01=SC{)_{&OdC|h_=yjLtT?D2O@AiQ1XgA20yI1HnZ{by?Cil z)}NNLz{%1Bo$IiUg);*Z1}d1gzzwExo&EWhMtl)3ytQ8vH@`p}WMqLA^lr}M!h^7P zyfSYt*HX@~0-GXA;kiz1ou}rxos3G&@129r@eqNR1WJqYakyU_Uc;! z6V+Wm(~Tbh1yDNVL_7zV?aE$?+`ZZ9Z5i6bN6{udu>i}4Vzcb0n4tNBRyVvQIZ!R% z*WR*b9=i&%Fx>zF&@GJM=wl253<0H}=-gJtD07FG=hpsLQ(1B^s7*WF8)P5WEYZN1 z=8d*hit!7DMMwkW;wlPHsdT|&jzhdl>l)Qx6tBqJ&Pm8&j5@?mz zeIzFxAliWiV`lT4iPj4rV%DqinnCV05+(T-IO_YW;aRW}yvEA9(^V;Lz->7hxLdS9 zIZ~Pl$$z_l_qT+(%9FmqbeYqqWk$LRXaZz~^>NW@rNw{``CDHc4MK{qf~=w6;QpVp z{!kZ^zRxXYy;PXbKRyW2;EbOAD_@JAaBaqZE#QlTICYlET4p=H%_cTZ!|qtk88ceE z+w$MeZXgm9=ADjOd)|%F1tOn!_RRCgzg*9aS5}M4v8X_w$~HW{0w| zgq-0YwqhLt!}XZt>x%F3F(AQB=8T+Wi`DkK_ej?p_0|k zK20z@AmPQSoISe>Jojp>)Dc`u7U5?^%6poke?$6zMRw(P!B?k2rgh+fu-**XKNnAv zb(j>y5{aabZBkry4kieCG?7e^q-&qZCpPA7VxHPsfRiCH)!*BeKCVI!zu345Hja%D zPv&uHCq~<{rd!<8Z~^zT|MX&WLS++H`Sczjrz~}i6j41!dh9GQzm=8loL{v6*$X2@ zsmtrn2lKx*szf+Jz1%7USi^l9zND9Q*Xs`U+u{d^dF7+6v{c2^mdacdetF1_iR-v- zvEU|>^3jlt4$DAs226nN!T8mo`-k~k^^d-t6H zH}lqqC$Dq_0u&?yIRda8jk=2h6_3_+#tv=z#?^3*IK8^hE;`tl+7IS`kLb8$^Ze1! zZjOo?AtzgPI#t~?mS&mJAwKON}{IZ};_m*9^0KsbNln(LFNX>O-L)V{tJ z@_X5WT%yO)K2VZ!GOnAW`tLhU3r<7S@7HF!3MhhZO{?7Sb>NSdo8Mta*HL;$Z1TEV zSg_{2&5g?WQo4V5K3re>7XM@@{k?h^2a6Iea#b}g`W&O4V%g+p7;xgT^BKRQ?b$j368nG!y5mpR=mIi9%G z4VnqKP*ShT)$5*oRYXWJjt^ERJCkU-=W%xWUs1DX_6Lm^l6d!hxUVxoZhQa;bUodDyROc~||91oVAYs52?IyYRDgEyt`4Dy>R! zR=1dv+CnE-zk;>zIv!kHd1;?z(y=~d-8>Mh6=WZQ9S@3~KZp-79*Ijv7*nf_?VR6H-~5MGK$F}kw{ax}l#`M$RP7x3sXr2Co6{NF zvAU*$FLC5Oaao*`@RC4cZM9xD(593}{H_H#ed|RZU9N?LW8~@0qP1@jtAxSM_@8d{ zs3bNAm|%d-1MKAq26qm&?T>CYNZ|Za0%P0w?_G5wWYoYQ@>zM5 zFFIqV->`~>XQMubpj<-j-ihc!gp zN~JV5=}!htdTUCpXC_<#!4?$*So`8;aM6!g)8oxf>uHYc z5|s9nv5b4^C*$vMn7XQ=Y6$t`zi=2*hSi$Rp&))>?9L+#HXO7_uLZtTUEk`#ojwfQ zXludwbT^gYa2hiqjo9TZoow<#7}1J|zrf73p$B+i&56vJw&MY7vRPa*9Y@#wgDmZP z8yPdigc(PYcy)B-(qS%RN=^|gn^Wo%O=}m#>D+#D0PZ%lW*E9pyhGem<3*79#2cK& zSw5DA$eey+oXWzHHGQJB_*Q@&b$iqV7iE)ToP{ddI^-rFC>`JnQU*1QXonnuN|Qxi z7l_ayaR>~XDKQKJ=aP32L|cGaO@4lw&ph!~)&_pcI;;S0D^3fx5KC;BRET>7DvUob zL6ZrjJjOlLgpSj7)vrbezOqZ><0Hz{*1Xd6JZ{*|bLJwiiE~sIx-;fY&88p{xpCab z1Vj87@^|T>D{8iu+x7A3QW%M%;fCP*H9D4m{-Q!1D{Ep9S~)fv7IudmHr)WWv10EgD4si^8_DQYE5#h-R@gKIO2ot*yW2n z!)A*gJxPwO?km1!X04=tp1VB)!%yuRTxhZ;72kX2gZ_;O^p+gK$X%!b7(}&4!IF9& zWYhDp=M1`**#u|-X*G)B*MdzwFUx>#BS$+3!V zZwn5Y2x8=^h4c(c?&MI*t`)EX*HTC4ZL;=!XoR<`;@;TS_$T75fq+;(Hu*}^MI9IY z3xXg*&%Xv1iMQ*E`qhH~Qm=CE3iscD>afX$)EH#BUR^)+$F3sI4*T}@kq9r>lkZai zs!Trx;hiH*&nlcDlmH8G+r;c;09+U#{g}lw3ozFNL&9u~MKZW<$4T~qk3i#$Onhoh z@t7Nm-pEWb>^9*C1e~q~l{NrX3Q9$P!q^^c_M|aqwt052{lg9#p(~{IE3g`(HW>(s zm1DWRKgZ5W9a%wGdc-yMuG0-hp!sxx-K6PC%B*cMbc=rY`Z3*Nz7H6d#%!-Sa52)E zK7vAkX$RE2tF;Q3NST>6zE{^M2AYv;z7F6ny*`M)z2C2hL3|xFAwSJ(yUQ~>AXS_^ zdO0bV=6aFMHwM!=*xEDeoquOmtOx$gYOk8@`xq}d1nVe%}&I>w$9A{*8U`_Eh zzrC~18V_J0d!+*!M*I&#BnCKZg}`@TbZ0ZlQ(S^E0^9*AZtiJgoSo{3P(h846wpVF zK4n5M*DJBs2A|1WskvPUgxzf78$^`7^l|1BEvJ_6c>r7w<~86tOh80z{PAE$mj?=G z>*hTjG}#cp*{X=8ptlekC`U`UArl-k(Iz=6%@3G zbB&e3b#=YDXd*Th(IEVv7hoT8(dTL&it&3~ChJVvq0uedv3;U^N=5K0 z7>UW<)$fzh$cx?MZ!59}mZ319;@*WK!q=+1=HF)JVJR;!343as`w~w{bCkl&6&YQ3 zZqSS3To;$u(tWNM7g=Z5v9^Gb&pe=W!F+jy9Y5;<*IG!!JUaoJ9VCx_%HbiUSJ1*z z3IuQ^^3?IIHj4BcZ)eHBm!+=TZ4BvT>8*G-xx{E9NA6~mg3%vjJ+)pcX*yEi+Z+7% zja^PL&XH>P`r+~}J;{X=W#!HsA1*<6?3ULNeGC6>Kmy*k_Nc?ET(J~wz>P{x(PNuU)?5y3smdM#_cmO(l4FosIk-|;^xQun|-IyoRRwg&TA3xjh+`WUR zf6k?TM#R-VP6na$oFD$lCo}U`YGKB`$jrzf3LvR!!yO(l}vW@M1PZRap=+$fV zAqAjV9>6oW@s^u6Bx6kWqU(Pd-OOr`NoH8jm9{+YSzc-YVeSRFsb*Ezai z2fpP&I6o;Y$(u=KLHDyl!ZOr3=JiPT^k0)WerPsV9PB_gV=*H=IW?9+;qigCtGOWZ z!5fS3Q_#+l0h)o`@^ogF5Dc@111;=%lNAF(Z@$io@fopf#=7k|S(TzJ^F(WFl;C+MQ_Z?uj{CAgU8^p-Ug3WA;?JeL>qCQmD@(;Si|9lUTi18g zV0}*6(;WQk+NOumvO*v5+_gl{c!Y)+Hy*P8QmfTEm^yq{lmp{*COV<4%T{sSOIVPL zy>{*)m-ema4ws!VmEcm#F7w8na9mbV&d!$&Io^$75RP*XMHhH2kpI3bZ(9%HZVKO* zBA96sb5GlYz0q3wwBurKOU$&eP`{cThm~mI{7@@<=fT3}BO^||4=VP0_s$=7TPfQJ zZWjEJ`PRZGNGrLL%!XCufe`-CKhQcF6RSLRuMMe4QTVf9I<_Q?^NgG(ot8G5lzWAV zoh?S6d?0MhoHJPU`)!%U#r2idFcT_W8$Vy3r9ra0MnXS-$kJb|k9G}4j+2Th$kS~7 z!3)AepDg5g)vDCSiXS%nkM=1MjQ<&b&uzw|EW^C^+Z^Qas`_Wd40daxb!-U>2B);M ztmg0k%J#%sZ0||a+ZGLVOuS%q{j`E5I{K*7Yiqm?-_fVuP5cH8BTav1BB$cY z662h<+{~Bbi`)pPeIKyMzZm@O75=Z#A0+Nx;b|~0YUN@QFR`&7$U2gPUtGu~e0!C} zdkK`CNkdH9+Zo~a-{Tb+pX8AVWIJFCdzjNrK8BjP=99R1gd=B219x-SN;v4?#leR> zMC)Vuc)@+|Z@Vou1kcmDXI%^viZD*m<~*Z~L}YQW5EI+2Thbd)5qQ7fS5p-w+EkLp zKbs!qQLl33ApUMkEiY4)eO`98TtTL3r$t*`LzI``H=O1=;*JxjN`elC@r4vi0a8-^f%Hmz3?LMBIZ!n7_;iuJXUpoMbp*Mzt5%~`I<*a zj4`05R3yKi9QLHf8T*v)Ik&3E zXY|mNN6*Vje|D2me5r@(Frj~YK$d;XO|qvs4QwY@7l6xlH(|o=-his*e{4kbe^)k2 z#6_FRIW(fjq9*(biuEI3uQ5Z#zYz(oUWh^&Z~K{>u#Gbkvkq2$mS_KQ|KZ1nXS~wS zW4kSsnA~yq4@Wz?79wvDBXbk1tvM)Y0}$VgO$@teW6 zIoRak4-jAg;C7K990}d;G^Qx~3BE!T3Q*Z|+P^(@E2lIbR@W;eJA7A!F-s8Uo9Oc# zCwmwZcrUO1q)c%=V}_Lwgw3Zx*e0hBkiJB6-c1;Qs=%Nz>+)*ka8ipkJDN7t*qLl9E+2&uw*-5BJ4G4~g5h`k zd9K|Ozad5u*Tzy-%e#(W&rx{3OR`}R+;~yaZU`*B#P9Lrk1xe*En`SCsT|>mT+Ty*bnf28b}KUodD=87wXR@Q7kOIvU!zw zaG*p0z23f1S{e4^Ts>N`E-D9V31IBC!)ojScC7nv@|b4H*^;K-=c; z8p5~IvRn$kkQyj@;~OXjuvP?Ii7H;sF?yrtF~axwntgtV5I2Yz2ZDS!}Qa zpP*vfg%jOw^HR9(5~Ir{!~_1!{i2D{HPX_DZns6#`gKNI5UIJp3wUW+6AmdgMqO|k zESi5G6hA#X9Os*F3m`ppHtoKeV>~D} zX7sj^zmS%mi$FQRmt?Is#cxjPu!12C5+mQe=1@L!%O*@He$HR7!DR?8=bQ7H`%yAj z9G5`0rGRsnE)y2?4$yZ3JV}C@)cAle|E9h)0v)-Z=qG%?!edAZV8*jiH_!7xotLo7 z(Ycb6QWWQI3rQ%Nt*tzLEvPAo+zYtOTCs;B*FJk1Qr#ei!+l}e!xEG(bj?Zua_p&K z>rAgypw{!Ty*#SnOImp5evVwKG z<~ZEC1HCzbsO)AtPNQ#RB@j4hn-EwU;B_bks9fz>k(>ZDD3G{_)1)u0IV(Pxu@`oH z7CN~jRXe3){?CUnS;dy_0i+LZ(doZT3h$hU-svOc9bIB?RV*J(UPJHR($uttHrTCf zFoY$IDn{v~hsJT}7TRu*(!T)F60l=l4P?F>U^H5BAgP^w1$kL^f%8tvKU|V^Krx7F z(4Zwm-x|To@5S|VP_y7(DM@q$$(f&b`wa3nr`FE<`$9dM{5#~Ff@210=&kg z#lsoBG7b^;-DNOq_)EiJ=xuXI2M#ov>*uN2I zksqD}4}QUtE#p+;ffNf8SKdtLD$>$6qhk(B3sbsEBl$zj56E)w#SAtL)`W z;O*U&Snxs;;^O5VlGgjFZF2BY7!H;29YPj;m8&l1yW}^KuO}?*JSif?=F2-P9enQv z<9JE-m8HA~f||QW1=u6}0CNLF$K3@l|R;$m9+gMQ(hC8c`2#N;x_^A^7hl zr!&ptu^AfaAK_ifxj~9_XN*_dbaXXmUMw7Gaf`hqHXB#edpljpo6!WJ0mp2bIjqzq zn>T!4IktA*+i_SHrMwr~ac8{Pt=yUO!5ru4%b zIW~NiK3{BN;h)F3C+Cb`Bb&OGQRFQt3Rwql(jf(?87aixt@r?gy44AsY|DmUSKsTV zo>H6QZXX({`iRXg^c#8AzVBFIa8*>)8rxzjU?d<4nwCDz#rPFFg}j&lVjFj+$KQfMPR2sC3j_f2y+Xr zC}ej(sgwVmfn2q~ZwaFa&1R$CC{QVAVm=LebZU zDxiqY5~|`tv~o*6?UcEE{N3x{0pLIp{g$7%MSFV7&v#eeb7`A1jSYW<7A ztJ<9xWo7^?%99C>lre8X>V5mzIhc1|+N5jJ(b;OR_0(m1-4E({M)WWd9ufE3;S5WA zi6HK)@d6EnkMq`v7&qrUk0aWg@BH`YJTuSdQF$=x3$|vo$^CA`$wFB2k3N;EZC)lg zXV2)hZ~>PW3y+##uxy$&Z!8USX8bE_Szp^1R;sQts8rO0N@K@lM9}RPkk{<-oBl_{ z?U6PAPnD=K%8`FxXNrCTnT;m@H4erWeBI-n5W2!|%2&X}FI-ym`X`RW2z$gDMT=ez zM$y^5paQ#H(4AXKSH z+H>lYg^oUL#OL>gVp2@l{6H;oDITdilp%^8`v;>PgX5gnvn1gJcetj76F5JQUWBV| z(cl>HOG9Vm+Mlj=RPB6p18vUN-+v{De)yz4=@CM^=O|T4+I?;OFq$@zOn}}ZbNjSX zwfpBDqgfOai|>L~UIWS4k$5BnFOuK~=SfXTzQ>#`Y1f*Rno|$8w2CwKICbe6j*IwZ zQEnP19=Wh(sflOS;K=KAowiuoT%Cu|5YKbAx{0TJjWTAY6o2lL80TK-C>gMK!Ow@+(hC@49RYd=7t@Hls=^!6 zK$?6WNr62qwY)tq1EVizDfQM&E__oLnP&;+swo{6 zQ+&gXRZ(?9B_Xu}$vI5WwDb@cp)e-1+{PjQSO@V<_K$V&GWA|mwQ?Fva; z_qriq60aCsKUs^Fw!+e8QaB=GzOar>mYLL%y1f)yiklFqQ+6Un4oDe{M0_%?a%FhB z<%Egf%IWR>Q7{JviSP|tIGv!gB7cN`cXT*pLY`@^ zFN$jEK~86Q`&@U|N#RPKA0n6QkNY`b?_TMo%8YEJ*!@?89lAdXBDYB<|Nc@GAQP0z zS5JXzDqwWM0o39M)MI%$joR_~djDkf`5LA^a816v&5g!ju_;En^_*H-u`y(;dK?bw zUaS}Fudm+$7+T9aA+D{*K+*vsnhIp%TQrm6OD37wa(Fz_sR=L6hCYB`47i zSIIkR0VszIaV~x>pqbb7%m-EwBKl>4r7dI)vD6x+J0KQRamDT8REHE^-n{_Dq5u@w z5z!#?!PN1Saqe9~+oQiHOz|3J zI)AYu;D3D;0A2=Xe=mgh$D}!zQMpRpQ;3n3EMvxoC6jgx>c1%%PpCupSWE)t79P#Zxz4|Lb8-BxjN_BejCzqf^X)cy?cej_y z%Wkhj_tbM0?bmcrNE($T1fvt&<6=r{Z(0yqX_`pgyV;0E&jqhe>hBPY&gJIr?u0iM znp~OL15szsaI}9akQ)loe4PsF9e#*9Q8aBBT{TMd*^dVt|5(eo7%Sn;E@s!dZur&( z*9K95+qWACR^3YTy^U?f@A1DvVq`Qb5t3ARDE7!Tf=uK$>YquKBwWrPC z&yN9wl#Q*!`X!USWE@*R=V=c_f)X^4}?LBvfE`e>M`0S)?5BN%`4Dm7&nB2$L?A#7*klP zUMAOd_{omX_-dc!*>gX#^Jlax4~SVBk9#e+0lCoQBs@4xVfDISQ=?dn5BVdW+LY5p@RUyY^PO%zd8I;|4Fs=U1Q;6X8$T(R)m2YuY)vbY^Ni=)%-ku8qW-ZFB$ zyb?tC<1x$+fCCIvi(x*88VPPGBzK&lW@V)seRB8pOcZ1z?)XvE4(y}-5mnaB27?k`-n%*TRF@Hf|(Q% zHZKZAn^@>IM)Wsh*dg4|8zdDjy7K{o0NluRY(dt$=4=JugVUD^ceEzHDr!`pphbbr zLAGmVl8D|g*D3B{+i#vD65a5{VLB)J)xErs*f2784%~S)h}?k2k*r2JBWy@?1|>?r zg3M|hDZ$U?nPy*@SoWcX6i;UdN$0+GA8*u z;CZBzrTED+quq6W;`9^>4+vR~Up7>SkdGi3PFC(6Z;`+-BJ)|s@73MFCWCo0fTG%AaE(v_bxF>UxN z?1#bw5&lBz@n^m+jB+Z0F{!yp=}1p`*271g+MF3l$Ts1gUugu91^4=c3)-nazGu?s zU`Z&jz$YnyeO9}IbhFE?LUU%I^S%@^QNP)N=@Rq^~Ne3){T zl(iWNmry#&do;!?Jwr9~C{Qc$NTXmevZ<$Q-gISXw3&_-jXYVP-dl~nV=iR8S3;0~ z>}zv2cE+P~odDvK8(qx(d23R|9tQo_r;t}h!^5%!G`$n2_fx)3d9?qPjxx5O^ zNki=WizWg|tLVg>Yux^+EoS$$&7*tA$7&&olpAJ?B$H6(;;P8h^L6%*I=-`%b)&M= zs(XKNl;ZI(;X5?T+rchgjCbAzjCLvEw5Y~^jgRU2diGpf8`&8bCokClptHKnstj4t zo?5UttuKYs1pFnq%d{Vr41igI_5&GIM}L=X&&-K*ZsVQTCyH*^>#)kg#@ms6BS0Hi z_Q7mEjiMqAo_vb0%jn1S19C5#QuW6GBrO%J+J2GdoIWB^TM8GkEEvBcz#W!ZROpE6 zJz~;^Jnq|vzp{zkT;AJk$5|Msz)Mv5pBJD+E(~US0dc9`BACr#VLfY-<9dva5Deqc z7*n|yOVJzr(IswJH*{T%F?rYKbK*`$6v=nF%LR7J{k*?Pdf}U^)Xcxa;$27)r2DSV z<-WYB6w>Lf4_00Pv=vmp&l0E!3-m-kphK2NjI+dQQ&^4XQ3 zh6-%-@QC0e$t@ZEs~keLQHmAqyN z2C|>es=mUPeIKNLEV8t>mz{k6#?m~16q2wNKS(fAvghw_PPFlK^7sMpk9=G-r(+LUa z{hK!LPHm`dWwyz}X$aqa&$foF(4gl@ZGEZ8Ma{i5ezHpfEgpFh1|u5>4`5z!GX67D zIGCioYyxzL+y+UgZgi=|I9xgdb@1D{e7+EZ$+u3{S0J!2dGWx)DFST+FwTJdOffvS zDKRqqRYQLa@A>mRWuIdydio({CluG;&nHA4S>jM#x&;t8C|g?YF^q4Nq}QL91f_d&}}ysGrAS?EtDx`(beSUjpZ@ z1p4CT@;pn9F^D7m63Pb~a$wSya^8|81-KAtV^nG-P~H%P!y7r0B59S)g{d+s9`9U` zS8D)6s_pn)WSF&n%AeLQ7J2ySYiU;S!%bOEF~Tsku<{b-LQmT2fiddGF`Y=9)$9up z(1PIsOXM0krx?2gZv?V^TC`O3^*PN@`dqjnnOVn>k5IbImLSljZ1K=tU^E(6~l0SiN)W5UdMD@|hTlcL=NT#$uH`lLUz& zdpe1ti+`xyVTt&tuEVeG?rI`7OJs2&=f!$*TRtekdn zBA2FIc{vpflY9>5-I>>mKOu<9VL8g-39hR_D&gf)rCXrd2x}lcvU<&rK9C$9#+-dX zzrNg9tvTC7Y0NiZ9w?rlsLf-q$u2JkmG-+5gF2J~uLWAKu*UP3gMMe{sesuL2iS8y za|heSgwVF{L@Nd8`FW4PpGO=iAx?zIw!(_GfS*>gcz+!i#92}7IOyN@i$wDLHJ2;P z^S3f#@=bA8h{ZNyXpo3R+Dm{J&9a(&J%4VSdiD3sJ;-tcY53r^8=VP%|8>Q~+8f(o z45!jU{2qhW4Q65C?3%-HQBI}z^pw^{T>fT{7)`K#|JzmC$jwFjKP^U%X!tHy+CKQ` zm6$#ntGSCqZ(6`V2vcX#aGrA)>fAPUsWN&w)mQx_3t**vgigEKK_dgg>!mTO?OMA? zCcg65jdi<^->Av_NTkY><)(Ie1aK87x|h3F?rg^J=dQ;fvm3i+%=#i^y4*}@I%{p< zDPMHVp9G*4R#s_=Z2hR9?g&i;(sUF%ptC-|K`M{!=G;HCz9CCgJh@q}>bsWa2->Fd z{&S!?`UR8X;_9hvmnSSn$174$2e+O>r&t1S?VT@ZczFrh|EGn6nHUTIsbI(5FH4sy zbuwO`=*|M$NBy8hS9hz23<}on_57&#+u-hgHr^&}7UrK8}c;BxV&XyCsR8_vKny-Frs0kY1P!?$`g~R8s*A3 zm)A&bjm3oUfA5jaRj?8KR^!Jb{Q#FVgsA(Bkmq;g`C#_S#@{FrPK8^%&&K3R z_-_^bmt-HOV(2gR;7|1!uY3ruZyh&FMt*YC300^{X=GxJfLFvb@*k!MB-`sPi*X7? z2(n+~VLqP>)zyEu^mAVzE8(&u8(zGnIpi2i!-5<5uELPi9*IQpE~Xc51`3&&D+fp3 zR006Ow{Vm0bHWZ&Yht-9ozZE}NJI^hJ$LeY)_?s}q-XVwHCH<}@5uP&{OV{|%-*jXQE)=@;DM!8|jBTE$w2;JGqFMW~{}M9myF zMr!YnK<84#JvtQ8VCDQI3OHEF^Y7Owh~lSwsHub&GtI?Z+_E-^{=WD^4D5eD9rcyf za*%j=sa5tyiiaZ&)Lp3dkf6HC47kpy7K2z9N@rVg?prDz}W3`ktaA7 z+_QREX{~WLRd+M`)3d`W%a=5{=!AjZvSena|CqyuM9lBJ4WQm!={?xiky@CBPEC8L zHNK23$g`l22+x!F9o3pF`ZYcp9k}07b-+ZQ6^vUIz0OLPs5o|DrP-6u$3ygDW$Y_S ztg_+P))0{g5xp6@HJxe+QKT-9N@?M-ug$@n7WdtZtwaFb62_OB-|Z@i2lT-v{wIyI8kI)x>r#dLmXm z4%!G7>pMgbyAPLklBR9qVxIJ!g==d+8R!TdQY{;(Xczx-rE<0Ake%{EhkgCFp6Q0V z?N`X6=H7z9&6UBVmEVpC+_Vu-=$-WH#BtV`oH!kBPWir@YjAE8T?{Y23Q@!BiUyXv zSXgej%h6L3biJq42m@Jm!5s0Ia7*72dcC3Z+7INvZ69*aeN_ube!`VifjvepM=Gp` zQ2A2#my6G{H+BvV5E(K05%@s4e@;%WDYpKvzPhqwWp_xdQ{r& zPp)^hNQG75`QhAt+Mpb&k_;oS&Pion!L{B(zK=-=MhXxZRVWjz7gEzEMV(Fildmg1 zIm&t_;kQcb>SPkW>0zwz>92Gyv=q9Srjx&&0!zQRd=ats+qBge%ouf-41&hj4?vkG ze(6*T<*t;u7sb1hCI1Dd<;9`|45LH@O6wACdY~ zw!~r|h!eu!lpOKNns51V(zL$LTFGf!K6nAfSRgM>sG_(Fw@O+@hm0AD zP8%3J81kqa8L-+*99+GKW%9;bU%goAOmFoLbh-bAp5M}6hwYr7MUR#txFDVDCrfzoeV7tndt@ZRc%Y`qUH*--%CLnY%A`9lQ(5BFN9hQ?#Uzqu zVFFSewpd@|WfS>V%AU<0akBh7;f`Im)0Phg>&rD1e>Nwj3aVNBzgh)#7LY zxo++5BED2y8&O*{2>a)W$t(?SAca3e__&u0NJs;Imn^6(nOv4vD5s_G&`Iey*jm%l zEmMAo_f+^9c~hKqv5;khJe`O%D0q)-*cKIjU>5c5I&#c!pZPhJVx(EXNxp5z^S?Hf z%AT@4HHZW|XDYD7Ppc@QfW^3t@LJ0^3IDwHZmigiz<8Lj;R?u4wf%E*Z!I88m?l+_ zTd$sLrf^xj4H7kf-M=TiMkq3_QPG2=PjzYG%%_?-8v|$N5lDxRUlMrx8``7I29J2D z@ZDpq4MN|5pc#o z$!lnAg9E-2=E~2kJ2{QgdSP>zFV86y6|0fkFd%E*yl9g~M{WS>VEQJq%+jWSpDYwM zOPe!pHpK@G`dP39$7$S_awda6dA0acEDZ$+0#63v`PiE2y7zfl&vdJq+}RG>P4TpB zfOi0#<9YEWAHn~l>8yjI{@ylBEZw0rC?QIBhe#^0fQ3kxfHX^YNv9~ew2EJm?(UAI zLmFh4?ppFa{$}2PbY#>aJ}l=s&wXE4AX;oo40w&-WY+=LV+vr~HIN1lgO5~b5S+Nn z2j&_3{2{96EM22C)^W?dK`BlrpA_v<)CaC-+VUli#&p6~DRTyja8W&zrSPYchAgr{ zR2H9ED5oI^EoSMkS3MAN&NVo4ekG}0PTqSSG64S9sS&```*Wl*y7OopkT%9SHNyZ& zH)92DLnYDTy@CnMPRHsr2bapG8L$Gc0WaW!8n)?`Xjyc@bTs0S@TYJzZVF{65nJ2x zDOvdws|%3;wR{g_+wO)5o7?n%C3&dgkGgs4f!nrNZsNYBfI?;0^rf6E;99G}9CB>- zqswme!vPXfz#{u=Z%@!ax0q791VkaKaS1BNR#b zPw5F8bTXP(m^kHNj&Z;rcWF^7)=^%vgKcf5sHDpebEf6y zFSYfb>LHw`jzpjJmwXd?gebE292naY_4U4vcWrNEv5lLOJn+k zGqO&&^Wur75SyI)H4boRyY}D1XO5yb*|IJ-5 zmZY88!-AJj1OoebS{gzSyL20mOort(#MHWW9dpE| zy_I4|c4eJ0s5o=y;4hWoNKu8XOy)DXV)b5TmHp%0-1z~kwfQ+o>SEHYjWY{fnZpZ~ zgN^+7mbx&&n;2B{H?Jad~U`yD5H>#SmFI&t8UZP1G!Z3I@04u(Q0Qn zN!zr^88OGttKLae-A5FsMF?Ld-#9E^ADKpZ8He)@^q8(jd?aRi7aF#R{#n@Hy=oIu zW;O20I9G*%GBPMuYEN2+`fW^n$KL-7#lMUO_!P&LadBw0AMMPHjC^9KZR3T zePe~KKvgYf;iXpBkG2Z^pkqx!ffS$Z5wt|Pt3LNX2P}~a^x0k3_ulyDDlZcf+sbsd zi5zLHYNe$fO!Uw+t-1&Z)$n&5ZG{>P^09>RDxyqoA|z=I^`fJ`F#c8MD34`cVF(q- zWO>%uw6bMFHdmZ!I(Pbfh5~<2Wu!>jm5-XuP6_don!5X2zSav&i9A{LYX|C4VA%qP zO{bcgqTM57pP_@y-SZb>*Bx&DPUX8;bH!S%#emdp%}8EEreyk>zP#gej@x-~roFfX zm`w7Um>3+q5r7&LFZx&bamoP*i359P;D!arQN|0MSa8d}kF+YlcgF(NyjLZ4hUa|q zg~e{i!6k(>*9HsAh0dQA^{|VQn6T#Iw4FbaltDVcduaCMeE{|xljZ-wmZ@=)%p)}NDbfE)KK^!IlFsi* z*7jKfl~^`PLqlyA+8A>^4v8$|A&g9nM_o=-*YmIE8McqON(BmNg@umNo6l ze|uq}P8#}+TnWa$ZkI)FUMD;?*P!%Jn{)RG4wCFpo8yZ(b5VsRFl!+m_iWm`0Twqg zOvTC+*{dN_^9z?I%dxX-Ay%TLfnpnVKVL$W_P<-H1m``Aak{vLhNDLjbybeCS$n$i zMK{}Jh3*n(vFQ;Z`JCo=8<8`z-dOIjjPX`s@m;SJRn5l}65qWNr;ffNX^%0QOx1oL zN5Em3s{K0ZuFM=>l(tnX208TFN?IA_=L*!J@i!${zcxh_G@}J zZ94k6s1YY>T)G4n+TdUlY|h8pQO|Uo@CmU(MnaPADTVt%pJE(^1YgKkhKukrv*tO+qDAa_Kogm-LFV%AYGCC9UhghkeE^mkw3!gdT%GR|*iRwv9^Iuz z4ezt*%gzQ8pd;rs<)W9poTYvwe=}EmOMDdLP1__gA~n}K+01<>J2R{8(q&${e+$`Z z@L0Wr<_Gj#dzdZJEvE0;rBZ2-9lEGQq)@G5S4NDX*rmgvK#OKqqeap~n z4+-CTzG%m^g&?_>ebWd4NPwlD+N~qmtoNsAYCW2mKE2pvFHX1Y z`89`3He(cL)A#f$h8J**FZ5qfQ!Yk!f&>8g9B^Q_t{p6(~l`EW#D*XxHaf;H^>c~4H z=E?PR6YJ1t0JVhg_RXn4#J&M(Qx_KG;19ZM>e@0C5S1rj6UrY+rHHfn^!(lH&)pRX ztukGe<6lOn2|b4!;LXNT)hEMUn~85~g^ZM{jOnNGr15B2WqTRg7WveO#Z5#39H+s_ z@5;zvshLH*dcTKZ?%ZT75Ho_5Ah4uB*mq&q^kgbWOp^L)D;g&-dxlKYB5T}AYbRd! z$HeOCr~JdI%QR2(Ay)$fNgUm`(2mV}NryXMaCz*0cW*>xZ6r~Jf1V-#qVg$6pg%&y zoW1>odUlUUHh=^`Ulz%Jm*adEXoH4RcKswJ;pV5d#$C`XjgMs(V| zN_5$I^38A|w(@u`(dEd7oi`)?qR}7g8G|~xJM2i2 zk9EHE13PoGnXe8Y{z2M2k9x*I8jl@7d-;HJIRV6g%h_21!FyUc=aUFQ@p?`JqK*9H=kpEe=Ma8Zxm zWf|Zk*@LZpv1C*eSwB}zp7%1r37zYG(GVMGUZpF=kq}h4 zQ*Y;6j2H${Dt)oN_MJ`ck-}O`uX)E?r!@nT;dS&9)-dQSx7{oe4iTgd*i70M2XBC( zg%`HX+a_rb))tRb^wW`8aB-*bI;rG^KLRN^;1unxkz-IcK#(J>w9nzbZ`7fnJx`yi z{@}LMo}_oZ3i3C3n(g6!p@+{%qpS(vehp4PC~!nKvUP*9F?Anbcpx~gos#pUOrKU+ zq-B(R@{*&AtxD1{7ROX%!2hE4+T_xL_`l3SSs;)BR4P~IV%Lm#rW)p?0+!CoI+Orx zkz+9JTpK0ZM=SghSGB6fG8J5ljr@z}ql$9SwUQty zRvckj18&MevqTGiH{$6YWe3i8&tKG_JExp?wyfQ~zz@6V88J?4zE(8rtCTv)biYV~ zbVOPiF(q7mz;}^n)|{^z@^{OgWSC}1pL_MsKi6HOTS=W{o*~vrRbf^;O!|DKF4L#X zY}1=c!bJ&Y8-j54G5I^{s?fDKEXnU$FEF`CP}#Muw%Q?jry<7 zJcrA<_hY51gRa})Ivm6hZRf5#pAfxs*b@3TBmE;rgH;jJs6*Tb`Dk7K^c6|v^1|@d z*%DDhhytLi*{}lv>C{)E1Ql>2UsG(*P7=HY<`m66p_Wh&Bm0*;Fp3WF0CPwL+<6PD zRs>vx2@GvshA?1#Npb@qko;Nw2W+!8MB~?OIq>B=H<<=ek(N_;Du+bNTT(q_^2l`s zo>C>yhzjl^>mqzu41xuQ?nJHmz=_)$dfsw`3xWVG^2mxWZ&)z`@*&YTLIB58@rs$MLX-W?Qtf{x#| z8VL3iG!B$-D&9=DA675jZF>*i6)06Lx^bTTe-_}*(}TwU!j7!Dr2aoNt&l1~;w ze#wVuLffQ(hxB4vl&qmj)csx5dWLj?So*z344slF2n@YaC^G-t@BDZ z2a@4F9&v1#6qw#To*svX9G{ui#e8%mOTTkBDaKvjI(7^~w$MDTxrN{11ErUXFk?-l z*c{SzsTEgJ?=J-5)2?W)lrk)~abiI;GgsTTlyo`dlb-j703N=%na(8EL1~XpfsO6xS?T(+>?{5H+_3Z{5gkX&QGU<|eupRCJF`MmC?j@mcif|@NK}@Nh%Fw4vpx~S zKh(L6AUIci=1Tr~jks4sEboCdVF&KL)mhOb=gowTrv=O>$b9bEr;c)sgkWTeT0=l1YCzfi?WYYG;$=Oe?(VwnpfNuOj#>A{4irm|r>Sxf-__1v{8eUG z*xn+>i+aJi;W&=77w3*Yjb;^R#iZ+oT-1R!1i6}XX;nx?6Pxe+^{hZV>3w8fDRBJI zFahR!-2mLgTTP2%ocU$1Q$)^Z`o?jzdOgDR5)iV)){I zj%^;ecvGZTs7vN$n$Kyr!o3mdqwqJ~2XLtoevA92>ULcHl~SP+vupC|Ml)q%885^$$kqP4Qbt3wuRGKt z$_eqe7ftZX$m24z?m*!3gK2rOJlhkO{y%%9); zLHfL-^U`9+Kqpe&CoIQuU%PULDNGZluAQ(N|Mw|V46}n%={B)yxWj|io&ELTAKz_9 z%k7xnCl|G?uiGB>N1a;hH8JbHb!c6`$1u|9EBpSf-P3_zB-Tb%n3{!CYhzJvwWYpA zAE%b*$0jAJOz4bK1!;U9AzIG}UX@y&c=FI0#P_|KOr0tGY~|~P)BWbPiJcyu%GWO@ zN;(u__o;Ip%9FXtx(Gg&Cc+jH8sQfu@q77lR9X^86f$p4@Vh6Ui|hV6MPe_J*n=)D zviut9N_rnpiJ8FG8g9L9cS5xSX1A`FoZ9MV!m<)MI%21d$1_p8olW~##Z);S6}yC6 z4(CoAr2MK3o{}@AOj@JILBmkBv5$4$50>QdKLuI*3eRgNkNap2`PJJ>X!Pq=%^xNI*JV;&2KMwSr7KFuz*K8Yt6ek^of5iQT1mYSjy_(rxL9h7KD zz0T(|Qg`KB>KXXWm;7v6WcB2WWNo82c5(6IV1VQE+_sTAo8@)8o`l30GhrT@usU=) zM*Sb4IY3PknEr@3UyQ^hM#N$(9H((?rs|}(`K=2_2@6yS++%ZD)1h!Q$&l%vX7U!t z^S=m*3AmIlt?~NY0}a|BJ;4a|quDTIBH!2q;Vo{V;1e~n0R;=SVr4upxI!vmIT3-! z+8fjC+1EH1Y~@!ptW&9EQ3eIyi1DNu;%ufHwzZjcLn|XFmBR0r-f+uBFY?Q=NwJfe zV%p%J#bTzR6q9aN45N;85=RqsRAH**F6EC{>G)4De)IM8=}`OTGq>M*+--FNBPfJ))K-6Dui8-f z)BqJ9G|tJTbmfjW$J0Hwi4C3!Us*v$Vk}vAs(g7MZZ8q#@*`))B3(hgpTSyq0T#UjShQ!1Xyu-G{Ui`6Kfk7Hj%pZIL?amW24ds9G+>!{c;Uv`C zC&d}T``hInk8Z0ZrW4i%*0%yvs59k9%4g&oEBItR!}zD}DsME%`}450DL3O+@nyYx za7Oi%MYwZ=9w2d`G5zI|?p#x%&r?kUW!9-w%5ux`#hGchX7 z47hQ<3|>E3HB(QlH6?hN;r`HTnw~v|F}!wgF(Nn4=lhaO*d1&lF}sbpc@BH^s2Q?$ zlwN&-?zHNi=BP|whUdyFII^9VQ7zv;+_B3M)~3@T7QY_F{ys4l>)v z5dn()1TN!OXdiN!JDU7IlcffJVst1j!0iPU@+fO?vH#JeSgtS^_&LY5tt3h4P!pC} z#i=Np6DdPZt^=9>J|o7&9I4W|TjBq@!hSl7w%ot)7*(^|th8VG&`*Xy^S)VtX$F^7 zyh+@}b5Lj39&ABmMMY{Vhp%#KQ5Z3_QgnsMj_qFvh_rPK!hQDy10*E=1t~$hqoHW{ zXldQZL7qwioV~Iv`PyoI4ZF(+!1*3jn!l!=y>#R8G3D(k2mN%A1tS>-BTj?vb8M~` zTM8Lh{Y7@Ldd_gLm4j!PO>g>lX-Aumg8&g^gbvQ#UH6BtMh>_+^-+*cj@Lj;QB5DA zpS^xHaej5mj1y%h?v`GtaU7>oss4`7L*EYol#0OgGh|r+?$KSSsI4l1)e#FtJ!GVs z1OE*u!O?pzSnH>;Ndk@jLSa(`+o0ZU+W{IP-YUcykveSm&E{*XQe|x!#EKUp{iL(o zZmq;kx~{uY1zy~1DUPyCnF5HaQ8t3OXeg}t5tZMBhFFIc)Ho(>JjIC<3_eq>aD}?c zL7PHN(5_!YI`R1EccV*iP(T81j5%zHS09R^glC*nezkX)wQ|5kazCvGX*L&jo*LYB zyA*_>{T8TnH+$YnRS&U%Ae#_PMO;JwbkSmzRrQ|PMWb&d1V#85ocq^#6o9gOe0IX4 zSZDyqUH@$>280!ks<^Y;f2}i=xpU~DGCZe>W@1i%>CCM^GHLcM1pEQJt`A!xO9wFo zaDd$Fli_>^J!gNMvOEtN%6{2eS20G(NbGDFoODRRerV7mEk$=5KnnJ$Nd*Mkwq zCPEH|IW(CJd^e7AU}^_L->d*wS5Y7wu#kj2oFG$}nNdHO!MA++uSLi4i_|0kmNZixpna9zve53lV-GB<`yy*+b6Cls-3~!TX*$?{1te2sokRv$ zL|V6;FLseW1BT7jjyUB?^#tgTf1|eVjo@j@Ki9nE#df|`@s5Hrm&#wRCa}^f3 z+ikrr$<|@HboM=;6?Ae$XI5)~&k!gi&Vz*r=z)9rl+=JKn zE*on&pjK6W+Tr>%I;8e$h+`f-Kr(-aw7kB#Z3eIqf^i&^JIz*uc6W|s!|sYZskugT z;P*MM4wP*AKr$2nE;abpW(Yz(sB-{$4>D*O{%_3!3MYRa*GSzRb&Zp4ili(c?f%sAcLt?xDE=Sx+%-kdhrE;P#ulR_-tJVE{D`t)*G5`~XN z5cwbvpEVMmuZ=-Lj2qK8`WN0dyXQ`8<&j}hv#^`xUNa}QcX~UuxP<-%{mS0zfB>Pv z9-}L16g3BCd!erUX(RtY@{vqioYibbXPBm3c=r9 zJ^4zosE)Cte@y#pb_D#3n$m_Z`Nlq$JU_{`j41wzo1%3B8S$mbhU+2z*qevEh4*6F z<^@ZK{ps4a|@Z>2P4fT z>6<_2A4ccDqS)EPl-|aqmDyM_5xsaWF{{Tm(LwcJy_&_RF1B{*)FSWTXBOGxchC2K z94aZ9fO|123?VucwE~kG|)hx%PoY zdLz>61LsQRgbKEk;$cQD&BQrsQ}F8dy$6Jy$KNc=XiC!H;N%Jl;R;g;3(E7x?>blM z@F~=JkHhMJ)ShwBeVTbOVjwtlF7$vUsEJVNTT?h|@xYfw>+06+GQk33-dx-brd{%t z4U7<#5H2k(xcU>5hU+fZ@{(5#|jUV4un`#jg4SfcC9V~Qc zM;{**p#W22e5Axdzk6ll{2%xm!Kba95^~u*hFBZ^^!gT%ie!(X_1#Ft`pzCnW(vdLok(2my;~1Xrj*J z$xm!UOWA9a`LgrmfB)ip_}EI!k(!wss?@_erRgpRpVqLPu&cJsaZO1X7Pd89yIGXH zB5q8gyn>GI@43I7FWTES2^X;9ec9BcL(dqzH6rkOo0T>$1$R^DY1zd|1;uYwJvG`n z)OQ7`I5z|lsj@>3luq_2{H8k)LU%kXe+DtzEbzUA#>RZ3?}aNs-2Hf%os}& z_H=7>6;*Ac_cz>i$>?3m!NDENLsdWSIbsT(C)GV+<3RfF9@&JM5ZtOA!--wJ7e;2t zi6e;=UcG?)O!8IuFA#P7;$>-$NUZ54{Ikg5V~uCF{#e}~l=8VA(Mozdehc?x<>)K@b%u~D5+p}ExKc&vE_u|d_M_6?mv!E(JwTNd84o$8Qx6=!1g^+p}_ zrzNJFM>L~iYeM%2o8m-mm6p7EyrXQym8)L0pxe7Rwe?1WPyRl;xVm_@Z9*iSp-@^y z-zvBpSA8}z^Gc?H0n3+IV1pyEcr?n$9a-dZ#5=TBlez&c5=I?W;rx2&zc0;_z9z<@QsM9n}5AlD&*(Y>JZvvqCtX4HC9}79PBi0 z$TjL6zgAcI7`w(mWLQSig*eJi7(;=t8Xs1p8l2576e62QwHoy6aezi&TpOj>Fu~X> z_C|~Y?kB&Rcu1Ju(7k*0HAwJ3Ty`AK_MTZxW_kulZ9|R>_dV`z&1a~;o3$f#1SJkj zJvT_|X{ap9BAZG(+u#jRQ#_|krTg_mN_kyr3y6=2se(*T`I22x#}Hk|;a1~^#z|2! zmc5;JJRkAp{HE>0hnOdZ+lOsgBo`(g;)`>WvAPX3D}RHZzXL`dO`In`HRHP?1|eU1 zy4l+K8M7Sxom@ta5G>!ZJ?k&nge0N^RAw=B+w4RcZ@(iL$A?SP?6%E1m8sce%W(Tf z*CSY@ahy-rC^BD$Y|Oae4&wUdZV(ng&s4#Y|L5(+@;v320b6kIZiqsj)dc==jbHtP zBcc_-qu_4#gm8QyA;}<0DFkCn#gmzDb<&(IDlywA42M?~$f~hy$}Eb;eMb0jm1|+_ zHwX;WN9|%chFlQa^s=B^C2`RJ<`?i5aC5B#k+q)`UB0FPEW)zkPAq3-f? zoI#&9*c*+8n2-EC?}LA>gbRKm#dJq6ID2CRTU9&;+Mnn+i3fCp#sf+^8pP=ZM|Eh5lLA#=q}d>AF-y10oKtX`20bd8m8>Ke~`@4zE{T| z*54EoZ?M7~<4{Tg9g#YKk?twaU_deqA*p0FW_N8Q<-SBfJ;FZe1A`3yz1hGj}-<4vZ2u0+bM<9dWO##76251K1EcY>P z{_TEX7q44n!I)TKT8wdIOT)Lit83gQ?bsN%ol;V2dY)3_+C-n{I>=h_izYQu}_YcJLbMv znA1JDs(IpX*j=1)mg!NlvM0S&7u>KP0RVfbLycoqMVL)Sg(Vc!c!q9+0+AM*`?kI}*DK@P7hC7Lhn!KmcNbjEm!WpY6&Fcn z34p<_2+Mcl0~0QNK}CcWjfug#^_yn^aMvdQ0;w(X$M2Hs`UK<)XOPHD%21tooph`|5(6O8bx90ZH&iz#59E_dmN{^QW;Mlpeg3 ze0O`CKdYGl`gEuMP97w;xr2Ad%Z=jiz{`c<`X_uBEff?01^-(zFyAK2w8HFg!JI!P z|IwIStk?+4tvc*(E%<%d*>cO^e-m&^<9}0VymEKF6(A@R5FCW2DlMZM9NoEHN4a_=>-`vQt$bkos%!m5rZ`h~QGqQ_^;JteQ?H z@S%4^IL#{d>Erkzi=P7vOL~*3dNP!@;X{&);i7@$8NcQT5>m|n1z-Xd5^yZ~CJ7jYOwUhVsYfvej z4E}o`PESdkr~4^`6g^?fjB!?+*s_m)MqCY(DAXOejkhg!Ctta2B09a7lbkB)G0JV8 z#4U8Rh1Hbg^I}z<;k!>gn4M#=S(IZO&stRnS95@MN)!RLin0SL2+XZ!xn2NYE|OzR zT74}<`f{b6^WJ2oXfJ}=YmH0icbDSr9N7L#@WwbRPI>*G|T$qn1&Te2l8$>iP z=j=cG9&TKJ-zufJEmE1=$z=Fh^|UxNJ-Eue+ibCPCG|(xR##W5wn2>GCmhxXnx_=e88ODP45%;?O+r{?iaR-E5FePABmKeFXru!8?3 z;Xa!%^%InCv+3j#sY;%9goovduoK^_$DatL6A+Oh?C8js{Ntx&A>uI-AO9S3BmF)h zIb3ws^1AIawwt-LO&j5%$9NM3qIy_KBZpsxfL7`qTQ`E~yG|Q%mnEcuLx!b26Zq4p zp3*2z=hD7N%ITQ6RvP4f-hq`qCNjwT+!8x;uPoB&bC_h;f2nU0Vx}6|HF~2uBL3os z9jxm-d>lvoOed73ry<Y&AmrqPh+P znFxNa`!a-M)K?A@k>5`s<<||UwKg!dvc&OWkcQNv^LXkZkrv}ZBK#_^t+NED7EX*- z{r=<3jDcy<$cLf)jldW~tQ=?z8GFes_#S6i75DYH*|PXDj)jqBl0Y zNfr!Cgn5jcuOET74V_`;gyk)lRDjXulbS)!u_f0yH#hqJVH{-DYmZ#mv|Dtkfs`mubHtK^`7h#t`0n}xS*4QYyU1yg%A1b)>(R1-U z&7Wy@^+{?@kAFS_u<1Y zu}8UrZI6W^4|MlKV#xW~@w^mJyToLiKAuw2tgNkM`RXr9e|pLM(f^TW+fNMNUJTat z*y&-ACS8p+1SnV(wx?eYromz<$r@K7=t;KkD@@`nzGv82*iF2*8uVuaW3WHEt3I8_ zm4sUf(aYr;Thtvin}3KzT6$j1ih6ojNiWWge~LdlTkb$L9PSOf)h<*(=03zJtGi)_ zp&sQ4a^ie_k`_VuJhaC40h|%OY+{QS+l0$Jj42S>8{uvWy&KDEEID5zb&7k!zxvK4 z_;)11WJD1|^v1ktd+pn_`FVRjpGFp==8D4tjGqp#@P`jf+U34jr| zPdUdK1`MX|%EBBk6&K#We=TBEoHw~%PsoKw{b72{WfTJ+Ozed+^(TE*netld1~=RU z!@RpLHd#~`!$Y+FH^8ofK+wls^K8i!T!EkqDC)4MJTL@@>;M8MqtpeAf%Av8jsydf z)8LQ{YVAO@GA33NigY!6%l@OX*CMOX)XVGevAGgB;t!~+C_-^g(^KLEw}pXUV~I1T z7z;V?SgcfbjyG(})vYL7b#G0wd|^yN7u&@vxmDkf7eN^}Fx|_$e_n$l0+0p(UeE!r zjxpc21qlR&y7goyxcjS{*D=4daS8eX(F|0y!63A@1x~ZSYTdn6aJ?(W?B&7+k992I z(W&lrJ+W!A&iTsJ4N_T#&yESq=N?#rqb{YS+{=4xJ`BB!niXat1G3HI^?4fy0tAPME;bDKQBCXS zlU2NomkpX#p21Av9$YG3jwa16dNqPknbLzPC8}3krrt^R&E9C--|zYCU{#vnA75bu ziOqQOhygt^xfT54LM5_q#AyP!RW|A8QC2_&rSWgjnQtP=n3f;tMkBL!?UEU;hORaQ zQvv}10<6+D1edz1>qLeLVhUABhSt3h6+W#MekFog;E~y%t75sznv1__AQcb@pcMfJ z%hKx+qq6uN8la(1PqG;XEhuF8;6Hs27P5dEVD7;0oN-y5|K%4r9UVM3w`(By!rip~ zB3m-!Z$G*pP2_o1rF*!?P_owDH6VdtLRz(+p(BOc#ejiSf1Oin?fO4qJ2;g{i{~W| zetO~6pt8mloq;4r{a{HJ#q#{`0r=G*4$nTxkftnBWxxPuz_{5Pliyf6KBdI4m0M(* zfAvilPe82q;F}S+)Zpadj$^ah$hFj>_d4#}I;0={z8xksY}_1HW0_JnX7xWI($V!I zurg&515eIfU?5ns-kssfd9I21U!AIYZqHp^EO$(Qd3UCNvGH(Zeo$Z^Arzo`lA7U> z8eQyCrTMSeReL7AZ_s7POa%t@;nwRV{PWCs{F;ZSA-WS zncUK>t^W?rFz*T)FarXSlyT}Nd?hyW%rXH#jOVUdjAgI^vwX=;@KMKgkLt5yRZ#D- z&G0zGT9=>y&g>$&+v3StCouF$lFy{}nw~6t{mvX*pSWPQ0qu_;v>^du^yl$A5~oh8 zyEAHB8A}qHaPo~th(y8kn4|_;^qN@?UCQ*WtF_?Cj~nAd{+8Rj1Mthz#c4^vC(f)3 znmF!Lr|}0e6Eu;6QWoq=Cf0h7K0tqWwQsU{BDD&8^5|mU4VLZ1lHVZn)(p~7t|eCM z7VyOe%4vKk%l@rp%rVWB=^YaNPQae_he(R4g&`>yA*D_#MQr1V+TQ|(1nPUC2bT?5=YiY-O(-gOiM5^Px zUFj_TF45?Rc_uGRGbdG$=XXduNNe0>obptPZZ8)z3!mUbIg}4VP^QzXrmm=9B=@nO zTSs3n?jjXm34-@vWB}XfJumi$t!eklyjwjhCC@81UUqs#Dk9o5F{?MGF1G?ag;_CK z6zx3X?~$O(vkX7Wnq{i3t*ddq9SjyteLWYLSNj?laAdZdu4!=_{>&Z59g``%)TX7x zYEPg_4oq&8l99H-A?2M7u3$J@JrWLg`m`)bx1mqEs)T}8YGs6neI~TvWPczz76|d9 zCC0=&aCQ!B672#?a~h0=DF5uKw+EviDYlS7B8Kcjiuu}%X)!C$KQU@8v55Tpc~@8y ziUNg5G4)7G#IO5)haaZA?sbpDur?tGAik)mrGWLTuyM-VA9fcjrMsrK!x_N6XB&yuUux8)%xeqiJ!-JtdO`_Gh{^l=(pBjN{leH{pAe1dw0Ua zrQoLU_~<1T1ruGwa=(U>u@PBEn=<}KhPZ=v3&xBZe3}n@?OkcnPX2pl25B|ax+wmh zbsTOdo6#2rhK+>N_e;8~zS}zaq2JHHt0NVE>$Z&C;+uaz7puR!?d-FFE68NlGC$g} zoZKphEq9yppn7y{SI6Qxazhtwu>&>o2gB=N! zU+>eJ`rGB+;O{eYVk{Z&f8_bJEAh|?VpV*!75uM~dMzqi;Ku_NHW+N=OH!BD}+?qh)Qp%vE8Cr z#Dm-@a1hQ1Z&{BrF{GP}%ulI%>%Rw>i!_5M=Y+(A3B71*GLKtrLQpu-^;Z7LTy=?0 zOcE^uHS}Z;bB^%=>zzCS8P;@#%ZLbCs0;1Ad*K9SeW_`mKb>u@%t$wop#B99Co>;M zMt_R0V1w`C!q~k(M9^^M1DXvZoM^mJ49frec!qqUI}+a`%8up5nV0Y5?r+L2Et1OB z2&;F{Zg5hNw8$sQkt<-oXW#WC6-0CC(2>^b&rP`fJ{qy6j}b?l!xU@7@89xOM;y2+ zM(Cyn{-GWi2Dh@>d^wV{DCHMQ(m^oOe6THv*T+|cUGC>(R^4l?a`+k7uk2v)#0-e^ z%oqC13eKsWi~?aoBgg3Nmr|-Z9@LEnH_K}jgvJN~&pJG|5qZkZ&97klTvs*+&p~ep z77Dl!cU6{jb|&+_D?4JHa%<|WmQ-+#GT-0$_V`Sf+WHoE%B>}c6ekN|?8)e+h+>s* zAPp<^l&}?bDy<01jJ;=9^c4#8!Lw${T-m0JI!Ms?)+L_zpyF$;mySDw^$Qq{iM5w_ zdiZWf=Z`h8$%$I=Qalyz)nJS*O%Mr1hqEp&VSD8orDo6|WPuI6z|``;2n%DqMi`=ain$F2u+VX6thVPM<;@K8V&fY9 zk{uN`Z};WL7($P$aRG}ieH@Y3ZA4`3!9-l|i&@A*^g_Mx3bkiu@o4G+zpcbev%-fD z94X9LUyw8D23af8aq^S%pmM2k4JnAf^go@dgSMiY0~4|`9o#ta z(t`6VD_=YH`moME&MT>X?O~JR805~6rckm4dl(bT@?&35^0r78{t7- zW*Sc@%?C6}4a$b-l0ins7pJEjh}SVtZ@|WozIup?3;1Pc3+#t64BK6zt-(MwEV%o; zsyFXBUDW(ZV((CTVB?N+FO(%{XF@8@1_5Oga0p&Y?gmk;@wA6t-c0NwDFU+bz z1kOnS;zcNf`2A|xTVDU(DAX900{KTL^II^Mkp|eWp;*CPFOq}=1A73lI{qB2a)L9Y z9<7@9dj^8QQ4)7cQ`ZIq^?DbZWLy(`m?QrSGYoT(_iB(JRULG}20_KY$OY6erpE+W zUW#HW{(5vY@fL~^1Y&6AAS(5*1d}kp+g3a8R^``IF@UNBN2=0?kim70PA8mnFs&T` z@qP0HZ+<5uc^o$DuxLSSR7XMXf6bG$<9u!4x;#5fCst%UHXj%1m#KNU1L*@4xeXCV zX35N0m-7CMKAr-btWRZ-5kT9eOfD3sLs4}PwOu&F1T0q#!cYS=e63?RL;?+OT)z~W z0su$GFcE~uF)jWH@3FvlWdki+y@<_u&E|x)=>ko$Aegz#)fb$myxG{~I>J1_P1V^I z{=vHf1tW{_Q%A$WgX@C8<5}Tk+4~YShdbP~>0p6nQYSJr`ELU>z-tGiKtLbBTP1hD z6DbonNQ|FKne#OK5fcwVs@JoC6eNK6jD4+j!$m#lM9~0S4NQcB3 z%x8IXB}0zg^2WiJjQ|1O39h_M;HNnnns97h(MxcKf;rZA?gI?q4qOHR#UjR97yH;S z$`D%Wn_`x^zt~J8LJ8krFa=}-Kzs$PGF%km+%X-X*2;E{G!A!E&sf?hgaEI4p9sz( zH*AQs%K(&uS2X;qC${{n6YAp5tAmo@zSYTp>);7o&X%0~mYZf^suuqn*9_W8sSqJno=vWxa zITHmR1rtbd+=mvo=YUZmLX(W{eshI$XcOG%7Il!0ZTYFmS92)l!Vw~GxQ}lD-nqDHgDO&=B z4C%gcCj%psbd;&XhjebhWjIDGwM6mD)rRrQHR4L0XZ6He6_a#qLfG@D^utcuzC!Bv}TWfet3tT||)>o>iu!p|A8KOapDTsW_S@zZFO~~(C)hLZp|wc;5+l@U8T`6-nsPQa+ah>fRhK4=N<)kmAXn< zl3&a{e;sn1?GM&OqPNZ-_YimZYX+z{ojEe0Qo~J0#3Y0bqR`x z!3BS0w$*t&JXyrS&mV?uNuKwGG`y17!TnR_dK;XZ0DrE!f*BTCJhoX2ef46>Jnqy&aix{(<=96I0Icdh>y7GGGvoHKLo>)Lz&Hq``h#|OtG zQ>wTII8k2u8PTZ2^94w&48N+nUR1bUy1hYO#?cX6+V-gz&BuT1opC-Gd54^7p}(jd z>^eqmOf|Zb$ucE$9Ue$Azx){YH_!D0L%}BjQPQwiqyl}h8dhnd%|{It})!Ot+1$2MVI>D5^`n6 zHaoqIRaiwmS3r>=D#%;)f{15sfcjdbbWV47OY4T%odncH1d3U$=THCGWvQVt>=o@r zjL$k-^-Dr$OK=WLcw4W2of}Vy`LNujUQ8P2CwBsslGMv`hRC9kjI zhCAM`s;^GCs10u+8znL!bFu zDg|LHpe;4HSpI@f6%w?oTNV|TUUwXK*di#&qn{viJz`{JKQA}`{8>uXt}KE;G%iuVbu?pJ1Fh?i3(g|jA##v#bFBSEFs&g)1HB@ zFp$V2E&2G7S?_6J&m4Qa5LZfiJkN%$O&_XLAb69|i}_<_OwV^A3Qb)V<9B4et*O1e zJW5&#zFC~p9UYGju$GZJN;eSk-Q7qR50!#U!A_$r<(s#~#Kv}#IIn||1Vbg-OGc{A znv!Bl6@8BFOF>w}=dKw}Wnb z1BiN0UeE*Y+scOq5dP13CC#)0Y#Mp_Uh;)6U+@g};%BoOp4x2FV78)HNCJNKgqEv; ze0Yfq-k(h#8%{xs`LHaV(VfE#8VX&Ku3vKmPwUQn8!E7JKlH<2Nt~OdIj7?d!T6UtVRTkSXDZ zxU)_fB%L`W#4ZW^*Ykn*-uKYeMZPah>B>z6d$d29f_N9Y@bo@mHN$f>pw06k%UfR} z>NH52<%4Nx=|hm)va#%HS7?jkEpXe%J8`wpN?PxAY)Z+DKE8W)KFN|o4(x}n-vi== z4^bk)Xh@l5M_#gxjX`kd<+Dg>tM;xT%J}06`^<6TylSfBkr}&OH+XoRkASQ4y+^Su z!Iy_$1W<)0*lG50llPL;Qr$buFY4In`XElSVUM->M+`26D)snzcyHr>@=uD~Khk&} z$o4KTxcs3*rsme1eNm7DR$|6Nl^Uk(E^hTTIUN|9T2hu^3Yms!Bmvfj^)r;AImsOA zOz2N{mcc4eNxqquTJVSI`zmd=oGCx=3q%WkkH4zOkuE8^cA)_lH{}%Ou#7 zpt?-p3vQaB4*#a`dz>P;sEfPaZe8W>#7Ki&9(0aLPD6kBqqgS$t|K9GZ>vM&LOODK zHl)tOed*7pv=Hm7IB~UCHuvv8G=E3x8bk_5{0-(i8k?Q&>R({F2J4%3GP4l|GUmZ1 z8gYse!s5a{*I)q6y27FeyuLlj5HECQB&*U8`@yhhi?>3MeluN$9lrD?TD?!6Rl25N zn>!x=>64DDpSVX#0+&e`W|Fe^bCx!=*`J^=q4W)$v&1!3(^F@Wt%b`ibHE>QCiTmZ zb!XG(uh3$?5;LiOD;dRaSwM%m&$!~ho&!b;rk`M`JY<&UZXMeLs`vZo$iPmDgU z%UC}(DOIh~%W3c`YM7DG&xtGadM-8QrCQVwYn@u__11+_La#u(^e}xKtWu`_s3d)q zrhoMXq7oYp>u^4L^hhVO1J?ETQ?!F4Y465sJRsO`XPGsw9mYEWr6AC77q4>aqtCm2 z2O#7aJ62()yPoB;Rt}LPHZOqQknt_3K_1W$-r1PE+lDx8QletiUFsTS-y3K5O8}eG zXiF@@|D`Mly-)vXdC-7|x)*P(W14HUuu5`FHtK9*2um7&#;X2Z&3GP<;>$Z_hc(Y# zA^t}q8l49`zgLwdt9w8uCB z1_JHn4Ft5J>x~%bO1@y(lw?xr@uJHqs&oT=>i{_2y?z%LxO4t)T*hX{Jj(unp_f$QYE1d75r^ zJr2QGQE@C_%qhCj;$jKYq`i1z+kOA?uBJQuwT-DC04OpRJ*I<4fxsu1XHtG?&4L+E zEeATwS?uR^!Fb~ZJwwn{N+*z7#g3hMX?BhLn5JaSkT4?#Ua*COZ9HV1<@AcXkfAD# zaiFV|kbVveQgr7Bpaxldph8Ie)UMb;7oL56v(-^GciGAsJ5WXN$8V3bSQvY)g$3tX zxmg*NSh1l=J&2q#g0%PJ{P-Eg;%bR%jh_7lW4H8TvpJiM^pSjwu)=J^xbIdt$J7&| zbM($sqpjSa7UIS2iz-9+K%j^Zk*1sg6_Ixa#Fu;$DkhPQLuzd>d@P1~2`A1132@9H zWkj%MkK9uT<-4F-UT^IJ#<@uGysNMf4P^u%6ZAuhVDWSjx=TOIXL^CP^7lafW&dow zKgJK~b(R94Yr{HAmwk_svhHNo^qxAI5f;-4IgI7N9{*()xhu}BbdSO%c=eaLNJQyy z7BmjauUd3Q__-G;1jaQhq+Z#XtpqB}+<&dQe6S1&3lX$Nt!%!^K-9bI3?5-I&O4W0 zMoOaX4KRojv4_0i-2c1)q(e@oio;3Ug$BnlG=(5DZ!60cL&mNS%|i)#N&-!%fJ|VToPt8HZYh z;b9u!ErzbSwyHeaaWd_;2HsG6tYAI1)ONR3Gv$mS{|y+m0^kfe${GA8z~b8_Suqw+KhnsTII#&~ z4%bDxBp-k}7pg?})Y{A+S0d$VIOq9xW9%C+MCs|mf}9Unar+4cWblp`v$hC9daVff zHDkTBni`C+No@Qzj?;7KL8GfJa07zHAIrD?)-tUr%mqR3C# zC^gEzIk>QN>73Y*rkmIU0@)G9uQOTYpWnhCk!?1I=we4*<_^>v3w+Bi z0dMJ2hB%`z6T_Wh_;&R01umhw=6~-s`Mn=Cd^=F^v5VF&QBiqu_vc^Q#7xHr>hC#i zNk2V`qgH-mPx9U}B#E6ZxFF5!hdL3r{15Wh?AP_O(+{@H2;;iU>TODvmo12?nTSt) zU_6RrT$XHqosZH8P6&3?0AZ+}Z5f7ps51xUG0{koW!vnXSpIoy^Ra1E{&3yuR4XU@ z%C1v5xB$;?j&-IWnCW{@6z89SeoM} zSzfp%fjfs}hA7|}87Hx`$Nx$cC?FuEYZfn|P|(Jn`N_n+4lP+tHPqxOA~yfm+rnM=En{4JaCAjl zh7!fu^1;5F3tGTtwnMjL!JAti!uk&&E(4mk#B@!euc=pTJic|{n^{}p%aky6xn$|$ z;k8h}on0eJY8YlWUWR0c_Pph8-gcPwjdS%-3!Dhz$(A|Fkb_AG=>9!^2$~==>ty+b zJv5Syvw1A1fe%5p@?W9NwSO_m?@ut_Y*NYF*eapJ*qWozX{GfDGRrIOP$(;eYT=X`2#pWSZ{9W|E;zK!c;tN`d3K0oTNtI6VJC72+1evF?7W7t| zDcmLA5EJ1hSj#pk=R9?~ta|LcLxAd<&w57B7OH2+%KhnV=xV6G-10V~&d&#yYPWlS zsap=bmoQqCBidr3&llonPOn%X!8(T{64~Y|`OM``Z4((v5YC$?DkMJrzf$!^BU|LP zrwqSn{eHCl`3q;1-|u{H-5~*XW(lH*@c8bIMrVrEgkQSt%RP@h%@6-W0us3%-P@JJ zf@$ddSWoVi)|NanvxS5SBi!{-P0-n|pEZ12W`d+o=k0|ihk|DXg3rLX@jYO-_ z^ePIXOxg{w;^D#e{XvRfpFii_g^_lTKI@|#=M%im%%ZIPh9<`D1G3Thkjn-oMs)#ct09n%{b66B(=Q_a8+Dt)5tEIgRj}H)%%C z;vP65%bUTF04Mq|!rbWZh)szis5@bres6f5gluTs;ny@8%eIE{u_I<$-H8TH zmDNM$kMG(CJ8#Fom8lxi)MJUHqtDT_j(28Kmu-uG0JinrIz>KJ}1Na2&)$Uboda@(F}c{ijnjn_)` z1NTdPA#boc9KZOg<$f*8<3)0$xuQxHkN`jRT3^Pn5OGm+$j{>~?c4&UGRS}bRf|Ea z4HTc?V4wYRQ}kv~m#IVOdig}Gi|=jva~N+eKCouO#p>6O8>v?(N40wIxK(Q{#Ez{v zKYIK%Fd>x-DHRVd{~UST0k5tLNzNx?B^H*S52j&Fj7;l${-;1k_1T0Fy>(3F@ya%= zSjZs0Cxe4oX@yXW)hnaptdB=7DMyi#$d5Dl%7SM5o5}~StE-DVVWpsaKqesH*LL2a zX2b342TgLI>B1!%Zar)CqeWCy8-0?QO-HO7CpEW2>;k#y>>(23kYuddViR|m5`!=@ z^)%srA^JnI@7Kbdo10QRJ{haD|JKJtqJan^R zg;x(dyXkmXYAu<~HJa-4Eb#aUFT;#;_GW@h9LOuad&z$t8>eAn55&=@44z}ZwPa76 zRmAArDk4C2qHGyV6(d+#?z0P>o2#bS+um-E@S(S94Zv4?iF0l^?6x!&{mMYTl67@} zT&%esk0q*`=VQ0zAlH6KD{~8uEmMTVYw@dD|X{5k;gH@nV>|OwodZxbv z=@{+T>GL}@f)5UFjGsE5FK7XJwAO%j`)j1;j}t8}Z_=VY!>MKGq&vm^q8b{89PthS zOq#b`Ec%TgeN7#H&HS&HFJb2I#rweKvMcy(Gr^$(aP#4G` zqOR7gJ_0&jGOMYrBI#9cHCs?anC-tXsC6L?q)a@-+E@#wtyW?$DBd^g)`!l6ev%j=QmT#=BaNM)p8;2;b$3g zIhVRi*FtTe==y$Ch)dCmcJsxO5#=!8U1WcLAyP-00t|h1cqq1i(JUKBfR^ii;kWh` zNMU2bxeb5k<{L=er&lBrfQ9XpRmtqqcN=t9j?B>_PsoQD28?>D$7>lcV!=^*kQblQDKUkkl~FVs1-`a1I$IJCN?-^-q7 zPm8H{2mgKRq)MmrIO8!)*=1Y-J2@%|JdxIbvhi=uDVwIK@mgqbm$d1VNG)vm{0hj8 z#)hNgN3jxyAUtgYypU{Yh1v2q<5d&`bw}In6LFB)iZ|o#_KWrTrf`uGAW;Arj}>E; zi7j4gxRtgyMZ5_qq5^iii)^{v*z&;>NvP6PK+)N*N+KAH7P=@vxMkcxy^2f8lb)Zd z#SAi-ASuSQgyfs~GJM&?VAOQ7=ee=9xI89Tw)`h)73%iqHi{hq7jH4uXovmlz#0vo35&VxO6!O6UPiM&k%}F ziW<0Qkb_Pf0QVL(y#3@jFa)Q4pzp|m~eRK8~bn6(&cA6 zv#rZxspg{j(v`;r?`$!^qW{#ri0jg#ebe2CQN8S+`I9&5r)* z((Hxjjc(4$yr|NT*|r-%e>qVLM{~8fX$OJ8V{(`y)xeitqvMS6y9Pjqb265iLI2Y) zmBCX2HOx+y9X zu{I`AU%JX#hfF?m|5X9dNPzfh<<@0l4}5l2TIHPgk;9RK3GVC5Xe0_ zd0wyj0jX3R*hf#e`mbXxGEcaALCz2)*jltt4?c}^LH4NM8!qfgcfx~Ll;-$I937Ls zUHs(QMhv|izqeEE%?BslqVYQhW-r8J3>LWeW z{kdyLi3JI;wtzzO#bf2Xf(kibMR6fL+#|W8SMF{uIrI9RxU-db55=&CrGs?%hr&ED z$><&IFDULPU0w(c-EyxnX2J27@jFV5rjC&r%J7&TB1fHCxJQLbc^i2~1e00sIZM5_ zYl+yOeu(v>1s;mi)nDTxLayeY%jhOWzjwv0Zow~pc{e*Bc{Sgh-)p{^xp#?1o6pI% z5o6*Vx|ZjS(E=zgHg~XA04m88IFAwIxjh~@@EtH2%~tH)%MQ%ce8Aq zvLZ&;ehcVmYrM5*AEU6!(P*b(CkW8>fX=+?csrtJ{|*s)@n93eIhf*?n<@7^gfH=P zLRa~phmazDOQZ0}{{ZYi7et~kRHxhTMvb$LLr7s#zO@9a=*dEV#3({%sfCQL(r)Cv z+=q^{;_ByCTb8%}psAkVmVefHvxU1q0_FZW$#s@Q+Be$!U~i4mTF!9lHDzec5zel- z2jXvdU9yr9$2{~rRgv3FYX6>%JyD0gWdb)p<)H{F5{^(VPbO-ma^KevG|nsH&n)wn zu&bdW8I^VU4(a~4YK16qktBizMxXqNn*Rgt@CddM+Dv;$9~aTk#;b35C|fbN#~fSyDjZA*Lt5Kf1r{`YGPY&yy36 zJn5T{lYMOwehk`E`u74avcKNl{>B=HFO~0{>rO%S{z#|Rr%RQc1I8i>(d~*Nm2`fu zb=>a&m2==k4H*O?9Aca+9e7M^3?n7UQa~Z~e;g_Z=m(Pali6 zeepsdDnU&>loK|Z#GLXm=osw`Z8W$rHr>sVzZrLQa4>T*Q&?yoM3%K?B#QZjGkTcviX}zR4@A2$F_B>D_epJp@ab)Lv98C~ae~_pB`^imz0IJ_K396xR9?kuRoBc2 z61l7e4LmRJfXbPB*$Pwq@%am1_~s}12(C@c?X!FuiQ0z^BMN?4Kp;Z&;V?FgAWNE_ zDhL?}irfCZ``y5el*718;x=&8R{jLXy&237hp73>SrdRIj;sFjHF`8meyS( zMyqDz{2Id5@vQYwAKo8IxX;dgt?tO=M+ze(hA`z0CMk7^K7hEu-dRwX%s#Hzx=iww zOkeB~1*w*5pf15fzu?4tY*+m+xOCr_1m8DN+tMJmP-IQtk^Nn@f*h1j&Xb^6+G9>$ zKSxF`JAc}Tmj_3znuRvXS=eH2zUSKY&&;a~BS*D#T$lx| z_ob{wr6(NefwP_jp)uWE^R?o~X$D$1Z2b5LZ1U*K_rWzoQd0}koEj-Qy`NEGo;x6; zxh}nFgGw+tZ9;p)Cx&QP8 z3YzCpaT8K%1vk&(hBLEa(cM>?Eql6tIT5`LnsDvF*9t5CQFx;* zz$fksSnC6G6JS^kU{?dNgCBSj2+;2WMe=5bIzS%8J_RT{E-6VnJyal!b3GzVdAJ~_ zR245b`h}^5+b-=uYqHQM!5SPq#y~b158)Q!)rOG=^QD;nEV?Cch6@+fe;+dik`S1* zz#b4VD(o{z8vZXZ(KtEz2;_%C*EWTN8s@G-unXb9(|7a1#@#kA zfdxiaDDIa2tpp4fYbpDe{3?Ji=RzN-^Aw!CTXMk>eGDQ)jIQjRBN=)DcC7!LeTG5k zmUgdi06Sdf2~bBxI&MctLcn_S1;X8#O9+^aAMWw zz$h5hz0JRslBtY67GAes3@$wurWl&^NL!f(V{*{n?A?;7DG>J&Nbze~mnw2Zgabo6 z7?4(_?dMO0Y8~gItfhC`Yqe)99I#Z|Q&xBwz}V1k_wAi9?vz+OmUq9OAC9gZKrX?u zz*!3ioPfRz7%8w1w_b3AlCM|jF=>4#Fb{;o+%m@d6cG)&?D9Q5u--~8?~Xx;lG`5w z9WGc9d0pA+nv#F$$;~lr;e18U$a_l)+2p4;h1Sr`+p}@U#{Y|^0CQ6ixLv@D@N8!c z(&me%uqm(wst#*9`lr#V2o_QAfBoH-B*PTSzcMYF-7Cy`Cp$|E0kUrdX!c?MXK834 z0<~YBGgO%%q=y)6MDnNK)PWWvNoc?UYoD}C1bTA+cz}MuAD`goZ%dW|ozZQJ0%x5T zw9LW6Y~8`}yvIR*YR=NCQb4$F>lu67%`Wxnc}LE{=we%YQ@|;X(|iE2Q^4Q*ik=sY ziq|`CG*D{;6wx_lHyA|cAUUmkc|fHC2?_g5y`qMG32?E1mI@a02=nv-1NUfKel!1* zMNw=T3tEZqeOBNZ6G6Y1$TIbwDFl_uWn^JfDm?_I{#lGwZe~I#x)ADao=pBoWM%qZ z9)M=BAaCMjhlYHHw3D{p35Zxstx4+LZaSCxirw>n2edO_^6cf!yF%UbRT*ajXhsxZ z{|;$OgHozZ;f^!s%cGMgT1}&X#I{z=ML10OC^dJ^<%AOTV#J660821)Z%Q9v_x3pP z;v#K+W4WsY$n4wH_I3P{jXe}CO`qMUBUxI4HpB>Hif{vK4fwX zSU)JC((|To_5u-_iH;HjL%9ujy`+f)=AJqat^z2aMUifNV4ennOR8#jT+hv@AbX_U z&Lw@hNQv8~I=^Rj0!_TF=)+=pzIZWL?b(e_~E z_3L$xdgt#Plkx6Lm)BCB=9uT~Q?gt>GIi#Y;jgA@9q-RDNn4^r??Wj2)xAvEE8lk| z(sBid7UM9xE|44`f|{y03^A-1LGW@el9GG|qpa`Cd!LofUqYxHa(a`t@!o>~)S@1- zitFyfqNy`bqdCivC{pT_wf*B8Q%?7VC|8$;6Y?3FUD0=yeZgl3LZz@6#k1BhLVVgj z{F@MUTwBf|Pg8pzp3Tf0zgf?|dv$l!_u<6T>W`3ogeRNy^U1Twu&H15BQ~H&y7gNP z2b1)!qzsAyzVKR!mC*U#Ba)GhCAv^C(STD)@VL>#!`$klN>I@;V2`G}$DH%RjtI43 zXU|%JW2hn8S!!$NY`-B1Z8H}YaZvbih0&0!HDCMl%BGY(`0IE1KR@`z<#ppDAAA>~ z?@-K!SJnl!3~?uWDega>dPNx+62}m-dHR6ErIT*-!|S{4fU92A=Y7W|OYxDIL<=(F zJJy+E_!}1~N=>&B2eUf;pN#Th1wHxj-ixl$-7Y<{Bo0petRg1lj)R%?5rl0WK(-?f z$RARrW6Z@tab*a37Z$gCc`<_0XdAg~=0I+TxA_wPv}wo#dDOp?BmWMZ7U9(DMu4K#b2(4j8H}L)V^I%Yy9Q#*^)f&%b!LBOiBtg_91h zmdnehL@b@XFSmi56COms?7xKgk0h6KoDw|8zYf?%Nj67gU(YJ(B1eAvOupP}Iawg5 z<>qq#c4Sa9C?W+G%Y+gxi+P)MPzHlFeBd(Mm4 zF`_Cge$U-F)Zt#c7hRlT&gyE83a4T16v=ae9x~YgLVSe@M$v1 z&dpw!=n4&qbXRUax4-|jlQaE3_sxV=vp%hXe#vp+*A8~!fPzIh`xlO=e0mNg-}j1~ z+27qZ?b^f;JR(EJ;d)g}mKSMJ#REfXp>@Qr@wNN#YUOei<;O4mHtgc8PG!@fcHg9z z#(vg7>s%RTH|6f?bk|nUiPtvs^GP|${?7~W4#a~*1?d=U9}8&eJTNz+sLbz7;^Yjj z9^oz^B<8-;PW`xbA#&2o7zVWR!^kbz~y{I4cB-bNGuWJDnNoARl%Bw zTV)fA3+*v+#rr$oDvl;s%c(az)TQX?+h%SyK>lQeY1By4=*yutW)3A-8~NkR&wezk z`oDerfy?D#GtKe_3H4@6ZEbLJ4drEv1p$Im>DerQKH_A>D9vRxFR6*|>~`$C z9<7p+MJg-%mqgldHB<2B0WZRrSzmD?YU5z0B90$_KRQK0k86Mlp5xoZ^SU#@$M&JK zn=odoI=&0qOX9DuFx-44WY>yG@M@1>kV5({>;u=5OUJ~!17tQlC`bP`Z?H=uqY_P6 zdh)aP3LKwd<3CVY@rri@#p>TGounsxl?%F6QPx*XP8EtEBct#ts0BPQTPZ)C^Y_+s$r+0Gja#^;AV!>&);ywr2$kR?rs zORtB4R59Vyz0nnP662MyZ~+)G=En*A+hf==$v`EKAi?oK7xWgf3g<+)A4yl^KdGoyb~TEfj{ zTh>rUu4z`T~X%{4~kcqm3eA$|EZDev| zEu%1b%JSDPN|_ za6jk>TErWu*%K$i5T!H_W!U))Z5X&`))5VUb^r@`8e|>yP`{!RT?$(|8bGO7GW6Y; zkuk;Y(boDtsG8aaacFA0QBUm_-{dR-dWUU;a9T=Wkmr#Ojxk4w-K#cAB!b;XCx9MA zKM00rgV$a^T6ifW$A&3!OBYOOAo!CvVC0^exe4L2H_Om8Tli)#@c*QxOgs!noHYn> zc&w2ee#vEtS8P$w)!nNo-jpKx{ma<|M)9I09H9l`ZIwS>1cI2#7?i0HpyDJ_vTDT! z38731=uU|K5Ev0?B%QV|MiR}U7drrf_zfL zmq{b_ins&H^*V0(e&~c@Dfv_&6|O`P)SWuH$~T$&ksCB2)UI@QjfL zVhsn?c_L7~>$)Lf$`!2ez{A|C|jVFfg8wj^W`5eb4!86cQ3;@ejKlQfYHA0Z4WiU-OC z$TeLIg4e|X5&up<_bh2OvCs=Uji}#WaGR_5Ave9;F`PT=%{f>$-Ca3KC|x}ai#hi^ zej8_7x+4XE6M*$#Id1gOg=Ihlq^O*F&fekz%|mk>Yy{owXD?&Th2&1s?ZEOJP>LzF zu~koUz^!MhFr0Zu{OPtPPkv)Z8AjVv>6HnIdy_Y;Jh2DQ`C;I0V- z@s#{X_nOJeaq80L)v|@Ioie3P84tyd$wlAj*?@q^i-dr74W+rBBGcv&U8RQbVWq+} z_uxNym`lORL0GME*xG$)8)(4%Wi8@>n0}>WC`XGNXDn>sfmnM28`$c!C|tg&;td!| zHl?~a5v2X39|mr|*X-%X}>V%gjRD=R?B&${z^DKXs0Sv=wF*e7NryH5$ryEpp_htbu zjPH@o+Xi+@F@Bp;LX6U)U)=B;`isR~>3qLgBYc!L9zs}t@-;fV_x023fvZ$=F^VSB z9;MwRbCIIe5#%yZ#_UtMp7G6)CT?}W(lOwloi@guBymm7Y7(7Pe2-!xc*b7ks) ztaD5qsCQ2WA7m+@!R+0Qh6hrUdjUPcjOn1SDg9AR>}l1p@H6uh*bn#!auIm{sfZKd zogrs{n?#z0W6t&wnh_{P`i@=yeYepL)EuiqqpMn-NY=8MQ&=tzb-~@xdrR_UVbc}G zWvJd*=POSWcHfy-}zmpL$zg1{<)NGyxX{PmiqL-M=ikipJ4{)+B5$Vbp zLTB`PZ9S%5lX~vjSQ9Z3+qDLO79hx;VW?oVwg{lnXI0(0*?gw}ZR@<-7zq!+48HWe z?7219=rv>3TJJ?RDazGRkW>>%P7Mk$$&Gd#re*6k7vgyA17qY?d_$hGq?R1}SRZwq zb_N-|R(M8@l3@$MHcn5?lR+0-%qZ_3vV~qwS^c;m;`=$kWzGpC$Y;Q4GtZ2~g!l4^ z3gLb{fTbCWBTL*Xhh!!+oBXJx=^k)Fm_*}Df~2Yia)5=V>N|8-9*m1M zdr+SLVaOA^!(cl)`Y0+^)xtm^xTR&uLifhHmSwj7m!S6OP73?HBatb;wW=3!?rm90 z%8fO=6uYMWenrrFq1I3R^E*wuoS|wh+ss;tv0hL^IjS36QkEOV+u!h{`n~3CIXBkG zb%}ipGTlPr)MPxTW_ddY*u2c0`$*%I(~6kd9PLI!F6JBthsB$4jF|nX9@Y>>>-GY z%JX9{yK_l?$jJ(b?_`<%Zjn?utTq!xPR|6|X{*3%Y}3k7A6pQ%cX}r8m_K+04L^$O zstse9daxwl#nsP~P2%pn6;y0G8LAXpQYp58n>xz85a@^dk6mq*Xf zQrQU{;X78gX@!P`d*7bRr9R^ge8iYIJQkq6=6BiH<6i_lyZT6Jv#CI$-9l{XvG(Bm zy^>C3r^}$gW>nN!_j=Cz=mH!iPpCl`s*>&dP}BagYo*#tRe`%FyCE-B!Y$Vl%?*qe z0~>1a#XswEX?@)eYu(roh)+;cHiEe1b;AD23rbKxrbn0MVWYSD;>a}IRRtteLXudR z16@r`ubslUr4x$qs#l)$>qTzM5 zfe~?cmnopuW1eGf$z2i~L(GUyvO1m3giDi=ph@Nbk{@Tiq3VY7`=G z61?jJ?l#W{vmleZb+R@%MOy8%G}Nqe_16rD(3C1EdCD77{IkuU%*Dgwj6%+^!)CwV zMZe)60GP50XTY|Rvd^Z|Y76=-SZeX7_^7XcH(@Cd3YDwx?3loP$@sRsb{*G;jjeVl zi`{5>=T`7YAjNI%Ms3_mML;lzCLijEGgbD{84opo;Er6KOcH&9i zT2IE|GKL2G@jj(Z4rRj9F$0qVCemG^+o!OGZd{}hmHOec`Muss@(W*QUEJXf7+zkH zg~?;q&E$u-{=6lZBme5X5fmF~2A~faL8m{R@nVy`be{gJLwCj7q%ACCl_6!jtJ_tY zj&+7F(6XD9Q^*w!6TaHW_da^)=S+Hc^4CgtGTR#%^O&rTwx0F^G(n6D(F4~s!HR7%F&RSC^!-WK z47;F)V}nkY_&1Xe5G^kNu{DO|y=E2Ib!XoJ(R60_3_EQE%dieOC8pU?B3Ave@edFs z4yB#I>E1O`WFZjZg17#Hf$xXF2yiRBFw?1Rc!wl60BZ!7|I9#YUHZK-IqI{+LfPw@ zApreNG|IN)X^@}jblDM4M?2smyh~c$@l;&&!o4)O8@~9cLV#ns%LJiU4pQWxfWi?R z)_W=wSjF-4)xU-}RR64*r5BQM(>z^MFh|h0CcYCul~&gK_s&14mI!yl9AFuW zEe8G;l)ldw*zhh5Fa}np??6n;TvNBq&oUfxIl-%BpH{{M#-b{xIUk%Y9nLPa-$jK( z7nS{@fO;U7<6Rku%#eQ28wR~5_MrB%uz@jUz*29-sNKZ@(iCf>R4nsv~8ktMppcK$gK(oqPPiEfqu$0VdvqdIb z2qJh5%xR%$%)N{&w?q)pI3H94k)yW(z*-Y)9iUG=Gz=m>q91w_Ej!dOX+%COx_TUuy8l}v+EynQL{pR+e;9)iN9kok!#L9XTrKex zXl$(zB{5qdf?%ky!*3GK)Z|ZNm(IPiBM5qq-Znr6YuW)>E#)6~t-4=ce|2WVfDm&Z z!tYsHGx+h^ML~=SY+;cx2JU#E{|ADJ$IcdRyF@#ts&E@yrVgyW%x#FYQ|kWL*CY;Q zx&_WUQi*e?2I7Nv#8M5pewQAmZc$>JtdKeF`A#J9;BHl~_||^u#$rq_-~ zx+Z*~@QuF*%VE;aU98aDZAo7@G zrQUtiStJ(wkihFt`z(w~r&bwW{r5p+6BnLQv$>NkepTuG$Y%t9t<}8IHVx-?*kOU# zp8}0M0e;4icVyz0MgfD_1~ISbh{T{Wwwbytk%W4z&`!VZZ5~gDVT)bL)X^<(sDHCU zB$&i-i`5dK9x+_}2HJ&nvUwrM!Mztxb3}O;M4Ox0H9Q8@S1-+(W$M{m$dZ%N>B9?b z0zwHJJ2Wr^*2IG0c@)DALuO8PR7}Kz1wDio9Up=KX<0;s%kWDb*qC6<;W~@N0BN9N z8X{O$(vw*vy%ZvNF(rL-`BqZV8f*06aM%fAiT(OY0HviISR^;My;Hw6*Qnt!rMFj? zEScwr_lz+szJrBf?nt}b^FI?x^vhUU=N)^bp3w!n{rAiPG-#sQ%P#LMaK0XE{>W^o zm(V-D<6L3G|PNP$`}_Z1*pbMv>Xh>3!r08s$yICt1nL+ZJ|lBw3=BDtSqCj3LZ9 zIG$6_QhlhO<}@_CVlqfedhA4KYEAuPt2s$WVQpdI(JwFFx!>sylO)#s;qC-W!ASNg zNKvFsbU0(Xk!mG)993)|QUqgux^Z!RARzk0bDwH;WxU;QEh?|6Sz#66LGTYlDL^k} zPy7n&wqRMe6J9fcVcZfdC-rv)uJ*8ThF-Mz!94*|l81Rs|LDVsJLq^56U8(R#u$A) zGUq#06!cXhgU;re-vW((Q~*q5P-FGr(Q$)C!MGRV32yC=0*Tv`8EE=hP~3_P5I_z# z0S;)fd+udfHDpo@#Sg%Y_zI*Sa!=`wNZ*hx_=E`k9G^PjION{U5mnI_GwZ36&N zWSU__XOG9TG#G*VyJiWwJN;^mnvKlc(%oCJ@UFF`sw?e@|2VNc0HwjCf;NeLNuaZ@ zI?}(22^DKL3)%}eivPko*Qz{u#7)M>m&kT29N8yk6;8;U%qw*&jcC#r=M_!Ph{b~_f88X+SB*Pl_FlVGk2YUB0BG} zs>*-zoB1nGnHVBwBAE}#6CN&>KRP5O#q2c+2@rJSb_ncKtG1fr{JpwN!fYiNnFd&S zUGR46MHtBF6Kw?P9OLB)-fcup&?-_%lekx6Zc<2_`RjeeVlk(lcpI{!1wLK}l3xTB z#)sMNwQ@c>I(gt2$)ti+tRVOq;#GWMbet1oN1K-%#Mz0{a$k{vVz_E`-{RTVRxDU4 zK@_<%Gf6fd^XF#;Hl*g?k>3`+wX_{*<3SB@)I2?19QRsrA06tdP^8zNd%Aav>En2& znG#*PiSN6T23EBQB6rxAS06>Oh(x+0RNkj@xdhWCaXu5UUs%HXao-&lbXuIq`-6yK z%W~;OW(!SHkk|fEBo3}umK}`~5oT98G7hEk;x|1mida;+Ye{W=(uv6XC?oLeCX=|Y zDj#}CE=0<%PXrv}jlY{{j9exdbn$%$D^9&4u7`UjdbijOw&0;>%cg|A8?5F__i+n9AwT> zDxLxQbdKAF*3!#p6kmP)hS*z*^!RL;!YwY=;JK-%6e2(WkEgQ^Yx0fTJ|NxQ?GI48 z84ZGI1SG~llx}3B!_oO%KF{&K|KK(c;h5~Y?{A#v z=lni2od<#Vin_IYyQZuhq6OrZ`3>y>)VX@UwH12 zmq0|!1l^hgri^}`HC`Au(}SC09yTWzGsDk#4bkrx5qR>dhI!ZZ4h^p9&iPKH!_UT` z5niX4jte)FpRpQX*;%=t4@sI`tB%AH_-U&s<+`3J#oTMD7(Gf;}*+Q$Hq<%0VqtjeoEH1InF#LL0Q&e^@P^@>~SzJgjX z`6 zP5B67(Z7{AlVWC;^&LkZO*k_cAWTHSxA)yaDt13vcEYC$*4G>Hbk>c>h$gh|MiN}h zuR?D48JIk-aQ2uB=);vtCjM*+%Nm0yy8l3S$KUaKu%Nmpd)`iyoo46em>jr%NgI_xvwM0xUBFRyR*NyyNxJoBd#U1$x443`Ri+!?yRKYouLkstC)&@Xit5DBO+T2jgw366D zYIqOOiBy9SKCaHRN&X$ zHYJqInDCL7bia`;Vg}~s965mSlwq2Qc?fAN{Uji(UU0|rUy4TC^)1qD=g!k=L8i=F zCs3b;CM}+hPWas_xjdMHL(Y$KAn9#Wr86=G{iEC2rXHD#=kZr`Yo%lnz zT;3&=0w!K?`l3ggrT*VPmp!keXguw`8z~O14!}2jKD5x5NHhQZZ0L4LZkXa>mI!E* z(q&X8!r*mdP=>*ZYVh$vU~tEkQj+b5;gbFCm+RzhCwszb7yI&RCxfm*SL-<^e=o}) zq@2nDk<>%bNm&HninT-{^eBhh1!3abe^VruIH*K3_AYW##Fwe@55ZUPh&3F1mUn|a z&AqZibzsn=j6pFl<;~9}L1|IRmg3wWM!>ZO5gn(#>|;<0)a|#qqVN?*A0>qtOz72P zotkpI+_OQd*hDxHBJ}P!lGQ({Q_(wfL5<=!NV{}X(OH}&&Az@kWMdt^eQ}VaG@T5m zL%C6+43{f?4dM#dyn)Prt_BTe(;@|+o+lp$Kxd89T;u(?f>Sg0F%QrOa7?Wpn|Chw zCok_F1GWObq)<21Jzein#hmahAqHr2q9Y3)6wjM%L@~zfC<6>4s<#P;cv7V*CNY%L zIfSHGKVPeyh3i4nldJw4LB|JyDgkE<+^Xkf>X#>iS4XKsepcD)qsNHyUS##d`8T+0 zx|P{7p}BV+^V|@JnG3$~zp5wiEfw+IxNAm_S8h+OZEM%%L||S*=A|sfmyX@%zUo%j z24BHw@_?4xf~TGcCBO^JCV3n$fpztI;NKpHK|^Tl!oLIg#&!5|)pTz&c-y77@|ddh zqg@*vdPf9jd4u$wb8G=H#1jtXXCZp!l?MfY5Q0JWI-dwbI6Bh+_Ew>v*Ja(UfPFlp za;W>av6XlE% z1SMRGzKG#zsdM=xeS7cz24ig-JC<5v6>=OcF<#gv%o3diM#@wgU#}ehKNrBIQ6b`D zcF|V16{~7#^P9?mnpuTg{P~aj)IAZOZd5yTKWz!|WBVarihUF9b`nf0YtaMWw!P_Q zKKok24FP~r=y~T}76n5QaG1>Jl4G)^qfP^*APo(&kx4InCo_Fxn_E@8yxV?I=zR}+ zM^B7plu_d^B_Df0V&i@7G%5KAAJehFn~*nEA>^k^WRzQde~zDsfuD8w%NyjtTIbb9i|Zc%7kE|h3BguQ3%M?fOYdvB z=8FoEH=;Ej;quPffmlVCDa(tiQ1*C{y;1kE| zmR20+NwGQp*y`VdQgng=MBnM+7xK{?hDMv@0P;1jq+*Qc|6HQ}^tZz+s{nx*2V-fK z(uMQIA#%$8Te|)(!WRfLNc~*)S*q(-x}Bw@*(z4s*k0bp*glQ9pNVROBV^ApbHJ-d zqV8b$U*IYKm@(_JZJusp6D(BPTRM$MucW*^l8bF?g`HAU zTjQcnUaG#&Ic6XkbjMmJc4e9jVQ4V4cx%^8;PRQ@=gA)dnbW<Qi%m>n@wvjFQ z^^N8+4E?8^B!;N~Rd|dL$w}@ziS5X?RLlWFUFH1+1?6#5eBkCPUqmFMx4EN`HXtfY z7STLxY#{P|fQ7>7-Je)Oci$_#sP~{TIpQTXP=2oi>2?)ce10W( z9zac)LeO=(t0|dljq9g3-bq8hDS%$9++=MxJY~22=q|bzY4_q|=9}yUy6XNl7Vacb z3!X=uN{4Z2?;p};Ed$Er`OJ*xfqz-;%}~jxrXE!nQA>wWs(Qi^RCCwpXA%O$7TwZP z{C_+WA5PEsMI>qc`8sbU#ozJwk`3tXEfAF_R$W#i_Fx_WDl}+ zR<8U3^})49#>Cf#E6xWCLw`Q#>)#*l`tV&pF~JZU2#Wes2f-hCML63*l^;{#q2}_V zuK#KHYJ4lFpeHR5q1(4kLmA9%?m)X~F&klzd;_)D5vkm3uYdl)J4hCoQPHj*&|(Cs zUiV?*=A}Du`H>YZNnR<+;#wQ2ItWowAF#WONeT;5-=zy7J%)ufq%j2{Txd6T;!P?o zzn|;eoRVNBQv=!QiCQ7rfv8)o7ArNE`OW3}f)vvkYV zm&IaaZT1EocY6GCk>)HQ-6+sJdzO}(uYmXIHq(#(?btTCCsNjbi1qVYNM!7}yS9*h z)v*0dlRAv+mlx;a`C*IKN7ZoYCtS1m^s_50cm_G$h+u1mK7BRSq(oK z6NeM;+;3FiSJ|?1m?x@FH(SDD68D3htE>M^2y)dj<;^>+zntax(rU`;fZCt!O^$?)v35nFFV?tp;=5qHSdqt2Sb{D zMCNb840v?PZMx@6xuU~c}JAdw0;2Q&EI?;F;l?B>yFBBe`X!AWOrI0>>M z9+MOrpNcN!ne;`Bo=7!(`kwx#X=35j>$qRYjx41uSC_?A_OQJUef%LZVws^UV|-Wq z61D+`OqxQP(EgJPF(VV2uK3uCQ%M*%-5|0`cn08K?%1ofuo9;osJujB7i)cer4k zWz4R}d?w3bDvjW&16}nLaS~HH{<{zX`NjB4L?^r0co%kMdr9}NH`3J-S zVW3^|mA3>2Tja)qNQG@nk-f4Cc0k;Dh1LXRk?~JKM>X=_@4FuXum~FVDAvC(5l**S zL9+78V%~xA>~NHQji89aQH}WJSc}Di5r0jqz3iEY4SnV@M+WxrSO0jLkK`^&xaWia>$jhe7^gcKn3Y$K8R~{1 zTXYv(LFHB6I0#y*-?9r)zeT=3(pE+fpd8=*6E8gpRip`r7Xw_*Du|(44604Ew`k|$ zFl>)cS_lbC%5QspSlO1CB*6p7%+1x_V|tu}!!f7KA7_FF#pO}HxA1}|>Q%*xrjA_} zO4|j234su>Vp$4W?oa)_DB#Wn`V~>|=4o0IZ^~xJ`NRMKzcEl*V7Q_%x)$Be1GEq! zNAc3EM9*x7QdrF?r9rFbV|`F-zw{H|_KaBd{8j=yKsz$(eE(+4ppC!ix98rF5i+UZ zQk7JPlN-OYvaE>4IG`7)RDqo7)RaYArMU`Kw|IfD&UvDLt_YU=A%`s>xn!h;YV0By zQ6U#^;_{GS~mS=jV~ed)RBWXx)XjqIFUAAAPoI3#a>BDi?hdCrhO{Cs+FlC+q7LdxJDA znwQuvards3z=2y6N(B86=Wy!8!*Y8-Fh}7G!~y4fCvBNRwr@mm2c01*Aq8GV>XWgh zG{;L)RP6>MEtkn~8?Y6`eC1JZH=F-?M`*HgsJoT2H{Xb{CFE#v>IMO(dH-pagILj| z0B5NfKC(p+P1W!!Yd0(mJEKg9BKu6S62y_GDjS7q7yc*IK}jMWI+6{n*2#m!9BH71 zOSHod|7BjhP-n~5OKbT$SJMrc$w;!y&BD{U)h=O$h-Eb640ORc#CTgNBlYr{6oPi3 zHK5yaL2QyQx-i65k4%v~gI&RBDtgk3t06 zqEm4GQ=}Yby?e(6D$Q;~{JzllKKak(8*f+{@YLNMAj&Vh23kZow}uwCY{^)3_56@i z9)0H@=-yAZy3r5w@cD_isc8ksW8YUATBNmAPK+gWOW*c{9f$%Q-VFnYRV6`T5DXl~UkM zKL8*_*WFd%Hs%nC^50-ZI1uZ0_w|z<@R3r;#Fxp(rhVlKLO|)ZcV0iO=?QLmQ!*xH zdDBrm@NK^a4eXn4RJqL0mZ)cWOXXgf&H<>y5~MXEO+cAfh23WP2_Kawaz5BdXKJgN!mB%_{6(2HS4oL0-hj>-S4Hjin!Wh~8$| zEPl(HsW*t=RpOGMOj@n*9^A?8sP|7XsM?u-z2s&dK{MR)G{rfV5oWN5*v1t$23WE( zKm4&;b`?e@;B7 z@OO4CDI!)6@KYf~+-cDdr7#EX)7|3)M*)8G(GR^0IrNA}71cs+9ngFai({pHZP;6N z!bq89*t6JZEBjr@$`Z6q=9;19a~&Pszl$ugEY<^G-BRMMEWU%or;hHqBKDS!6Yr+9f|XqZyH4L;Ew;NKv? zdhBq=`S@yOmfws33%a#ev80AVA4q6bj&<|>2rw@lD>^)rVKhvYJq!?<$2$~V9UmkU z2lYA*-agGM%#!*+gVX#lOouNHX8X0eZ`*mKBN$S-pNA1f_-ZP~9iZ=6!|>mBCD3u` zPmsDX?1^i8J>u)Sgwt;2QW`p_*AIO<&%vur$Ytn)s=nD+O`u$$wIvj|DfbO;pHF~t z;C8xde4cKVN?BYA**l6%@vs2dDXeDKE1F+Dor7YmYTQ8L0MT^a=K`fvK$78{^WocFhpv1sE9TL9Z8#hGyROg&ewS%idUKKLh`Fo!Jqtks8 zsh9#JeUF+>=IR;T-)zA{d}l`1j@aC^o;h^3nrFh7yQBJ}h|~uM#m^v@erGfK`v~tZ zW~Sw{;YdICV=MVSFn(^Y4d%%<{?b?Rf}+ZI-g+xjk;eV;h4KwBvxxP8mr73O7+2_4 zZs`-QtI#g4M-=_JMJYDe`=Rabq>8_!DW)NNJhI?4gM<*$ez%W3t_?m-s=uC_a`lOh z)T=gfc%I$ON1pU3S>q{;+nV*2GYY1a`6Xfvi!|@50z177TOb{M=xdiXDpo*gv3>argLAjUvkf@r{qlui3yvJPIqQ5RQ8r@Q$gR zZX2j{$cF9m6EssXyQOj4Gx`~!c;38l3Bz^0g0&t%tieSw&c31lx7ls?HEg)L!EdUx7 z4iiAi6w#vFehKEdAX{({j;u=u1N^Ud>zu8Cs+~n+D_SrKNXYYbv_Q-Y&dJ)|z#=hg zEMspdyPB~UM5n#+0m+0)_As?TA`Dud5KEsvI0wegVIaVcB^dKcR(WQXV%(}f!rP>& z%8pT4w?^Xe5+q-w07?LxCPdd^|C-$K_OF;DK!E=(F(6;h1T{0ctUL7n{?@Df)3e^M zyeo*WK&LbDd34Jqt8$K-ZE!djLoU0}aw_1W0>j%}P)SHyXhYW?r8rdY|FCkIswM%) z!ydUMTRQh#MfosicdDKSsJqj1G2g%pxD!d7x$Cy929LMRxLF8F!WPrl_AK?MMx4$8 zSWZ)&FL&lmlcX|7Pj` z3=vG3Kr|Hr;sTr-}3@H zjKl_Z2dJY&(oaiS9s+4t;Xjd2`sGq7i(lE`ETqWnActcb6EHT*n|w)doRw1p=E*`c z7if#O-XY1lz2AUFSGp}X%zvf|dajg(`S+psQku}fJ+}l(`WRE9)d0(o*f1pLO59Oe zm$HhMGJ=k;EV1w&#~O{XBOib*mSy)>HgWuoQklDII5g7k?Ld|50bI zmzwQ^&arv~RoAEVZI?4*DrdX3es`(>peAemp_WNF4)i0;vjD@aAx`?>?*2gURf5*6WubN zq#*Y%r6Y3Xr~VN9bv|}e@oyZo%v1Yylm*TgA18P>0skA>3Fwee6AV{1iU_h0W6>@b zfuZ?z?r#(Oqk-=+AM3Pdf#a%DWtUVfFP3Y%_g{5))Vxo+NB_^v*A$Xa9mK#660tE zJbpFvNWEo*sQtW>Wv`2(y^kkkfhhNSglewYq@#0yMYBnTPzHk54Res^{1Rk2rNxT1 z%IhTcpb0DfDE6f(r+Z+C@<=|Nb7KChsZgf(E+vVwUb5@1>6`GZm2==KqZ>0X?ZCZE zwzue5Y@x;pP2dix5_DD$@bQQ54mHI=+q-(}zx4pRDjGOy5)-(g+2)7oRgx+IL&fqY&JVJw>wbjtFI(FM1-CVdn7wwFUQ1z zFTGAy1q&{{^}UL>(1x+?u_9YvhAds@bDP_^zKAYjx8hB9dEfQflELz(IJ%_+ZS+Gz zhj!(NH=P|i86gYGPE3)wgqh@9ix-l+b~dHO^#Ek|raJD33?u@@JNVX@+_Mvj3h?vT z@-wof=a}Do57v<0@G2|b;IC6Arpjpm6-`AIg8?^?oDBz?!Bpg=q7PZN{nzfoo}4Q0 zap@rrDg5H|@uHF{!WSO)9Bex+RNcNC5W1!j{N=^8V)rk%)|4ok}9c!!ywBKp?h zaipi{lAm*qzG+0PZ3KK*?!~~%g3leW8>Hn(L09;+7tM>+zvic$WZ~;gjTRkV@dQGa z>hgSCifvaHxLC+cu}Nun%ZSOBga^HP)$4w@<*7)PWjv%m;$fd8z@)yCX8dF-6JG*X zD>+&){22Yf`6WsJ``aoAcdI`)cdUP*6zkeHi7I6GiX{1YX~kj-04`9GLwI5ovSXHB zjnS&ASSYrJ*-SgfcR!kuA-FNXpUQ)cg&2|zD{popbMG1((51F#gszvgKl^l&GrF5K z1m7sbF0}r9CVs6WJ)A3l`PDc5081k&iWcvl{YIewU|`t~m)BW%5uU7}tL!&z0_$r? zd(VdWI&@;<;6OyM8cq$;+r6|K6J*x3cnOC9yhgGlbgVy5=}I9FvyC#^QA?JGRZBU9 z8SHN#F`F&fIV8#Evh;nViBInP@PV?v7yDsVX2?ACMHF(K$fYHX%0Mz-)RSOF#B-pE zzX7UV?ipw;kc)k1&)$RE8c5u7n;R6w*a(tuTy9 z3Gz`DFF%$P7SF<04pt374T0)6eU%fR#b z`!@=TTHl0e(zh$f@fwu1^vcO@JcZ5i>|hJZOe z0I4hyWa|>G!ZQ?KEV?BtL4*sY=BKF*e1`Wt#`$!xDPHZQwoxDW6u+=m6aL#QFE$hI z@kLXj*Ei!T3xl|>vWwJJ`FS})^62(FXzXAWaEj#+aR25OR~tc|ccB#s`S_~i5+B^P zhVn^2c7F6uosr6$LdshErcN?6#i)4P>Q9+Bt7^baLBpxoDY${<(3&bM1VpLFm)ulp zq2(42sj91Ar6GJAO#Cdu1S|>b-V1EGaxJYh$I)It-T5$lpY8Qq1k3+eW`4Igm5I|0oSu+NR&@ zpFBOMuLto?EEuGU(4)4@qB%B1X+!|(_D-(7<_mUvMgc3w0LTEp*AMa|jkt0up_h=C zIXA`s!;{(E1bjt-TS8%O5XLcsT9*SzJvs*?(aB-zv-I^V091rZ2_Egn;uD?5?csFF zDurH=|Mdv&>s;Xc9TF~Dc6&^!IE1!jV%!FG(hq5{r>NNFvlQ2d*H8KK^eWFB7q@*Q z0}0^RGMIRDFyM@?_hIbbju7kZ?~72G~9xH}oh8nF4$lde*H zsqReXek8(rQjbonTM~MZjgx8Y1HiXaN`R};a8Ncwiu0+o>)x0>g?9O!;Tigog>pG% z>c!1xyK?i~r`xusFB;J3PO^KVgejDg43THw%q`Kz4M2&-*<{LnCPX7L3V5~eubgNRw zt%+65K~j9lpX#sl+22$r@z{W&=p;ZqA$XU;B46OJ&&&AdAXNO{IB?n~;*aNAlZyDz zPAtLYLF|^K!mO8BVi@MLhZ`*_Pg$c5g(H#V%}7W3FhDYRC{sre_4gmSjW~!G`1{{i z9eA$>*K(ZyspJ4NFA2v8Cc<4SK|?dRvOq9gE*x8EDA0+sDg&VOfu*(XV#M*=UgVnM z?jSG1vN1DTSbE?$#E1A#08EWsPO$UT@nBb(`0^~?4J;vkN&~gAv4$u9C{yOVyC~^f zns;NNU%1mJvhlF=ZwKcjQh{P9a3GMiz+Nl(vRnPPGT z-USdlmW|GCW2|_w)bRhf0F)@?7<64O|28EKS^GT9etrwM0Cb}<1n(-pM<~j&HwW#! z5=H2Zp9+g28psnc34D&?%|ifz3bOIy9WDB#w&{~4jFnIs_hD`K@HaObtfz+OfWAni z`>&l&^%ijz6o2DoRYf+YXa?l^{T@`Xmh;XQX~j4{cezu{o$0Q#GJv84YM#pJ#KZE2 zhz`))h)rr3ZI?G#YOOqHB>)?pN@M)9@k8Y*kKK?j!JDGv^C2W0I}6`Sc&?(Tc%WV5 zX6J;m3m@*_wn6!q4q!!!zw9bvS7%;MV+gW$`>t}kOM3%OHVE+DDj7M- z!!#{lzSr>dh>$pGSDsdv*g!(om_WM|4N}*{WHZb#0gj*}ad5n)yM*f^vMGY{=#8hCfWCp^#{w@z3-%Psz#@7FE+f8yWfad-iq@kXLNET!8VeW% zZTh@y=;b$Z6uN;3g*rTfd0W9jH zTMhH2lioxhLd!G&JM=nErvpR>wm(kh-je*d6BIQ~M&9W5@bb(;XgB@TYFi$?zi z3yiN6vsM*Hz|ds;&loNADCC?Vh$tS8VWCN$D7p+(k#XPpF?0q(2LEu*o}cTVtI zMyS8x!e&o;Gx?;w7t;iWeMa;!-S)4C^T{3+Y7P>t-$gp|mZw%TiPyUzp#h-^j){eh zjcpW$y9s=-ig}^=bCDOAc(bcNOWdlE&O~f z-bOe(SR_xiK#FOqjj3IY@uo7$Y0w-uUWlacHt^W`>Xj)Y+un|kcHH^eR~z`t4j8YT z<;LPlk0;^)dlnmXF>^kYKW9oc>eR+=xJwVosC}y$uo;ZK=7x!*Jh#({Pt{3K8Pc$8 z8h~R(CD8uiTSCs#zf0i8@zO-BEUQh~0CK8k-szst!|;qJDt)!4In9N-3LIWnTE;OL z&}ChNCMz(!(|^L?SDgz9OEYa$02BXEGpSLVK->W;Hph(j%g_%`ADuE&+BR7KM3y_Lozwv{t0Zr{ua8Qy&LkJPx5aci|1 z?BT4txY965%~UXE@iFZ!7Fe^js#q#c@5&;i&ZdKg2%hGdypGv`&tjBzS1T-@93Q7Ojm8{tkE@|G<^v} z`@i$W8?crEF%z-JaV@X(C3xa{r`IW~?b;O&lb-~g=iM)dh2Z$0mN0;fo=LG>D(f#B z7SVoSLRi#tNmqdj&nUj>G88C@pgum(3^Cypwyu@@^nshBUli+xQ#4Ue4LcQ;M;&@> zQ!$QJP~*edV>TXqI8W!pRXJZs%c7>jT5;pnqhW?mdDE`X(Cp6@QDGtLcGQ-7z$o%S<5jumVT0irnB9=#E{^nws6!gey@@UAx8 zKwhcSyXKcJ<~duqhs~p_Agorcun}86kvoa*BU|O*HQ)gcyxBXGPjz6Dj~BCUZjcPC ztBom7l55%Crd`KGXdBYRI1{4AT3TtbJH#7GDTlBdJ(bQjQ>Mx#c{r$r#nadr8(SCY z8K6`G13lVSIm?PxHB~th)A(|>66x6xYM=|aV;RxZJV-40W9ax$w=vNTnQAXWO%2$!b0#IRUG(9~5_9*z^9i4yM}_=s?PWH-T>M7%!r*o(&Cr z8d%$jzV^K5QkW7;Akf`&n#XSjg^E z8jaT^=Jn5E4b`?9J1$c@ z2{$4i(KE&`SHWzf2>HKv6IC2Nzu;qY#tm1=?GhVuh=f>pXz=Rvl@>@fu+%d@Tl)Bx zeM_9DL;c33GGETs$G0JqMvun|y#V`2e$DsZZfU5qvfjB>;C(82re}pxmGmO;foj=u zMhfY8NfEL9PL-beu~0qWJb|FX+aw~k2>)_W1X!7AN_-i(ja^vTo78?9t6d;^i&a2V zvmih6EpJV5(3_oA6i>|ky@N$k-!rqjxA#imAfm2gEEVs(mHJgg^s6&%44mXRPB8fd6>`> z)d%a^EJjbSf{;ak zX33zaa97+`kS07uoWM<7>BNtaUxuG-1qZ*|5`bphkrz5anXS6yGTbukep}-ux^o{4 z+E(>G4I)sU5u3}?%QcLmxAZz&em)%%)&CwfYw}AdwvhK}>^D5)WJlj`8{|T!6j6Tu zmfCj(o+tmF1a}|<81&A+f>6o;&r8W%(u+{=kR#0LX}F}flK7XI2$38g%i}G76G#xD zDTa(sll16Fp6yH>I%OO+XcH}NhzjGMtc0>bU89e8_L zR%(0y&BucKaU1=`4MTE^Py(;7PU3~gwmwk#1JQc)GxOKqzRwqA9wmMtx21*bs&lf* zX}x)47Mb{G{)hffG$psv^FqZL%%|T!mg!1>Ld2YiU}cIeW>H0=RpQSd;Z%hD3oKBpSI%uUsH;%KsW&MAN|G;z>p zn|CY-Hr_+4&w=q%rFmRfLGAg<6mZLqO9RVC^ePDat}z42(9-F_csFn!Wt$4r-j{tv zZee&>m-oj!?v`1=Nno2v^Et;-GICSM8rE9qR1v*AZG(@ZDxQt~W!RM(bD!75jdBQZ zdrY%ezX?Dx`oL=CD{yZNo8tc|DLBnEl9`egf&l+D_uG`bx#diyA)(}~@(w`1BFi>p zQ($@0$M7G^Vo=wKVx}YrzDv%Jy}yFB`g`KPv9C?A?p3*TFV0|MN;Y4X2Xql!WIq5c z$kFG}Bpmag59quUWh`Vt3t9zas3P6}mW@t{mH?MT_HJxHLQ$m3a)+D<0UQbT+?u%e z0WeVbCh%GpTnJOMm;UEzVwS=FdUiDv$~1wR@5dx*@vb zOKzC7WxC*~TFAat7Qm%PGQRZ13vg6L6g2hfWVB*DE1~t=oTF_nH`p`WyQWt;s&(+O zNh0!A+wmw$G>5TUml9~0Zfdl>qLBYm0>Y`~7ZQ`o8?06~z809nfxSHwW2)dng2H$c z{m0iqWVu{&8Ai>3VO zy9Lrzwq*f|C%JwMc+(q*2M%hn>0Vfp9X9TJl7)BWBfD z(+o4M2A^`Sm=m(oZmuDcG)8$!gP6aHxh~lZ-b+Fy^1-@209GmnbtWdm&?x1UZPdZd zHb)QUW|<@MPxfUVTj(VI1?MaN#_mdqCLA^O{?||;9C6Pv7 z1E=2lHNq2^^-ZrmIq@(+YJ{lAlya{r*k$Zo2^e8kJq#=E_aMB zJg=E9Ja-$_V*a7L?6dWsv z?}_6ncDhHb*`~_?l9#wXt`DR-?Dk0b0^3JxNT@{Kta4bX@9`Bn3{C|z{BOdSi;vXT@A()+mD-4Y5t|(?&Jk^t zZ6r~U%9fE)YMfJX;7UjDr$#Rq0j*G{9*Xl|s=l8V!LC&EN_BKRtsbQL^D5D3#gbOG z21a0htKBTEwjK7f{qHWUUFq)ovFk#2XDecwKoae>AS2HA@tSN*E;%#;n<}L=f-Dm@ zcI}_U00HUqZe9&JOFd_Av}>$~(~MEFi+b}%GI&gq)?Isf`baJ0g33@g2lvrYmHZ~P zG6kFv>Cdk$%Pe>QuF1S_QP?86ii5^HFL0S`{PG3PF+t)rg3K{FCd6RevErnxm$-al zWC1BL$kFO`;_pwRa*-kW(n-h*U9O(&nH+C)Ykzs-z& zy%U_Lo=rFH;2N8r@13^w`I{fh!O^yNJPw2NvB!P>&p>^=Cws!yHLHFQrzsc1zKogEiFZab84U%Ob5 z)13QwvIAK;LHpm`n1Ui+PBd5Et&Y?CHK@|%x|J~|ToAiCM2XE=X>deI1^;mMIi*Cr z&Ru&#>6>>nxh4sR+44ZbyQfx-_;>r|>!-Uy;g;-&I68>X5B+gP&1JDwDiecVA5DRD z=I8qvqQd+)>3E8wqj{0}3J11n=YCa227R{SPZW@Hw;pNNkoalsV#(s|Xby1%ci;Z& zwk#jq`yumK6iKJ3!|?Z^RT*i@9W#AS-Ru+t{hrKk`iUZ;>n({CT2I;egAMV!iJ*xqJS|08ttwBkx`VLk85MKL0o_c8s4H->1q z?RUtm#Z3I%?}wDX`kz}oebiaK1DE;Bw)I4;E7<>|OT+G$SKp_9E}6VD?G2^AO&t;t zK>d>b?WkpvmaB`3u(gd5BUdyufh|k$tR@`)6EWB0B)%U>q<6jVMB!n{|H}x*wn*!< z06Qi!ML$LJ;bTbrSF3yE6grN)hkZ2R?Gv<)K`~v6yV15`%`vDzVj0t zTu_spgS6?ayWxdnnFUlM{2hHfZRUAD!{^%3A9*7>{TaJGi`BBj8;nXhIY^6i`MMAhiN9VZ za@VrzrK`m=l^fWsPS;Wn8-EEPH#0jfu7WXk>5p=@b1&|axN7hcTz;?Yn;8RFxUz`e zzA>)0d2>=q(x@rNyAgGy>-P`KZXrZma5d3oV$Fu@@)mJ1R^?LFNSfN|{O?<2hPX#h z&nIK%?iqezpu?TPzDElcNePh*f_uF8tdjvqHELW_5MpinCde@uyDCX*VV031=WSa; zaj)&OJdH>U_OExuDuuB0$cwiz{YWy_H!hkUiTG^kv?f&HBP4!zc-A7LU^2Z=pBBXy z`U}Z>noa&Fh;;y2MRsWotvm!dlU(0P~jqc!#X*`7bliXY3VU+Suegfs=o z`JhdIEVf80((N-dY~XOPSKIb2{%d_NuxQu0$U_;2!eTqhZrpY*?(WlOf&l?Z>|yv5 zUai)T5kKEjN^X9;mn>hbB14xX@FMf2am2GUj{V7Le?RO!iFx%lEj+JyclBxpo?PA= z!OFS~*Xuvzx3(O01C7Y}y+cTk;JRTcBwY{tFZ}f%!kEg%3y-f|6QFH7=w|x0^e~G% z?*5|2{#ORZWW%Tax29Fwh#40Qu-hFi#GkSb@9BNjVxQTpyKs0t1SgqM>1WGMc~pR0 zlQ-6a*AFwTKmoX65YYV-*|R}}Fir{|ex9gp_55ahP4*)Mu+VmS$Qa26a>vJ{IKYNS zR8khfD3uWH^uSZM_`gav0sk9Xpa3<0c?(ZT(~BMOAO^OX{qGvdIDU@r3oDwMQj&1e zG_#|a)~PG}n78OnA^f0MlCe_!)m^!{a*czWaL+?IInH(_NX7&g%9CvLne&uM{g{9# zK!3<$SN?j;1{(yD^{)p1ot%hq`NCHFZZSTt8v(TYG|<&CzQ-jk|)5Z*k<{X*S5G)_cBPj zZ~rO0=OaJT=VSTPBrq14=mbbkIyDrvv(#vz2H!bmSr7|0C-750Xdh6vDmIrIDFLAU@z#aH2~kXxz#;UInUna&kH`J#ve3xzcDvfYp;wB zh`RaC z3yaZqD+gKTEzf=aA zBi+5A3C*pUVD+OTuFeWw11t3Y%H;8g)K<`;s873RIv_wf2|3O;T;p@g-O31j33kVu z&}6u*@(YakLtJr}tS=E*uU$;utWO5KgB0#i%9K1mO7JIP%Kjsj^A%yoD?)?(fS<&u z{Gb!Ek$a9IGO!&=)a?>8sy_Gnj72C&pu0J3C))gNz^+vBtAq+p^!o$4ZSG!atU?S%%o1c~Ks<7XWg87wC!+Y{zp zGnMUxHK@?zY`FHho(m9xgQGR-a7BJ~P;yh!*f$$zj{lDU3sNj15kr}157yp;CPrai-J9n@ zEWA)@W-kc6dLx{k%X^v&-q0`f@?c7Sx4L==yM?(@H?A@Ty=?KVAq)H24gPTgp*+~n zeEmnZ?NJzrmsFO`NJT6nXUmNPQ%>7Svz1LiU$wo62t-w?gjY(aC%cQQ#z<7=_Fxyx zdK5Ca`;3k6<^!l2X!W1{n_+_T-vd|@Jj|G;cAr0+ued`^vme4{najDoa$&Q@1k64SiJlikN489JwUBHrl>E+0Os z(E=vG!YAzKsxC4gJ=&d?d1_MMHf&&k8puu@p!=~-Gfb8_0}gFv3}ypo9U2vmR4uwB zt&kA~!LrRB27w!LLXIITukxjjejJA5A#wg>zqZRo5-#M?W-}yK8M}Q+BC>%~vJIwS z;d>2xKV077uigy}|3f(7T6;sGf?m=$X7%q$DF{9h7IF@fX=|?`n~-qtqDsEAkjU|^ z{Tp~jCz)Y?nquZof^h$HW(*DPHXd7JMqo)9&v@yJeR*# zaTHJZr;?t5}epVCe1~x`xj8_P5sm z{h}Xa&B9@3IQyKv_l0#f#n7*l*qSXXxt`IprUPkZqkgZ~DS*9=^QNHs~!8EptB_7B#OU?k7t=gsVAp_x||GQ@~4g zouS>Wuxm1g*|{94Qv3WE;Ss7y7kt)@HE3Vn@sNWL@v)}Cy7?bQU|z^HCsEz0iz|0F z+{;in;_~PEUA=jR#G;Don96xb$jGA1)G#}%k^Wg)rmM_1VSU>#r)P*) zl>A}H(t}at<$Oh;JDFF)SC>|+H5{V+rB+-5&bbJ;TeX<jDUUw4vAy2=VG_nBx{}}-- zMHRyXaxCebAtKV}KX9a2{)mnNyA>`X|nX^*H3m%X&?el zwcgE0sN)huz9~V@fCr)pFGL<+`89Q|97S$$-%vc^`SmA96!f*sADl8TX&nj2^TV)n z9>1;lN1QH<$0!y^h|`(ONm&Po5$?lLWsQ;MPbLRue?|>UCBLR{Q6R2qHN4xyKJ$!R z8m5|}$E#A!?-$HUGMQlPGq1_mGXF|oo(V-Tkv^d`UFUiAY90d|z+rn1pAm?{~9EjG;D^`9#AbQcPUQT|Y1Jare@h(KdBBKwSzW4sZL zmQVkJoXMBwr7Rw~39hVGI(q3AR)Vopy<9%qV4O*QJ~^qaTsFvHcXE(h6k+!%y%kc9 zXFe3X)c)-z$t6fql%@HBFa(ZYJKqj8^y3#$&ylU(2km1qTmOs`SE?!(iUMPIV@NW? zlmBhlwYb$v8@jqD99B3Gqzpd#p$;p$GG{lQ_OG1U|90BGSCn(hM4sIkl@7szOE}Vn zp4Q)v7wMJCE7*jtm6W;Wy29JH^W7P?g>6ViomQ=CWb+M)$~ zd_LmF9rv(AZWG`4?M#24PQhq{upQEdm3LMrs<%;RbW0N$y{;S3^wdf{q7`ZTKIbjZ zP2xmC4}j-6e-AKurr7Ld{><1?ftGYDrJ%k5nS@xK=$IXcy|U~(#zeh@@T({5uBRjK zbfa$eIli%UGfFa03*RxJGU9NUuqN;q^7qCO{Q{+AY@xn`W}^_I#3FZg%JJXUd2ixn zRNuWgEs!;NjYdC{HueT1M56wV0&x<|(;j)d@q}ZwKe2*=@nvLF-#B)rR=JSkF9O+5 z`p=#g#!#g1)moz6p!0HEo>2bPm|dQaEOnDj!d}Iwiq}eZd?n-ATrsG{=4!Ab2R=Jb z?&>k%15>WuiW`ia44A1S-iLyT_)w`ZHVWoYq|Krc>$>5cneT}k2$FSLQp(uve)kP{ zyo|vjKR^GVv>UXATr%)k#0T}To~QA~ub6tSx|aLMLIOKeFE39}?i=s?#a7|#J*mQ8 zS+{n^SUil(yu@rLA6N%-qB7sbShGO=iBQkxs^rNH1L-~~*!P{e6oXz#V=x?P-)jAQ zrT2OJSY`XOD%Q9n{d8v7PS31;^4B-5sUky)B+i33Ynjv>|G~POPv6&A=#A!>^$Zr6 zyQluhuNF%wF5$qVVX{frOpl9hI3dp^jxDNTeczWwo^BNxNe?4La!casltrOnwd(0B zsI8*Rn&D*m3W-Cgp?~voA@O^hxp1`491qW6q|!{yh={u)|5j97(DVbHW!kYD+C;EA zxMkpNKE$l@^Oy7o1(Dy(s1X)crhb<)ce^8%bkC+ijiK70lU-Mf!+Pc8(vPIN>-hkd z2GRSJ0D={rOS*M@50QG?Q}+#~ZpH;d+^=e(XERvuEsBlbzhN$#Ofz1OBZVwg5Vna= zfI!lb_CA6}`LZE+=ZJ1T+Uv%*(o+UCW^Hf;{ZH5Me7xl4Niw>zbB7@S=GH^m%XLi|xwRaAbNQ!{lkV0`y9&DF!gkV?%o!gbqG$~98?#FqtY8djmt1EcxZEXru#vQ-!5iJtm4iZfrhv|;D`!un$HArFwDZORY%;j9vnT>z&8F>le{>cqOf+OIB# zD_F4be{XK`1QRaWP*>ibSUruQqHA&uxtpt^%9%gjyxQ)n3hT#}tX$7gThO~=K4}bH z0-k0|0s!3=x1g=V;FHtT@ovvJte$|RN${3?F4|U&GI^O{_V8N`&Lav=(V>$0=j*e3 z5yHLIZ|4_g0W=xHajF*rMl_I0)}i93lV-ko5djvZ<8d~biBpv&JeGr|M8$^_cAO^H z2fv>th?biv47~@==DGlkP{b(y@dEyc0kSLHt&^V)DZOc%pKhM_iNmXE?lKSj-da!N z1>IdPGS7w?uY9nP-n|Q}G)PJYpk&xlzW|w~a0qxt$GF>4EWp|w#TEVmd{@?LC1{(l zJ*gFt&4qu!>)SN+OcVX>mR9hUVII!e)tq3VJ6ns(Ldww_9{zTu-WdIG&oCN28%UD* zJfWVNx7=mF-G{CrH@Xg)!djxlJ>TATef?GLCTAogQ6XETgs06JH) ziN%)NZUZqkYUVB?>AIJ`vH;q*N7m6nHBgnnhFD+vkA3Z*C*g)XsJ=2|BHY(;vM(3{ z(jmnkP}~7ZioYq!Mn@LGqV|se)(j<6@^r%i6(oDHGev{l^!}ykCr2Rk4L9i*?rIJh z&=$(fk^|Rl4^K-89R z?Fo)vVl299$@~1~fc5}-g=ZZe4);g~91|^cP~A*2fs%uQ?y=Mc{(smpdr+3;X}v_3 z#3$y30;g+1;QXA1G!6Y)hNyynaRudV7nw~7R-kH@?6{JDXjwclF^H>OxHOG5;a;6< z?UW8+%tyhG(p8kZSPfBfH2Vr9p=ju@>EzoQwqFA`-LfBTZmVKy15NsPV4jkvO*-_0 z4C3)F>Si#v&x$UZ=wu)6tmPaSS$7Q&5`Q9$AFzcB%MBkAXv?rDYrH_0b_Jin8iAW1 z{e3bRCVw62%av$xHISq1DT|5rm1uPXHkSaZL9~Sz-d}@%%Lz#z>PH4F@F9UW1QrxK z+-;}it&KNAt<4v>t#^sj$CF+`eL6vsi9z@GVy&(FGgjaTagk91*x{QO!oQ>t#P*pb z4sMuG{SbIPDy;2CD+0AR*H>)ie4XpGemYIJmYbVn3B8+VXK~J6 z5m+q$T_@p&u>;o2RkgcJlyYO&4R=yFb@2owuv}Z4PU-CnQQ)W@h(L|I%!-NZVW=6(7R>nW zCWZ0p;S{ybrTLIDotV5WFr1cg$Q6D&F#@?zv=$`Z?9XHLks2n4Q{5`={k%8zcEO9Xw5ie!#L?k4LDJnRh{Y9Q0t|a$a$@?4jb&a z4@zB@vp^FIQ`^j@SO0;fNC%x3qTfAAWqWFv7qNAg3Z z4dAj73qw=F6ne}p7#`0)>b?oq&v;g|B&r#0SBxmQ^*@Se@ILHTXnr9rG{0%vwLp{} z`{yE;Dl-;dJZ<{+ZeR#^#K`|Qncb0{qPz*tDW4gk4ZciNZx*8=KriE-rDM^|DW;jM zuSI)rti1cN4#^qD9|5=Ii3 zMc1*ISP;q2tsnHbODmr}n{DW?>3u#xJ)p5fNZudOlvqrK(kz~bU@-&e;9ue78JZDA zke4d#Hl3d{qjjej;_-$Sw`rOPMSJIs((uG09D3V0wcsod$GYp~8P!V>!kF<`B<<{uhm z;YX2jUnv;JaCpK+hvn&nskWKoQPR@{D>Kx24$y`Gih5ifXZY8p|0g!&Yv%VXmJBK- z(n;lHiieRHwi<+4-I8Xi%ABXBYlNiVSGicPd>fv(+hO6h=1{){p*E1aOZ5>tPg|x0 zy^&l`2o&w!;ZRlV&Un-frSyBk5oHP35H1VnhsVEwaXHJ`IJ_r+*|5D$8!7wxm97yl z^`#}52@dkiclSYMSogvPhl;vV&$mD3Dpky;Rj+fblU|sxM5H0U=?b4Z7824AkT4Vu@98y~(yx9>74Ae0^ zj0B@%EYCwO!3bV4mOnK6@E%VQWcUBbe#XT~vvnc3)ihZ7voy&ZdcJp)3=R+W+?aR> z@!PzFxxZ@fk%v0lPEq5Qyp)<-3XfXk|N5M?MICubHkrIY-prqO3iJ*04Cm?lB$_`( zK|arFAwV_w8qshzdJ0P4#;z)zL<>bnEOJxkYNi;zjbFO5fjHu923fIqvW0Bzetc?87}FgSK}MG_I)lO6xFt`L1-y$ z;!TZH;Fd(pVmgbR=?3vtVS36COJt!Isb&|}mMFL#tCf=@yK=zu4WMq}NmAmM@rvP0 z&)G!i*myRT5;zr~s#AP1`1#8PIrXWa}_#NGbJ>R2yeN_ zAE6?X@gm5BL%l-j@s->Z1w^E_;XUM$Q57%b(!UZBr$ldry)(CbUqD|@8jUTC^*WRA z`=rb|T{{3&s|W0Nj9`XK7vsqXm*;YCw=@&3>>!|#0Qd?&c9buHX>C@Q|lcVUXjwjl#dxWR>MTMOsY)_%X4^9 zhb%0V;`kYP`Oz|5c+y8lf(xPAt7|zDb$@f0>&UcrZ8eiKU@kjMHUqj6J|dwGn4$|Q zJcnxwCAWzy8@ur{Vogu<;O>0sX~T&5uHxgHdxF*Du@Bz9iE7EscBiPL~^#ot{ zc9TeKA~eac%$$+lnQ^cVMJbxOFmDNHn{9p{6>4G{%1L--A5TxF+Bd%HYLi_rm!gjS{955 zDt5Eo4k(sPyQ%bQOw&9hna%m43kCad_^Hpkb-UzROJUx*A|4euCn8LwZiw$o1fy1` z8!%C!xHkL;)_q)gpbx|Z^r|y|I2k5XT1nPYUJb4p#$*(b+>huk$yD*2+-0O z^~f5o!=u>THESSSSpX<*6}M3n2}PbExUqf7)1jpT_l)_KE9xG8K)N57%>0)n7NG?F zg-_P+VBn16vJa*Z>|v*A-n60yG=RxwQ3~uE(T_FJ8c;y!1`w9v>A>4m!detCt1$E1HOAbia=??LV1_LrfN!d7A?7u^b-%!J zL~V&9K1@(!LqrylZJ(<3UQ};uPi|OPu?qU<;Ih<7{G1K)}q+max6g;|F`+ zQ=+qd(XgCs%#rcxEVJ3kV+fFdU|WAE2Fhec{Gmk#+Xu6y!KW=V9ZCL@p7srNqV?3B zoG4o@w?2!L>~RQ#`Ad`O3)GpG`{1|pp#QO_>PU+Mj_FC)*|B)Jjx>}bE6{bfvLvCA z_Rj!U7UyP@LCjk30Xkj@%{fF%LGy13P39ACpe_gay)3f8t1)7$?*&J3`bFRI%s}7C z%m9lwEnEW8=X^7Z>ks!y6lB|!|~>fD$div?Wv?d+1gc5yIi7*aeJT zPw)|GUYslIUf40q_J$;RcZ-NCxeySh4?2w`I~kyZt&h>cR>$ZJD?;3O2Wddr);Oe% ziJ!$7H2;DcGwQr+O!&zTCS1C5U$7c@D`W8y2mv8Z4!2Poz^^vXB$j%FL|ghw$ShEb3!hLOwrTdf5fP(88Bm1Y*Yg*MLC zn4KrwS0$=g{q5ag>uCTU2v7>^e#&Tp$0u3^69soJbO4f zu)69Kq+8dEac(n>gx}|ZA8gPmck8uochy&mhjSK|%^DMePLF%?Zl;yFO2@4o#h&p>1fiTWC zEQ3A9eBs=$K7IFOE%RGJ9lBmCL5VJ_+?J?viuPC#B0XC+YQV?lzWC~4(3&_J31 ze=%u(a@QU*UU?&7^>tygl99alkFO}$WZXCM;d+T362J`FU7vB+_f-IB)?s=20UT0)#7zwpN}CLCy|U)>8ybg!|G3uRq3eUFl-E8lOB47|o6~Y{5?cz{ z)A3rlWgp`Nf*280*rp$C(Pp9tRIjlxUdAQ}dV=A6tL2YN22vf;4zI#}U)gS%tB&8v zC(!J+#{~Dj(97C*TyGclf>gVx9XF$BMwrTNKQYEqj!274HJgdV^|aCroaVw@ zE?4ZK20{JL7r8E*0QCFBP*}D4Svlme=dHSZ7i7SLb?B{>W5ly5EE<%1G2yCg4yHmF z9h2}$x?m}C-vvi^c;A37(DvB3=u#}sYQ5J^T+}^&P7*!YTXd}fq(MG#F$r%t^-|Ct z@E4@P#DaaQ`xqp8(Sqo_2)mh$Rf2`YgwSkKt>cu~JHLI=#Dxuf&(U0pV>%zF@3`iS zdGBNt(xRokvdwD(F%n|6ciRjIf#zmOT7qs)8&Wt@|1&In=k=>izZZ@?s=}UEKIRY;ON-h z9Nl33v!+07`SX{3Zju*N$;SAfbJJ)b#D5;xI)rD(?)>P@1}%ntN`o6;Cu^HWP#TY3 z$-?)drH=APyc-y2`e>e;$BlavY^Ib&+TA7ne1bu-v4bH#7N3t&K!v-Y$5}X2jf?Sp zTgLbdu{sxG?Bo@8*)}cCP(6bD3Bh854Gpuqup;vFQM(2=TM4+9#p!l3@GsXD)eW-Od9Yg57@#szG z_mhyR#0NuiT)Io?V~@5-RkxcarS*dlatFe9cxRgt8s=Gp{d|24k|K0I69)FBGPbzL zM^8b`>31INPeFM8En-(sKAD?paWo~SvG50mjM(5};qi3YM@h#qp<<7sD@DCr>BG?y zBXe18h>GQqV(4&V$`Svt^Cm6$&a!0kOUMY}le15Z91*&58DC7WYh3}9dQ&r%UoNuv z-!w-{tKi&3j>gNUMU|AP5sqd@yH?1THyzHPR2VKmk2HsbcbTH6auSuGr1)JpWmQNX zl;GqBa+-Vp8z)HCpj(3(}RRl5G+hBXv7OVHUVY?!!skoKB)GxU(eImeTEjc5_H zun8fVJV&nBzB9(Z*jzqxE+rVGbV{#T;Av&R+`z>|Hr4SD-E7P9tUqY>xjIe`Nx;6=SYP~IY;7t)Q?c7FCAju}tsXPx+ zO5iEX=YGOR^>TDp4EHU|#QMnE&edk?xi?~kxp{Ir_A>FH9dp48z;rNa^@V8GpNwA( zKYKLTKM1vcn~E}sP7QtuQo_;3dLDw9h1#@q%UX?O4(Y1L5F_g^q(EeRK9|&HqZM`h2*zh$Xax@<~uQr9v`$pn@kNAPai|Rzo(fUBan9Q zj-hzB*FtIkaH;4VPT=`6on?>hr!J;-yM3QhV`}a}Wm!{eq6`(9Nc(ERS+Gz7(gcN{ z@!YXTX>@cd^aIpToaSx!c)cPvN;}oKK8V1aP=+S8uchb>@CI$TZU*NMN=(6CULW{Z z?8*Si!Ql{VP~NG59Yit_;K~uP%~+K8E5{dFThnG1267qRZOxled;L z2;T1MUSOCc5v%Bgy24xdVKxpnkZ>O5dLO7Y3W#Y~9g7gMvKTua@#ThAnr#&r@izhT zUe@~T051zSCkH~U4%!olKi4;gb?fi1hk2PvOkdmzcG_biX(J250A}6L*mP&|w|-FXQ!HhdOW1L(yVg&nnooV_%WO?P&Eak}s_PkVb_qzEXG1~w|FxMIy$ zn}@eV!!RH+;pK*eMGZKRHrbUs9oXpp1wh&WMWWv3lkzW;|HDQt0GQ*hF^}}o@TfN0 z3ONyJ$InaK0?_H29gg@|q8>&?$v%j0C1h{edOxIjVb%?ztB{RAqyaV&odd{_2$5lM zdq`ln<`f+?C`B7*VlDpg8KKUWW3a;y>IwJ@>vd@RrgL+;CXdQiB-`jTCHU_f=z7WxN00)$YG(>qeZAVQf|Rx6oqe^|7wzr)VrC z5Qg~yvBzDfVwVG>wl2J?G3;P=?S_3J;7HqQ5YIFKyg{8^?jXWt!=e<0XdAeAPbD4d z{cod%E9%ET4-^uQw;%mIHhKL0&foY49I*MzmcKdKt4Hp`Y=)2VVA7XGtech#w4jT5 zg>8|HA7XV(O6ea0xT6@?^q$T{xf}d;&kGACpV)x5`xG*N;QE?F=V(9#IHn>`x@v>y zGM70yif@GiTa4-(7{M>dL+T;NJzgvF!~dY*AOxV5&aF?T%MZgX^a zAmwX-lWx=~aDB{@DKmi2TAlGXBB+n~i0I^qb8XteQdrg(d(c81I3#zku{*AZ&Avce zPxVU8A=4lw?#|kA`c7^;mhitfA-RfJVvBbx0@kb;i+pHa#2k-3T+Ww^q3zk5m$(tP zgap>&p(aydi~`*;BxVe*o#V+SZz6a`kkk)Zydpc)W4%#B5HH@#Pa4|{DAx_?q@5c- zQ@zIcU3%D&`Ct6ZLJf6K<*X970^=vEh}1+4z>Dh%(FNc-+<*2%)JbMn_>1U<7S{mRiYa_OWG5{}0V>|?{(CO2^> zlitRC{$fG4p*Vp0*A%>M50PvkcFGNsinf-FO$>T`D$#aco>Iq=xRKZnl%;AO;5uYEI~|zYJL%cSTEqJ<2B4$$_Uy0& zNzj0N4r%i~CgR9lijJsKCMo*<{ME~dcm!(zYfbCYv1>7{i{RB4m+d!}|B0SGAV=|i z)F8=?FnQDPQ*{7Nkpqb&vO%|2V(;ybd&h63lmFU@ym#Y$K3fTj>g==T+)n~HPzANV zQ~{G>CkMT-*YR$%-&p)wU$p_a^-`=jpU%p}e+J&RP-zt#ducPDXSOjhnwhCX0b4FW zAK2bC$U+?axps?bP+}YiP7w0?*5rM4#O=(tdNf1eh2|1y>Rgt-PeLqNU4xA_uEjAr zf_^2lzTPvsZ{ADr_OC*K0uL{PnF-Dq{me2Ivf<(JB{@!faWI@@R;{-IGLH=JDk$V( zVuRntc7tcDceA}xF|$sa1kfZVNzteBQG`pmoes~awNA5U{}j^p|8$x4&} zbtzrn{rH5(tH4(5I=^k|4prYl7xb#9=EbeM2hSKAf_yDO>VQ~_n?nR+lPDQn3uNqM zaOR%Aqfqi~AXsxp4a$9v+fjnUfeSMd=2^rTqDV(na>I;7B=F`_CklLYQT`&(gof35 z7)GBC3NXss-1^`}^xCmL4U9-|^QG(OEl%0$Xgo3bR?X%G2WFB%F+7RuxLPd%_D^iw3f#S9(fy*se09qC*>9E~1pH;uI(dzJ1 zsGj)R&Z>*tL@G}cRWis6%^QCe{yRFMqpDN+4A05qN^I_?--#F!I~-%jUG{+T*`FX= zCvsS%#j^Cuey+7$IyLA(=upn+gKoII&kr$i^FcwicDGpV)yX9qZx1Nve$Hgb+&*r^ zj}QsjS<+&zkr8-kpt?2dulDJ2yuhZ#SW@OUtZiC)B)xLZ0Z|^M-_uO*3mibVqp1hQs zs(`R4(GpdRQ-scC)Te@cy(fK*h|D1F^z-b`S4MxQ8HNV1_~aOLiQ}Y#B+<|#oSU0o zGhj|_Q+LZ*@^};Ajc5=q6-~$ zZp~)va(i;P60Z|dub{@~lHq;|dcSFIGSK}-SHR^d{wu?Tw97LScyoAvTs?yT2MPA7 z$Qp#1R!l(o6c7_`Sjap0_Dt z>%MRfJ9C*xs66YlCdufM6yGydJibv8U!u9*GWoYqSN_*91+CDQa)0_J{ha?TxNV{O zhZGROS(ASe*6dB=bYc##nn5_XR2z*m=)|eZL8PkvX!7Umt@SYV*JEL>8``vSBJOQK z+C)h$!2?73uYd3qpO@qM?%$SiQ$-E;w!j*0a55E4w=kFe|E)uTpvdmHE(QK~kpIut zvGN999qeyj9B$+SL!znqg>Dog;IFJ(0I$BjE89$8e#2;TtvtA=-^15tmjVtHHaX+U zNZG~>`cA-})#UXG)x#$1t+yJxe2rFl!>i1Di4Xj@rhV4n>&kWKLQ|mDVK$u7!lkb2 zQw@AV^%-0BpbSf;Ua@wZN4~aPuL;jQv%JuZcNn`YHvmWP;p(ZU|MA=XyKTJvh6{m< z2e|0W#i-r3 *Uj2o8t{G}Nm6})Liq!_%ZZI76&%c=(1Vhr$+-HC?4oPLqhGE;Px z;k4|F)^sTr9)QVZ`j~HI@_1ivvK#`hw3^1=pYv4O5iADQyi6y_DDZf(x)(H;2<4&% z2hU{C0q#SGe<%?b>W9DnARZu86KQ;Hf(&~$4(?}V#$ac*KKnlx)W0OZs0>gGo-?oc z>Bu3HD6jd0&aS#VoddtbfuT8Z9lL7iC=Uu`^|06li8bWasUBT!1XwpKl^ybd`B8oS zx;WP)3QV@}e*T~vo95%1r%+I&^fzaH)(Ls&hm9j9C?#v+A9~gW32q?g9W>DUXS4#r z1H7TloZCSoKZ>IfZqVd=^q?H~v8Xw?lfbU7j=~1MsvME?P*eW$3 zoiRlFpWJv1LWQwE5B3qp&3u35y}cscvKiV!kxtOy$BnTppS&OHJiHjnZ9PK&2aggZ zh#*J+T3E{yMW7~Cz={2)(fm94ShC4qsUl%i%Xp$CS@9L|i6^~CG;8siN&?Jzy&@>k zx6>e*qwxFp_Ug}z+LWxy0#|Wug1wH3&Pt{F?k?)@k!el9DHyqc=ax=1n~~8E9g?+= zd*<7M|M1X?3tNoDUkh@MtJ>yvbVpBhk3&Dtg3er|Am(O;z$t>dt{f85hhGNn2X(A< z*F){XAD2-~AMaN5(^t8~N1;W+ElWKt_3O`K93)%t`~+a~vL4JaRZoTM775p$IF*BV z1qF^-6y01F)WzCPFh{(Vl&jjoF>>on9|dyM?gXRj1y_h@f}mS!iTf*uyJ@e-5W3b| zY9s#}iHDm=o#RNsoX(;T+5J$J;Hl*-Jm(nI;#PaNq|_nXsy3Eqg2uKs#6>Sx{Ff@Q zXGA=SLJ^C^snss6c7NYd>(^0mvC;q&X721cVPl`Vf=3|o=~t~}QVV%g-4_g>J%Ihl z)cWvf2S2`^Y<_|I+0ie#0;(a_I5jy{S6bUIt{SwtAzx5$bdETCTpu8)_vLc&&5F%k{Kd1%waZ^LT1l>LW z<(dG@osBdQaPTuzal59*-GOFZ30r;RHx*IrO*Hk+v96(?nSK%?k%M)LQ1Fz)Rj~M$ z$IJG_rI$Os=F>LH-4zrGt*^#V)&%=ZzBNMy7)QIDY_h(F8&a9|Y$G7#H<3A4{=m zL1Z+T(Wdvsue_h0yMk@r@6I4bV#4T(z6z$F+(ceJVVD8p09(F*NeM~ghb4XgJdMlq zjyt>CH%rTnE*F=wKFf&{iGBHvm8`K*GOo_tiWSAX9`-Yen09{v7Ig(LJD03R;t=bY z)Ol(?fV(*o|8xDVI5oS|@ukdvhKVXI$REK5K73d6`*h)p7ig0a8sB!$S*Lb13dR}# zf*02X{bzV9Z4|*+UdYX6m)Xcu(vVc{CsQxJuj_jdFQre0Py70vY@lLR+-6`pFH;qB zuif`)-Z&GSUT{b)-0WZ}M~CIsi=tYT2oN3&?96B_n%{C9A61+BF2inFCCN}1?QY`+ zxMFdS7YL^6W51(L!oSeI9acxm))pzckNC2BXXUD`!0D+iuok_u=xwoR*<9&BV7Od` zX~&`>r(lnEMoA}du+uVr>mvhSk2W?^xAqq!R5EhRyX^2|MPXxVpC-#kM&`B+HO3w5 zAh!?ZVI|3zRv?$HNI?8hKaCZ_8tS!4W{E_Y-K1XJn~W8EHd47eI1m^J)T}NDr}|Zy633S((!pFFIha!Gik^+6zPkd6d5#EM5=-?J zUC%>4E`xof5j%EmV^ajtpsi$SFmO>18{6(-Zxq*e{)`QKLl*s~Lg_uTTtOj6{O!>6 z^uW&xnL}Za;*Ol{VZ(*tg&0PSUYmIYP>{y`*R?$+^WLhskb@DAY3B{A`db+XPiAIq z?E*7%)I$e~P$uHJO3xb=`)tv~e4(Byr_8q_&BQHk=p10osT!;w%4_VO|m=4^JcH-x`1I$s!)(etN;yeHRr%Y|sBJHzC zJkwf z@1+MD(ab~{9qC7WOqu1z^l?LptDn{wN#j9dO$&y!|I5Mp&Arz5#29^COknEwJa-c| zDl|I}IK3&=uKN4qBj=H-8cDmpVPU_g0F2l!sn(dsHQ_*RDT^hkx(V}RA@g%aSqI4c z5Mt0Ad8qo`uEQco23r+l-|C~deLASSR{AmD9Q3{kX{%5pNmzM@pKRoR2ystm!!LX| z@;;`@Sb1>3ZM>BE#;>YqW5}lr+R>7m2Hzt3@;IFMC)%64(ZyJx3ltDwBf*AFmT->@ z@H&=h)>uU5n0Ahd zg#)>^8eiS=&-^PXKkQ)}4?I|3e%&XzT2W9o3rYN$fy6`1!_A)?7tuKIvpl<7){mm? zu=$I@lCGj)gYL1ks3;bE<)NH!Zuu)Sj(0k z$)O9#sly-f=l^-QEB6+`q;jC2z}drDtOnv4iv|gm`?%fU=pa3Z-3~RZgIulPzVz^Qaph*$bj42i_{<*! zy+G-5_>i4fR6h8gHgWi^gjz#H2Ej2ZYzrm*s5S&qI$^O?jfpnwbw=BLXpm_37^35n zcT_LreMLk4{d{C^rtR_L{!*Y^F!)Nlz;+C%*O5?EfG9zQj~e@V2J|_Y#;+e117_Na z32ra3p%74*Yz+FQx->#THl{@9^Ooy(kB61~$YTvU`5HPiDYc|K-Q3_!+(9~_)iHiL ztW1!4aCA$smV6+m6_q~O2Z7AHjY8Z(Kq>d_!~i6m<-g#-bGM_YE-K}w)3RBH)QGla ztIK(LA@MKrFp+#v6GREm3B=&~s|kYFKShQdcn-j?%`tx9RH6ZC2usNlBoL%{TdiM) zpS@L%KZZiPdn0hFX_VH?4?BOKMO$@DjG8r7T zpdV1qf~X)M;c(#e1d`i97Q`ea!7cQ-_OwZhAenw(ZEd5$}roGGM%H|WWzvQ-iO((3* zm+&i>3->e{iHAF-{JEf-a0>*m_2?Yw!*AadA*YMpk`qtXXec{Y)PleGQ z!QTU-eYAmWt8!E!c=|<2Q_8jnIAz*re6<0jPaV&-UJDP7rmD6o^ksIlM4d;kI7G<5 z?>@%D3UNnlljYQXnI^c_1l2n}NO8c?eY{+0V0Y#WZlH`?wtbYOh3GIa*Px^(iCG6Q zuIwmOEMPi@it}7K3Ld_s6SKy`AaLzU>Tq6kfDk{Znu`RH6tYZ z7DW>9vMTPnACFz;qxoy)LS>>~we9mms5!EWM3jVaXtKEP;@N&CI&~|@SaA_+9@xF~ zZP$8Z02kN&Sc|M`QcJ0NM?)-tjJRmbA85Ppy$y3k8kVp2mmtn1X%p7oSu|uEr$=ni%_s zQG0}4W*U7(V3Li|(xT#OGg}uwFJjdX+Oyy{$4j7)y31>LHCFvG?(t@o>fs5zt@V-M z?x1jarLaD??*i|#;5RF(NNJQB!SRJ$QaOPNCEi-R<@*=r`7Op_rrBRVE{2u;ce3s9 z(U=eBm0%PhKAvWFw1(#$n7c0&L>|CiXFT_l^!>&LJr@tfuVfx2enol)Im}Xm`>x6; ziD}F$#*ws@2GPgR#xywL0|g)(Y7%C}bp9dPP+(zT5kdaATG<~LCGQ)S(h;ct6MNJb zb+AL4+vfG%LL~N_+z|_kky!vBJGUeA<*y;>-0Q=hnw&tQKdE4@1C=#pJzMyS%S+V zw#StfE<)i?!wgo!N2`o`-A@OmZW)aLpBXQ%Gb5TnYYb0 z(if9AMZR8jrU|j0_B@n2K3Nu5AJG&a+hz)d1d_%ircF(v{&g35zl|Gpf(U^@QAsMx5FU!!6{L)+Cf2-J zqt*gu5GE9Z^V&a`69OvUmnJISkNk5IV)4m3x$=uF#iKLz)USIQxZTzwF#W|bx~A>8 zQA=-T(ClB*g)pN1N*QL7w$I?qdk|ZI<*d|&ZJr`z?b`bO4!>v_{*MGz8PxWcpSsQF z6njz&q{g?O4eAdLD-72u{ht@$mBR8*kdC%~ZMe4>K3#v-gtk=?vz~n)Njf)T2{Hv3A{ z#d`pUBTI;4B2w*G55*Z}$vg>ahTZQ}_r(T4eh>5eTCRh|w+!aC%a0^uZVFK3B6o;v zuw-l$aPVJ!jGiWth!Vt}sxA$DN@X>yVB-6?d_|a?3?p_K>{6+hdMkyyW zyXO4yt9EjkG|WcXx;=Ie>t-sC0LiILy!` zHGs^}HNen(m(RDoKllyXnze>?UgvS_yPt)4HQM{ZgEm~o7otv?whxmk`|51DriFMx zHUMyd{B&Qks#Oci=!Jpf^0k-!e!=}be{GYkB=`d0eS(S@RU&k^m|hNwrck`v9JnJi z7kNH?a0kH4D60(dqKA6DmBK8;KuQ;H%Pr0NPh$6>;*gLyo9@ig$dtJvh1{)0X3aIx+&HUOjMx|QLv98%}#O6jc|Wj zGqU*17{y8sALPrQoC-6hMIrzDQFCzg>HW-%9P#*|6g#&xqD3+Ti5=Bt`Z-6yyZ+c)KM-t{nW1u|il%se19rcycXCeo7TzPO-BbaqP& z-Xg6R&jYf!dJ4_Lbhc*YcxWK3eFL-tq`yGLHbA|l)wO`k4ji6OIJ=1d%hwFlK$Kf7 za$$BS*T_IxUH-i~iuY?Jdhw}M;Qh10untayn6BXB0WYzDzK_>82@df_MQ(ZsZt{kOK(cFlh>@g%o1*N zLy?s5&$}OB0z*fwE~Y;c8QtGE1X+`-0?nzT;TtVqxsbEYZg-Oc~_bcWTj9tBTsH%&2+yB4PY= z7o$zdQVoaqH&IC393*IesM=yJ>lSfkhXVC%?q6}f$KU*5f|uO@_GEN*XdM`G@tE)G zQnLMQ^UmeWxlFL#fBHUTG7TUJ3kQ7|`JbMdhP;?9ddh|!QE{M4v6Z(X+7RdYm;YXr(6l<#CS)7#K)ky?h^@k$ZrDj0dGu{GYfa9I00IODF&F|-6n(kHJZ z<#SLAGLU%Jq#)Cax(zg2JouNJT2uDgs;`y^h6W|*+rX_}2Eq6-n+2nPbIrF`Q~Q)V zMS|kt=ac%H0@ml{L?D|&DZ(wha0^-y&GhkR3u)AOC|%}UG)u_az*!fKf( z@`3QfJNHbk-Q3-jGZ497MkP4z%aCsv3x7!ebBFYRbYINBV0^Xk23k13v&|M&f}joy z&U+qDs=T-2ImDn@wNuA3-tOzbx;OolF@^plJ{f{HR`GWDOl#C#!v@>*z|k#vWo{Pa z*)*o7NiHq~-p_kddVLu83m-30$v+*vBjNLv6m2hCi-)GvR&E{>4OXt2`aCV^6Y2je zXa8~8Pd<+`qx+9dWTs1EHtIG+bKKmvc;6lGB+n1o{k0vqKk^qhcZ#i??{+Nt!Ly!3 zgVvXONnq2x@)UIzRaA12l2N}}6v8rqCO}jK^&?rZ!31z|)1XAnMPSO%9a64fd%rK* z45?@>=?^O?$tZd9J)zZ5nZ`l*rC_092>F(3?!uK|dm~fA<9^E*YgW5=@^!_?F^>I~ z$Dbr6+T8g~7B5)_>NG2uBYua|{QdUr-cu=}IKaXcIup+Hwrwm?iFBo+iC9GzVZ#xF z)Ec+F?{_a02&*L&$MhE&THQLd9RF~aE{=rX^mOCcDO}sCxp*q8Xq+@w+qHRAhZygG zpe}+!m1xk)Fvc$cBk8KAx9i5e|Jwb)%8Yrzb6QrXIa-vt1vgxtXJLos`{2 zoWau|xvF@Hvag_Kvdk+ozlB*y$x``U0QQzZFJcGwWJm39TAT}z7W`I2V{d?1t#)$l z<#2KEwfVvY$Iu+H|2bY{0+Gos-}>FGP%XbZ>uK|>%O=!#;vw%1PVx|9AA@Fd*eudG7A`Qg;{9o{;ztCKRqx(PaecKCV&Qu8 z4^RERCN(d;Cl{SIM#A*Oc->wy(AmM@wl4i~*SPg0IT5GtE(y({A7{M*-t)}>RJ&ar z>opaXiJVFK(L9aIBKBC?*X7vqk$-Sd%JsbB>ki^`3*55JYoB^wwkgQB-l)sIWJM(NX9Y>MRWWpzAPyjnHS zE8lmkj)U$-Z1r|l#eOXD3|Kzw0o~qo4BT}S~B^xy%Z#|rE8Fl zTFTZFd!#I0ME_fzYbY+cXLeg?DCMO>Q$<{tUtR`fxEDg;ZBTgsZB=gRuYSIT`Hyg} zt}eCAZ*^uONn}3fB{UGH^jwf-Am^j&G7tXX${eJ~ul~wbod66aLv>*N_zr2IRSJxM zf}NB!x9||F|3og*<8f|0idGMv`g74HyDfQaTV6EqU0!oD;BNp@zU3_}Lwfx>x6PsI zVKD*bJMc76B_~0{F$p;g(2jZ!e5RO01p_+)b$|Lu-{uGK;mD68ZeNKb?+q!pEs>H? zK35X)ii`PMNzHcmL%2YP)rZ$?+qAH6jf28CCN3s!KBMk>O{YFN3V!r&LL^l_wMexH z$cQmUP_5I(z3H&(jb8hy?v6WPtqH>HojE6-?M3zhu2r)pDU`Ha(q-3+)cec&r)H6- zoSjQg@Y?&SP8lK;-Dm06pgEEsFOrn-wU_sp3ENt@=ZzPZH*6xi7R-{3ryWE_S~jTH z>HDJnT~KynT`_t)Y7WoX8Dv|RHy(FN9_P2TY%K5ojA`hK{LuNZSM~0F;s5S(E&%-Q z<%Z3i(H}HEY})J{+&r;NI<87d;~8MVZS*j-r#Z8&Fn4Qh>inS2H2eroIvLT{S^D$R zvA5^-~uJTDEmfoz)ZdB2<0+k_0uy2J2 zL4aTPG!j^ybqLQSrW)_MI?u&4khB9N5XQDO)R+L{01xh_9~IPx&PGix%*ud#pABi70<}CX7_WVD~-#*ZYt(H*f+nxcce2P zxjIX?Imxe=T0PhUtVlnOpK~}*_B6Yoy=Lx}&)0`1 zU;HdQe=z=rp`RB9Lna>%&^;*gc=-0PL|HkYHr7Tn`3Zgs&3GP@W+ixj1s&#E9Y2Py zZw#(=i)ixc70zDVf0BjtWw-ivLgV<-^=t8wDikN;<8jpl0uF%Y_;KZ6Ff%Yw~Af(-Oordg8%z_EE%IN$>) zCTLaQtVg_gSTv;*3S}F{j!D)9mH!c@8!mYkmt+q(yVhlj!+}iZ|6%+%3)^bHFmb9( z@;v#jHr(y->F#u)tyUXjI;{x*lb=fODXT%8FQX*ZhMuZTZ@9~@qG$eug%RyA2gO=t zW>DIiEjCR25o^GKd^ShmEO?aG!yfhLl6y)9&MU@%#h-h+}^&I1BXzipAAtc2ea~In;RfEuKhh{2(JtrB2Q!%#$O#k&iU0uxo9qW6o!9zb zG67Vy*sIHk3^)wSlPyha%|z`;pyIqngAeY{s1!@$x=P(G@po-y!N%-wQ)L<*bSWNW)Yt2`J;|ApA(Lvf5zk?a~ zRx4ou+j^)+sp!EZEE94~fRGEpLj!Xhn*hjt)YiM^B>0|OsMO>XG>zF`M*|GOr-rQQ z;pN=v;gyAH5GH&425c*8hn}{fDuhJ-0lyGG#*NC^JA&9OO!@{~^Lw}_tP$f=5;xnd z)xSZ>q~|ih=TF$$UT$BX&u70BDfpZ){HZYjjoFT0wq+==qQ-a|jDdoUdZ*UpY(G(m ze+5RVDa>)RsYJ#>kG$mEZwkrlpQQZtRvxZ|I-3@&_nWixj<=)7$t|22jsfuHX@2(QYfL^L4KLVr z6*N6g&fWHqw9yBSl{$02i=nw^;7Eqst(=LBBqUiHF^7*9=i9-D^FQXfE>ZU|Y%zLv zn2dmJVT~sjQ0a1*3nrw)NST5&9;$(FuR9mk;)W6G!Y-Vy{Z?kG%6s)lXxS95+QEIO?P-) z@3zDFB**(X}GewcJWOo z6FtSTz*IQCwb)WkhAo$Agw5j(l72GuAG+~^1(NO7$ypQrCKS;#T+MOcyOnfqGysN; z&l298>AAdMVY@N&xUenAEV#n!sU2^66NsHfU}6@Qw1zwltXZVXDDj6l6*^vwv|1Ae zUwg0`1k1$n2m4dx-<=<2UpNfJ@;&X7O%Chem*55$#P41=No3Bg z&k)Yo{inEH2PAUb=2FHDN7*rFs0TAon8TvgPaC5WEjtb??k8z0VpHYjCtAmK2@|ku{Q_}|KrB+Qo%j

qhZw98DJomVpIrk$?!Y$uHc#H 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

=!#+qlqq=*_T` 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 z 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�nti# zO8lR?&t4iMTPzWj6v1#xF9ajE)JM974=Nvg;+E>mRI8*^?-+CzdUw6~5oM4Ear#c- z@d;NWLB{esD?Hh;O2ukYhl&eCc=y#`Y{Sn32ccC0M&Skxzr;R8R2=eViJORy@Jn(k z$F@?t8;B(jg!4WqQT~hyU9lDU4Tp=RzXPrq#&?6Tzvc=k;{UE1VP;^6QG);4*^^-u z^upUDSa?zYSiM~)C42UsF~lU7rKX~lwQYVrOR|xk{ch`h)kKUp4&;^=Qq zEi-03k8=>VGD8v^K%(Tf>f$;)x}Z4wEz=#>IP!k5qr~qjBl%SD zi2USgmA~H*nP8bS-aJV>q{($Z9sf`^#R)yan_Qs4uuea0F#e6KLHEMItQFr*9iB2! z*ld}75@YX>;aftIzsS^wUiP)}#-Co3JWYU8w7G(SfimprnciFNHx{jk1%4vzoH(`+ zVa6z3k{03t+-o8^Z3xit6M?Y?jyVt#6P4L`et~i&A08ZfKP4) zD<7LDiwanc+Ni*qM!&|M;I$^GH;+rjy>e*uEnK{OzGND_LeLN6V$=Z$;WfZzv^=wC zZ7tf4Y+^G?x<{#FYhf5cK+K^vrS$O0iNP@1=g`8?33hzUf*E<5b>Lk{h2M&>WqY~z8L0AWZIu-z3vy(vxsx0ZXr{*76(gI@V03~nIbYMFV#Gt2+h`uCc! z5+Al2G4H$=it~ff@*U`!dXpcw?1O^9Bq%BCeIw0#-Y ztBA;frg2OiHQiAA51Ezn<6OXGp@fYv)|Q~D*WRK4)`SG{io*fzGvC;8E%ioC3D8X> z>{tR+lWX%B^q&FC@p?2YsWuQkYnyf9z&Zm2lN-kaT+-;frB?@0r`yM%Ra$a!7&OQ% z0iolkMZ~|Wk+cIOeIQ?e&=GKlWRYjMZoz=4OKtZ#R)wx5IVpwrKoB?hqX=0PCF$6< zCWR6&9(H7D(2xMc&%%F;0(uxXpNx9v`!Hz623H&~de_?$(6b7_vpVF!hcEw*@j`dv z>=|=GaLPyT3&5+& zSLj-q0cm}mKtcKVH2Cc9ci#t+z$&I*Kd#Sr@v`dt9BH8#5m)seqQA8Y(Z#yg5j&+6 z#A=9#%yYkbz0dTa@RCi^4ZcgqO=#w5J*%marcnMHa5otCH2z zV{l+fY+eH?u=kle5vt>CjUe0?cQH_>5yly7%Rh{WM1$Pb&XYOun|RA}cTP#l;6tT= zcX%?1mg%%y0MTW^YS0HIyj8_k2A zDUqY4^N$~28}-WL-?UNfl8GJOJbpAw(qW+3yQ;61_ z9_eR_(i}}1lsAn@k~!RXk+HlEajH$iMQL3)#(TzhX=&d7g+kXjddI8Rwb3__>I%p_ zt7EoejbX^d8Rh4HJTNgala(*aDDgyYG+!Q{H%~}FoW7gRRr#qKQ`j%z2*TCc-v*A4 z!gMR6?r20tbJZphTWu8jiTz#h6J5)1728;76|)^xfK*57BQBD;Nmym+tW=|FbWcKw z4CXErm^}98ncjgzLjo|0VX9P|)Pzo+boGCjrjfV4RoqKkRwEv4zgpQe--`5%DGW31D+U>DfW@m1K3cvZk@wQlp|8N zKh|Apx~Y&IJ1GK?B(J_U`y{h*xyTTJJG#*Cb-!FI_vV0B@YSJy`fhL9tbB!&YiB-T z>i*yVvddAPbr-|^&&5cBta^Clrxn>F-mu0^=bL0lrLQ{Id~YCXvvD3Z$xhgol#BIv zqHl_K_CGs-GtAE0n=59Y&{Goc#bFh}LNVID>_;un?f^7hv=__8u zJ%#Oiw1W3oJs(o0#nK6+W$O#Ti}cq;drY0nt&`>Ny1>N$aH_n!R@FkAP`>q$sY89O zbkeGRY%e5zljS~%%R$b9ag~EG|_Ukeq z=&jE8Q;cNY?=&L!y3h+pJ|7&|8%4|`*yEmCU35R2mhE8tQsyNdtl03G^sD+artD|2 zEffA}-~LOsukQLZ+4E_v$40cfXuOLnQ-y&Z*Vq;+C{E}hs0VrLV5#;{u^;=qNU9ER zy%Li4?FqAdl{T`k{I58}l=*KR^?WJn&3*#t#H)?lW1{zMjFo)dLC@9<$I~*oWUMq# zUva1*BPA<%tW!yzFxd(mn26R%bIRE#bd9Cgxm%-5D+(rXTJ^el#_hzolQjud85t>( z?lI8o;eS@RGf_kR+M`PrJd|+%N7GpcMfJXIT%MtNFaN%V5Gxzwkiy#8v{rwl3^fhjSEHzZGX&$*=23Z|;<`B5lQ7Hq$FKm5*~-&E zv)35%x#&JGf(AxhRR?Cd=(R)(`4hR}x&X#xd?kx$x|{&ko!vf~ z^M70FH*1YKXK*BtKN^L8bJ_gr=5GF#FJg&@_GbtOJo&pqN)G1>%ap44p-&30Y)O5m z^)kYu$g&KL4MLx}sQU(vIDgmTyjOaaO^40H&I8mbF*;y+XKPFKxS10Y#w*vJ+=v$tw=s+7v zvYGT3qi{Rzi+TzE_vfbKo~F9iU7n-IN!8)xUmZi#RSu!a{^q33>Vy!*Z z-mexv$2taJ9=>{P4sCx#k|NfRz7Me*yh2Cpv=>jONYZo+NE-Hh0Noq4q_J3Xy*}=_ zNG&zgDDyiP;Nmg)7Gwg^O@N}|nFCQ1zJARbPetpb7I@fKJ6rn*MTTur@j1;b41iT;XsmBjBo4R?<}Dgp;ura<4^CkJ##hn(96x&MmN<(-zbvMt`eH1O2DqJF)LZ)vh(b@thnyZkJCaYv_h!`O@+Q z1&h3iP-5CMuTY(%pR!pP9le;%Y5tSXxO#z1h`8WnyyR%J^iS4G-0^mrO$IMxgXwez zi-DP0aSe8Y1seCeBPTB^hRrdI+No14EEsQ1iOX%*5MZ8M@3?CEC@R6o;mdZO&m)rG zEht!ALBHV3n5|Nc8JMno@8*%$pgesfc{W){5s{?lcX$AWtvR2QdJkmOCrGi_Wd zI4jmZZpK)t|1h&SsAn}+#nme%-7I1r>SdH57eAtP>dW?k%Kser+{f*i+m5(AOj%>2<;ce@=a2PY zX}5nQFU?Cii0X3;*Jp`&!x5uW9%1Av6TVE4JR7@x_jFEIx3JS6gWBm}T6ZxN{z9E{ zZ7zHP&YvmZF3{q4s zUu6o08XD5v++ow$UKuesyM<6Z{Q!*f(OM1OIrceQ&JwIR^DjtclSxT?@95 zF^b~05WpJtM_v*lhWG%Rgm(J;O3l}K>66j z*!c2gM?6A)-o@xQA%*;&OqXxi%?2*0N@vE;?4}8^fv?L)PQ4(sY|jysp2*WeyQJOi zoQNMcWwr6<@%dDlw_kQ?M?l&59LT>l-*e?bF_2)A|DEy){AqSf1Y|{+!ZjNrL_`G4 zL#Q?X6(5F*_WC8uMhc5s{I!$^+7Q~9>&iKXLc}(H^Oj6R1&Fp>5=Cuq6$I{Gha1AC zO+qi-+<4wV%qBE`!JStF57Am2cr9>pmldfTEY^wb_lQI2*;KC zU+_t3FH0>&2@5|lKEw!;B3~lvt48~9lJ6w=2JE|N0u@K(z&(jpghO`q+F?Eu4y#ax z7umCez^Nwl;4yV~&mO<~-MB#HkocbK1SeUu-$5?Gg_q~_px*Za)6-mdm?v;2P=zHR zwJh`JQ_xMY8&7V}B!^8f%K5{riE?)S5O1wXH*i>AV;kImcsOARyj%y46UD%zAxM?O z;wg{LWjSyP@mHu#o!`&6{mrQMco(m>=%B#0ZKr z;rYhKZ^+i@bzwU+^$#UZ}N!YXkym}O)({7xG;xRlR!fk33OzbAmEuICYLS|czL_#JSx z9QgIJfSvuxl0=9=*x`nM?1?99T#GWVQ{?IMKb2&PMek$m zx~CM&D#KtE@4`w1&>^Z7N(nNgJ^s4P)prXj)_kw$rp9z@u1r%X@ryOEa^8i>C8K}) zYsQtm9{w!N))a*KYe91;Oug}JFGC94;w6%FYW%7Ens=abNPqhqLUj9JY}I}Dl2FU* zHr>E`b8gFqeON>Gr(S%9oalnL==Rj_*dOgyR1wIZv=m_P*Q$`&y14dpmiyQX2RGl;me;ja-W=JQ6H@rH_IEs;UA#VElQma|QrTBfbNQuK+zR}c_ z=VTmrsq+0e%2wN(x@84D?;<{4i;WNGC;3G+8kyc^U(D~7d)jW|?9G|4CI3x#;-8iz z$NWdTw2M_i@};1p#82)ifdG}Zu(5vDNppEIGdDg9AqCi0LM@o4M4*D0L`Fu#kcWvc zIWe4zhx$MPx8agJL-mx$zI)~$#}dBjj=Ah$ zV13z8xY@PaXjzctHS1fTYtC%kA^X$%1-XzlSsmW>+X!5vH-g$;a*E*N3bvu4z9MDY zTlnAaPq`|xK9MDM?2Xr2x|to1%e$0O9JlT6al5=x{E6L`L28)hvG?W6rcmXknrI;> z8z$X=QKn%^eAyiVX<620LxrrChJ$A~#2=Pbv_kC#miVil=H7O6w8)W1aH#n5wqq%m&5h3QPewBZkn6p2yqT~F&sjLhY3 z&vh%;A=W)uHBXSyT!ZYSr?$~fwR$!{4R?mk>hNM@sj-aWc44AB;k=ozg5^^zZS?ST z-wP7qr;dJH#)s{`$V&AamL8N7Fy3!@=jQm9cV|$^&J9`Ic=Yf$fOqRRiA0^FHjQd7 zd5L4mnXxYA*ROF=>1~Ea2BGPHqYPI~!q#TR&z9oa+_Iav{vNhupZ7yizFvcJ;6(wB zCkRbZjqa@j?;5TO8Hg%1-d`-zJx{l4-MW#~0?mX77JfpM2T09TdY|XQH5b1UqMBkp zTsx@NX5-sy`YGaj;1LAQ&uG3g-2c>xvyA#%jYfyOmCUcf?wKuhNA81pYM}~Yd)u6y zCh3ndG{;F!P4?5;-+rR)R3znU{r>Q#HBWnw)syCJreo8G=#gkp1}RrlY1jkTilp@3 zcptw3THY{ceGP6hQ9`Fd%R>nmGd#&c|=OLnbMFq4NE>GX@b z{vk#+R;BMN3C`TIepuD^ldLl3rjT3`#j-%5viYLd)yG?oON#p!THx}>oVR7 z`Hd7R!-fFx)wl0GBSCaOF2}7+g8cE=5U;x(c7r&|K74_KZCb@`1ddKj!KSzu?j>Klq@j z5o$(_oz6^7T}f`Mjs`Rb(`52**$C;^C?-;0Yi4mK2KcwP zB&kRj$hrCmvaBj`&mn|X@II5b8i zAEkxYRssnyUZ89mM}D6LE)#IT3x@kU1H(pVsv}!E-5HEDn_p*py*9p&XJ2k^+|gjT z)6&5Qq*5U$ufU*vypNsohArep>-JunrLS-my`_ZoFt= zQ=QsnbBv7J(B|Yi#RU~~7Un0Jqw7|BUgGy0hHjrH^?U*X_3B9jg|#tEfS~b*%LDfG z753%XS4U;tEq=a2Y%=BjpdOI)u8#w3!v_quDu>}t?c=yfJ)e}&GOZ6~ znOF^g6%-@5#D8tbK*prf$dK7rZf+Vhh+O9(=*+Hs?$m+Txf6d8gb{K50Z4t>xjV%8 zlg3laO}BlxyMx6%f$nR@v?2l^pR|qHbttg#1c!qZuDa&|Ydr=i<{Z0?Dtl2AQ!}e^ z_3__OFKEd9e4-HAHDvy1C`J_Of9UDi43qha0|RA4m?<`Bhm9JbXTS5s5T`LkZCcax zH4cam8a{5Tck6B%74&bjh$4|PqtI?J=|njfmP>a07r3QRmqBkJyvb&h?aA)Ly~k6} zPMdWK5gVSl#`x-G4hxM+WLwbFBFG*60l7R#$^ATFYsw^HYuoPOe*1dQ2r7hdfDj_& zeg=LJ4iFO~ih)NW#=d^+)p9^~m!aamp@D(cy+ec3Cv>Vg_#6=aOp>BgoD!hC#vL1o z5rK*RJ?$@hFkPDKvg=-McNZ0LEit}gKu5@}1hNa2A9%ZuLh}afVFiIXbx!o5NSEFg zkY-L}3F^C2z3ZaI(JD8s{(R>l|Ir4W0%S!1p+ta)sVoY5lFiVU5)mwhuz%QdrwzLN z!EW=woYZLS&E%rN0l;_&lx2bgz$;k9{Lxb=1dOl;Ugy(fiUD9Oojt4m_o&G!_+Xg= zu;Xq)3&3u96fiw3JH1wjVS`^e!<=(P_08bz;HSF5)rNUcI;vy`JDgJBl^}I6la2WJEEGxXax#z zR!0aGLzkxSNv&P^H6_%%_lXdj*!2#uhPfG9A*z{(XXjsx!TIvnuKusB-*<=}QMEV8 zrw`$)kAB#TAA{qZ@;l;rLlk2n?kjhk!N?K4Xn5D-A5L`SM##a2Fhvi_AdT-aLE|~B zGBvk!qSm~35$Ih@JT!1auGswk=}p!3xb2d`^Y}Nvt9PPny~m(cy6>y`{nM`di{Hj2|gA?gkg zIgb?qyXK=F$1CZ(6WWKw(h2()>nvHFqk7)r? zOOGi4$$R=IcSuvhLIi}${jc%~VDj2<40ugm?uPEj1708GXO!UcvBz4R$;Uxp6UUSu z4`B(mbAx>j!U6Ut0Q`xsH@O1~L8ZB}V{XB+|2D<1rv9{14xV1Wz1?kZ$z9vfTDfxo z6F@hJdLmRV-72KcB=ZD9>LNi(K+fl{O{k0{4k8TUnzR)lo+i}=A)p(b1K39}s@IdV5CH;-cZ($>7tq>n2r~ zDoF}EB~0O?CP-S4AMp^8yR?&!Y~3jC zkkY$n;mBt{)NUqcfSr*LA1BGZsl^8yB>=JZO(G<>b^R8_on7Adw2UKkHDrA(um}AI zKLBxEHB^mHehq#fIQjnff%KoT^T+qGC*g!?6775=O_ZQOu{U4=Xz8R9Ap@FU4ed`1 zbb?4k>>EQH4rLv&EnVy0Ea*tpY;M(C>#AHghuq;A(AJC%qfSl|fjYIe9^n$HNT!WG zOt6!0Q9Ocx*CAxH=gs&@<3H{bsEb&8-LfRtzxWJ!OM)qgI0K$Fa6b;30llLcBul9k(_|8Hn+2? zAXHpJE$deT>s75@6%4OY1l?aAZM=niNqeZ#N_{_ajUR143zBlY_Ng~+=$-NH)4<)x zKSNsY9>ougHxx||C64A=I^$OsT9-T9MrNL-58|&Vwc69U*{dtRJ1F=RuQ*p>@rf2h z;9jgGn_m+C{tH^I6!t*bQ{9zO$|4`z77ND{((&_&!SG%`L*pil*Q5HOQ-M~(^R$z; z&uvo<3RKb>{Jql^o)*6i^ZZ7?%u3_IO?X3_<;)Ac8g$`g+Tu=*KW7_%l|o8`t7t-S zsm&qa$vS8AkFUCj^%pMIGN(AvN zOhAY7e0U7QB3}P< zb2u>?SRG(`RTZHo6@Ir07Iu|s{wJ;zEtoUF_n_PblyNP(j0^w3lw8PW*^v7d>Otg> z3u|F;9OtQwQ7<#H?@Ju>i zk#fp3_7I+OoaA5lZo^qI-yD`R?Yus4x+LFT_c;W#n^q4|Hj^hhKEoM%fA8SF!c@NI zu9}iOPc>y#_n~1roa4=Fe*)IGCB>qa4by|412aHT_sj7$m4*m63%fUjgf{Se|v@N&;PUqV_+CRS!M}P;!GW0?fuY}Ur|G23TN0s>f!C_WN zQqZ2m+1n}JN>fd#7U(T@zY(3dcY{4y!>wh)ZocyH6wfhI1=EH~-vtC>chE_KcKBNB zhz_e42qTfys@d40Fb13q-JByBOTNcf0yT%w|-Gp&#S)o*X%vLukySQu=;@;sYTGDRgdKD|ZtIy;|P+Clj9pjwGv18C}MJ19xOgnwvAr&twbsidhJ zekd!G5L3G8^g^egRjYzVUJ@IUwQqiwl8VUF*BG-wSw-Plv>u%i)U~Yi%9EJ zQV6Chub?wK{^{rraN?4z_>_+vvSr`GC1?9TF-xT|1vt;yhs^w*@Gfi=q)z$BD{t%g z49|nLpb8j45(L@&`&K6JS479xt%?uA@cDswN|UkFRI1L|b@5{b39dkd$r3g1aNeh? zBFq}jj(SVs!9>s}Dv}E7d-Z6LtiL^dH&Pg^VDNsVPm`R>bC++Vla z%iy|Kl+_{L;60Hrlk>myV>?C50lqL{_gy>pkx9!!69vtdTde${zf?aR zAW=%%PBd8Wwz?%^6r70b|1n)>pPp%Ko@^j;N;(5i&i~MSoDaT#865PF;GMXiNkW%|34y!xi>H z?D|~DZ<8FBt(ni7NqP!PXy!qLC=8k&`S|k3ug0-UCOF(rq_5>6`m@2w zO#q0wi86sYChMU)sCyEG9G!$(M!e$^D0_CI+XMsAUX-iXa67wO=%yhC+X{R+-+cRe zc|i0y3#krypzXeh#pln`5S6};29`V7;3LAkbi;+HW;M>WF~D#qsS0A4VW0#eKTUJO zBsjsCA}%CPib%f!yLEiO1JrmoM6|o@=lN?{s z9+tYBCc@BU0{|XLCQ_aQSsEWgB#dkX{o6kQf0~ z4JgbvA$57V7NAxBjh$Ni@^27+C`s9@8H(O{{n84^DYcN|v+4BGIdifESgI3p$dtiD z(T9S4i+H^P$^&FV(bDlKe{YLL=)rPS+*OzgAl`*=0R!SzpylI6inm)s?nh@kVX9Y8 z(gXno?d~R}{2VyY?KM=8T4Lp%zzk#ENgi7LF^%~n`ME}XdwL-8;|U;D0#*OlJc?Af zoT9{#NAT_R-CXtcnlM9}5U>ySZU$-rLPyT}BGWftqypRpw%}m|)mkG&YaOK@u`EE+ zwQCf>U5&7RC<}$Vc8pvBDdQWUkc{~zoo(=EfiC60N3NK_+S?`-j*q+ZkPk8C6I9ve zqzB8u-`z6K;SPvHMDcLxu6}LAVz3|PqSTMLLk5$czeKg0kSdGEJvx)eKXiBS1+Tk@ zNzrrE@!^lFWr>^ZS5@|1cq^ihe}}%F=Oou|i!zw^oc4csSk^lO?#=ws<-_h1Xh_h# z0Dx0jVJHI(KxRIP0kE~p9cUyW?!5aKbaw);b^D^dzX;nIY;HVqYLzMu0^UP>=Z(9Z zN#0P-l`hmBxD$0p`!U3w(8qA}?x|W133LOs%^j%*#a`cG3{K8DSbp5AwR_yC$&<|F z0l;&LkRcUlT0ftDGrt*93cLZn;kS5 zhzG|jnrqb*>ET5M6-YF^c1JoyK^M29gK1b3m^0Zo9T({`WX- ze9V{I1h{II!f4xMNvsPSx*;CcwdTLn?85 zBqNmQH$TN@plIhWc{_@e=w$&SMaaMLr`x6i;F!;lRsbN`=IP-aX(v zj=qs@ZxZCJ6-X^#?mVYZ*`P_Tcvnv;EI?fRid~j9jCCa8Z3Im-OuOliZsC|tyoZw1 z1-FJZjdn_@X4L!qIOh&@o?JRAV|?xTH%qC_b;I+{uOt<1LUruI)a(??7M^}x$NSnd zdiAq0frD>U_w&#|#Hk+JfRcO)DSo4V(#vFY7caj|ffm}1o$Bf3O?d-(G`OaV!s9mX zQhT5Pp-XPW*QA<$C(Z9xG?3u( zHQJ04YvB$%)o0^jioUn=$71(?jBB8)VgF{{dM^Gc4!NK_Iyvk`R@-h5->D3@*r(V` ze-KrJ)^?{KSJ#&{K1)9ldh2>-(O1I11ZpOUH|Bh|uMs9+9le?sJ|jdlnmfQgRwFCL z;#Z^Rmi_v(1<+K{`8-a6oB7;>d0?ziS*x3Ikx9|YGS=>wHc`Y3);Dn)EGw2(7N6Z3 znX&+Ws1b7Of=emSRdm$ROhJ9jMz_^O!EenWO*db`@4mXiDJXx-&t)v2!XbzT(}IQ)SOMPG?9(&ogPBzwNyX_sh&%jhFjE;a`cDjY0MH!rG8j)$q%_+d)E2-kOza z*bp=v>_q+h4Gn<@D3xS~DYj7cN?CcS%#T1VFNaK3zf`KS0{8wKq~3Mg<0${fQ|zAx z+l;w+dcI9Q+<9gV=)5lA1Op%1p?Ha;&8)=Rv;Kd%zK%Qe;I6-nX6s(02tvttH6@L$ zixiz7o_{bTD3YMvZTFMgml;EK6+xWTkf1XV^yqY7AoGI`UV-M5Hz7*Zs!>=zX!^qH z1JMgcnI?0g|HcD#OWIPbntG~qdkd#!c)xZRs=Y~>O{j9F8T6gy|32QQjp!sG@i;OT zQ&(kj_^8D=Rwb+FjrWf_-re~f(f1SMX!9fUk*T|mpx5VjqYjihpV2yA%2sG<#ziN3 zPaKOkS(g@Y=gjQtdp^&!LoUkwgL+R^3no-dHWUpZdV8w^xvIIl!{bac_*_T4yPfp^ z3#MQec{r9#*%i$$_3QoES;zmUrKg{&_9K4CrZdo80da{#8ASO3$E$V z+w@)at>bHXO(%|@@5lH$D=Bw!;`rJ+pj$U(18cq>2)TBD>t{Uqzhlj(l2H5iKhBP9 zxw2QDe$j}om`-N&pW{u?^!-eUv>eZ{wnUx7& zi{GAw-*eA?n=fm8>Z~oI5^TKCa;fjO6DVLFh?I-L&B9{Q{uAq_!ou~e^Cb&98$`|M z**}wby2$0%I?&94mXRnSvEx{hlF4Q2aCBxRLOETbi<*noLV(Yf+2T^+>Z~ zve~!#S4RKVL2y#8`Z6oiD*T+;-!<_254QC5J`~%EnpEo-`dd}WB8!Lar3K`!y9QgH zW+1b1?g1odz_<6fFW8R$pH5@lOkS8`i_kcKxn=5l!po?qW?2MyE5ZztfCGgsfga7~ zE%T9zw)N}8;c2{I@Z}ZHvl5`%K^!z{S#ZCpZhT>7>Owi$G9eM{c>ryhplbQG%FohD zqoxYD4ph_e?a==@Ijjc0644_mxVHMZ<*d7+mhxRK%$O6qblm0~_XsplpkNhC7hg_Z z5E2X$;jQUTd6wwAGpt||^qrzsQaq_cx{x2eIf`72z+-sZ^7C_&fhm&|K5D6W;&@Jv zx_XW7i^N3Cf>+GrQFc`hc6!Hu&1x#HKKPYlzjnIdt6qwQzkLP90tpDKd>&GiA(kY@ zo$gyU^ACJWa5;jpHb5}3#-TSnVIL}5O@(P>^*L7`yS#(Cl9fUG@}sp8QY+Jpz_p5K zxy3~6(m_j2kIPHLO#}DLx{{pZ4X?m)I>8^)D^5eNkHf@dfL3O)q#pWls-*FL=dBVM zm%r#+aW;Y3s&@yuVR##~Hy&)SqyuP2+h^bH=R}M*ar!p06)}g1LzD2B$NnmRBAYo3 zMEtgR;SJOIHZZK}Dx>lsG?&3;Td=I(ir!(R$tT7JcCFnA%dD7Y>@WX$wYT?zZ;$)z z$JpjXt$ao`#=ZkR7NW`Pqj0(Wx4BmXsY6!_>i!f>suGt6x=ZSQ=m#qtUK(CVvZ%%g z2}Dgx5U!)cZF}UCAdYM&k;3vF+!imXM#Qu613x;!05f@0lx1d<{xGrC2ko(~miJm2 z=~1u-?aSt-535IQOVgtHxlf`Wbz_lIRl)f&!aDw2kTUty=RmS8&M>pP^Vh(cNL+&Q zuRJD^14u-1VHwr{CT3mM#Ah}YCNB00y{HE!o_fa8{#d-yWZT z#<%|-t)ZxdE-7Igy^AJeH_Q{LUp>?9%*V8`WASNyX6aM?G2PK=b7_cV%g5i5$2p=_ zhl9_Sn!WG|kJpl2XheIn92HH**_F3nrq~Et-PVA7PtQo?Om9ip&X*y)J3g*A*Ap8- zUs+(T^+Axrs(aC|JX_r>^X#J|)^0psnPn=c3VTIqbOvh&c-Q?HLT(T9ffDBz;I>-7 z$9KEty}8QS_yBn{E-^gPdQHGL#oKHgBu(5}xh|Qh%hnI`A$i_fUv+ug7w~-O^sf;i z;u48M>}6?aypbI3NZdPi?kQRq;e!5-TZie-kqYw{1CKz2_@S}+XibCZqlFvll7gLK- z$LxO-6}<*%g+!cXt;Xo*7HZ`cRfst8B;*{I?|ot3V-i|=%(VPa2qjSm=ri&fbr`T# zXwReZ6~a}XbDR~U+dO-XHM7f9iDcTkL(_&o6JC4%pMO!3%K7^9uSkip-j08lFuGiz1nBdb|c9T-N2u~)^FBvx%F(Zk|KrbaNjPqWO2D` zOj-&7q7|^eE+)pti139?Lx~Z0&!O1$&|=VB zO-yb}zLUHKF82M?Y(a3jDe}Y2ok1i#V)ITw%I{i0EjvV&?D!!K(4p`h04c94;V@0) zx(|h5FtZWUka<8U8Mq&>1l;^-W!PLnoZ_#-8Az%~GIVF14JAc$yRIL{mlvCwj*u6M{x!%M4e9VBy%~?D?kd% z?u+bK?`W~Q{pmdZQYMl%O*+ditGZyUQ&*~#`gfGT#C=Xli>s~KgC~l zrt~6`4_dLvn1S;`Dc+-O2rc4z!#??rknX7`Q!LEl?zA<3z^C=pd|8STmOr?*s@n%U zoR@d)G?$|6JIx1&a6Z|UrX2>Q#jHzXLWwXu2zLvw*8nN(muu3tglZ1<)%Yn9+(-V& zeV+ZpmlD82n~U!EBLGLJ3-Wv;NbMHhJBX4#J+hnhS?*x)sjRw(Nm;Dktp@dGppLb~ zh{91s@NaEnD^D?oZZ9xcQ)R^b*?cego@bZ!sQ=slGh_ZCFh zfcM!?I6(Try^-Ouy&moHNBw$;$fmh{E7WnZwW+rM;wNa2n>vQoKv>loH7siPYB4Pl z3?Xc{B~o=Z(-jY7Z{97QJF%(FrN&Of_2^HCdqc`}IjoFUqNMQBatTL)Ah~-lrMOU4 zIr?2ygi%$D(MJW<1~Lau8f`rhu{3f+vNx1A;`S`m%tLIiIK*+!Q!sYVDJ2D{U-Z2K zn2nu)Mnu4uo+{QtnkLL5IicUpKiC>0`ri2m5I{h4*cW^yNDyF6`Q~|nlEN!-?eLpS zYh_E}&w~yrl+_AvOEBCcPf}F0R0xJ!Z5vmv92AfDIP7~cTuHJUM&H4QEu3WH9-bJnBkMtZ{w0E0@OiyeK7vx1dn@=y6cc&e?h%nb<}b^_ckKv{`E6 zu9Z_=X)Br2kf?>R3sZY#lM}bn&xKDW@5uxASt`a{x|e3WJ=49476h^A1B8!$1`d-{ z;2GjMghRt3wTnVE$|5y@uilT5#`}@$T4?d#=qh1U%9GHDgz+|Ip9xw0b!t)rsl=-2 zR;_tY!ubh`cdP#h4S%*rrNU1e7j;+74F6Hqw0Kj#P3Jqnx0o$`rEVt|Jvf{?cmD2D zjihgxwS&`av^%h-n#2W0E>yBmv|<*f>clbnZGgS;pO*7Q(fE+q&1nQ)AYjhlXA<`ID+;t64dyi6vS1 zXTM2)`iq1l=-JY55Ya7VW^HfSiJq94I~k$6Nn*rWwOi;};3ze1ek0Xn?e7?aR{FlI zph+O%m(6Xz{>zU`$}Y|AnUpV2q0-*O6buq!NF~k9?ddN+0&g(#%(^Ia4&P5_nn$J* zP=LuL8WL@n<{T@SV*wPGV^fohUI*N`UxnWeUPO=Bdy>5zv$rwVVI7oztu7O%f##Z> zBI{>r#wmY_=Yyw~hLG@dGtyNSWPYWdpFo>KsE*R$vajsk^4mFISipRmO#(eNkA=La zu$;K@7rXSZ-_@O_#VrOCE=OB8wb98nKuafF_CDC3#2}p|ve!5&-U=3R=_PBpijyzi z)|FLaymrK|Z!dc?8*fi7(^r*GhWn1Mf_T%zp1;17V9d6~a%@IrsnZ#+g*)fvTnY9R zlx<4haXzN^vd&&(LxN1ruBoVTJ^rBRt?!zMm`)Qxk3-k*0+sM|k&W4BN00F9n!M=Q zer;Ngx~tHYma(jYU#R% zT-o9yV@%DQ)qSk;1u3uvko7FwG_Q38Wa>0F)${i?A%eQ)qgPUm zbb=G!<9w@_V9^!6S!=5wo&9+|p#k!azJguE zwSO}B8OtYWJ>XXFjYSs3poY$B1J3buUkGfQW^I2O$77{qd2tFmrc24dScCWSk>(Wj1z9Q?n;WiOuphmD5wyrfASku1W>VA&`rifBI80)w6G0 zSi+U!HQ&c-%RE_kt_C5w!)e$N7iN`jkzCEtMbn|H#y8SX5dxO5s0U z(J^gzgL3Si*(Rg2{MnymW3S~l4bRqI0hJ?4D|pSLV1q%KA}6G_-d(Uw=vkoU;R`L} zuXV;OYN7JAvMFP+S2M(KtE&6TvKqtP)B_8xi36qe48)qVicKl`&oUb6V!7l70+j z;_Z~o=kfiKV$3Z4@~WpgW0A}+8u}H6nVa(SFiLf!|1fj>n)fITJy3nd?x2C|8O-kf z-Qbqr^jnOSTjcfZ5us;Gi{(&;`ck76g}3u^v`dbN#o=JE^Zx13Oceg-A%O_#kv@H($`8Jzul^#s|8|Nw$3oZ|UmZW9 zYT7UEPF5>Nisk}E+I#%-i5q0^q0&_jvciA;lZLOYnQHQcI$2Q3{|vtM5!@B3u#m9- z0!{r>`1c6?^~$PD{xe#03ZUhzxS<4lS8+$nY$+CRMWlSLZ8BfnZWW%p`Je8B0GdBU zv5|~PK4D!$r<;r6UPrX!R2cwxpdkyVObFn2elpwb2M-*`e+RM8&)R94Y+ytz6AWM% zDNL&a495RT`KZh`<)py{_@0#~w4 zsFq0rVjICD4MkRYo6Q1lE!v5J>&WlR1^s^PnaD^`7{~(Xc9}maw5O+sMcC700L@!4 zSHeGB7BDo^$lX~65gRENBSsql#7?yM$``k$fL0;DpU{)##tfqHi+~=GW>Ne!bbUvQ zXAtr*{w}ZwEC=lLV{b4(<%nYbSaPuezvQVyCqb7df^egcgUdm*Es++>@Rv78n}ERsyLW7B<&3R1fe8b3xdv0YyrDY z=zu42hhQ?oO^R}Y!-hvnlNJ{stf4%MRk-f7hSHK?c}bhrB)u{~xs8BVtlLC62k0^6 zViN;|3e{{PjhwCo1C0kjQ4%#H=3E(2ra$pxgvMxQL8*mE%mP8XYd5AQWB#8tXa{j_43m{~&yMG1-=QPpq$X$c;U&-GE#O&-fVv(90 z@95)p?}S+y@&iCRnp%z7FhG;on> zH}IABz@hlta{mHZQ;7*+qW{DsS>3<7{JZDDazbGFK@#jN?J^%xo#X7B2khk4!UD=XN zd8QS%3#LL6h^Nrgfi>6b?UP)|54XE7f&V1|*FidPjDtIZx7o;C#z!t;v%OI||}GAe|*7LSCE&wzy+1(#k!Q zJ&4LQT8XG?BL3mIuUvTCYc0qXx$Gf%sZB?qP3IZQIc$m3#BolSIGhr>Q%tFvOi3QL z)%V8Y&)K_Al=ShL)3E?Ak-vEL#$s-momqiJCbuG7qbf?jC|tkDR#dNyZRqu9(pQQ{ zd%g++%nXTJM~Lakgb#c$H^BVscJe5wL=dmgf5r}w+F-?tX-YcTzpJsI=(rUFbp?nm z=al1S=Bd9T zIFlmQdtAy^zSZH;4@w44NBez;i7jQ{L$y_etcg{NhU%ZGroTkvRHSVh!R4zcRc>_D zf_qsGMpDx*fhjt;cRwZ368gyrvFhzw$!n6dT(@jR%{RJvPLuv0O=lg|)Z_kfX_1od z5+oGq?hb*`DAFOJ^yuy`B_u{GA>G~5Y=Ct4Mu#Ju)bD%t0IgXgD=8z4?fo402nkur(0D;gS;5zX!VAV9t8u%#9`+u^gNNQv|o6hs6{s%Nq* z&m{S>hCBS540&lZnv&bRF5&*Vwy=rl)-NIr^>8}3xY31;!&coV*WU3?K-4aCz3W*t zTTS0|x2BKtpjl`89u@2~5SvmdBxj75$1>$f4v(c1ybx7x~(0Nm`q!YJuI#^vG|x z?QDDHKDWE2n-iMhEM@&K)C7shn68I5yOKOhV(37bV)uAh)Nd{g#&^*VSfsU1OEz8{ z)G)7+rFGGo&%v^SH|&$Zt^uzTsADe`NMiAsIC1Fx-t4ZA;{Wo=K#nt6$?DGj*PtR3 zw=FB{MRDP~moIo`BB-rjyIF1U2b>>D2kdX~KJFc0wBFqrYMhpZuqM$6J)LBf3s~jg z%3Y6BpLF_|e}CSjfS%U_4tqICofqs*Arf@O2Fn)>aj*uW&7VV(!ps=r$M6L{ND;m_ zh~-K=<#VWOuzSUQ?K1d7DCgqSS%BoiD#lMcptaa=MS8BWqbNDY@kG39!CXJlP*xDO z_P<#G74f$TY-v;p9Q=o0s?++o;-d{nqF<%QImOHDaoeoGOC>-0OzeFuKZlkZz29=J zUvpb#%(rZ|%+C6~E36F&rTw%AGt0?dzvY)&;0Du6_WF3&7p0grdj{K;Ei{N{pIoCt zBx~^5rC$0hpI8SERVUCnYC!vS{l#y6Nj=#b9WJ?WH)KVtbqfuDDCd4HfS6V2)ch{c zdHF>A2Nd~HO@=McB9Bw*%_IU{Qk_p^}RSqNSF$PgVgqT zUp2YzzZt2u*U54jx^w0chVcw%MDB^U*Ad$#dG4(4NQt&KGo%{VYnvPr;l)0F z>#ZCmNf>RkP@uPLqs%ethoqP+@|1e`1{a4QXpfL}jr_DblEV7m?Kd0BQp(e1Sz;CC zH88h}pH8q)WvdsdFs%m{QRh7-+}lZWe-hN7kr-+Q^%Y7bZ_NQE^>1X2#pJxg{sAN& z-CMxq`h%#`-iTLPKcZ4OulVT_C)Nn)qJM`YiaU#BlMlZTcQSSRN9}NT$x%f7_e^q3H%Iao<* zh|{YlQtrYFM~))Rift{pS)OVosOZYmv0e!3Js)_uPul6pd`{hWp6fKKlBCF$3%u5n z9lcKHE9TCO;H;M4G`QNzXM zMXB5FCNbS&7o|kAV;`L0$SBcY^CNZRE3sSuUn(k0b7g}+^Eg{OA33B053%n4r30K?nmt-zL*{dAH%cVt#!Qni9j;}$r?1RIHCuEQ{;X40|-NA zat4mM)eZ5RIB@REvLHcsUg&6_BAgpA~enmZQ{S_w8`;j61*kOB+J7Z3YsV%nYfpvd7!Bs1QrcWAwX{0**^y8GMTQ^VNVZ) z`4*>0vy&0U?-lL(a(s< zdavaFE?;~6w8k3HFtW(%B@A77p*_fzTfb4pXZcR97m#5@vL4IAL~_XJB|(HX>;lq5 zhy@0`tGumT zK-|n7%O3^^7}Oyf+${Vc#lmQ9wcv+=!{x|)1za$o{V>4~cK9L4Duw^12ytpZuY~rw z{wJ7-a5f?A|GoS+Ocu5UNDsOhz?s2GA^>F*$s*Y!v%R`MJ}l~qg4neufsfIrAar5{ zd_@L7Qb_#GM0gIIof??m0`pP=Cdu|7;sEnzg7YJTv;%htO4|YK_B&vzS`6@4pyqy_ zvh=rI(8Qf<39tgA@^Q+Rz8wxkezzVy8l0)1ON4@sK9k14!y< z0{RdE%CYXt0tg4BI*>GDP-kvo5p=ZtaqCQ*PO>&^je%7moUJ>_Q$Pc{-UYcn)F`}!27?KM?@q+fphi-F0eGQVj>P*bLYzdJ zjTem}*5~_IfGPBW{3I{hF)#SdY{O&ZS{f^*?w(~Iq+9suf9jC&n=p|Qa^WIhM(DqD z{%NVlS4lKTk*L2dg&*;skTpmDF`@v(MqCv{0Ec<0@HTsY zfzqCoBO}`Un;Xs~SbFm3?Cf|@X5V%csnDwKdBPRiO|-GG9)ET^wIsj_NF9F>`HDpa z^G9ATO6z}G1PG!Kc+0?C-Hd-f>J-j)&hi}^tg#I_3zm_szkO8GFEvMJ65I&s5E0%y z)kFg>ssog{ZCZj#aRmuOF`jT_){p)xHGRv<2uV=fuQJSEiAhTOie$=(OjOAhLdW=H z!OChbe)O?VvFF`l7}6vDa*&f)l_#wvWKNSP*7;q%XH|TgB74rDSw^2c5@WBJ5c6wf zOaDZgh9xR_Xk_a$8$|X(S=st>L{w3UwKkuYwp`XEjl@l7baOJ6?}O@2Ldvjlp=zz% z7yD>_P6F{rTIC;d9R==m~*J^MN38x;*3 zbSsu}lI0i^F!q=pQaeW{tXzryy^ahiw;n3 zmEw*xr|$?Vde?)K5y8cjkF|hnJL_ALl!SHgf%KS$9{(9u<8M~`?<8g4aaBQa;Tj|Z z%~Po)#j?@7rksh9W}I?SO3D2|^x>|b_MV!;ZrN7KuOxYMYt9v+4dE(+$?8lP$WBez z#FoJQq&#z0J9*%Uaq`yK?1bM8WMAx9E-W%@YBPzc5jF9X`)M-hk8yE)ohi`YtEYFb>c;=%#O%>dLZu-D zpxaUokHg0svisU3T%_ue^DOKx7?SHy4h~y)QSoBN z$u}F}Gsej~#}9UH59df9&l|pDAj3_9vicW%DZbA8LL9Q{_mq-QX7cyG%A?Hnx`6mk z0nL@%e1u1frZy}c%$@#|)qoQLX-JWM`UT8S^<0c4Y?KP&=xCh^#zq_uQHS@P3Q9S9 zudEH_-Bu#jt_)9Jr9bhP6xc92y1f9N=m_IoeCTVcxiwpkEd>GAFL0wJ@(1>M91>4{O4W4P{<+-R4R5AUz5uowTlTG_PK=( z-kjY{F#n5McUx?9l{_`(C(fbJ`c-el!q?t~Kd0m{;!bTjr(T$%$ikhyU3@05vCBkJ zZftzmrx4iSc6Tx7WBq7IvGQ>EK;K$xC-vbc_&L4sQw5wyLd)<+Mp3S}lAS@qW=kE^ zF2@_O3q;4gD=OYQ14#dKvBBn4--m0RfV<_O(6EV81gRU{yeiyIU9d9jLiDsBVJ6E{GGD)rpn{Hb>84;J<;DCNfBUz*wH8Aya#)TFPJ()@~V& zxgzP#D_D2o`f6f=zf{#L&hDlR^JulojY;7|K9-Z{4NN@6=>aJ*;X<$wU5W?)*ILOi z@j5TwfGa6?xUr`HXLkB~qc%D{FgugpQJC7#k4?;EfQ^;%Lg_5Tz&gsbICOwR$-0~z zIZVmx+8yhNtfCja-F+|FR7Wt=Q9q?`1yC-qIhR_er&SY@qSUfOPBkP9=O}CcdLD8k zrjKoMYOEAwO=IlLjlM;5VsQ($^|cY5#1R_1dQK?Pmt#CXYWrA?V}hC>xq{(s7Fw(u z3B@A=IrV6zXAb8AWtQ`_-GDQo7oAOQZr@0C3nQk zhko(p*YOe6o^gefZ)v0A!m|1m&|cmYH8)b8T;=d~BaJ9#q@gsA#4m?>1L5aV$30Zv*X!q*{Ipn9H6$j%G1{L3^Y6dc0B?9M^LGO+kdiO}-Kx|1pQ zlleY)T97!Ln3NB*?u(^rOstiRc}C__rLXv(%D-mqlWkP%eWK!Gk8#$3>xm52dE0$8LO zfPSM*p~QsY#M!dj2l)faEY}h2oO#Q#T)xuD8(l(>KFGq`>`z#t_2HLQmpY!f;=Gtr zbBjQx*;n>V_@LQNXPOH-JaRzWj7ir0P^6~da~K?R=n-#f6=$F;N)%(qOqN?3`~-CK zs}~}NL_2nWpzc-(1>OO9A^`O*ZKKRaQeC$nGRzt#S}Ekh@1$||=pZ8Vt62^pVX;tT zRJM+N*{Qq&R8?>xQCYo9COelF(I_T*V+63GW**3U#iI8xPAq)Zr}?Sr-=Om%4BLE= z0@3hBfThrSeLX5|!QBisV)f@0yfO1mb(1!EazvLoLqQ8K?y$4;xY0z6q zG9^-Ef~5e?d@Q_WQjq9SfYLh~NeBjDh7EtS*9BgtIZ2m`^a>L-PlWfOCPVkEVz{w) z`t10a5O#!p!7w)2)9_tp>!ojXf3Mb2pWjc2i$F12rd$BrM3`>{lLnI@A`niO8LtT@ zoD^e185%CJEE zluw}>tQIh~=h;1)#3%TWeDVY^vFPJw6WC&4duej>-W#@cFET1B6F-ih;opa%MVEZs z*F?+Hs}Z}(3cgG7e&2#J3i!vpw7bfMFy7|}ICfa$5Hv84V9(nq;MyT78#j3Z0Le{b z>}3GX8+%L;-8&i4u@@^f-N9*cS3J@Mt=Gk^*9>Uj`UwX{YnCVALIC0Z-$}Y*3@ci~ z%|zlRe5T|AJ7<$hK3dDHn1moaWCR6el7b(BBS}hjCL{TE?ePPX=pzv!Oolz=KU(9; zUMQl+R4NX5gvq*s76P2@vS*HPFc8Z@clVUP8g3pFdS)P%?uSA*O9=e$NN(`5KaL<2 zw+P@T_`Bf3+8jYv!ydHxXg>1^3;jWV9_x-grUGi7*8xvBu9 ze-LDXeWagrQEm_cQIt>XBQN z-TvV-03d>UV?%?V;ldWShd=kPcD7>&1a-Dk$Y4#--2EzA!7agoC7V~u_n^dd_VFPz z-gl3Es^+nbRIKIz!@KSd68AP#ii&L12QEJa=%cEGisSjC28tYBUek`db z2)%eE9~;AbF@fE4R9)D5RLzXvI^&IJi_*rYCX0+I#GKoUN&fwUZ|JF70#=+T&MdCO zlv=%I8fAYGSEQN_W|w4ss9SN-6AA;)%EPz9!k$=;hwf)nOa3QV0I>r1J1K8z9kPlO z@UEg-U2*%d36%7y?)L&D>7J2d?2|#wvc5)7quyj1OHthDC-$}W3nz?}tJrxFEc3sf zI_6fg_T$T5eQAG{Ry?W~_o5;?PqgZrol-iYCX#1jnRSf_c9Mx4xw63 z176PEsqvRns-%UWxae1$44>4{0d1B^?*85WYHEB|TP>~fo!>~x1~a!i@2Nvo@6S5u zdx3896k1(dBp##pC0l5~_JJVU5kimgy!-s+>b95b=_giyOK74!{nc1|ImVZVh#7|0x> zsT%*46QAI+ZduddRMw#dI3ZHNNx1B6HMfiG6!H;2&%gd1)9W50ti9xdf7(^QrQKe0MwxEcN|iYi7Epiv{p7V^r~RB{@ySTZfwqhNydvJ#2{ z389y;Sz(Wo=3spRcm0mgB-)agygNGbHb>L)p?FzKQ4syIlG>5`t#_BGS_R$ z!@5h#vuWa#;h}ymyT!qO3@c<-!-!}b>WgQ-u=8?j5DW}lU;BN48S z!>R8DJPA)vsFVHMhl@JeiQo8sEPFd{+l8D3SI5LhDse|^mPd#)6V@-dvd5wGs`F?n?w^jH#}pAf0nq!nW^v?l;rR$+f8$kw~kzkn<`m= z7U2u9XSULv@GeFm(_HJOSyZ9F$_i6{MfDZNC}_rohF(}s2(}bJofImftyVZoa*x4r z4lPzbpl599cEzQOiSrt?%JBB7)HC@)O{_##Y-}Y-6NIQ_m7>T1v7;5wl1U8)S!rK-bx+wj< z-}I|@eA|pPRX?9-j$EwwAc2GIl~qio>t{3y_Py$-ieH@CVzI9t?FJ2cDZ4MwOx5tj6 zF9uhJUH5WXT0Q>qapf(A<99IpZhdN-N6R`r(o*)tN$17FPx(-twO=Q+CS#I}QdLqsY^4vz5`Pw#P)51%P(B_*p&sB;YMK~AI zseI}Emg)eVIzQV!l&X5V(4a~wRX6-o8+tlF)|d@{+L#T;m$y2s=|!@y4n#ci@sY$d zQbPw5nX*qdZ2HK;u>>@QDK^ZCQ;KE3Vrtrme(gV1=2B{kUc++IV8zFE|Ng3qNfiJF zfqVox&&%jtE9fVLYnsvvS(>O>p1PM3D7^D4os{eWr+`8_gFAtN)ZWbN^vYof7x+-f z+^mT#)t!yWz%r6wu0O=gN(0|Rm%L(rqg|bgZo$#M+zsRJgr5SiCPkieF9^ay zGfIl9Y=7c%g(d)i3P;L6H-|svU zZuSMeX#&4#0<&rry@Q)Rj#a23k%c9SDJ*n~IVLv2@_>U|ozrBVf8MV8tMPl8R;B#G zZ78mvablb6%Xftw{*s^K%85*3gi3voKexr~%if3fAG@7@7nXa|!pz4VdS6*K!aMR( z+{L8hc{*tNfKZ*8e`sE z$lxM%t=AI??zRQrG8$RfJFso7X*9U9rHE_;**spc>+_SQ@v~qYOh}55GcW05h8+lna;>CN-<4o*Ws^K5m{N?sAsN%GeeQFrjx~@{#^0WS~0O9 zpzIjOX!^v#NUC?{$)2gD))<40TBPl;a-@l4;^RA5*IMxw|Dl|=7}qg3cFjvSH?s~& zhFG#b1_dI82xf7sm?!N6*vx+WYcWKOm>)GnHE{VL?>9_2DH#l%0e9>xFj9h2jw zZrQ=4dZE?1NzE+(4x|zsu8h;rm#{S;UVGL3X0hobyO&cN+}sikG?oY9c| zGF}R$nsoL;ZV{Z7v#ey1ydZ$VEs4PZ4Z7;b>JtUZqu`)xI+#ogjiy&{k-an4CM|G%f^> z9`00`+*x5wGjuh9hPL+g&Jqpaa;-!sjOH2@!XD+38oCf$J%j`(@BcD<&9<~_HE{5FYtNIBsIwEughEo0Q`lJl|p>Pd} zcg{EO!jdAqCUR3IpHmEkO-?i~ba1K@w(^-<7$|XYR2p#18(@Ey`J^q(jF)2LzAC3t z7#4Q6QV5Y(*;gJY>#b2Wo&$^nH~VtZe-mPorE6p2u;IdVai|LhtW8IH3SJA;&Ue|u zXy9(#j9U#bI>KxQqTqf3x1*SZ5g?mKfp2E?B$ip>f3pB^dc8go3`FjXTvVGY1vPx2 zw8&qy4|zbP)Ef{nWe4K|yJ+0*e-XfPU4Ih-j{8iM;FzCSR~*4y%dlzewfThgiQ?>cO9e6f&5}cEZ%T5MbjgUCKQ%8!krnnx>XS(%8&jTX zZ$f&wqY!i%NX=T40KzB)=J4PR5Dq^DF-O{aIcM;gwNlXDHt#&-CR;6Bt4y`nzQ)+M zNds#$bowJ|tj-EEz0gkq^>v7Hpg2 zGEhR$asGEe%Zf2;2#0VBWoO=dnoA^5a1Sn8LiyjPKvv*=n*p>>AxJZ@j3`kf47bST zkj1`xX2A(&wJd^5d}6f{;2#45B+B6CU647Tqh_SFB_-qltzD{F0O@mg>1m_Nj>bex z2$$MlqgkMeCu;#RxdX$Z1E{&J6`&2kgX{rh_o^UK1c0=b7;MlB_ANVb$v(3q5~~kF zQr_%rs^7Yu4+e@VHayCPxPb~F#t6D>#1rT9#prfdL|L zdq?EJvvBfmr)6?;#~b#vq>VBYrytCmk$aV;SBmm4-HL_-_pJXve)XeSI-se$aMA*4 zWCbG~uo;m1oax_fsavE5k_falgu|Zc5VW^5)B3Q5yV@FnZf*+Cg_DhQD>mTunuu<+ z2BaAQxElZBrN{GW+$o@c$~bq5g0 zRzq*o1;1x*6%Fco%vyiEskmKwn!A6SW%RHn6t=xCdj0wKJlC5_mi-ozh48;vyVA~u z_jjG0)h<9nP%>S_Ct;z|vWmA?b{F^G`u`T7n(PAMC>h)`|2J2%J9m^%{?Hc64ET?` zv<$KV%^tG3hngd;^?6YMmiQhXX37l-&a-^jNgS3%ZhZa*@Z@SuI?sTe$j*nScSv3; z%$sHS>^p{MY4K;cQ+I{NEAZ~K3zd4jDM&RAFU-Yt^Zv6F9}|%$aH6Gm?*4hLUWOqV zGXnv@ogs5|u33j%-7zM>Mcv?{LL8etmR+v^_4@Ss1|W`iTf}ceQP86!*NV2lVbn<| zDj9RUrUp$8s6On7kI@3*tD-j;9%z}Q9F$s2T$BUIpecxKy9n$K=J!hpNcuSfds{R- z(uD-)+^l!L)j1iz7!W$-HxFgZa_B~vF*S~LdHDNO`WBAf{eZ-)MBZ&^kO*wQAmR1U z7L7MSOz-#HL)QvWYc8DJxe2cIy)1k-+Fbq7PYWbpK_0dZM?-uA8qwl>C^g1NG7ZRi zU%zHbY+#Z8ki4i$jc#OY)}RT*M}(xpXib|k71Itd|(nOcNf}{Ej!Jc5>=^%vgEoI-(Fg^G%h560-}&6qTS)D4qwu8Cbspt2u^0$Lj~ zdUKob4~*2mWY;}WKH{}6pENPY&XJ}BY4YDn367F!{~A=FpdD}DyCR|9W_j_P&*nKv zQBg|Gq;f|CIeoPkHZ&6W$A?8*DjxFUYf%E-i@bL$ub4{9P-XA26X-s%*cv8S1jB8t zOOH6zWbsUOUwkLKr{N>3+nSw`Ap4rBT1HA@q4)EPLw&K}QaG{LT&A(avx*O;w}rlw zR=l#OLeRkwlK=`waGx^eMkx|Dt$s1}-N46rnu2caFBRyNb>L16VwsDW_2D`H`2?r_b~jC+A3$wf;a>(P0+#l@2FrZqG^|%%|K$W_=n#@th9eb2T9&7{ClQup4ncNklHZh!E_Y zdb=S*6WC>4=Wu~}Y$8OS?2;W$d1fB5lUy~_h7jJ|`_{ZU7ietcBIeW{6nRo5`gq4i z=jVZSYA!^er!rr}J3v?!wq1n7%=U@bMoouftbV60x69}1hZAs%<)2EHs-vLj!X&or z8A$2tk#n47a{M5QMwz$q>)2yG`GGJCK{+BR6Y<)Gv2X9)jpbzc5pPi)J|~+HYu%P= z90PhdEB41rS;cy6F+=h{SD$7xtIC=dwe6Y;r{TReTHN#LvsRyd1-#x74eVT*R^A4v z`{LQ!QWT75Mft^(D}8t~hX3CjBQN`)!Z$LE&$?U!9UUIns|c)J3EhSZ4_o3Sgu%9B zkWdoB&??xAIuFJ*blNC+DaOw`d~9*QLr?SO1CUqGF;}L`K~2ZbYsQrxwms|cGzH<$ zPR4b!ma4jlC>sv=J|Ck-hUZdml|33ott=t1!A>>7k@|K^O(TTM>M04J{Vu0AnECFU z%ZmHIyqIAzRZ3aKZ5ey%sQFA_O6n7PoMu~?Qy$wQ-1LBcA9SWjDOJ1E-J}W94)n=> zG7;S{iMQGLx(ee`ieBJ{tHDK5 zyi*XP6#}Z3YwMty$ z$+>=fC7xkW1MI2$g68*3UD&^ITKBqk(7u4VLH=Yrw0szHipQeZRO2u*eBG>jOurB! zWqnjzSpFP2Ce_-q8g81KE-F!hhpUOmiL^zm6ed*NfBzPQTm^;!eL~Spe{IOUZmNd0P~5qnGbQt zmxTJ{x*|ZK>Ra~a2k0DSUuF{e^Q+OwMS{h=pRNgsz;f}6{x4KKA2&2NRCG>8OXMkV z@^=nwhQ#`Amg}*o3|ojvRXRgpB`4ZroG;nYb%-%TqUG7rrv2Pi)=7pQ$o}cTO zI{a$J)?z@gaODmp4!d3Szc<~-Tod8{9LP5BZ@qC_0vhfzW%**u$Lk8BM_l@+{wi9u zeom>tcWjBDp||U2wfnrRXuvWdQP$l=kUw=>r%K-hs3-{x99ehGVz{*uqTZ6= z7|C-rOwH+1dpr}uw}JRuuUvhS@}N1hzv4a8sNJ9FpQo`jJhCu605V*lykE7t6SLsewTkFQladX(pXEqF~Ff_Jv3cane-Ps7IY8|4bGC zJ<504lnHD`we)IjY?d-UU?3*x21a08Q{{OiQATEyK5s1yuGZiGM)sbjUda$Kwq0h z4tS@Nw*o6NOAvEBCnbN4G5a>OZ9|$p1q9e?_3y}tzcXx|h_R2G#C$4U2)>*;BZMVYpx4`InYhv4+FF(P5+f0E0VNP@-kRL1aG3a$sjcOwgs0R939d z6%CTC9OxpBzQ zvqFaNk~3zjcuQukC=tCEFoVIs(lv16&ObrTRq6~rOQ4a)kivv^`FkvIO(jr^t+X6S zmfYqs*>f)x$tPj+1n?;HLutVJ$t9PqO_(#g_I~c@dj;UV!yD#y)W~fQ-d+ zo_6VeqQ{PNoh@J?Jx4U&<^&5B?Q;pDaN#2(!WtW_iAQVu%Z0szkt-&PD3J64yMm

Bl!2oF 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∓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

4%CuNv;m@^enk(cL6s%SU-Tml; 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%0D9Qt=G&&G*HVz^pPzNS9@6yCM8mzk3j8GB1X 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

+
{content}
diff --git a/src/Frontend/Views/OwnedPluginView.tsx b/src/Frontend/Views/OwnedPluginView.tsx index 3c39a2bd..da57bcd6 100644 --- a/src/Frontend/Views/OwnedPluginView.tsx +++ b/src/Frontend/Views/OwnedPluginView.tsx @@ -5,6 +5,7 @@ import { PluginId, SerializedPlugin } from '../../Backend/Plugins/SerializedPlug import { Btn } from '../Components/Btn'; import { PluginElements, Spacer, Truncate } from '../Components/CoreUI'; import { RemoteModal } from '../Components/RemoteModal'; +import { Sub } from '../Components/Text'; import dfstyles from '../Styles/dfstyles'; const Error = styled.span` @@ -98,9 +99,11 @@ export class OwnedPluginView extends React.Component { ) : null}
- - {this.props.plugin.name} - {this.state.error && {' ' + this.state.error}} + + + {this.props.plugin.name} + {this.state.error && {' ' + this.state.error}} + diff --git a/src/Frontend/Views/PlanetCard.tsx b/src/Frontend/Views/PlanetCard.tsx index d5cd5a5a..1d7b2996 100644 --- a/src/Frontend/Views/PlanetCard.tsx +++ b/src/Frontend/Views/PlanetCard.tsx @@ -26,7 +26,7 @@ import { SilverGrowthText, SpeedText, } from '../Components/Labels/PlanetLabels'; -import { Subber } from '../Components/Text'; +import { Sub } from '../Components/Text'; import { TextPreview } from '../Components/TextPreview'; import { TooltipName } from '../Game/WindowManager'; import { PlanetIcons } from '../Renderers/PlanetscapeRenderer/PlanetIcons'; @@ -106,13 +106,20 @@ export function PlanetCard({ + {active && ( + <> + + + + )} + - + - energy + energy {planet?.bonus && planet.bonus[StatIdx.EnergyCap] && } @@ -122,9 +129,9 @@ export function PlanetCard({ - + - growth + growth {planet?.bonus && planet.bonus[StatIdx.EnergyGro] && } @@ -135,9 +142,9 @@ export function PlanetCard({ - + - silver + silver @@ -147,9 +154,9 @@ export function PlanetCard({ - + - growth + growth @@ -161,9 +168,9 @@ export function PlanetCard({ - + - defense + defense {planet?.bonus && planet.bonus[StatIdx.Defense] && } @@ -174,9 +181,9 @@ export function PlanetCard({ - + - speed + speed {planet?.bonus && planet.bonus[StatIdx.Speed] && } @@ -187,9 +194,9 @@ export function PlanetCard({ - + - range + range {planet?.bonus && planet.bonus[StatIdx.Range] && } @@ -199,9 +206,9 @@ export function PlanetCard({ - owner address + owner address - planet id + planet id - {active && }
); @@ -228,4 +234,8 @@ const StatRow = styled(AlignCenterHorizontally)` display: inline-block; box-sizing: border-box; width: 100%; + + path { + fill: ${dfstyles.colors.subtext}; + } `; diff --git a/src/Frontend/Views/PlanetCardComponents.tsx b/src/Frontend/Views/PlanetCardComponents.tsx index 3657b3e1..68c60ada 100644 --- a/src/Frontend/Views/PlanetCardComponents.tsx +++ b/src/Frontend/Views/PlanetCardComponents.tsx @@ -1,17 +1,15 @@ import { Artifact, Planet } from '@darkforest_eth/types'; import React from 'react'; import styled from 'styled-components'; -import { ArtifactImage } from '../Components/ArtifactImage'; import { ArtifactBiomeText, ArtifactRarityLabelAnim, ArtifactTypeText, } from '../Components/Labels/ArtifactLabels'; -import { Sub } from '../Components/Text'; +import { Sub, White } from '../Components/Text'; import { TooltipName } from '../Game/WindowManager'; import { TooltipTrigger } from '../Panes/Tooltip'; import dfstyles from '../Styles/dfstyles'; -import { planetBackground } from '../Styles/Mixins'; /** * Displayed in {@link PlanetContextPane} when a planet is {@code destroyed}. @@ -58,7 +56,10 @@ export const SpreadApart = styled.div` `; export const RowTip = ({ name, children }: { name: TooltipName; children: React.ReactNode }) => ( - + {children} ); @@ -69,6 +70,7 @@ export const TitleBar = styled.div` display: flex; flex-direction: row; justify-content: space-between; + color: ${dfstyles.colors.subtext}; border-bottom: 1px solid ${dfstyles.colors.border}; `; @@ -76,21 +78,8 @@ const StyledPlanetActiveArtifact = styled.div<{ planet: Planet | undefined }>` display: flex; flex-direction: row; justify-content: flex-start; - padding: 0.4em; align-items: center; - - font-size: ${dfstyles.fontSizeXS}; - - ${planetBackground} -`; - -const ImageWrapper = styled.span` - display: inline-block; - border: 1px solid ${dfstyles.colors.subtext}; - margin-right: 0.4em; - - width: 22px; - height: 22px; + color: ${dfstyles.colors.text}; `; export function PlanetActiveArtifact({ @@ -102,13 +91,13 @@ export function PlanetActiveArtifact({ }) { return ( - - - - Active: - {' '} - + Active Artifact:{' '} + + {' '} + {' '} + + ); diff --git a/src/Frontend/Views/PlanetLink.tsx b/src/Frontend/Views/PlanetLink.tsx index 32fda7e7..75b205d3 100644 --- a/src/Frontend/Views/PlanetLink.tsx +++ b/src/Frontend/Views/PlanetLink.tsx @@ -1,7 +1,7 @@ import { Planet } from '@darkforest_eth/types'; import React from 'react'; -import styled from 'styled-components'; import { isLocatable } from '../../_types/global/GlobalTypes'; +import { Link } from '../Components/CoreUI'; import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; import UIEmitter, { UIEmitterEvent } from '../Utils/UIEmitter'; @@ -11,7 +11,8 @@ export function PlanetLink({ planet, children }: { planet: Planet; children: Rea const uiEmitter = UIEmitter.getInstance(); return ( - { if (isLocatable(planet)) { uiManager?.setSelectedPlanet(planet); @@ -20,16 +21,6 @@ export function PlanetLink({ planet, children }: { planet: Planet; children: Rea }} > {children} - + ); } - -const LinkContainer = styled.span` - color: ${dfstyles.colors.subtext}; - cursor: pointer; - - &:hover { - text-decoration: underline; - color: white; - } -`; diff --git a/src/Frontend/Views/SendResources.tsx b/src/Frontend/Views/SendResources.tsx index 54ed48a5..b5d0b4bb 100644 --- a/src/Frontend/Views/SendResources.tsx +++ b/src/Frontend/Views/SendResources.tsx @@ -1,25 +1,27 @@ -import { - Artifact, - artifactNameFromArtifact, - ArtifactTypeNames, - Planet, -} from '@darkforest_eth/types'; -import React, { Dispatch, SetStateAction, useCallback, useEffect, useRef, useState } from 'react'; +import { Artifact, artifactNameFromArtifact, Planet } from '@darkforest_eth/types'; +import _ from 'lodash'; +import React, { Dispatch, SetStateAction, useCallback, useEffect, useState } from 'react'; import styled, { css } from 'styled-components'; import { formatNumber } from '../../Backend/Utils/Utils'; import { Wrapper } from '../../Backend/Utils/Wrapper'; import { Hook } from '../../_types/global/GlobalTypes'; import { ArtifactImage } from '../Components/ArtifactImage'; import { Btn } from '../Components/Btn'; -import { CenteredText, FullWidth, KeyboardBtn, Spacer } from '../Components/CoreUI'; +import { + AlignCenterHorizontally, + CenteredText, + EmSpacer, + FullWidth, + ShortcutKeyDown, + Spacer, +} from '../Components/CoreUI'; import { EnergyIcon, SilverIcon } from '../Components/Icons'; -import { LongDash, Sub } from '../Components/Text'; +import { LongDash, Sub, Subber } from '../Components/Text'; import WindowManager, { CursorState } from '../Game/WindowManager'; import dfstyles from '../Styles/dfstyles'; -import { useControlDown, usePlanetInactiveArtifacts, useUIManager } from '../Utils/AppHooks'; -import { useEmitterSubscribe, useEmitterValue } from '../Utils/EmitterHooks'; -import { escapeDown$, keyUp$, useIsDown } from '../Utils/KeyEmitters'; -import { TOGGLE_SEND } from '../Utils/ShortcutConstants'; +import { useOnSendCompleted, usePlanetInactiveArtifacts, useUIManager } from '../Utils/AppHooks'; +import { SpecialKey, useIsDown, useOnUp } from '../Utils/KeyEmitters'; +import { EXIT_PANE, TOGGLE_SEND } from '../Utils/ShortcutConstants'; import UIEmitter, { UIEmitterEvent } from '../Utils/UIEmitter'; const DEFAULT_ENERGY_PERCENT = 50; @@ -129,9 +131,9 @@ function ResourceBar({
- - {getResource(value)} {isSilver ? 'silver' : 'energy'} - + {getResource(value)} + + {isSilver ? 'silver' : 'energy'}
@@ -148,44 +150,28 @@ function ResourceBar({ ); } -const height = 3.5; -const margin = 0.5; -const thumb = height - 2 * margin; -const StyledSelectArtifactRow = styled.div<{ planet: Planet | undefined }>` - width: 100%; - - border-top: 1px solid ${dfstyles.colors.border}; - border-bottom: 1px solid ${dfstyles.colors.border}; - height: ${height}em; - padding: ${margin}em; -`; - const RowWrapper = styled.div<{ artifacts: Artifact[] }>` width: 100%; display: flex; flex-direction: row; justify-content: ${({ artifacts }) => (artifacts.length > 0 ? 'flex-start' : 'space-around')}; align-items: center; - overflow-x: scroll; `; const thumbActive = css` - border: 1px solid ${dfstyles.colors.text}; - outline: 2px solid ${dfstyles.colors.text}; - outline-offset: -2px; + border: 1px solid ${dfstyles.colors.border}; `; const StyledArtifactThumb = styled.div<{ active: boolean }>` - min-width: ${thumb}em; - min-height: ${thumb}em; - width: ${thumb}em; - height: ${thumb}em; + min-width: ${2.5}em; + min-height: ${2.5}em; + width: ${2.5}em; + height: ${2.5}em; - border: 1px solid ${dfstyles.colors.subtext}; + border: 1px solid ${dfstyles.colors.borderDark}; border-radius: 1px; - margin-right: ${margin}em; &:last-child { margin-right: none; } @@ -233,31 +219,27 @@ function ArtifactThumb({ } function SelectArtifactRow({ - planet, sendArtifact, setSendArtifact, inactiveArtifacts, }: { - planet: Planet; sendArtifact: Artifact | undefined; setSendArtifact: Hook[1]; inactiveArtifacts: Artifact[]; }) { return ( - - - {inactiveArtifacts.length > 0 && - inactiveArtifacts.map((a) => ( - - ))} - {inactiveArtifacts.length === 0 && No movable artifacts!} - - + + {inactiveArtifacts.length > 0 && + inactiveArtifacts.map((a) => ( + + ))} + {inactiveArtifacts.length === 0 && No movable artifacts!} + ); } @@ -266,7 +248,6 @@ const First = styled.span` flex-direction: row; justify-content: space-between; width: 100%; - padding: 8px; `; const Remove = styled.span` @@ -288,22 +269,22 @@ function SendRow({ remove: () => void; sending: boolean; }) { - const isDown = useIsDown(TOGGLE_SEND); - return ( <> {(artifact && ( - {artifactNameFromArtifact(artifact)}{' '} - {artifact && ({ArtifactTypeNames[artifact.artifactType]})} - remove + {'sending ' + artifactNameFromArtifact(artifact)} + don't send )) || <>} - - Send - {TOGGLE_SEND} - + + + Send + + + + ); @@ -315,32 +296,24 @@ export function SendResources({ planetWrapper: Wrapper; }) { const uiManager = useUIManager(); - const energyHook = useState( p.value && uiManager.getForcesSending(p.value.locationId) ? uiManager.getForcesSending(p.value.locationId) : DEFAULT_ENERGY_PERCENT ); const [energyPercent, setEnergyPercent] = energyHook; - const silverHook = useState( p.value && uiManager.getSilverSending(p.value.locationId) ? uiManager.getSilverSending(p.value.locationId) : DEFAULT_SILVER_PERCENT ); const [silverPercent, setSilverPercent] = silverHook; - const [sending, setSending] = useState(false); const windowManager = WindowManager.getInstance(); - const ctrlDown = useControlDown(); - const keyUp = useEmitterValue(keyUp$, undefined); - const lastKeyUp = useRef(keyUp); - useEffect(() => { if (!p.value || !uiManager) return; - uiManager.setForcesSending(p.value.locationId, energyPercent); uiManager.setSilverSending(p.value.locationId, silverPercent); }, [energyPercent, silverPercent, p, uiManager]); @@ -359,9 +332,7 @@ export function SendResources({ const doSend = useCallback(() => { if (!uiManager || !windowManager) return; - const uiEmitter = UIEmitter.getInstance(); - if (windowManager.getCursorState() === CursorState.TargetingForces) { setSending(false); windowManager.setCursorState(CursorState.Normal); @@ -373,53 +344,42 @@ export function SendResources({ } }, [p, windowManager, uiManager]); - /** - * If the user presses 0-9, set the energy percent we're sending to be - * that value times 10. If they press '-' or '=', decrease or increase - * the energy percent we're sending respectively. - */ - useEffect(() => { - if (!keyUp) return; - if (lastKeyUp.current === keyUp) return; - lastKeyUp.current = keyUp; - - let setPercent = setEnergyPercent; - let currentPercent = energyPercent; - if (ctrlDown) { - setPercent = setSilverPercent; - currentPercent = silverPercent; - } + const shiftDown = useIsDown(SpecialKey.Shift); - if (keyUp.value === '-') { - setPercent(Math.max(currentPercent - 1, 0)); - return; - } else if (keyUp.value === '=') { - setPercent(Math.min(currentPercent + 1, 100)); - return; - } else if (keyUp.value === TOGGLE_SEND) { - doSend(); - return; + useOnUp(TOGGLE_SEND, doSend); + useOnUp(EXIT_PANE, () => { + if (!sending) uiManager.selectedPlanetId$.publish(undefined); + else { + UIEmitter.getInstance().emit(UIEmitterEvent.SendCancelled); + setSending(false); } + }); - const digitValue = parseInt(keyUp.value, 10); - if (isNaN(digitValue)) return; - - setPercent(digitValue * 10 + (digitValue === 0 ? 100 : 0)); - }, [keyUp, energyPercent, setEnergyPercent, setSilverPercent, ctrlDown, doSend, silverPercent]); + for (let i = 0; i < 10; i++) { + // eslint-disable-next-line react-hooks/rules-of-hooks + useOnUp(i + '', () => { + let percent = i * 10; - useEffect(() => { - const uiEmitter = UIEmitter.getInstance(); + if (i === 0) { + percent = 100; + } - const onComplete = () => { - setSending(false); - windowManager.setCursorState(CursorState.Normal); - }; + !shiftDown && setEnergyPercent(percent); + shiftDown && setSilverPercent(percent); + }); + } - uiEmitter.on(UIEmitterEvent.SendCompleted, onComplete); + const setPercent = shiftDown ? setSilverPercent : setEnergyPercent; + useOnUp('-', () => { + setPercent((p) => _.clamp(p - 10, 0, 100)); + }); + useOnUp('+', () => { + setPercent((p) => _.clamp(p + 10, 0, 100)); + }); - return () => { - uiEmitter.removeListener(UIEmitterEvent.SendCompleted, onComplete); - }; + useOnSendCompleted(() => { + setSending(false); + windowManager.setCursorState(CursorState.Normal); }); /* sending artifacts stuff */ @@ -448,21 +408,9 @@ export function SendResources({ uiManager.setArtifactSending(p.value.locationId, sendArtifact); }, [sendArtifact, uiManager, p]); - const remove = useCallback(() => setSendArtifact(undefined), [setSendArtifact]); + const removeArtifact = useCallback(() => setSendArtifact(undefined), [setSendArtifact]); const artifacts = usePlanetInactiveArtifacts(p, uiManager); - // attach escape key listener - /* TODO rethink this. this is a trash way of doing this. this only works because - `SendResources` is always open when `PlanetContextPane` is, but we shouldn't trust this. */ - const onEscapeDown = useCallback(() => { - if (!sending) uiManager.selectedPlanetId$.publish(undefined); - else { - UIEmitter.getInstance().emit(UIEmitterEvent.SendCancelled); - setSending(false); - } - }, [uiManager, sending]); - useEmitterSubscribe(escapeDown$, onEscapeDown); - return ( @@ -475,10 +423,13 @@ export function SendResources({ /> )} {p.value && artifacts.length > 0 && ( - + <> + + + )} - + ); } diff --git a/src/Frontend/Views/Share.tsx b/src/Frontend/Views/Share.tsx index 2c3e79c1..d87a61b7 100644 --- a/src/Frontend/Views/Share.tsx +++ b/src/Frontend/Views/Share.tsx @@ -32,7 +32,7 @@ const OnTop = styled.div` const AddressChooserContainer = styled.div` width: 500px; - background-color: white; + background-color: ${dfstyles.colors.text}; color: black; padding: 8px; margin: 4px; @@ -40,7 +40,7 @@ const AddressChooserContainer = styled.div` const AddressOption = styled.div` ${({ selected }: { selected: boolean }) => css` - background-color: white; + background-color: ${dfstyles.colors.text}; cursor: pointer; display: block; margin: 3px; diff --git a/src/Frontend/Views/SidebarPane.tsx b/src/Frontend/Views/SidebarPane.tsx new file mode 100644 index 00000000..e4bb88a1 --- /dev/null +++ b/src/Frontend/Views/SidebarPane.tsx @@ -0,0 +1,110 @@ +import React, { useState } from 'react'; +import styled from 'styled-components'; +import { BorderlessPane, EmSpacer } from '../Components/CoreUI'; +import { GameWindowZIndex } from '../Utils/constants'; +import { + TOGGLE_HELP_PANE, + TOGGLE_PLUGINS_PANE, + TOGGLE_SETTINGS_PANE, + TOGGLE_YOUR_ARTIFACTS_PANE, + TOGGLE_YOUR_PLANETS_DEX_PANE, +} from '../Utils/ShortcutConstants'; +import { + ModalHelpIcon, + ModalPlanetDexIcon, + ModalPluginIcon, + ModalSettingsIcon, + ModalYourArtifactsIcon, +} from './ModalIcon'; +import { ModalHook } from './ModalPane'; + +export function SidebarPane({ + settingsHook, + helpHook, + pluginsHook, + yourArtifactsHook, + planetdexHook, +}: { + settingsHook: ModalHook; + helpHook: ModalHook; + pluginsHook: ModalHook; + yourArtifactsHook: ModalHook; + planetdexHook: ModalHook; +}) { + const [sidebarHovered, setSidebarHovered] = useState(false); + + return ( + setSidebarHovered(true)} + onMouseLeave={() => setSidebarHovered(false)} + > + + + + + + + + + + + + + + ); +} + +const WindowTogglesPaneContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + position: absolute; + top: 0; + left: 0; +`; diff --git a/src/Frontend/Views/SortableTable.tsx b/src/Frontend/Views/SortableTable.tsx index 03209a7e..2898323d 100644 --- a/src/Frontend/Views/SortableTable.tsx +++ b/src/Frontend/Views/SortableTable.tsx @@ -11,7 +11,7 @@ const Header = styled(TableCell)` ${({ isActive, isReverse }: { isActive: boolean; isReverse: boolean }) => css` padding: 2px 4px; font-weight: normal; - color: white; + color: ${dfstyles.colors.text}; user-select: none; cursor: pointer; ${isActive && 'text-decoration: underline;'} diff --git a/src/Frontend/Views/Terminal.tsx b/src/Frontend/Views/Terminal.tsx index a1c5bd5b..e77cb9d2 100644 --- a/src/Frontend/Views/Terminal.tsx +++ b/src/Frontend/Views/Terminal.tsx @@ -1,9 +1,11 @@ import EventEmitter from 'events'; import React, { useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'; import styled, { css } from 'styled-components'; +import { Link } from '../Components/CoreUI'; import { Hoverable } from '../Components/Hoverable'; +import { MythicLabelText } from '../Components/Labels/MythicLabel'; import { LoadingSpinner } from '../Components/LoadingSpinner'; -import { BasicLink, Blue, Green, Invisible, Red, Sub, White } from '../Components/Text'; +import { Blue, Green, Invisible, Red, Sub, Subber, White } from '../Components/Text'; import { LoadingBarHandle, TextLoadingBar } from '../Components/TextLoadingBar'; import dfstyles from '../Styles/dfstyles'; import { isFirefox } from '../Utils/BrowserChecks'; @@ -75,7 +77,7 @@ function TerminalImpl({ promptCharacter }: TerminalProps, ref: React.Ref void) | undefined = undefined, hoverContents?: () => JSX.Element ) => { @@ -83,10 +85,13 @@ function TerminalImpl({ promptCharacter }: TerminalProps, ref: React.Ref{str}; if (onClick !== undefined) { - innerFragment = {innerFragment}; + innerFragment = {innerFragment}; } switch (style) { + case TerminalTextStyle.Mythic: + fragment = ; + break; case TerminalTextStyle.Green: fragment = {innerFragment}; break; @@ -96,6 +101,9 @@ function TerminalImpl({ promptCharacter }: TerminalProps, ref: React.Ref{innerFragment}; break; + case TerminalTextStyle.Subber: + fragment = {innerFragment}; + break; case TerminalTextStyle.White: fragment = {innerFragment}; break; diff --git a/src/Frontend/Views/TopBar.tsx b/src/Frontend/Views/TopBar.tsx index 32595506..f6b03005 100644 --- a/src/Frontend/Views/TopBar.tsx +++ b/src/Frontend/Views/TopBar.tsx @@ -1,14 +1,13 @@ import { EthAddress } from '@darkforest_eth/types'; -import React, { useCallback, useState } from 'react'; +import React from 'react'; import styled from 'styled-components'; import { AlignCenterHorizontally, EmSpacer, Spacer } from '../Components/CoreUI'; -import { LoggedInPlayer } from '../Components/Labels/Labels'; +import { AccountLabel } from '../Components/Labels/Labels'; import { Sub, White } from '../Components/Text'; import { TooltipName } from '../Game/WindowManager'; import { TooltipTrigger } from '../Panes/Tooltip'; import { usePlayer, useUIManager } from '../Utils/AppHooks'; import { GameWindowZIndex } from '../Utils/constants'; -import { usePoll } from '../Utils/Hooks'; import { ModalTwitterVerifyIcon } from './ModalIcon'; import { ModalHook } from './ModalPane'; @@ -28,23 +27,17 @@ function TopBarSection({ children }: { children: React.ReactNode }) { function BoardPlacement({ account }: { account: EthAddress | undefined }) { const uiManager = useUIManager(); - const [score, setScore] = useState(); - - const syncScore = useCallback(() => { - setScore(uiManager.getMyScore()); - }, [uiManager, setScore]); - - usePoll(syncScore, 5000); + const player = usePlayer(uiManager, account); let content; - if (!account) { - content = error loading account; + if (!player.value) { + content = n/a; } else { content = ( - {score || 0} pts + {player.value.score ?? 'n/a'} pts ); @@ -74,15 +67,14 @@ export function TopBar({ twitterVerifyHook }: { twitterVerifyHook: ModalHook }) return ( - + diff --git a/src/_types/darkforest/api/ChunkStoreTypes.ts b/src/_types/darkforest/api/ChunkStoreTypes.ts index 4b8f0f38..9726c7f4 100644 --- a/src/_types/darkforest/api/ChunkStoreTypes.ts +++ b/src/_types/darkforest/api/ChunkStoreTypes.ts @@ -1,19 +1,15 @@ -import { LocationId } from '@darkforest_eth/types'; -import { Rectangle } from '../../global/GlobalTypes'; +import type { Abstract, LocationId } from '@darkforest_eth/types'; +import type { Rectangle } from '../../global/GlobalTypes'; /** * one of "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" */ -export type BucketId = string & { - __value__: never; -}; +export type BucketId = Abstract; /** * Don't worry about the values here. Never base code off the values here. PLEASE. */ -export type ChunkId = string & { - __value__: never; -}; +export type ChunkId = Abstract; /** * Chunks represent map data in some rectangle. This type represents a chunk when it is at rest in diff --git a/src/_types/darkforest/api/ContractsAPITypes.ts b/src/_types/darkforest/api/ContractsAPITypes.ts index c02da83a..928fa1a8 100644 --- a/src/_types/darkforest/api/ContractsAPITypes.ts +++ b/src/_types/darkforest/api/ContractsAPITypes.ts @@ -56,6 +56,8 @@ export const enum ContractEvent { // DarkForestGPTCredit ChangedGPTCreditPrice = 'ChangedCreditPrice', + // DarkForestScoringRound3 + LocationClaimed = 'LocationClaimed', } export const enum ContractsAPIEvent { @@ -71,6 +73,7 @@ export const enum ContractsAPIEvent { TxConfirmed = 'TxConfirmed', TxReverted = 'TxReverted', PlanetTransferred = 'PlanetTransferred', + PlanetClaimed = 'PlanetClaimed', } // planet locationID(BigInt), branch number @@ -101,6 +104,14 @@ export type MoveArgs = [ ] ]; +// Same as reveal args with Explicit coords attached +export type ClaimArgs = [ + [string, string], + [[string, string], [string, string]], + [string, string], + [string, string, string, string, string, string, string, string, string] +]; + export type DepositArtifactArgs = [string, string]; // locationId, artifactId export type WithdrawArtifactArgs = [string, string]; // locationId, artifactId @@ -149,6 +160,7 @@ export interface ContractConstants { PERLIN_THRESHOLD_3: number; INIT_PERLIN_MIN: number; INIT_PERLIN_MAX: number; + SPAWN_RIM_AREA: number; BIOME_THRESHOLD_1: number; BIOME_THRESHOLD_2: number; PLANET_RARITY: number; @@ -157,6 +169,7 @@ export interface ContractConstants { PHOTOID_ACTIVATION_DELAY: number; LOCATION_REVEAL_COOLDOWN: number; + CLAIM_PLANET_COOLDOWN: number; defaultPopulationCap: number[]; defaultPopulationGrowth: number[]; diff --git a/src/_types/global/GlobalTypes.ts b/src/_types/global/GlobalTypes.ts index 1a100ab5..5b42a3b8 100644 --- a/src/_types/global/GlobalTypes.ts +++ b/src/_types/global/GlobalTypes.ts @@ -98,3 +98,9 @@ export interface RevealCountdownInfo { currentlyRevealing: boolean; // true iff player has an unconfirmedReveal currently being processed revealCooldownTime: number; // in seconds } + +export interface ClaimCountdownInfo { + myLastClaimTimestamp?: number; // if undefined, never revealed before + currentlyClaiming: boolean; // true iff player has an unconfirmedReveal currently being processed + claimCooldownTime: number; // in seconds +} diff --git a/yarn.lock b/yarn.lock index 84dd76d1..220009ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4073,6 +4073,11 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== +"@types/uuid@^8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.1.tgz#1a32969cf8f0364b3d8c8af9cc3555b7805df14f" + integrity sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg== + "@types/wait-on@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@types/wait-on/-/wait-on-5.2.0.tgz#f9096b7bd0c9c03052d6d402ae5cd51714480b2d" @@ -8325,6 +8330,11 @@ del@^6.0.0: rimraf "^3.0.2" slash "^3.0.0" +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" From 2018eb5eb224d59870e19224e205aa5c3b56e8cb Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 12 Aug 2021 04:02:26 +0000 Subject: [PATCH 13/68] update client --- .../Backend_GameLogic_GameManager.default.md | 8 +- ...Backend_GameLogic_GameUIManager.default.md | 8 +- .../Frontend_Utils_SettingsHooks.Setting.md | 7 + ...d_Utils_TerminalTypes.TerminalTextStyle.md | 21 +- docs/modules/Backend_Network_Blockchain.md | 4 +- docs/modules/Frontend_Components_ReadMore.md | 1 + docs/modules/Frontend_Components_Text.md | 129 +------ docs/modules/Frontend_Panes_BroadcastPane.md | 10 +- .../modules/Frontend_Panes_ClaimPlanetPane.md | 14 +- docs/modules/Frontend_Panes_HatPane.md | 10 +- ...anetArtifacts_ManagePlanetArtifactsPane.md | 10 +- .../Frontend_Panes_UpgradeDetailsPane.md | 10 +- docs/modules/Frontend_Styles_dfstyles.md | 1 + docs/modules/Frontend_Utils_constants.md | 2 +- last_updated.txt | 2 +- package.json | 20 +- src/Backend/GameLogic/ContractsAPI.ts | 2 + src/Backend/GameLogic/GameManager.ts | 19 +- src/Backend/GameLogic/GameUIManager.ts | 4 +- src/Backend/Network/Blockchain.ts | 4 +- src/Backend/Procedural/ProcgenConsts.ts | 38 --- src/Backend/Storage/PersistentChunkStore.ts | 1 + src/Frontend/Components/CoreUI.tsx | 9 +- .../Components/Labels/PlanetLabels.tsx | 6 +- src/Frontend/Components/OpenPaneButtons.tsx | 12 +- src/Frontend/Components/PlanetPreview.tsx | 1 - src/Frontend/Components/ReadMore.tsx | 40 +-- src/Frontend/Components/Text.tsx | 105 +----- src/Frontend/Game/NotificationManager.tsx | 6 +- src/Frontend/Pages/GameLandingPage.tsx | 69 ++-- src/Frontend/Pages/LandingPage.tsx | 23 +- src/Frontend/Panes/BroadcastPane.tsx | 13 +- src/Frontend/Panes/ClaimPlanetPane.tsx | 41 ++- src/Frontend/Panes/HatPane.tsx | 17 +- src/Frontend/Panes/HelpPane.tsx | 43 ++- src/Frontend/Panes/HoverPlanetPane.tsx | 2 +- .../Panes/ManagePlanetArtifacts/Find.tsx | 2 +- .../ManagePlanetArtifactsPane.tsx | 40 +-- src/Frontend/Panes/OnboardingPane.tsx | 20 ++ src/Frontend/Panes/PlanetContextPane.tsx | 6 +- src/Frontend/Panes/PlayerInfoPane.tsx | 2 +- src/Frontend/Panes/SettingsPane.tsx | 12 + src/Frontend/Panes/UpgradeDetailsPane.tsx | 18 +- src/Frontend/Styles/dfstyles.ts | 2 + src/Frontend/Utils/KeyEmitters.ts | 11 +- src/Frontend/Utils/SettingsHooks.tsx | 2 + src/Frontend/Utils/TerminalTypes.ts | 1 + src/Frontend/Utils/constants.ts | 2 +- src/Frontend/Views/ModalIcon.tsx | 20 +- src/Frontend/Views/ModalPane.tsx | 4 +- src/Frontend/Views/PlanetCard.tsx | 318 ++++++++++++------ src/Frontend/Views/SendResources.tsx | 26 +- src/Frontend/Views/Terminal.tsx | 7 +- src/Frontend/Views/TopBar.tsx | 31 +- 54 files changed, 578 insertions(+), 658 deletions(-) diff --git a/docs/classes/Backend_GameLogic_GameManager.default.md b/docs/classes/Backend_GameLogic_GameManager.default.md index 754c8be9..b876da0c 100644 --- a/docs/classes/Backend_GameLogic_GameManager.default.md +++ b/docs/classes/Backend_GameLogic_GameManager.default.md @@ -1473,13 +1473,13 @@ Gets a list of the planets that the player logged into this `GameManager` owns. ### getMyScore -▸ **getMyScore**(): `number` +▸ **getMyScore**(): `undefined` \| `number` Get the score of the currently logged-in account. #### Returns -`number` +`undefined` \| `number` --- @@ -1735,7 +1735,7 @@ this client. ### getPlayerScore -▸ **getPlayerScore**(`addr`): `number` +▸ **getPlayerScore**(`addr`): `undefined` \| `number` #### Parameters @@ -1745,7 +1745,7 @@ this client. #### Returns -`number` +`undefined` \| `number` --- diff --git a/docs/classes/Backend_GameLogic_GameUIManager.default.md b/docs/classes/Backend_GameLogic_GameUIManager.default.md index 74a3efe6..6a972dc7 100644 --- a/docs/classes/Backend_GameLogic_GameUIManager.default.md +++ b/docs/classes/Backend_GameLogic_GameUIManager.default.md @@ -1338,11 +1338,11 @@ state in some way ### getMyScore -▸ **getMyScore**(): `number` +▸ **getMyScore**(): `undefined` \| `number` #### Returns -`number` +`undefined` \| `number` --- @@ -1468,7 +1468,7 @@ state in some way ### getPlayerScore -▸ **getPlayerScore**(`player`): `number` +▸ **getPlayerScore**(`player`): `undefined` \| `number` #### Parameters @@ -1478,7 +1478,7 @@ state in some way #### Returns -`number` +`undefined` \| `number` --- diff --git a/docs/enums/Frontend_Utils_SettingsHooks.Setting.md b/docs/enums/Frontend_Utils_SettingsHooks.Setting.md index 69aa8c7d..1c4be28c 100644 --- a/docs/enums/Frontend_Utils_SettingsHooks.Setting.md +++ b/docs/enums/Frontend_Utils_SettingsHooks.Setting.md @@ -10,6 +10,7 @@ per instance of the dark forest contract that it's connected to. ### Enumeration members - [AutoApproveNonPurchaseTransactions](Frontend_Utils_SettingsHooks.Setting.md#autoapprovenonpurchasetransactions) +- [DisableDefaultShortcuts](Frontend_Utils_SettingsHooks.Setting.md#disabledefaultshortcuts) - [DrawChunkBorders](Frontend_Utils_SettingsHooks.Setting.md#drawchunkborders) - [FoundArtifact](Frontend_Utils_SettingsHooks.Setting.md#foundartifact) - [FoundComet](Frontend_Utils_SettingsHooks.Setting.md#foundcomet) @@ -39,6 +40,12 @@ per instance of the dark forest contract that it's connected to. --- +### DisableDefaultShortcuts + +• **DisableDefaultShortcuts** = `"DisableDefaultShortcuts"` + +--- + ### DrawChunkBorders • **DrawChunkBorders** = `"DrawChunkBorders"` diff --git a/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md b/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md index 8bb10098..e8b37a30 100644 --- a/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md +++ b/docs/enums/Frontend_Utils_TerminalTypes.TerminalTextStyle.md @@ -14,6 +14,7 @@ - [Red](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#red) - [Sub](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#sub) - [Subber](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#subber) +- [Text](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#text) - [Underline](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#underline) - [White](Frontend_Utils_TerminalTypes.TerminalTextStyle.md#white) @@ -21,7 +22,7 @@ ### Blue -• **Blue** = `5` +• **Blue** = `6` --- @@ -33,25 +34,25 @@ ### Hoverable -• **Hoverable** = `8` +• **Hoverable** = `9` --- ### Invisible -• **Invisible** = `6` +• **Invisible** = `7` --- ### Mythic -• **Mythic** = `9` +• **Mythic** = `10` --- ### Red -• **Red** = `4` +• **Red** = `5` --- @@ -67,12 +68,18 @@ --- +### Text + +• **Text** = `3` + +--- + ### Underline -• **Underline** = `7` +• **Underline** = `8` --- ### White -• **White** = `3` +• **White** = `4` diff --git a/docs/modules/Backend_Network_Blockchain.md b/docs/modules/Backend_Network_Blockchain.md index ada4e43c..1832abdf 100644 --- a/docs/modules/Backend_Network_Blockchain.md +++ b/docs/modules/Backend_Network_Blockchain.md @@ -94,9 +94,9 @@ Loads ths GPT Credit contract, which players can pay to talk to artifacts. ▸ **loadScoringContract**(`address`, `provider`, `signer?`): `Promise`<`DarkForestScoringRound3`\> -Loads ths GPT Credit contract, which players can pay to talk to artifacts. +Loads the Round 3 Scoring contract which tracks claimed planets and player claim cooldowns. -**`see`** https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestGPTCredit.sol +**`see`** https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestRound3Scoring.sol #### Parameters diff --git a/docs/modules/Frontend_Components_ReadMore.md b/docs/modules/Frontend_Components_ReadMore.md index 63d8f4be..1c0b4ea6 100644 --- a/docs/modules/Frontend_Components_ReadMore.md +++ b/docs/modules/Frontend_Components_ReadMore.md @@ -19,6 +19,7 @@ | `__namedParameters` | `Object` | | `__namedParameters.children` | `React.ReactChild`[] \| `React.ReactChild` | | `__namedParameters.height?` | `string` | +| `__namedParameters.text?` | `string` | #### Returns diff --git a/docs/modules/Frontend_Components_Text.md b/docs/modules/Frontend_Components_Text.md index 30c60afb..90d8ad7b 100644 --- a/docs/modules/Frontend_Components_Text.md +++ b/docs/modules/Frontend_Components_Text.md @@ -10,14 +10,11 @@ - [Green](Frontend_Components_Text.md#green) - [HideSmall](Frontend_Components_Text.md#hidesmall) - [Invisible](Frontend_Components_Text.md#invisible) -- [Item](Frontend_Components_Text.md#item) -- [List](Frontend_Components_Text.md#list) -- [Paragraph](Frontend_Components_Text.md#paragraph) - [Red](Frontend_Components_Text.md#red) - [Smaller](Frontend_Components_Text.md#smaller) -- [StyledLink](Frontend_Components_Text.md#styledlink) - [Sub](Frontend_Components_Text.md#sub) - [Subber](Frontend_Components_Text.md#subber) +- [Text](Frontend_Components_Text.md#text) - [White](Frontend_Components_Text.md#white) ### Functions @@ -28,14 +25,8 @@ - [CenterPlanetLink](Frontend_Components_Text.md#centerplanetlink) - [Coords](Frontend_Components_Text.md#coords) - [FAQ04Link](Frontend_Components_Text.md#faq04link) -- [FakeLine](Frontend_Components_Text.md#fakeline) -- [Header](Frontend_Components_Text.md#header) - [LongDash](Frontend_Components_Text.md#longdash) - [PlanetNameLink](Frontend_Components_Text.md#planetnamelink) -- [Space](Frontend_Components_Text.md#space) -- [Tab](Frontend_Components_Text.md#tab) -- [Text](Frontend_Components_Text.md#text) -- [Title](Frontend_Components_Text.md#title) - [TxLink](Frontend_Components_Text.md#txlink) ## Variables @@ -76,24 +67,6 @@ --- -### Item - -• `Const` **Item**: `StyledComponent`<`"li"`, `any`, `Object`, `never`\> - ---- - -### List - -• `Const` **List**: `StyledComponent`<`"ul"`, `any`, `Object`, `never`\> - ---- - -### Paragraph - -• `Const` **Paragraph**: `StyledComponent`<`"p"`, `any`, `Object`, `never`\> - ---- - ### Red • `Const` **Red**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> @@ -106,12 +79,6 @@ --- -### StyledLink - -• `Const` **StyledLink**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> - ---- - ### Sub • `Const` **Sub**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> @@ -124,6 +91,12 @@ --- +### Text + +• `Const` **Text**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> + +--- + ### White • `Const` **White**: `StyledComponent`<`"span"`, `any`, `Object`, `never`\> @@ -227,34 +200,6 @@ --- -### FakeLine - -▸ `Const` **FakeLine**(): `Element` - -#### Returns - -`Element` - ---- - -### Header - -▸ **Header**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :--------------------------- | :-------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.children` | `React.ReactNode` | -| `__namedParameters.style?` | `React.CSSProperties` | - -#### Returns - -`Element` - ---- - ### LongDash ▸ `Const` **LongDash**(): `Element` @@ -282,66 +227,6 @@ --- -### Space - -▸ **Space**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :------------------------- | :------- | -| `__namedParameters` | `Object` | -| `__namedParameters.length` | `number` | - -#### Returns - -`Element` - ---- - -### Tab - -▸ `Const` **Tab**(): `Element` - -#### Returns - -`Element` - ---- - -### Text - -▸ **Text**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :------------------ | :---------- | -| `__namedParameters` | `TextProps` | - -#### Returns - -`Element` - ---- - -### Title - -▸ **Title**(`__namedParameters`): `Element` - -#### Parameters - -| Name | Type | -| :--------------------------- | :---------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.children` | `React.ReactNode` | - -#### Returns - -`Element` - ---- - ### TxLink ▸ **TxLink**(`__namedParameters`): `Element` diff --git a/docs/modules/Frontend_Panes_BroadcastPane.md b/docs/modules/Frontend_Panes_BroadcastPane.md index 83904177..592c55db 100644 --- a/docs/modules/Frontend_Panes_BroadcastPane.md +++ b/docs/modules/Frontend_Panes_BroadcastPane.md @@ -15,11 +15,11 @@ #### Parameters -| Name | Type | -| :--------------------------- | :--------------------------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | -| `__namedParameters.planetId` | `LocationId` \| `undefined` | +| Name | Type | +| :---------------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.initialPlanetId` | `LocationId` \| `undefined` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | #### Returns diff --git a/docs/modules/Frontend_Panes_ClaimPlanetPane.md b/docs/modules/Frontend_Panes_ClaimPlanetPane.md index 069c2991..8d6ccef7 100644 --- a/docs/modules/Frontend_Panes_ClaimPlanetPane.md +++ b/docs/modules/Frontend_Panes_ClaimPlanetPane.md @@ -10,16 +10,16 @@ ### ClaimPlanetPane -▸ **ClaimPlanetPane**(`__namedParameters`): `null` \| `Element` +▸ **ClaimPlanetPane**(`__namedParameters`): `React.ReactElement` #### Parameters -| Name | Type | -| :---------------------------- | :--------------------------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | -| `__namedParameters.planetId?` | `LocationId` | +| Name | Type | +| :----------------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.initialPlanetId?` | `LocationId` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | #### Returns -`null` \| `Element` +`React.ReactElement` diff --git a/docs/modules/Frontend_Panes_HatPane.md b/docs/modules/Frontend_Panes_HatPane.md index 8f8320a8..1af5e404 100644 --- a/docs/modules/Frontend_Panes_HatPane.md +++ b/docs/modules/Frontend_Panes_HatPane.md @@ -14,11 +14,11 @@ #### Parameters -| Name | Type | -| :---------------------------- | :--------------------------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | -| `__namedParameters.planetId?` | `LocationId` | +| Name | Type | +| :----------------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.initialPlanetId?` | `LocationId` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | #### Returns diff --git a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md index be4edc01..3e2eb506 100644 --- a/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md +++ b/docs/modules/Frontend_Panes_ManagePlanetArtifacts_ManagePlanetArtifactsPane.md @@ -29,11 +29,11 @@ activating, and deactivating artifacts. #### Parameters -| Name | Type | -| :--------------------------- | :--------------------------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | -| `__namedParameters.planetId` | `LocationId` \| `undefined` | +| Name | Type | +| :---------------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.initialPlanetId` | `LocationId` \| `undefined` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | #### Returns diff --git a/docs/modules/Frontend_Panes_UpgradeDetailsPane.md b/docs/modules/Frontend_Panes_UpgradeDetailsPane.md index c3564953..a1471152 100644 --- a/docs/modules/Frontend_Panes_UpgradeDetailsPane.md +++ b/docs/modules/Frontend_Panes_UpgradeDetailsPane.md @@ -15,11 +15,11 @@ #### Parameters -| Name | Type | -| :--------------------------- | :--------------------------------------------------------------------- | -| `__namedParameters` | `Object` | -| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | -| `__namedParameters.planetId` | `LocationId` \| `undefined` | +| Name | Type | +| :---------------------------------- | :--------------------------------------------------------------------- | +| `__namedParameters` | `Object` | +| `__namedParameters.initialPlanetId` | `LocationId` \| `undefined` | +| `__namedParameters.modal` | [`ModalHandle`](../interfaces/Frontend_Views_ModalPane.ModalHandle.md) | #### Returns diff --git a/docs/modules/Frontend_Styles_dfstyles.md b/docs/modules/Frontend_Styles_dfstyles.md index 825cb0fa..a8f62409 100644 --- a/docs/modules/Frontend_Styles_dfstyles.md +++ b/docs/modules/Frontend_Styles_dfstyles.md @@ -48,6 +48,7 @@ | `colors.dfgreenlight` | `string` | | `colors.dfpurple` | `string` | | `colors.dfred` | `string` | +| `colors.dfwhite` | `string` | | `colors.dfyellow` | `string` | | `colors.icons` | `Object` | | `colors.icons.blog` | `string` | diff --git a/docs/modules/Frontend_Utils_constants.md b/docs/modules/Frontend_Utils_constants.md index 8bd4221f..061eb18e 100644 --- a/docs/modules/Frontend_Utils_constants.md +++ b/docs/modules/Frontend_Utils_constants.md @@ -41,4 +41,4 @@ the algorithms implemented in {@link ChunkUtils}. ### MIN_CHUNK_SIZE -• `Const` **MIN_CHUNK_SIZE**: `16` +• `Const` **MIN_CHUNK_SIZE**: `256` diff --git a/last_updated.txt b/last_updated.txt index 4d28969d..5c1be995 100644 --- a/last_updated.txt +++ b/last_updated.txt @@ -1 +1 @@ -last updated: Tue Aug 10 05:45:48 UTC 2021 +last updated: Thu Aug 12 04:02:26 UTC 2021 diff --git a/package.json b/package.json index c14cb75d..2ad25986 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,19 @@ { "name": "client", - "version": "6.3.0-staging-round-3.0", + "version": "6.3.0-staging-aug-11.0", "private": true, "license": "GPL-3.0", "author": "Clown Town Labs Inc. ", "dependencies": { - "@darkforest_eth/constants": "6.3.0-staging-round-3.0", - "@darkforest_eth/contracts": "6.3.0-staging-round-3.0", - "@darkforest_eth/events": "6.3.0-staging-round-3.0", - "@darkforest_eth/hashing": "6.3.0-staging-round-3.0", - "@darkforest_eth/hexgen": "6.3.0-staging-round-3.0", - "@darkforest_eth/network": "6.3.0-staging-round-3.0", - "@darkforest_eth/serde": "6.3.0-staging-round-3.0", - "@darkforest_eth/snarks": "6.3.0-staging-round-3.0", - "@darkforest_eth/types": "6.3.0-staging-round-3.0", + "@darkforest_eth/constants": "6.3.0-staging-aug-11.0", + "@darkforest_eth/contracts": "6.3.0-staging-aug-11.0", + "@darkforest_eth/events": "6.3.0-staging-aug-11.0", + "@darkforest_eth/hashing": "6.3.0-staging-aug-11.0", + "@darkforest_eth/hexgen": "6.3.0-staging-aug-11.0", + "@darkforest_eth/network": "6.3.0-staging-aug-11.0", + "@darkforest_eth/serde": "6.3.0-staging-aug-11.0", + "@darkforest_eth/snarks": "6.3.0-staging-aug-11.0", + "@darkforest_eth/types": "6.3.0-staging-aug-11.0", "@hot-loader/react-dom": "^17.0.1", "@types/animejs": "^3.1.3", "animejs": "^3.2.1", diff --git a/src/Backend/GameLogic/ContractsAPI.ts b/src/Backend/GameLogic/ContractsAPI.ts index 24ff88d4..e2aae200 100644 --- a/src/Backend/GameLogic/ContractsAPI.ts +++ b/src/Backend/GameLogic/ContractsAPI.ts @@ -1104,6 +1104,7 @@ export class ContractsAPI extends EventEmitter { return rawRevealedCoords.map(decodeRevealedCoords); } + public async getClaimedCoordsByIdIfExists( planetId: LocationId ): Promise { @@ -1115,6 +1116,7 @@ export class ContractsAPI extends EventEmitter { } return ret; } + public async getClaimedPlanetsCoords( startingAt: number, onProgressIds?: (fractionCompleted: number) => void, diff --git a/src/Backend/GameLogic/GameManager.ts b/src/Backend/GameLogic/GameManager.ts index 391fbe05..09e6a6d8 100644 --- a/src/Backend/GameLogic/GameManager.ts +++ b/src/Backend/GameLogic/GameManager.ts @@ -500,7 +500,7 @@ class GameManager extends EventEmitter { this.playersUpdated$.publish(); } catch (e) { // @todo - what do we do if we can't connect to the webserver? in general this should be a - // state of affairs because arenas is a thing. + // valid state of affairs because arenas is a thing. } } @@ -1171,10 +1171,9 @@ class GameManager extends EventEmitter { .reduce((totalSoFar: number, nextPlanet: Planet) => totalSoFar + nextPlanet.energy, 0); } - public getPlayerScore(addr: EthAddress): number { + public getPlayerScore(addr: EthAddress): number | undefined { const player = this.players.get(addr); - if (!player) return 0; - return player?.score || 0; + return player?.score; } private initMiningManager(homeCoords: WorldCoords, cores?: number): void { @@ -1336,15 +1335,12 @@ class GameManager extends EventEmitter { /** * Get the score of the currently logged-in account. */ - getMyScore(): number { + getMyScore(): number | undefined { if (!this.account) { - return 0; + return undefined; } const player = this.players.get(this.account); - if (!player) { - return 0; - } - return player?.score || 0; + return player?.score; } /** @@ -1672,6 +1668,7 @@ class GameManager extends EventEmitter { if (!!this.entityStore.getUnconfirmedClaim()) { throw new Error("you're already broadcasting coordinates"); } + const myLastClaimTimestamp = this.players.get(this.account)?.lastClaimTimestamp; if (myLastClaimTimestamp && Date.now() < this.getNextClaimAvailableTimestamp()) { throw new Error('still on cooldown for broadcasting'); @@ -1699,8 +1696,6 @@ class GameManager extends EventEmitter { TerminalTextStyle.Sub ); this.terminal.current?.newline(); - - // blehh return this.contractsAPI.claim(snarkArgs, txIntent); }) .catch((err) => { diff --git a/src/Backend/GameLogic/GameUIManager.ts b/src/Backend/GameLogic/GameUIManager.ts index 8eb79be7..bac84987 100644 --- a/src/Backend/GameLogic/GameUIManager.ts +++ b/src/Backend/GameLogic/GameUIManager.ts @@ -930,7 +930,7 @@ class GameUIManager extends EventEmitter { return this.gameManager.getPlanetWithId(planetId); } - public getMyScore(): number { + public getMyScore(): number | undefined { return this.gameManager.getMyScore(); } @@ -1044,7 +1044,7 @@ class GameUIManager extends EventEmitter { return this.gameManager.getEnergyOfPlayer(player); } - public getPlayerScore(player: EthAddress): number { + public getPlayerScore(player: EthAddress): number | undefined { return this.gameManager.getPlayerScore(player); } diff --git a/src/Backend/Network/Blockchain.ts b/src/Backend/Network/Blockchain.ts index 070f3df9..0699a297 100644 --- a/src/Backend/Network/Blockchain.ts +++ b/src/Backend/Network/Blockchain.ts @@ -72,8 +72,8 @@ export async function loadGptCreditContract( } /** - * Loads ths GPT Credit contract, which players can pay to talk to artifacts. - * @see https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestGPTCredit.sol + * Loads the Round 3 Scoring contract which tracks claimed planets and player claim cooldowns. + * @see https://github.com/darkforest-eth/eth/blob/master/contracts/DarkForestRound3Scoring.sol */ export async function loadScoringContract( address: string, diff --git a/src/Backend/Procedural/ProcgenConsts.ts b/src/Backend/Procedural/ProcgenConsts.ts index 5b9348d3..4163f830 100644 --- a/src/Backend/Procedural/ProcgenConsts.ts +++ b/src/Backend/Procedural/ProcgenConsts.ts @@ -76,7 +76,6 @@ const genericVerb = [ 'obtain', 'smash', 'queue', - 'snatch', 'develop', 'end', 'pine', @@ -102,7 +101,6 @@ const genericVerb = [ 'kiss', 'test', 'thaw', - 'sin', 'wander', 'bless', 'walk', @@ -160,11 +158,9 @@ const genericVerb = [ 'pedal', 'tempt', 'kneel', - 'suck', 'sail', 'observe', 'replace', - 'race', 'answer', 'laugh', 'play', @@ -176,7 +172,6 @@ const genericVerb = [ 'argue', 'guess', 'decide', - 'load', 'deceive', 'dare', 'book', @@ -192,7 +187,6 @@ const genericVerb = [ 'clap', 'peep', 'wriggle', - 'bare', 'explode', 'rush', 'bolt', @@ -213,7 +207,6 @@ const genericVerb = [ 'add', 'dream', 'warn', - 'lick', 'kick', 'plan', 'memorise', @@ -247,13 +240,9 @@ const genericVerb = [ 'present', 'sneeze', 'provide', - 'mate', - 'paddle', 'look', 'haunt', - 'choke', 'fail', - 'satisfy', 'push', 'point', 'stain', @@ -283,7 +272,6 @@ const genericVerb = [ 'scratch', 'dislike', 'pat', - 'stroke', 'dress', 'turn', 'promise', @@ -413,7 +401,6 @@ const genericNoun = [ 'snail', 'plane', 'flock', - 'servant', 'dog', 'grandfather', 'achiever', @@ -423,7 +410,6 @@ const genericNoun = [ 'wall', 'school', 'minute', - 'religion', 'clam', 'rat', 'notebook', @@ -469,13 +455,11 @@ const genericNoun = [ 'harbor', 'tub', 'dock', - 'women', 'hands', 'van', 'calculator', 'cause', 'history', - 'plantation', 'effect', 'hour', 'experience', @@ -563,7 +547,6 @@ const genericNoun = [ 'sneeze', 'robin', 'lake', - 'underwear', 'bomb', 'memory', 'snakes', @@ -702,7 +685,6 @@ const genericNoun = [ 'measure', 'oatmeal', 'name', - 'girls', 'toes', 'limit', 'veil', @@ -752,7 +734,6 @@ const genericNoun = [ 'pump', 'things', 'competition', - 'boy', 'wheel', 'toy', 'kick', @@ -798,7 +779,6 @@ const genericNoun = [ 'canvas', 'position', 'note', - 'rub', 'ray', 'cat', 'library', @@ -822,7 +802,6 @@ const genericAdj = [ 'one', 'zealous', 'versed', - 'highfalutin', 'exciting', 'keen', 'tasteful', @@ -857,7 +836,6 @@ const genericAdj = [ 'venomous', 'vagabond', 'puny', - 'chubby', 'mere', 'unkempt', 'private', @@ -909,7 +887,6 @@ const genericAdj = [ 'knowing', 'adventurous', 'ruthless', - 'faded', 'hypnotic', 'remarkable', 'understood', @@ -940,7 +917,6 @@ const genericAdj = [ 'smelly', 'internal', 'meek', - 'aboriginal', 'tested', 'hurried', 'marked', @@ -975,7 +951,6 @@ const genericAdj = [ 'raspy', 'frantic', 'doubtful', - 'alcoholic', 'fantastic', 'tan', 'screeching', @@ -1018,7 +993,6 @@ const genericAdj = [ 'kaput', 'straight', 'defective', - 'phobic', 'ripe', 'wide', 'whole', @@ -1052,7 +1026,6 @@ const genericAdj = [ 'reflective', 'mushy', 'wholesale', - 'lewd', 'quarrelsome', 'closed', 'equal', @@ -1120,7 +1093,6 @@ const genericAdj = [ 'flippant', 'obeisant', 'mammoth', - 'psychotic', 'milky', 'substantial', 'modern', @@ -1178,7 +1150,6 @@ const genericAdj = [ 'obscene', 'repulsive', 'boundless', - 'blue-eyed', 'handy', 'greasy', 'irritating', @@ -1243,10 +1214,8 @@ export const planetNameWords = [ 'apparel', 'applaud', 'apple', - 'apple', 'apples', 'apply', - 'apply', 'aquatic', 'argument', 'aromatic', @@ -1312,16 +1281,13 @@ export const planetNameWords = [ 'broadcast', 'brother', 'brothers', - 'brothers', 'bulb', 'burly', - 'burly', 'burst', 'bury', 'bushes', 'busy', 'button', - 'button', 'cabbage', 'cagey', 'calculating', @@ -1329,7 +1295,6 @@ export const planetNameWords = [ 'calm', 'can', 'canvas', - 'canvas', 'capable', 'careless', 'carriage', @@ -1341,7 +1306,6 @@ export const planetNameWords = [ 'cent', 'chain', 'chairs', - 'chairs', 'change', 'changeable', 'channel', @@ -1814,7 +1778,6 @@ export const planetNameWords = [ 'quit', 'quiver', 'quixotic', - 'racial', 'ragged', 'rain', 'rapid', @@ -2133,7 +2096,6 @@ export const planetNameWords = [ 'lodge', 'town', 'awareness', - 'anxiety', 'childhood', 'chaos', ]; diff --git a/src/Backend/Storage/PersistentChunkStore.ts b/src/Backend/Storage/PersistentChunkStore.ts index dab3a0d6..f2c3194d 100644 --- a/src/Backend/Storage/PersistentChunkStore.ts +++ b/src/Backend/Storage/PersistentChunkStore.ts @@ -266,6 +266,7 @@ class PersistentChunkStore implements ChunkStore { public async saveRevealedCoords(revealedCoordTups: RevealedCoords[]) { await this.setKey('revealedPlanetIds', stringify(revealedCoordTups)); } + public async saveClaimedCoords(claimedCoordTupps: ClaimedCoords[]) { await this.setKey('claimedPlanetIds', stringify(claimedCoordTupps)); } diff --git a/src/Frontend/Components/CoreUI.tsx b/src/Frontend/Components/CoreUI.tsx index 67ea94e8..568a4230 100644 --- a/src/Frontend/Components/CoreUI.tsx +++ b/src/Frontend/Components/CoreUI.tsx @@ -3,8 +3,10 @@ import colors from 'color'; import React, { ChangeEvent, useCallback } from 'react'; import styled, { css } from 'styled-components'; import dfstyles from '../Styles/dfstyles'; +import { useUIManager } from '../Utils/AppHooks'; import { GameWindowZIndex } from '../Utils/constants'; import { useIsDown } from '../Utils/KeyEmitters'; +import { Setting, useBooleanSetting } from '../Utils/SettingsHooks'; import { Btn, BtnProps } from './Btn'; export const InlineBlock = styled.div` @@ -409,11 +411,16 @@ export const CenterBackgroundSubtext = styled.div` export function ShortcutButton( props: { children: React.ReactNode; shortcutKey?: string; shortcutText?: string } & BtnProps ) { + const [disableDefaultShortcuts] = useBooleanSetting( + useUIManager(), + Setting.DisableDefaultShortcuts + ); + return ( - {props.shortcutKey && ( + {props.shortcutKey && !disableDefaultShortcuts && ( <> diff --git a/src/Frontend/Components/Labels/PlanetLabels.tsx b/src/Frontend/Components/Labels/PlanetLabels.tsx index fd1bd9b0..edee791b 100644 --- a/src/Frontend/Components/Labels/PlanetLabels.tsx +++ b/src/Frontend/Components/Labels/PlanetLabels.tsx @@ -32,12 +32,12 @@ export function StatText({ const getSilver = (p: Planet) => p.silver; export const SilverText = ({ planet }: { planet: Planet | undefined }) => ( - + ); const getSilverCap = (p: Planet) => p.silverCap; export const SilverCapText = ({ planet }: { planet: Planet | undefined }) => ( - + ); const getEnergy = (p: Planet) => p.energy; @@ -88,7 +88,7 @@ export const EnergyGrowthText = ({ planet }: { planet: Planet | undefined }) => const getSilverGrowth = (p: Planet) => p.silverGrowth; export const SilverGrowthText = ({ planet }: { planet: Planet | undefined }) => ( - + ); // level and rank stuff diff --git a/src/Frontend/Components/OpenPaneButtons.tsx b/src/Frontend/Components/OpenPaneButtons.tsx index 38d62571..70939285 100644 --- a/src/Frontend/Components/OpenPaneButtons.tsx +++ b/src/Frontend/Components/OpenPaneButtons.tsx @@ -61,9 +61,9 @@ export function OpenClaimPlanetPane({ return ( } + element={() => } /> ); } @@ -80,7 +80,7 @@ export function OpenHatPaneButton({ modal={modal} title='Hat' shortcutKey={TOGGLE_HAT_PANE} - element={() => } + element={() => } /> ); } @@ -97,7 +97,7 @@ export function OpenBroadcastPaneButton({ modal={modal} title='Broadcast' shortcutKey={TOGGLE_BROADCAST_PANE} - element={() => } + element={() => } helpContent={BroadcastPaneHelpContent()} /> ); @@ -115,7 +115,7 @@ export function OpenUpgradeDetailsPaneButton({ modal={modal} title='Upgrade' shortcutKey={TOGGLE_UPGRADES_PANE} - element={() => } + element={() => } helpContent={UpgradeDetailsPaneHelpContent()} /> ); @@ -132,7 +132,7 @@ export function OpenManagePlanetArtifactsButton({ modal={modal} title='Artifacts' shortcutKey={TOGGLE_PLANET_ARTIFACTS_PANE} - element={() => } + element={() => } helpContent={ManagePlanetArtifactsHelpContent()} /> ); diff --git a/src/Frontend/Components/PlanetPreview.tsx b/src/Frontend/Components/PlanetPreview.tsx index 00b5e5f9..1a66f5fa 100644 --- a/src/Frontend/Components/PlanetPreview.tsx +++ b/src/Frontend/Components/PlanetPreview.tsx @@ -15,7 +15,6 @@ const PlanetPreviewWrapper = styled.div<{ size: string; color: string }>` position: relative; width: ${size}; - height: 100%; background: ${color}; diff --git a/src/Frontend/Components/ReadMore.tsx b/src/Frontend/Components/ReadMore.tsx index f1553906..f4cf7404 100644 --- a/src/Frontend/Components/ReadMore.tsx +++ b/src/Frontend/Components/ReadMore.tsx @@ -1,13 +1,15 @@ import React, { useCallback, useState } from 'react'; -import styled, { css } from 'styled-components'; -import dfstyles from '../Styles/dfstyles'; +import styled from 'styled-components'; +import { EmSpacer, TextButton } from './CoreUI'; export function ReadMore({ children, height, + text, }: { children: React.ReactChild[] | React.ReactChild; height?: string; + text?: string; }) { const [collapsed, setCollapsed] = useState(true); @@ -17,37 +19,15 @@ export function ReadMore({ return ( <> - + {children} - + + + {text ?? (collapsed ? 'more' : 'less')} info ); } -const active = css` - background-color: ${dfstyles.colors.backgroundlighter}; - border: 1px solid ${dfstyles.colors.border}; -`; - -const ReadMoreContainer = styled.div` - ${({ height, collapsed }: { height: string; collapsed?: boolean }) => css` - cursor: pointer; - border: 1px solid ${dfstyles.colors.borderDark}; - padding: 4px; - margin: 8px; - border-radius: 3px; - background-color: ${dfstyles.colors.backgroundlight}; - height: ${height}; - overflow: hidden; - ${collapsed && 'user-select: none;'} - - &:hover, - &:active { - ${active} - } - `} +const ContentContainer = styled.div` + overflow: hidden; `; diff --git a/src/Frontend/Components/Text.tsx b/src/Frontend/Components/Text.tsx index ce16409c..01409595 100644 --- a/src/Frontend/Components/Text.tsx +++ b/src/Frontend/Components/Text.tsx @@ -1,6 +1,5 @@ import { BLOCK_EXPLORER_URL } from '@darkforest_eth/constants'; import { Artifact, ArtifactId, Planet, SubmittedTx, WorldCoords } from '@darkforest_eth/types'; -import _ from 'lodash'; import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; import { artifactName } from '../../Backend/Procedural/ArtifactProcgen'; @@ -10,69 +9,7 @@ import Viewport from '../Game/Viewport'; import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; import UIEmitter, { UIEmitterEvent } from '../Utils/UIEmitter'; - -interface TextProps { - children: React.ReactNode; - size?: string; - style?: React.CSSProperties; -} - -const fontSizes: { - [size: string]: string; -} = { - title: '4rem', - '4xl': '2rem', - '3xl': '1.875rem', - '2xl': '1.5rem', - xl: '1.25rem', - lg: '1.125rem', - base: '1rem', - sm: '0.875rem', - xs: '0.75rem', -}; - -export function Text({ children, size = 'base', style = {} }: TextProps) { - return ( -
- {children} -
- ); -} - -export function Title({ children }: { children: React.ReactNode }) { - return {children}; -} - -export function Header({ - children, - style = {}, -}: { - children: React.ReactNode; - style?: React.CSSProperties; -}) { - return ( - - {children} - - ); -} - -export const Paragraph = styled.p` - margin: 0.5rem 0; -`; - -export const List = styled.ul` - list-style-type: disc; - list-style-position: inside; - margin-left: 1.5rem; -`; - -export const Item = styled.li``; +import { Link } from './CoreUI'; export function BlinkCursor() { const [visible, setVisible] = useState(false); @@ -98,9 +35,12 @@ export const Sub = styled.span` export const Subber = styled.span` color: ${dfstyles.colors.subbertext}; `; -export const White = styled.span` +export const Text = styled.span` color: ${dfstyles.colors.text}; `; +export const White = styled.span` + color: ${dfstyles.colors.dfwhite}; +`; export const Red = styled.span` color: ${dfstyles.colors.dfred}; `; @@ -123,24 +63,6 @@ export const Smaller = styled.span` font-size: 80%; `; -export const FakeLine = () => ( - - line - -); - -export function Space({ length }: { length: number }) { - return ( - <> - {_.range(0, length).map((el, i) => ( - {'\u00A0'} - ))} - - ); -} - -export const Tab = () => ; - export const HideSmall = styled.span` @media (max-width: ${dfstyles.screenSizeS}) { display: none; @@ -183,13 +105,6 @@ export function CenterPlanetLink({ ); } -export const StyledLink = styled.span` - &:hover { - text-decoration: underline; - cursor: pointer; - } -`; - export function ArtifactNameLink({ id }: { id: ArtifactId }) { const uiManager = useUIManager(); const artifact: Artifact | undefined = uiManager && uiManager.getArtifactWithId(id); @@ -198,7 +113,7 @@ export function ArtifactNameLink({ id }: { id: ArtifactId }) { UIEmitter.getInstance().emit(UIEmitterEvent.ShowArtifact, artifact); }; - return {artifactName(artifact)}; + return {artifactName(artifact)}; } export function PlanetNameLink({ planet }: { planet: Planet }) { @@ -206,15 +121,11 @@ export function PlanetNameLink({ planet }: { planet: Planet }) { } export function CenterChunkLink({ chunk, children }: { chunk: Chunk; children: React.ReactNode }) { - return ( -
- Viewport.getInstance().centerChunk(chunk)}>{children} - - ); + return Viewport.getInstance().centerChunk(chunk)}>{children}; } export function FAQ04Link({ children }: { children: React.ReactNode }) { - return {children} ; + return {children} ; } export const LongDash = () => ( diff --git a/src/Frontend/Game/NotificationManager.tsx b/src/Frontend/Game/NotificationManager.tsx index 9bf5918f..71f3732c 100644 --- a/src/Frontend/Game/NotificationManager.tsx +++ b/src/Frontend/Game/NotificationManager.tsx @@ -382,7 +382,7 @@ class NotificationManager extends EventEmitter { You found a spacetime rip! Now you can move artifacts and silver in and out
- of the universe. Moving silver through a spacetime rip increases your score!
+ of the universe.
Click to view .
); @@ -423,8 +423,8 @@ class NotificationManager extends EventEmitter { this.notify( NotificationType.FoundFoundry, - You have found a planet that can produce an artifact! Finding artifacts increases your - score. Also, artifacts can be used to power up your planets and moves!
+ You have found a planet that can produce an artifact! Artifacts can be used to power up your + planets and moves!
Click to view
); diff --git a/src/Frontend/Pages/GameLandingPage.tsx b/src/Frontend/Pages/GameLandingPage.tsx index 45d12bcb..21db9af1 100644 --- a/src/Frontend/Pages/GameLandingPage.tsx +++ b/src/Frontend/Pages/GameLandingPage.tsx @@ -138,40 +138,40 @@ export function GameLandingPage() { terminal.current?.print('Champion', TerminalTextStyle.Sub); terminal.current?.newline(); - terminal.current?.print(' v0.1 ', TerminalTextStyle.White); - terminal.current?.print('02/05/2020 ', TerminalTextStyle.White); + terminal.current?.print(' v0.1 ', TerminalTextStyle.Text); + terminal.current?.print('02/05/2020 ', TerminalTextStyle.Text); terminal.current?.printLink( 'Dylan Field', () => { window.open('https://twitter.com/zoink'); }, - TerminalTextStyle.White + TerminalTextStyle.Text ); terminal.current?.newline(); - terminal.current?.print(' v0.2 ', TerminalTextStyle.White); - terminal.current?.println('06/06/2020 Nate Foss', TerminalTextStyle.White); - terminal.current?.print(' v0.3 ', TerminalTextStyle.White); - terminal.current?.print('08/07/2020 ', TerminalTextStyle.White); + terminal.current?.print(' v0.2 ', TerminalTextStyle.Text); + terminal.current?.println('06/06/2020 Nate Foss', TerminalTextStyle.Text); + terminal.current?.print(' v0.3 ', TerminalTextStyle.Text); + terminal.current?.print('08/07/2020 ', TerminalTextStyle.Text); terminal.current?.printLink( - '[ANON] Singer', + '@hideandcleanse', () => { window.open('https://twitter.com/hideandcleanse'); }, - TerminalTextStyle.White + TerminalTextStyle.Text ); terminal.current?.newline(); - terminal.current?.print(' v0.4 ', TerminalTextStyle.White); - terminal.current?.print('10/02/2020 ', TerminalTextStyle.White); + terminal.current?.print(' v0.4 ', TerminalTextStyle.Text); + terminal.current?.print('10/02/2020 ', TerminalTextStyle.Text); terminal.current?.printLink( 'Jacob Rosenthal', () => { window.open('https://twitter.com/jacobrosenthal'); }, - TerminalTextStyle.White + TerminalTextStyle.Text ); terminal.current?.newline(); - terminal.current?.print(' v0.5 ', TerminalTextStyle.White); - terminal.current?.print('12/25/2020 ', TerminalTextStyle.White); + terminal.current?.print(' v0.5 ', TerminalTextStyle.Text); + terminal.current?.print('12/25/2020 ', TerminalTextStyle.Text); terminal.current?.printElement( { window.open('https://twitter.com/adietrichs'); }, - TerminalTextStyle.White + TerminalTextStyle.Text + ); + terminal.current?.newline(); + + terminal.current?.print(' v0.6 r2 ', TerminalTextStyle.Text); + terminal.current?.print('06/28/2021 ', TerminalTextStyle.Text); + terminal.current?.printLink( + '@ghst_gg', + () => { + window.open('https://twitter.com/ghst_gg'); + }, + TerminalTextStyle.Text ); terminal.current?.newline(); terminal.current?.newline(); @@ -207,7 +218,7 @@ export function GameLandingPage() { terminal.current?.print('(i) ', TerminalTextStyle.Sub); terminal.current?.println(`Import private key.`); terminal.current?.println(``); - terminal.current?.println(`Select an option:`, TerminalTextStyle.White); + terminal.current?.println(`Select an option:`, TerminalTextStyle.Text); const userInput = await terminal.current?.getInput(); if (userInput === 'a' && accounts.length > 0) { @@ -233,7 +244,7 @@ export function GameLandingPage() { terminal.current?.println(`${accounts[i].address}`); } terminal.current?.println(``); - terminal.current?.println(`Select an account:`, TerminalTextStyle.White); + terminal.current?.println(`Select an account:`, TerminalTextStyle.Text); const selection = +((await terminal.current?.getInput()) || ''); if (isNaN(selection) || selection > accounts.length) { @@ -271,7 +282,7 @@ export function GameLandingPage() { terminal.current?.println(''); terminal.current?.println( 'Note: Burner wallets are stored in local storage.', - TerminalTextStyle.White + TerminalTextStyle.Text ); terminal.current?.println('They are relatively insecure and you should avoid '); terminal.current?.println('storing substantial funds in them.'); @@ -281,7 +292,7 @@ export function GameLandingPage() { 'burner wallets inaccessible, unless you export your private keys.' ); terminal.current?.println(''); - terminal.current?.println('Press any key to continue:', TerminalTextStyle.White); + terminal.current?.println('Press any key to continue:', TerminalTextStyle.Text); await terminal.current?.getInput(); setStep(TerminalPromptStep.ACCOUNT_SET); @@ -299,11 +310,11 @@ export function GameLandingPage() { async (terminal: React.MutableRefObject) => { terminal.current?.println( 'Enter the 0x-prefixed private key of the account you wish to import', - TerminalTextStyle.White + TerminalTextStyle.Text ); terminal.current?.println( "NOTE: THIS WILL STORE THE PRIVATE KEY IN YOUR BROWSER'S LOCAL STORAGE", - TerminalTextStyle.White + TerminalTextStyle.Text ); terminal.current?.println( 'Local storage is relatively insecure. We recommend only importing accounts with zero-to-no funds.' @@ -372,7 +383,7 @@ export function GameLandingPage() { const advanceStateFromAskHasWhitelistKey = useCallback( async (terminal: React.MutableRefObject) => { - terminal.current?.print('Do you have a whitelist key?', TerminalTextStyle.White); + terminal.current?.print('Do you have a whitelist key?', TerminalTextStyle.Text); terminal.current?.println(' (y/n)'); const userInput = await terminal.current?.getInput(); if (userInput === 'y') { @@ -414,7 +425,7 @@ export function GameLandingPage() { } else { terminal.current?.print('Successfully joined game. ', TerminalTextStyle.Green); terminal.current?.print(`Welcome, player `); - terminal.current?.println(address, TerminalTextStyle.White); + terminal.current?.println(address, TerminalTextStyle.Text); terminal.current?.print('Sent player $0.15 :) ', TerminalTextStyle.Blue); terminal.current?.printLink( '(View Transaction)', @@ -434,7 +445,7 @@ export function GameLandingPage() { async (terminal: React.MutableRefObject) => { terminal.current?.println( 'Enter your email address to sign up for the whitelist.', - TerminalTextStyle.White + TerminalTextStyle.Text ); const email = (await terminal.current?.getInput()) || ''; terminal.current?.print('Response pending... '); @@ -466,7 +477,7 @@ export function GameLandingPage() { const address = ethConnection?.getAddress(); if (!address) throw new Error('not logged in'); - terminal.current?.print('Enter your email address. ', TerminalTextStyle.White); + terminal.current?.print('Enter your email address. ', TerminalTextStyle.Text); terminal.current?.println("We'll use this email address to notify you if you win a prize."); const email = (await terminal.current?.getInput()) || ''; const response = await submitPlayerEmail(email, address); @@ -549,7 +560,7 @@ export function GameLandingPage() { const advanceStateFromAskAddAccount = useCallback( async (terminal: React.MutableRefObject) => { - terminal.current?.println('Import account home coordinates? (y/n)', TerminalTextStyle.White); + terminal.current?.println('Import account home coordinates? (y/n)', TerminalTextStyle.Text); terminal.current?.println( "If you're importing an account, make sure you know what you're doing." ); @@ -699,7 +710,7 @@ export function GameLandingPage() { // indrect eval call: http://perfectionkills.com/global-eval-what-are-the-options/ res = (1, eval)(input); if (res !== undefined) { - terminal.current?.println(res.toString(), TerminalTextStyle.White); + terminal.current?.println(res.toString(), TerminalTextStyle.Text); } } catch (e) { res = e.message; diff --git a/src/Frontend/Pages/LandingPage.tsx b/src/Frontend/Pages/LandingPage.tsx index db2263de..f89e3fd1 100644 --- a/src/Frontend/Pages/LandingPage.tsx +++ b/src/Frontend/Pages/LandingPage.tsx @@ -101,7 +101,7 @@ export default function LandingPage() { 08/07/2020 - @HideAndCleanse + @hideandcleanse @@ -135,14 +135,27 @@ export default function LandingPage() { Ansgar Dietrichs + + + v0.6 round 2 + + + 07/07/2021 + + + @orden_gg + + v0.6 round 3 - 06/28/2021 + 08/22/2021 + + + ghst_gg - t.b.d. @@ -205,7 +218,7 @@ const VariousLinksContainer = styled.div` const PrettyOverlayGradient = styled.div` width: 100vw; height: 100vh; - background: linear-gradient(to left top, rgba(194, 83, 10, 0.2), rgba(28, 187, 201, 0.2)) fixed; + background: linear-gradient(to left top, rgba(219, 10, 20, 0.2), rgba(1, 255, 22, 0.2)) fixed; background-position: 50%, 50%; display: inline-block; position: fixed; @@ -330,7 +343,7 @@ const Page = styled.div` position: absolute; width: 100%; height: 100%; - color: ${dfstyles.colors.text}; + color: white; font-size: ${dfstyles.fontSize}; display: flex; flex-direction: column; diff --git a/src/Frontend/Panes/BroadcastPane.tsx b/src/Frontend/Panes/BroadcastPane.tsx index d09e2d95..f40b8dfe 100644 --- a/src/Frontend/Panes/BroadcastPane.tsx +++ b/src/Frontend/Panes/BroadcastPane.tsx @@ -7,7 +7,8 @@ import { LoadingSpinner } from '../Components/LoadingSpinner'; import { Blue, Sub, White } from '../Components/Text'; import { TimeUntil } from '../Components/TimeUntil'; import dfstyles from '../Styles/dfstyles'; -import { usePlanet, usePopAllOnSelectedPlanetChanged, useUIManager } from '../Utils/AppHooks'; +import { usePlanet, useUIManager } from '../Utils/AppHooks'; +import { useEmitterValue } from '../Utils/EmitterHooks'; import { ModalHandle } from '../Views/ModalPane'; const BroadcastWrapper = styled.div` @@ -47,17 +48,15 @@ export function BroadcastPaneHelpContent() { } export function BroadcastPane({ - planetId, + initialPlanetId, modal, }: { modal: ModalHandle; - planetId: LocationId | undefined; + initialPlanetId: LocationId | undefined; }) { const uiManager = useUIManager(); - const planetWrapper = usePlanet(uiManager, planetId); - const planet = planetWrapper.value; - - usePopAllOnSelectedPlanetChanged(modal, planetId); + const planetId = useEmitterValue(uiManager.selectedPlanetId$, initialPlanetId); + const planet = usePlanet(uiManager, planetId).value; const getLoc = () => { if (!planet || !uiManager) return { x: 0, y: 0 }; diff --git a/src/Frontend/Panes/ClaimPlanetPane.tsx b/src/Frontend/Panes/ClaimPlanetPane.tsx index f9f9b1a8..01e87312 100644 --- a/src/Frontend/Panes/ClaimPlanetPane.tsx +++ b/src/Frontend/Panes/ClaimPlanetPane.tsx @@ -1,35 +1,35 @@ import { PLANET_CLAIM_MIN_LEVEL } from '@darkforest_eth/constants'; import { LocationId } from '@darkforest_eth/types'; -import React from 'react'; +import React, { useCallback } from 'react'; import { isLocatable } from '../../_types/global/GlobalTypes'; import { Btn } from '../Components/Btn'; import { EmSpacer, PaddedRecommendedModalWidth } from '../Components/CoreUI'; import { AccountLabel } from '../Components/Labels/Labels'; import { MythicLabelText } from '../Components/Labels/MythicLabel'; import { LoadingSpinner } from '../Components/LoadingSpinner'; -import { - usePlanet, - usePlayer, - usePopAllOnSelectedPlanetChanged, - useUIManager, -} from '../Utils/AppHooks'; +import { usePlanet, usePlayer, useUIManager } from '../Utils/AppHooks'; +import { useEmitterValue } from '../Utils/EmitterHooks'; import { ModalHandle } from '../Views/ModalPane'; export function ClaimPlanetPane({ - planetId, + initialPlanetId, modal, }: { modal: ModalHandle; - planetId?: LocationId; -}) { - usePopAllOnSelectedPlanetChanged(modal, planetId); + initialPlanetId?: LocationId; +}): React.ReactElement { const uiManager = useUIManager(); const gameManager = uiManager.getGameManager(); - const planetWrapper = usePlanet(uiManager, planetId); - const planet = planetWrapper.value; + const planetId = useEmitterValue(uiManager.selectedPlanetId$, initialPlanetId); + const planet = usePlanet(uiManager, planetId).value; const player = usePlayer(uiManager); + const claimPlanet = useCallback(() => { + if (planetId) { + uiManager.revealLocation(planetId); + } + }, [planetId]); - if (!planetId || !planet || !isLocatable(planet) || !player.value) return null; + if (!planetId || !planet || !isLocatable(planet) || !player.value) return <>; const center = { x: 0, y: 0 }; const distanceFromCenter = Math.floor(gameManager.getDistCoords(planet.location.coords, center)); @@ -45,6 +45,7 @@ export function ClaimPlanetPane({ const planetIsLargeEnough = planet.planetLevel >= PLANET_CLAIM_MIN_LEVEL; const disableClaimButton = !planetIsLargeEnough || claimedByThisPlayer || isClaimingNow; const isCloserThanPlayersCurrentClosest = currentPlayerScore > distanceFromCenter; + const claimed = planet?.coordsRevealed; let description = <>; let claimButtonContent = <>; @@ -91,9 +92,6 @@ export function ClaimPlanetPane({ claimButtonContent = <>Claim Planet; } - if (claimedByOtherPlayer && existingClaim) { - } - return ( This planet is away from the @@ -104,6 +102,15 @@ export function ClaimPlanetPane({ gameManager.claimLocation(planetId)}> {claimButtonContent} + + {claimed ? ( + 'Already Claimed' + ) : isClaimingNow ? ( + + ) : ( + 'Claim Planet!' + )} + ); } diff --git a/src/Frontend/Panes/HatPane.tsx b/src/Frontend/Panes/HatPane.tsx index 39931d13..af819b0d 100644 --- a/src/Frontend/Panes/HatPane.tsx +++ b/src/Frontend/Panes/HatPane.tsx @@ -12,12 +12,7 @@ import { PaddedRecommendedModalWidth, } from '../Components/CoreUI'; import { Sub } from '../Components/Text'; -import { - useAccount, - usePlanet, - usePopAllOnSelectedPlanetChanged, - useUIManager, -} from '../Utils/AppHooks'; +import { useAccount, usePlanet, useUIManager } from '../Utils/AppHooks'; import { useEmitterValue } from '../Utils/EmitterHooks'; import { ModalHandle } from '../Views/ModalPane'; @@ -49,9 +44,16 @@ const hatUpgradePending = (planet: Planet): boolean => { return planet.unconfirmedBuyHats.length > 0; }; -export function HatPane({ planetId, modal }: { modal: ModalHandle; planetId?: LocationId }) { +export function HatPane({ + initialPlanetId, + modal, +}: { + modal: ModalHandle; + initialPlanetId?: LocationId; +}) { const uiManager = useUIManager(); const account = useAccount(uiManager); + const planetId = useEmitterValue(uiManager.selectedPlanetId$, initialPlanetId); const planetWrapper = usePlanet(uiManager, planetId); const planet = planetWrapper.value; const balanceEth = weiToEth( @@ -59,7 +61,6 @@ export function HatPane({ planetId, modal }: { modal: ModalHandle; planetId?: Lo ); const enabled = (planet: Planet): boolean => !hatUpgradePending(planet) && planet?.owner === account && balanceEth > getHatCostEth(planet); - usePopAllOnSelectedPlanetChanged(modal, planetId); let content; diff --git a/src/Frontend/Panes/HelpPane.tsx b/src/Frontend/Panes/HelpPane.tsx index d0eaa1d3..e74932b0 100644 --- a/src/Frontend/Panes/HelpPane.tsx +++ b/src/Frontend/Panes/HelpPane.tsx @@ -1,9 +1,6 @@ import React from 'react'; import styled from 'styled-components'; import { EmSpacer, Link, Padded, Section, SectionHeader } from '../Components/CoreUI'; -import { ScoreLabel } from '../Components/Labels/KeywordLabels'; -import { LegendaryLabel } from '../Components/Labels/LegendaryLabel'; -import { MythicLabel } from '../Components/Labels/MythicLabel'; import { White } from '../Components/Text'; import dfstyles from '../Styles/dfstyles'; import { useUIManager } from '../Utils/AppHooks'; @@ -25,8 +22,8 @@ export function HelpPane({ hook }: { hook: ModalHook }) { {useUIManager().isRoundOver() && (
- Round 2 Complete - Dark Forest v0.6 Round 2 is now complete! Scores are being compiled and winners will be + Round 3 Complete + Dark Forest v0.6 Round 3 is now complete! Scores are being compiled and winners will be announced shortly. Also, Artifacts will no longer be mintable. Thanks for playing!
)} @@ -36,33 +33,43 @@ export function HelpPane({ hook }: { hook: ModalHook }) {
- The Universe + Official Discord Server +
+ +
+ Community-Run Wiki +
+ +
+ Dark Forest v0.6 R3: Grape Extra-Small Dark Forest is a vast universe, obfuscated by zero-knowledge cryptography. Your{' '} explorer explores the universe, searching for Planets and other players. - All planets produce Energy. You can move energy from planets you own to new - planets to conquer them. + All planets produce Energy. You can click-drag to move energy from planets + you own to new planets to conquer them. Also scattered through the universe are Asteroid Fields, which produce{' '} Silver. Silver can be sent to planets and can be spent on{' '} - Upgrades. Withdrawing silver from spacetime rips increases your{' '} - . + Upgrades. Some planets contain Artifacts - ERC721 tokens that can be traded with other players. Artifacts can be harvested and deposited onto planets, - buffing their stats. Harvesting artifacts also increases your + buffing their stats.
Prizes and ScoringA snapshot of scores will be taken on{' '} - July 3, 2021 at 9PM Pacific Time. At that time, the top 63 highest-scoring - players will be awarded prizes from a pool 63 prize planets. You can see the current - rankings by scrolling down on the landing page of the game. + August 22, 2021 at 9AM Pacific Time. At that time, the top 63 + highest-scoring players will be awarded prizes from a pool 63 prize planets. You can see + the current rankings by scrolling down on the landing page of the game. + + This round is a race to the center. You can claim any level 3+ planet that + you own; there is a 3 hour cooldown on claiming planets. Your score at the end of the + round is the distance of your closest claimed planet from the center (0, 0). - Your score is determined by the total amount of Silver you have withdrawn - from the universe, plus additional bonuses for finding artifacts. Artifacts of different - rarities are worth different amounts of points: Common are 5k, Rare are 20k, Epic are - 200k, are 3M, and are 20M. + Note that planets that are destroyed with black domain artifacts do not count towards + score, and other players can conquer and claim planets you've already claimed, overwriting + your claim!
diff --git a/src/Frontend/Panes/HoverPlanetPane.tsx b/src/Frontend/Panes/HoverPlanetPane.tsx index 6f547a99..820e29d3 100644 --- a/src/Frontend/Panes/HoverPlanetPane.tsx +++ b/src/Frontend/Panes/HoverPlanetPane.tsx @@ -9,8 +9,8 @@ import { PlanetCard } from '../Views/PlanetCard'; const StyledHoverPlanetPane = styled.div` ${snips.absoluteTopLeft} ${snips.defaultBackground} - ${snips.defaultModalWidth} ${snips.roundedBordersWithEdge} + width: 350px; `; /** diff --git a/src/Frontend/Panes/ManagePlanetArtifacts/Find.tsx b/src/Frontend/Panes/ManagePlanetArtifacts/Find.tsx index f14c0ebb..e6721370 100644 --- a/src/Frontend/Panes/ManagePlanetArtifacts/Find.tsx +++ b/src/Frontend/Panes/ManagePlanetArtifacts/Find.tsx @@ -51,7 +51,7 @@ export function Find({ <> {button} - {roundOver && Round 2 is over, and you can no longer mint artifacts!} + {roundOver && Round 3 is over, and you can no longer mint artifacts!} Once the artifact is found, it will be placed directly onto this planet. You have{' '} diff --git a/src/Frontend/Panes/ManagePlanetArtifacts/ManagePlanetArtifactsPane.tsx b/src/Frontend/Panes/ManagePlanetArtifacts/ManagePlanetArtifactsPane.tsx index b2356407..e13444c9 100644 --- a/src/Frontend/Panes/ManagePlanetArtifacts/ManagePlanetArtifactsPane.tsx +++ b/src/Frontend/Panes/ManagePlanetArtifacts/ManagePlanetArtifactsPane.tsx @@ -6,13 +6,7 @@ import { PaddedRecommendedModalWidth, Underline, } from '../../Components/CoreUI'; -import { - useAccount, - useMyArtifacts, - usePlanet, - usePopAllOnSelectedPlanetChanged, - useUIManager, -} from '../../Utils/AppHooks'; +import { useAccount, useMyArtifacts, usePlanet, useUIManager } from '../../Utils/AppHooks'; import { useEmitterValue } from '../../Utils/EmitterHooks'; import { ModalHandle } from '../../Views/ModalPane'; import { ManageArtifactsPane } from './ManageArtifacts'; @@ -41,56 +35,54 @@ export function ManagePlanetArtifactsHelpContent() { * activating, and deactivating artifacts. */ export function ManagePlanetArtifactsPane({ - planetId, + initialPlanetId, modal, }: { - planetId: LocationId | undefined; + initialPlanetId: LocationId | undefined; modal: ModalHandle; }) { const uiManager = useUIManager(); const account = useAccount(uiManager); - const planet = usePlanet(uiManager, planetId); - + const planetId = useEmitterValue(uiManager.selectedPlanetId$, initialPlanetId); + const planet = usePlanet(uiManager, planetId).value; const currentBlockNumber = useEmitterValue(uiManager.getEthConnection().blockNumber$, undefined); const myArtifacts = useMyArtifacts(uiManager); - const onPlanet = uiManager.getArtifactsWithIds(planet.value?.heldArtifactIds || []); + const onPlanet = uiManager.getArtifactsWithIds(planet?.heldArtifactIds || []); const roundOver = uiManager.isRoundOver(); - usePopAllOnSelectedPlanetChanged(modal, planetId); - const find = useCallback(() => { - planet.value && uiManager.findArtifact(planet.value.locationId); + planet && uiManager.findArtifact(planet.locationId); }, [planet, uiManager]); const prospect = useCallback(() => { - planet.value && uiManager.prospectPlanet(planet.value.locationId); + planet && uiManager.prospectPlanet(planet.locationId); }, [planet, uiManager]); const withdraw = useCallback( (artifact: Artifact) => { - planet.value && uiManager.withdrawArtifact(planet.value.locationId, artifact?.id); + planet && uiManager.withdrawArtifact(planet.locationId, artifact?.id); }, [planet, uiManager] ); const deposit = useCallback( (artifact: Artifact) => { - artifact && planet.value && uiManager.depositArtifact(planet.value.locationId, artifact?.id); + artifact && planet && uiManager.depositArtifact(planet.locationId, artifact?.id); }, [planet, uiManager] ); const activate = useCallback( async (artifact: Artifact) => { - if (planet.value && isLocatable(planet.value)) { + if (planet && isLocatable(planet)) { let targetPlanetId = undefined; if (artifact.artifactType === ArtifactType.Wormhole) { - const targetPlanet = await uiManager.startWormholeFrom(planet.value); + const targetPlanet = await uiManager.startWormholeFrom(planet); targetPlanetId = targetPlanet?.locationId; } - uiManager.activateArtifact(planet.value.locationId, artifact.id, targetPlanetId); + uiManager.activateArtifact(planet.locationId, artifact.id, targetPlanetId); } }, [planet, uiManager] @@ -98,19 +90,19 @@ export function ManagePlanetArtifactsPane({ const deactivate = useCallback( (artifact: Artifact) => { - planet.value && uiManager.deactivateArtifact(planet.value.locationId, artifact.id); + planet && uiManager.deactivateArtifact(planet.locationId, artifact.id); }, [planet, uiManager] ); let content; - if (planet.value && myArtifacts.value && isLocatable(planet.value) && account) { + if (planet && myArtifacts.value && isLocatable(planet) && account) { content = ( void }) { ); } +function OnboardHelp({ advance }: { advance: () => void }) { + return ( + +

+ For an overview of how to play, rules, and scoring, click the question mark icon on the left + to open the Help Pane. +

+
+ + + Proceed + +
+
+ ); +} + function OnboardFinished({ advance }: { advance: () => void }) { return ( @@ -207,6 +226,7 @@ export default function OnboardingPane({ newPlayerHook }: { newPlayerHook: Hook< {onboardState === OnboardState.Money && } {onboardState === OnboardState.Storage && } {onboardState === OnboardState.Keys && } + {onboardState === OnboardState.Help && } {onboardState === OnboardState.Finished && } ); diff --git a/src/Frontend/Panes/PlanetContextPane.tsx b/src/Frontend/Panes/PlanetContextPane.tsx index 75c14b3c..73f7c26a 100644 --- a/src/Frontend/Panes/PlanetContextPane.tsx +++ b/src/Frontend/Panes/PlanetContextPane.tsx @@ -2,7 +2,7 @@ import { Planet, PlanetType } from '@darkforest_eth/types'; import React, { useCallback, useMemo } from 'react'; import GameUIManager from '../../Backend/GameLogic/GameUIManager'; import { Wrapper } from '../../Backend/Utils/Wrapper'; -import { Padded, PaddedRecommendedModalWidth, Spacer, VerticalSplit } from '../Components/CoreUI'; +import { Padded, Spacer, VerticalSplit } from '../Components/CoreUI'; import { OpenClaimPlanetPane, OpenHatPaneButton, @@ -38,7 +38,7 @@ function PlanetContextPaneContent({ const isPost = planet.value?.planetType === PlanetType.TRADING_POST; return ( - + {owned && ( <> @@ -69,7 +69,7 @@ function PlanetContextPaneContent({ )} {owned && notifs.length > 0 && } - + ); } diff --git a/src/Frontend/Panes/PlayerInfoPane.tsx b/src/Frontend/Panes/PlayerInfoPane.tsx index d252e1c1..80061324 100644 --- a/src/Frontend/Panes/PlayerInfoPane.tsx +++ b/src/Frontend/Panes/PlayerInfoPane.tsx @@ -52,7 +52,7 @@ export function PlayerInfoPane({ hook: twitterHook }: { hook: ModalHook }) { const updateEnergyAndSilver = () => { setEnergy(uiManager.getEnergyOfPlayer(account)); setSilver(uiManager.getSilverOfPlayer(account)); - _setScore(uiManager.getPlayerScore(account)); + _setScore(uiManager.getPlayerScore(account) ?? Infinity); }; const energySilverInterval = setInterval(updateEnergyAndSilver, 60 * 1000); diff --git a/src/Frontend/Panes/SettingsPane.tsx b/src/Frontend/Panes/SettingsPane.tsx index dcef6516..b37fad7c 100644 --- a/src/Frontend/Panes/SettingsPane.tsx +++ b/src/Frontend/Panes/SettingsPane.tsx @@ -364,6 +364,18 @@ export function SettingsPane({ Reset Tutorial + +
+ Disable Default Shortcuts + If you'd like to use custom shortcuts via a plugin, you can disable the default shortcuts + here. + + +
); diff --git a/src/Frontend/Panes/UpgradeDetailsPane.tsx b/src/Frontend/Panes/UpgradeDetailsPane.tsx index b35c71cc..22ccb563 100644 --- a/src/Frontend/Panes/UpgradeDetailsPane.tsx +++ b/src/Frontend/Panes/UpgradeDetailsPane.tsx @@ -12,12 +12,8 @@ import { Btn } from '../Components/Btn'; import { CenterBackgroundSubtext, Padded, Spacer } from '../Components/CoreUI'; import { LoadingSpinner } from '../Components/LoadingSpinner'; import { Gold, Red, Sub, Subber } from '../Components/Text'; -import { - useAccount, - usePlanet, - usePopAllOnSelectedPlanetChanged, - useUIManager, -} from '../Utils/AppHooks'; +import { useAccount, usePlanet, useUIManager } from '../Utils/AppHooks'; +import { useEmitterValue } from '../Utils/EmitterHooks'; import { ModalHandle } from '../Views/ModalPane'; import { TabbedView } from '../Views/TabbedView'; import { UpgradePreview } from '../Views/UpgradePreview'; @@ -73,20 +69,18 @@ function SilverRequired({ planet }: { planet: Planet }) { } export function UpgradeDetailsPane({ - planetId, + initialPlanetId, modal, }: { modal: ModalHandle; - planetId: LocationId | undefined; + initialPlanetId: LocationId | undefined; }) { const uiManager = useUIManager(); - const planetWrapper = usePlanet(uiManager, planetId); - const planet = planetWrapper.value; + const planetId = useEmitterValue(uiManager.selectedPlanetId$, initialPlanetId); + const planet = usePlanet(uiManager, planetId).value; const account = useAccount(uiManager); const planetAtMaxRank = isFullRank(planet); - usePopAllOnSelectedPlanetChanged(modal, planetId); - let content = ( Select a Planet
You Own diff --git a/src/Frontend/Styles/dfstyles.ts b/src/Frontend/Styles/dfstyles.ts index 9a011469..478cc506 100644 --- a/src/Frontend/Styles/dfstyles.ts +++ b/src/Frontend/Styles/dfstyles.ts @@ -35,6 +35,7 @@ const dfgreenlight = color(dfgreen).lighten(0.1).hex(); const dfred = '#FF6492'; const dfyellow = '#e8e228'; const dfpurple = '#9189d9'; +const dfwhite = '#ffffff'; const dfstyles = { colors: { @@ -59,6 +60,7 @@ const dfstyles = { dfred, dfyellow, dfpurple, + dfwhite, artifactBackground: 'rgb(21, 17, 71)', diff --git a/src/Frontend/Utils/KeyEmitters.ts b/src/Frontend/Utils/KeyEmitters.ts index 4f2b09de..5206b6f9 100644 --- a/src/Frontend/Utils/KeyEmitters.ts +++ b/src/Frontend/Utils/KeyEmitters.ts @@ -1,7 +1,9 @@ import { monomitter } from '@darkforest_eth/events'; import { useEffect, useState } from 'react'; import { Wrapper } from '../../Backend/Utils/Wrapper'; +import { useUIManager } from './AppHooks'; import { useEmitterSubscribe } from './EmitterHooks'; +import { Setting, useBooleanSetting } from './SettingsHooks'; export const SpecialKey = { Space: ' ', @@ -59,14 +61,19 @@ export function useIsDown(key?: string) { } export function useOnUp(key?: string, onUp?: () => void) { + const [disableDefaultShortcuts] = useBooleanSetting( + useUIManager(), + Setting.DisableDefaultShortcuts + ); + useEffect(() => { const onKeyUp = (e: KeyboardEvent) => { if (e.key.toLowerCase() === key && !shouldIgnoreShortcutKeypress(e)) { - onUp && onUp(); + !disableDefaultShortcuts && onUp && onUp(); } }; document.addEventListener('keyup', onKeyUp); return () => document.removeEventListener('keyup', onKeyUp); - }, [key, onUp]); + }, [key, onUp, disableDefaultShortcuts]); } diff --git a/src/Frontend/Utils/SettingsHooks.tsx b/src/Frontend/Utils/SettingsHooks.tsx index 6dfdfeb9..624bd1be 100644 --- a/src/Frontend/Utils/SettingsHooks.tsx +++ b/src/Frontend/Utils/SettingsHooks.tsx @@ -40,6 +40,7 @@ export const enum Setting { MiningCores = 'MiningCores', TutorialOpen = 'TutorialOpen', IsMining = 'IsMining', + DisableDefaultShortcuts = 'DisableDefaultShortcuts', } export const ALL_AUTO_GAS_SETTINGS = [ @@ -80,6 +81,7 @@ const defaultSettings: Record = { NewPlayer: onlyInProduction(), MiningCores: '1', IsMining: 'true', + DisableDefaultShortcuts: 'false', }; /** diff --git a/src/Frontend/Utils/TerminalTypes.ts b/src/Frontend/Utils/TerminalTypes.ts index 561d5add..177f1b4a 100644 --- a/src/Frontend/Utils/TerminalTypes.ts +++ b/src/Frontend/Utils/TerminalTypes.ts @@ -2,6 +2,7 @@ export const enum TerminalTextStyle { Green, Sub, Subber, + Text, White, Red, Blue, diff --git a/src/Frontend/Utils/constants.ts b/src/Frontend/Utils/constants.ts index 9b69328d..c685cf63 100644 --- a/src/Frontend/Utils/constants.ts +++ b/src/Frontend/Utils/constants.ts @@ -3,7 +3,7 @@ import * as bigInt from 'big-integer'; // To developer, increase this number to 256. This, in combination with setting `DISABLE_ZK_CHECKS` // in darkforest.toml, will make you mine the map at ULTRA SPEED! // To code reviewer, make sure this does not change in a PR to develop! -const MIN_CHUNK_SIZE = 16; +const MIN_CHUNK_SIZE = 256; /** * @tutorial to speed up the game's background rendering code, it is possible to set this value to diff --git a/src/Frontend/Views/ModalIcon.tsx b/src/Frontend/Views/ModalIcon.tsx index c49cda62..e9a3b886 100644 --- a/src/Frontend/Views/ModalIcon.tsx +++ b/src/Frontend/Views/ModalIcon.tsx @@ -22,6 +22,10 @@ import { ModalHook, ModalName } from './ModalPane'; const ModalIconText = styled.span` flex-grow: 1; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; `; const icon = (modal: ModalName): React.ReactNode => { @@ -68,13 +72,15 @@ export function ModalToggleButton( e.stopPropagation(); }} > - {icon(modal)} - {text !== undefined && ( - - - {text} - - )} + + {icon(modal)} + {text !== undefined && ( + <> + + {text} + + )} + ); } diff --git a/src/Frontend/Views/ModalPane.tsx b/src/Frontend/Views/ModalPane.tsx index 717f6cda..d27037b9 100644 --- a/src/Frontend/Views/ModalPane.tsx +++ b/src/Frontend/Views/ModalPane.tsx @@ -412,7 +412,9 @@ export function ModalPane({ {visible && !minimized && !showingHelp && ( <> {renderedFrame} - {!renderedFrame && (typeof children === 'function' ? children(api) : children)} +
+ {typeof children === 'function' ? children(api) : children} +
)} diff --git a/src/Frontend/Views/PlanetCard.tsx b/src/Frontend/Views/PlanetCard.tsx index 1d7b2996..f4f36544 100644 --- a/src/Frontend/Views/PlanetCard.tsx +++ b/src/Frontend/Views/PlanetCard.tsx @@ -1,10 +1,10 @@ -import { Planet, PlanetType } from '@darkforest_eth/types'; +import { Planet } from '@darkforest_eth/types'; import React from 'react'; import styled from 'styled-components'; import { ProcgenUtils } from '../../Backend/Procedural/ProcgenUtils'; import { Wrapper } from '../../Backend/Utils/Wrapper'; import { StatIdx } from '../../_types/global/GlobalTypes'; -import { AlignCenterHorizontally, EmSpacer, InlineBlock } from '../Components/CoreUI'; +import { AlignCenterHorizontally, EmSpacer, FullWidth, InlineBlock } from '../Components/CoreUI'; import { DefenseIcon, EnergyGrowthIcon, @@ -26,6 +26,7 @@ import { SilverGrowthText, SpeedText, } from '../Components/Labels/PlanetLabels'; +import { ReadMore } from '../Components/ReadMore'; import { Sub } from '../Components/Text'; import { TextPreview } from '../Components/TextPreview'; import { TooltipName } from '../Game/WindowManager'; @@ -66,13 +67,13 @@ export function PlanetCardTitle({ ); } -const StatsContainer = styled.div` - ${snips.bigPadding} +const ElevatedContainer = styled.div` ${snips.roundedBordersWithEdge} border-color: ${dfstyles.colors.borderDarker}; background-color: ${dfstyles.colors.backgroundlight}; margin-top: 8px; margin-bottom: 8px; + font-size: 85%; `; /** Preview basic planet information - used in `PlanetContextPane` and `HoverPlanetPane` */ @@ -113,117 +114,216 @@ export function PlanetCard({ )} - - - - - - - energy - - - {planet?.bonus && planet.bonus[StatIdx.EnergyCap] && } - - - + + + {/* */} + + + + +
+ + + + + + + + + {planet?.bonus && planet.bonus[StatIdx.EnergyCap] && } + + + + +
+
+ + + + + + + + + + + + +
+
+
+ + +
+ + + + + + + + + {planet?.bonus && planet.bonus[StatIdx.EnergyGro] && } + + + + +
+
+ + + + + + + + + + + + +
+
+
- - - - - growth - - - {planet?.bonus && planet.bonus[StatIdx.EnergyGro] && } - - -
+ + +
+ + + + + + + + + {planet?.bonus && planet.bonus[StatIdx.Defense] && } + + + + +
- - - - - - silver - - - - - {(p.value?.planetType === PlanetType.SILVER_MINE && ( - <> - - - - - - growth - - - - - - )) || <>} - +
+ + + + + + + + + {planet?.bonus && planet.bonus[StatIdx.Speed] && } + + + + +
- - - - - - defense - - - {planet?.bonus && planet.bonus[StatIdx.Defense] && } - - - +
+ + + + + + - - - - - - speed - - - {planet?.bonus && planet.bonus[StatIdx.Speed] && } - - - + + + {planet?.bonus && planet.bonus[StatIdx.Range] && } + + + + +
+
+
+ + - - - - - - range - - - {planet?.bonus && planet.bonus[StatIdx.Range] && } - - - -
+ + + owner address + {' '} + - - owner address - {' '} - - - - planet id - - + + planet id + + +