From 6b4c88340665bbcb46206e1ef388b1efc570ad91 Mon Sep 17 00:00:00 2001 From: cpojer Date: Sun, 12 May 2024 18:03:53 +0900 Subject: [PATCH] Docs updates. GitOrigin-RevId: a84a8644914ee93a60cc50f2ea130245287bfaba --- README.md | 53 ++-- dionysus/BaseAI.tsx | 2 +- docs/content/examples/entities-example.tsx | 5 + docs/content/examples/map-data-examples.tsx | 4 +- docs/content/examples/map-editor.tsx | 22 +- docs/content/examples/portraits-example.tsx | 26 ++ docs/content/pages/core-concepts/actions.mdx | 166 ++++++++++++ docs/content/pages/core-concepts/ai.mdx | 83 ++++++ docs/content/pages/core-concepts/map-data.mdx | 16 +- docs/content/pages/core-concepts/overview.mdx | 5 +- docs/content/pages/index.mdx | 22 +- docs/content/pages/playground/ai.mdx | 3 + docs/content/pages/ui/game-components.mdx | 43 +++ docs/content/playground/ClientScope.tsx | 55 ++-- docs/content/playground/Image.tsx | 27 ++ docs/content/playground/PlaygroundGame.tsx | 4 - docs/content/public/actions.dark.png | Bin 0 -> 66649 bytes docs/content/public/actions.png | Bin 0 -> 65719 bytes docs/content/styles.css | 42 +++ docs/vocs.config.tsx | 17 ++ hera/editor/lib/ActionCard.tsx | 16 +- hera/ui/PlayerIcon.tsx | 5 +- hera/ui/demo/UnitPreviews.tsx | 129 +++++++++ hera/ui/fps/FpsComponent.tsx | 1 + tests/display.tsx | 4 +- ui/CSS.tsx | 249 ++++++++++-------- ui/Portal.tsx | 8 +- ui/TagInput.tsx | 20 +- 28 files changed, 824 insertions(+), 203 deletions(-) create mode 100644 docs/content/examples/entities-example.tsx create mode 100644 docs/content/examples/portraits-example.tsx create mode 100644 docs/content/pages/core-concepts/ai.mdx create mode 100644 docs/content/pages/playground/ai.mdx create mode 100644 docs/content/pages/ui/game-components.mdx create mode 100644 docs/content/playground/Image.tsx create mode 100644 docs/content/public/actions.dark.png create mode 100644 docs/content/public/actions.png create mode 100644 hera/ui/demo/UnitPreviews.tsx diff --git a/README.md b/README.md index d6c44f2f..7fe6e208 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [Athena Crisis](https://athenacrisis.com) is an Open Core video game developed by [Nakazawa Tech](https://nkzw.tech) and published by [Null](https://null.com). The source code in this repository is licensed under the [MIT License](./LICENSE.md) and can be used to improve Athena Crisis, build additional tools, study game development with JavaScript or create entirely new turn-based strategy games. -The single-player campaign, multiplayer, art, music, and content are not open source. You can try a demo at [athenacrisis.com](https://athenacrisis.com) and you can [wishlist or purchase Athena Crisis on Steam Early Access](https://store.steampowered.com/app/2456430/Athena_Crisis/) or [buy Athena Crisis directly](https://app.athenacrisis.com/checkout) to play the full game. +The single-player campaign, multiplayer, art, music, and content are not open source. You can try a demo at [athenacrisis.com](https://athenacrisis.com) and you can [wishlist or purchase Athena Crisis on Steam Early Access](https://store.steampowered.com/app/2456430/Athena_Crisis/) or [buy Athena Crisis directly](https://app.athenacrisis.com/checkout) to experience the full game. If you like Athena Crisis, [please consider a sponsorship to support its development](https://github.com/sponsors/cpojer). @@ -38,7 +38,11 @@ pnpm dev Visit [localhost:3003](http://localhost:3003/) to see the docs page. -## Packages +## Documentation & Playground + +Check out our [Athena Crisis Open Source Docs & Playground](https://athenacrisis.com/open-source) site. + +### Packages The codebase is split into multiple packages to enforce the separation of concerns. We suggest starting with these packages to get an end-to-end overview: @@ -59,17 +63,33 @@ These are secondary packages focused on specific domains: - `offline` → Offline splash screen for app (_client_). - `tests` → e2e tests. -## Documentation & Playground +# Contributing -Check out our [Athena Crisis Open Source Docs & Playground](https://athenacrisis.com/open-source) site. +We welcome contributions to Athena Crisis. Some feature development is funded via [Polar](https://polar.sh): [`nkzw-tech/athena-crisis` on Polar](https://polar.sh/nkzw-tech/athena-crisis). Here are some guidelines to get you started: + +- The style guide is enforced through tests and linting. Please run `pnpm test` to run all checks. If they pass, you are good to send a Pull Request. +- We suggest adding tests to Pull Requests. You can find many examples in the [`tests` folder](https://github.com/nkzw-tech/athena-crisis/tree/main/tests). +- Check out [The Perfect Development Environment](https://cpojer.net/posts/the-perfect-development-environment) and [Fastest Frontend Tooling](https://cpojer.net/posts/fastest-frontend-tooling-in-2022) for tips on how to optimize your environment setup. +- [Join the #tech channel on Discord](https://discord.gg/2VBCCep7Fk) if you run into issues. + +We greatly appreciate contributions in the following areas: + +- Bug fixes. +- AI improvements. +- New game features. +- Balancing improvements. +- Experimental technical explorations. +- Tests to cover untested functionality. +- Performance Improvements to core data structures. +- Separation of concerns into smaller libraries that can be published on npm and consumed by other projects. # Q&A ## What is open source and what isn't? -About 75% of all non-content related Athena Crisis code – **almost 100,000 lines** – is open source, including the core data structures, algorithms, game engine, rendering, AI, and the map editor. Backend implementations such as user management, databases, APIs, realtime spectating, server configuration, and app wrappers for Steam or app stores are not open source. We aim to open source more of the game over time, but the content will remain the intellectual property of Nakazawa Tech KK and therefore not be open source. You can buy and enjoy [Athena Crisis on Steam Early Access](https://store.steampowered.com/app/2456430/Athena_Crisis/) or [buy it on athenacrisis.com](https://app.athenacrisis.com/checkout). +About 75% of all non-content related Athena Crisis code – **almost 100,000 lines** – is open source, including the core data structures, algorithms, game engine, rendering, AI, and the map editor. Backend implementations such as user management, databases, APIs, realtime spectating, server configuration, and app wrappers for Steam or app stores are not open source. We aim to open source more of the game over time, but the content will remain the intellectual property of Nakazawa Tech KK and therefore not be open source. You can buy and experience [Athena Crisis on Steam Early Access](https://store.steampowered.com/app/2456430/Athena_Crisis/) or [buy it on athenacrisis.com](https://app.athenacrisis.com/checkout). -## Why did you open source Athena Crisis? +## Why is Athena Crisis open source? [Nakazawa Tech](https://nkzw.tech) is an Open Core company. See [the "Athena Crisis is now Open Source" blog post](https://cpojer.net/posts/athena-crisis-open-source) for more information. @@ -85,7 +105,7 @@ To simplify dependency management with [`pnpm`](https://pnpm.io/), most of the i Why not!? At some point it became necessary to split the codebase into multiple packages to share code between the client and server. The first package was named `athena`, and it was hard to come up with meaningful names for the other packages. We decided to name them after Greek gods because it seemed cute. -Over time, many pieces are expected to be extracted into separate packages and published on npm under the `@nkzw` organization. Please send a Pull Request if you find code that you think should be extracted into a separate package. +Over time, many pieces will be extracted into separate packages and published on npm under the `@nkzw` organization. Please move it to a `packages` folder and send a Pull Request if you find code that should be extracted into a separate package. ## How do assets work in this codebase? @@ -97,25 +117,6 @@ Yes, you can. However, any content such as art, music, story, characters and the If you'd like to use content from Athena Crisis for commercial or non-commercial purposes, you must obtain a license from Nakazawa Tech KK by emailing license@nakazwa.dev. -# Contributing - -We welcome contributions to Athena Crisis. Some feature development is funded via [Polar](https://polar.sh): [`nkzw-tech/athena-crisis` on Polar](https://polar.sh/nkzw-tech/athena-crisis). Here are some guidelines to get you started: - -- The style guide is enforced through tests and linting. Please run `pnpm test` to run all checks. If they pass, you are good to send a Pull Request. -- Check out [The Perfect Development Environment](https://cpojer.net/posts/the-perfect-development-environment) and [Fastest Frontend Tooling](https://cpojer.net/posts/fastest-frontend-tooling-in-2022) for tips on how to optimize your environment setup. -- We suggest adding tests to Pull Requests. You can find many examples in the [`tests` folder](https://github.com/nkzw-tech/athena-crisis/tree/main/tests). - -We greatly appreciate contributions in the following areas: - -- Bug fixes. -- AI improvements. -- New game features. -- Balancing improvements. -- Experimental technical explorations. -- Tests to cover untested functionality. -- Performance Improvements to core data structures. -- Separation of concerns into smaller libraries that can be published on npm and consumed by other projects. - # More information Check out these links to learn more about the tech behind Athena Crisis: diff --git a/dionysus/BaseAI.tsx b/dionysus/BaseAI.tsx index d2ec98e5..9104d8a1 100644 --- a/dionysus/BaseAI.tsx +++ b/dionysus/BaseAI.tsx @@ -72,7 +72,7 @@ export default abstract class BaseAI { protected executeMove( map: MapData, action: MoveAction, - ): [MapData | null, boolean] { + ): [map: MapData | null, blocked: boolean] { const currentMap = this.execute(map, action); const state = this.gameState.at(-1); diff --git a/docs/content/examples/entities-example.tsx b/docs/content/examples/entities-example.tsx new file mode 100644 index 00000000..3d6513e6 --- /dev/null +++ b/docs/content/examples/entities-example.tsx @@ -0,0 +1,5 @@ +import UnitPreviews from '@deities/hera/ui/demo/UnitPreviews.tsx'; + +export default function EntitiesExample() { + return ; +} diff --git a/docs/content/examples/map-data-examples.tsx b/docs/content/examples/map-data-examples.tsx index ed691ca2..e5fb11d9 100644 --- a/docs/content/examples/map-data-examples.tsx +++ b/docs/content/examples/map-data-examples.tsx @@ -3,7 +3,7 @@ import { Flamethrower, Infantry } from '@deities/athena/info/Unit.tsx'; import withModifiers from '@deities/athena/lib/withModifiers.tsx'; import vec from '@deities/athena/map/vec.tsx'; import MapData from '@deities/athena/MapData.tsx'; -import Button from '@deities/ui/Button.tsx'; +import InlineLink from '@deities/ui/InlineLink.tsx'; import { Fragment, useState } from 'react'; import PlaygroundGame from '../playground/PlaygroundGame.tsx'; @@ -41,7 +41,7 @@ export default function ExampleMap() { return ( - + rerender(render + 1)}>Reset State ); } diff --git a/docs/content/examples/map-editor.tsx b/docs/content/examples/map-editor.tsx index f1bbea4c..7d2d8aaf 100644 --- a/docs/content/examples/map-editor.tsx +++ b/docs/content/examples/map-editor.tsx @@ -16,15 +16,17 @@ const viewer = { export default function MapEditorExample() { return ( - {}} - fogStyle="soft" - setHasChanges={() => {}} - tiltStyle="on" - updateMap={() => {}} - user={viewer} - /> +
+ {}} + fogStyle="soft" + setHasChanges={() => {}} + tiltStyle="on" + updateMap={() => {}} + user={viewer} + /> +
); } diff --git a/docs/content/examples/portraits-example.tsx b/docs/content/examples/portraits-example.tsx new file mode 100644 index 00000000..2b464b55 --- /dev/null +++ b/docs/content/examples/portraits-example.tsx @@ -0,0 +1,26 @@ +import { preparePortraits } from '@deities/art/Sprites.tsx'; +import { + BazookaBear, + Flamethrower, + Jetpack, + Sniper, +} from '@deities/athena/info/Unit.tsx'; +import Portrait from '@deities/hera/character/Portrait.tsx'; +import Stack from '@deities/ui/Stack.tsx'; + +preparePortraits(); + +// [!region portraits] +const portraits = ( + + + + + + +); +// [!endregion portraits] + +export default function PortraitsExample() { + return portraits; +} diff --git a/docs/content/pages/core-concepts/actions.mdx b/docs/content/pages/core-concepts/actions.mdx index 1060a658..1f019b93 100644 --- a/docs/content/pages/core-concepts/actions.mdx +++ b/docs/content/pages/core-concepts/actions.mdx @@ -1 +1,167 @@ +import Image from '../../playground/Image.tsx'; + # Actions + +In the [Map Data](/core-concepts/map-data) section we learned about the core map data structure of Athena Crisis and how to query and update game state. In this section we'll discuss the formalized approach to update game state via _Actions_. + +Actions are the primary way to update game state. While game state might be mutated before a game starts or after it ends via code, players can only interact with the game via actions. Actions can be a move, attack, create unit or other game events. You can find the full list of actions that can be executed by users or scripts in [`Action.tsx`](https://github.com/nkzw-tech/athena-crisis/blob/main/apollo/Action.tsx). Each Action produces an ActionResponse, which can be found in [`ActionResponse.tsx`](https://github.com/nkzw-tech/athena-crisis/blob/main/apollo/ActionResponse.tsx). ActionResponses will then be applied to the game state to update it, and animated if they are shown to a player. + +**Here is a diagram of the action flow:** + +Actions + +## Defining a new Action + +Adding new actions is straightforward and TypeScript guides you through the process. First, add a new Action type to `Action.tsx`: + +```tsx +type SleepAction = Readonly<{ + type: 'Sleep'; + from: Vector; +}>; +``` + +You'll also need to add it to the `Action` type in the same file: + +```tsx +export type Action = + | ActivatePowerAction + | …… + | SleepAction; +``` + +If you are adding a new type of `ActionResponse`, you'll need to do the same in `ActionResponse.tsx`: + +```tsx +export type SleepActionResponse = Readonly<{ + type: 'Sleep'; + from: Vector; +}>; +``` + +You'll also need to add it to the `Action` type in the same file: + +```tsx +export type ActionResponse = + | ActivatePowerActionResponse + | …… + | SleepActionResponse; +``` + +After this, run `pnpm codegen` to generate all the encoded actions (for storage or network transmission), and the corresponding formatters for use in snapshot tests. + +## Implementing an Action + +After a new Action is defined, you can run TypeScript via `pnpm tsc` and it will guide you through each call site where the new action needs to be handled. This is a great way to get an overview of the whole system. Let's build a new "Sleep" action that puts a unit to sleep. In our case, it won't have any functionality, but could be made visible to the player with an animation. First, add the new Action in [`Action.tsx`](https://github.com/nkzw-tech/athena-crisis/blob/main/apollo/Action.tsx): + +```tsx +function sleep(map: MapData, { from }: SleepAction) { + const unit = map.units.get(from); + return unit && map.isCurrentPlayer(unit) && !unit.isSleeping() + ? ({ from, type: 'Sleep' } as const) + : null; +} +``` + +Actions only return an `ActionResponse` if the action is valid. They do not mutate the game state, which happens via [`applyActionResponse`](https://github.com/nkzw-tech/athena-crisis/blob/main/apollo/actions/applyActionResponse.tsx) by processing the `ActionResponse` and returning a new `MapData` object: + +```tsx +switch (type) { + … + case 'Sleep': { + const { from } = actionResponse; + const unit = map.units.get(from); + return unit + ? map.copy({ units: map.units.set(from, unit.sleep().complete()) }) + : map; + } +} +``` + +Next, TypeScript will tell us that we need to handle the visibility of the new ActionResponse in fog. Fog in Athena Crisis works by removing all information from each player that is not visible to them. When an Action is executed, it calls [`computeVisibleActions`](https://github.com/nkzw-tech/athena-crisis/blob/main/apollo/lib/computeVisibleActions.tsx) on the ActionResponse once for each player. The Action we created is fairly minimal, so we only need to handle one case: Show the action if the source field (`from`) is visible to the player, or drop it if it isn't: + +```tsx +const VisibleActionModifiers = { + … + Sleep: { Source: true }, +} +``` + +There are more complex cases where it is harder to know if an action should be visible or hidden from that player, such as when a unit is moving or attacking, and the action affects more than just one field. `computeVisibleActions` can handle each case individually, and it can either return the same ActionResponse, drop it, return a modified version or even return multiple new ActionResponses. For example, a unit can be created from one Building but deployed on another field. The process looks like this: + +```tsx +CreateUnit: { + Both: true, + Source: true, + Target: ( + { from, to, unit }: CreateUnitActionResponse, + _: MapData, + activeMap: MapData, + ): HiddenMoveActionResponse => ({ + path: [from, to], + type: 'HiddenMove', + unit, + }), +} +``` + +If both fields or just the source are visible, the action is shown to the player unmodified. However, if only the target field is visible, the response is replaced with a `HiddenMove` ActionResponse. The player who is viewing the game won't be able to tell if the unit was just created or moved from another field in fog. + +For convenience, we'll also add an [`ActionMutator`](https://github.com/nkzw-tech/athena-crisis/blob/main/apollo/action-mutators/ActionMutators.tsx). These are simple functions to avoid repetition when executing actions against game state, like is often the case in tests. + +``` +export const SleepAction = (from: Vector) => + ({ + from, + type: 'Sleep', + }) as const; +``` + +Now, if you are writing a test to simulate some game actions, you can use the mutator like this: + +```tsx +const response = executeGameActions(map, [ + MoveAction(from, to), + SleepAction(to), + EndTurnAction(), +]); +``` + +TypeScript may point you to a few more utility functions that need handling for your action, but once you are done we can move on to the UI layer. + +## Actions in the UI + +We are now ready to make our first change to the Athena Crisis game client. Most of the client code can be found in [`hera`](https://github.com/nkzw-tech/athena-crisis/tree/main/hera). + +For our new action, we need to first implement the handler for what happens when another player or the AI execute this action. This code lives in [`processActionResponse`](https://github.com/nkzw-tech/athena-crisis/blob/main/hera/action-response/processActionResponse.tsx) which is a wrapper around `applyActionResponse` to animate game state and apply the ActionResponse at the right time. The client side Sleep Action could look something like this: + +```tsx +export function sleepAction( + { optimisticAction, update }: Actions, + state: State, +): Promise { + const { map, selectedPosition, vision } = state; + if (selectedPosition) { + return update({ + map: applyActionResponse( + map, + vision, + optimisticAction(state, SleepUnitAction(selectedPosition)), + ), + position: selectedPosition, + ...resetBehavior(), + }); + } + return null; +} +``` + +Finally, we need to allow the player to execute the Sleep Action for a unit in the game. We could consider adding a button to the [`Menu`](https://github.com/nkzw-tech/athena-crisis/blob/main/hera/behavior/Menu.tsx) behavior that works similarly to other buttons and executes the action against the game state when clicked. We can reuse the same `sleepAction` that we defined above for the user initiated action as well. + +After following the above steps, Athena Crisis should now have a new "Sleep" feature for units! + +## Optimistic Updates + +In the above example we called `optimisticAction(state, SleepUnitAction(from))` to update the game state on the client optimistically. Due to the elegance of immutable data structures and the Athena Crisis architecture, we can apply an Action on the client while sending the same action to the server at the same time, executing it, and sending the (visible) ActionResponse to each other player. + +The architecture of the game ensures that the server always has the final say on the game state, and the client will be updated with the server's response. This is a powerful feature that allows the game to feel responsive and smooth, even on slow connections, and it also allows hiding secrets like hidden win conditions from players. diff --git a/docs/content/pages/core-concepts/ai.mdx b/docs/content/pages/core-concepts/ai.mdx new file mode 100644 index 00000000..d872661c --- /dev/null +++ b/docs/content/pages/core-concepts/ai.mdx @@ -0,0 +1,83 @@ +# AI Deep Dive + +The first Athena Crisis AI, [`DionysusAlpha`](https://github.com/nkzw-tech/athena-crisis/blob/main/dionysus/DionysusAlpha.tsx), was written from scratch to understand how to build a heuristics based AI for a turn-based strategy game. Instead of building a new AI from scratch, it was extended to handle almost all of the mechanics in Athena Crisis. The AI is roughly as good as an intermediate player at most types of maps, but map design has a significant impact on its performance. + +## Architecture + +- The [`BaseAI`](https://github.com/nkzw-tech/athena-crisis/blob/main/dionysus/BaseAI.tsx) class abstracts away interactions with game state such as executing actions and handling game over states. +- [`DionysusAlpha`](https://github.com/nkzw-tech/athena-crisis/blob/main/dionysus/DionysusAlpha.tsx) is stateless and does not plan ahead. After each action that it executes, it looks at the game state as if it's a completly different game, and makes decisions based on that. This is not fast or memory efficient, but makes the implementation less error-prone and easier to understand since any mutation to the game state can completely change the AI's possible options. For example, defeating a unit on a bridge may unblock a path that allows other units to act. +- [`skmeans`](https://github.com/solzimer/skmeans) is used for clustering locations on a map to identify targets. + +The AI executes actions in a loop until it exhausts all possible actions for all units. After each action, it starts from scratch. For example, after the AI finishes capturing a building, it will try to activate a power, finish capturing another building, […], attack, move or end its turn. Once the action generator returns `null`, the AI will yield to the next player or AI. Here is what that looks like in the code: + +```tsx +class DionysusAlpha extends BaseAI { + protected action(map: MapData): MapData | null { + return ( + this.activatePower(map) || + this.finishCapture(map) || + this.finishRescue(map) || + this.toggleLightning(map) || + this.rescue(map) || + this.attack(map) || + this.capture(map) || + this.fold(map) || + this.createBuilding(map) || + this.move(map) || + this.unfold(map) || + this.buySkills(map) || + this.createUnit(map) || + this.endTurn(map) + ); + } + … +} +``` + +:::info[Note] +There are some optimizations when it comes to attacking other units where the AI will actually execute all attack actions before moving on to other actions. It will also mark that it can no longer execute any attacks to avoid some computations. This is purely for performance reasons. +::: + +## Possible improvements + +There are many ways the AI's ability, performance and memory consumption could be improved: + +### Making the AI Smarter + +- Almost every heuristic and assumption the AI makes could be improved upon. +- Instead of taking one move at a time, the AI could plan its entire turn in advance and then execute on it. +- The AI could simulate various actions to determine the best outcome and only return the most promising list of actions. This works because `MapData` is immutable and the AI can simulate actions without changing the game state. + +### Making the AI faster and more memory efficient + +- Intelligent caching could be implemented to avoid recalculating the same information multiple times. +- [`getAvailableUnitActions`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/lib/getAvailableUnitActions.tsx) could likely be used to more intelligently determine the available actions for each unit. +- Various algorithms could likely be improved to reduce memory usage, especially around wasteful allocations that get discarded immediately. + +## Creating a new AI + +- Pick a good name, create a new file in the [`dionysus`](https://github.com/nkzw-tech/athena-crisis/blob/main/dionysus/DionysusAlpha.tsx) top-level folder. +- Define a new class that extends `BaseAI`. +- Add the class to the [`AIRegistry`](https://github.com/nkzw-tech/athena-crisis/blob/main/dionysus/AIRegistry.tsx), pick any unused number as an id for your AI. +- Implement the `action` function that returns either a `MapData` instance or `null`. +- Call `this.execute(…)` (or `this.executeMove()` for executing a move, considering fog) to record actions. + +We suggest starting with basic behaviors like ending the turn, attacking and capturing. Here are some of the behaviors you need to consider when implementing an AI: + +- The AI needs to understand all types of maps, terrain, and units. +- The optimal set of units need to be created at each turn. +- An AI should know when it's time to push and when it's time to defend. +- Units that are out of ammo or almost out of supplies need to be resupplied. They may need to retreat, or a decision can be made to block the opponent's path. +- The AI needs to make reasonable decisions when deciding which buildings to create (House, Repair Shop, Factory, etc.). +- Naval transport units need to understand which islands to travel to and how to transport units from one island to another. +- The AI must never crash or produce illegal game states. + +Check out [`AIBehavior.test.tsx`](https://github.com/nkzw-tech/athena-crisis/blob/main/tests/__tests__/AIBehavior.test.tsx) to get an idea for the type of behaviors an AI needs to handle. + +:::info[Note] +AI specific helpers can be found in [`dionysus/lib`](https://github.com/nkzw-tech/athena-crisis/tree/main/dionysus/lib). If you are building an AI from scratch, feel free to add more helpers, extract existing functionality from `DionysusAlpha` and submit them as a Pull Request separately. +::: + +### How to test your AI + +The [Map Editor](/playground/map-editor) can be used to set up scenarios and try different AI behaviors. You can choose your AI for one of the players in a dropdown in the "Setup" (shortcut: `t`) panel. Then set up a scenario in the editor, jump into a playtest and end your turn to see the AI behavior. diff --git a/docs/content/pages/core-concepts/map-data.mdx b/docs/content/pages/core-concepts/map-data.mdx index 29e157ec..3004a1ee 100644 --- a/docs/content/pages/core-concepts/map-data.mdx +++ b/docs/content/pages/core-concepts/map-data.mdx @@ -21,7 +21,7 @@ class MapData { } ``` -Each map in the game is a grid defined by `size`. `map` is an Array of tile ids (In-game they are referred to as "fields"), with `modifiers` being the corresponding Array to identify the specific sprite variant for rendering. For example, if a tile in a specific location is a Street, with Street tiles above and below, but not to the right and left, the modifier will store information that it should render a vertical Street sprite. `map` is critical for gameplay and behaviors, but `modifiers` is only used for rendering. Modifiers are only stored on each map to avoid recalculating them frequently. In tests, you can use `withModifiers(map)` to generate the correct modifiers automatically. +Each map in the game is a grid defined by `size`. `map` is an Array of [`TileInfo`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/info/Tile.tsx) ids (In-game they are referred to as "fields"), with `modifiers` being the corresponding Array to identify the specific sprite variant for rendering. For example, if a tile in a specific location is a Street, with Street tiles above and below, but not to the right and left, the modifier will store information that it should render a vertical Street sprite. `map` is critical for gameplay and behaviors, but `modifiers` is only used for rendering. Modifiers are only stored on each map to avoid recalculating them frequently. In tests, you can use `withModifiers(map)` to generate the correct modifiers automatically. :::info[Note] In Athena Crisis, the look of a tile on the screen depends on its adjacent tiles. There is always only one way to render a tile based on its neighbors. The map editor first checks if a tile can be placed via [`canPlaceTile`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/lib/canPlaceTile.tsx), and then recalculates the modifiers for the field and its neighbors via [`getModifier`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/lib/getModifier.tsx). @@ -119,6 +119,18 @@ const newMap = map.copy({ units }); That's it! After a mutation to map state it can be shared with other players, like for example when an action is taken on the server or the state can be stored in a database using `JSON.stringify(newMap)`. In the next section we'll discuss the formalized approach to update game state via [Actions](/core-concepts/actions). +## Buildings & Units + +We already learned about [`TileInfo`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/info/Tile.tsx) above. There are corresponding definitions for [`BuildingInfo`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/info/Building.tsx) and [`UnitInfo`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/info/Unit.tsx). Instances of these classes (also in the same files) contain all the necessary configuration and sprite information for buildings and units such as health, cost, or the assets to render. + +Maps contain instances of [`Building`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/map/Building.tsx) and [`Unit`](https://github.com/nkzw-tech/athena-crisis/blob/main/athena/map/Unit.tsx). They are immutable like `MapData`, and similarly have query and mutation functions: + +```tsx +Jeep.create(player1).load(Flamethrower.create(player1).transport()); // A Jeep loaded with a Flamethrower. + +Factory.create(player2).canBuildUnits(); // true +``` + :::info[Note] Many data structures in Athena Crisis are technically mutable as they are basic JavaScript Arrays, Sets or Maps. This is usually for performance reasons. Their immutability is enforced via TypeScript types. -::: +:::import Tiles from '@deities/hera/Tiles.tsx'; diff --git a/docs/content/pages/core-concepts/overview.mdx b/docs/content/pages/core-concepts/overview.mdx index f0588eb9..80414b79 100644 --- a/docs/content/pages/core-concepts/overview.mdx +++ b/docs/content/pages/core-concepts/overview.mdx @@ -1,7 +1,10 @@ # Core Concepts – Overview -This section dives into the core concepts of the codebase to give you a high-level overview of how Athena Crisis works. The technical walkthroughs primarily cover these three top level folders in the repository: +This section dives into the core concepts of the codebase to give you a high-level overview of how Athena Crisis works. This overview is for you if you are interested in the data structures and algorithms used in Athena Crisis. The technical walkthroughs primarily cover these three top level folders in the repository: - [`athena`](https://github.com/nkzw-tech/athena-crisis/tree/main/athena) → Data structures and algorithms for manipulating _map_ state (_client/server_). - [`apollo`](https://github.com/nkzw-tech/athena-crisis/tree/main/apollo) → Data structures and algorithms for manipulating _game_ state (_client/server_). - [`hera`](https://github.com/nkzw-tech/athena-crisis/tree/main/hera) → Game engine and rendering (_client_). +- [`dionysus`](https://github.com/nkzw-tech/athena-crisis/tree/main/hera) → AI implementation (_client/server_). + +There are many tests covering almost all game related logic, with most end-to-end screenshot tests in the [`tests`](https://github.com/nkzw-tech/athena-crisis/tree/main/tests) top-level folder. They are worth checking out when studying the codebase. diff --git a/docs/content/pages/index.mdx b/docs/content/pages/index.mdx index d6fbeb44..9d408e13 100644 --- a/docs/content/pages/index.mdx +++ b/docs/content/pages/index.mdx @@ -2,24 +2,40 @@ layout: landing --- +import { css } from '@emotion/css'; import { lazy } from 'react'; import { HomePage } from 'vocs/components'; import ClientComponent from '../playground/ClientComponent.tsx'; - Athena Crisis logo + + Athena Crisis logo + Open Source Docs & Playground - Athena Crisis is a modern retro turn-based strategy game. + Athena Crisis is a modern retro turn-based strategy game built from scratch + with JavaScript, React and CSS. +
+ [Read the + announcement](https://cpojer.net/posts/athena-crisis-open-source) +
Getting Started - GitHub + Star on GitHub + + + Athena Crisis on Steam + Try a demo of Athena Crisis! import('../playground/PlaygroundDemoGame.tsx'))} /> diff --git a/docs/content/pages/playground/ai.mdx b/docs/content/pages/playground/ai.mdx new file mode 100644 index 00000000..357f456b --- /dev/null +++ b/docs/content/pages/playground/ai.mdx @@ -0,0 +1,3 @@ +# AI Playground + +The AI playground will be published shortly. diff --git a/docs/content/pages/ui/game-components.mdx b/docs/content/pages/ui/game-components.mdx new file mode 100644 index 00000000..7805af71 --- /dev/null +++ b/docs/content/pages/ui/game-components.mdx @@ -0,0 +1,43 @@ +import { lazy } from 'react'; +import ClientComponent from '../../playground/ClientComponent.tsx'; + +# Game Components + +The Athena Crisis renderer was written for fun in JavaScript and CSS from scratch without experience in building game engines. It then ended up being a real game. _Oops._ Anyway, it's been fun to push web technologies to the max and optimize every detail, so let's explore some of the core components! + +Most of the UI and game rendering can be found in the [`hera`](https://github.com/nkzw-tech/athena-crisis/tree/main/hera) top level folder. Athena Crisis renders almost the entire game using just plain React, DOM and CSS. Only the map tiles, fog and decorations are using a `canvas` Element. Even then, all three are rendered using different `canvas` elements that are laid on top of each other. The entry point to render a map is the [`Map`](https://github.com/nkzw-tech/athena-crisis/tree/main/hera/Map.tsx) component. + +## Tiles, Fog and Decorations + +Building a renderer with basic web technologies makes it easier to study how to build a game. It's not the most efficient approach, but it's a great way to learn. All the "static content" is rendered using `` through these components: + +- [`Tiles`](https://github.com/nkzw-tech/athena-crisis/blob/main/hera/Tiles.tsx) for rendering tiles. +- [`Decorators`](https://github.com/nkzw-tech/athena-crisis/blob/main/hera/Decorators.tsx) for decorations. +- [`Fog`](https://github.com/nkzw-tech/athena-crisis/blob/main/hera/Fog.tsx) for fog that overlays the map and blends into everything. + +_If you are a fan of web development, check out how the fog layer is implemented._ + +## Units & Buildings + +Units and Buildings are interactable entities. Both are making use of somewhat complex CSS like `mask-image`, `filter` and `transform` and are therefore slightly harder to replicate when building a game engine and renderer from scratch. In a way, CSS was used as if it was a shader language. Their implementation can be found here: + +- [`Unit`](https://github.com/nkzw-tech/athena-crisis/blob/main/hera/Unit.tsx) +- [`Building`](https://github.com/nkzw-tech/athena-crisis/blob/main/hera/Building.tsx) + +Here are some examples of units as they are rendered on a map in the game. You can click them to show the [`GameDialog`](https://github.com/nkzw-tech/athena-crisis/blob/main/hera/ui/GameDialog.tsx) as it is rendered in the game when right-clicking or long-pressing a field: + + import('../../examples/entities-example.tsx'))} +/> + +## Portraits + +Portraits are rendered using the [`Portrait`](https://github.com/nkzw-tech/athena-crisis/blob/main/hera/character/Portrait.tsx) component: + +```tsx +// [!include ~/examples/portraits-example.tsx:portraits] +``` + + import('../../examples/portraits-example.tsx'))} +/> diff --git a/docs/content/playground/ClientScope.tsx b/docs/content/playground/ClientScope.tsx index 17b850de..fba8bdb9 100644 --- a/docs/content/playground/ClientScope.tsx +++ b/docs/content/playground/ClientScope.tsx @@ -1,6 +1,11 @@ +import AudioPlayer from '@deities/ui/AudioPlayer.tsx'; +import setupGamePad from '@deities/ui/controls/setupGamePad.tsx'; +import setupKeyboard from '@deities/ui/controls/setupKeyboard.tsx'; +import { getScopedCSSDefinitions } from '@deities/ui/CSS.tsx'; import { initializeCSSVariables } from '@deities/ui/cssVar.tsx'; import { ScaleContext } from '@deities/ui/hooks/useScale.tsx'; -import { css, injectGlobal } from '@emotion/css'; +import { setDefaultPortalContainer } from '@deities/ui/Portal.tsx'; +import { css } from '@emotion/css'; import { init as initFbt, IntlVariations } from 'fbt'; initializeCSSVariables(); @@ -15,21 +20,44 @@ initFbt({ translations: {}, }); -injectGlobal(` -@font-face { - font-display: swap; - font-family: Athena; - src: url('/fonts/AthenaNova.woff2'); -} +const clientScopeStyle = css` + all: initial; -body { font-family: Athena, ui-sans-serif, system-ui, sans-serif; font-size: 20px; font-weight: normal; line-height: 1em; + outline: none; + touch-action: pan-x pan-y; + + img { + max-width: initial; + } + + svg { + display: initial; + } + + ${getScopedCSSDefinitions()} +`; + +if (!document.querySelector('body > div.portal')) { + const portal = document.createElement('div'); + portal.classList.add('portal'); + portal.classList.add(clientScopeStyle); + document.body.append(portal, document.body.childNodes[0]); + setDefaultPortalContainer(portal); } -`); +if (!document.querySelector('body > div.background')) { + const background = document.createElement('div'); + background.classList.add('background'); + document.body.insertBefore(background, document.body.childNodes[0]); +} + +AudioPlayer.pause(); +setupKeyboard(); +setupGamePad(); if (import.meta.env.DEV) { import('@deities/hera/ui/fps/Fps.tsx'); @@ -38,14 +66,7 @@ if (import.meta.env.DEV) { export default function ClientScope({ children }: { children: JSX.Element }) { return ( -
{children}
+
{children}
); } - -const style = css` - all: initial; - - font-family: Athena, ui-sans-serif, system-ui, sans-serif; - outline: none; -`; diff --git a/docs/content/playground/Image.tsx b/docs/content/playground/Image.tsx new file mode 100644 index 00000000..8e0a807e --- /dev/null +++ b/docs/content/playground/Image.tsx @@ -0,0 +1,27 @@ +type Props = React.DetailedHTMLProps< + React.ImgHTMLAttributes, + HTMLImageElement +>; + +export default function Image(props: Props) { + if (!props.src) { + return null; + } + + const parts = props.src.split('.'); + const extension = parts.pop(); + const image = ; + return ( + + + + {image} + + ); +} diff --git a/docs/content/playground/PlaygroundGame.tsx b/docs/content/playground/PlaygroundGame.tsx index 19947ead..77dbe4ba 100644 --- a/docs/content/playground/PlaygroundGame.tsx +++ b/docs/content/playground/PlaygroundGame.tsx @@ -6,15 +6,11 @@ import useClientGame from '@deities/hera/hooks/useClientGame.tsx'; import useClientGameAction from '@deities/hera/hooks/useClientGameAction.tsx'; import GameActions from '@deities/hera/ui/GameActions.tsx'; import MapInfo from '@deities/hera/ui/MapInfo.tsx'; -import setupGamePad from '@deities/ui/controls/setupGamePad.tsx'; -import setupKeyboard from '@deities/ui/controls/setupKeyboard.tsx'; import useScale from '@deities/ui/hooks/useScale.tsx'; import { useInView } from 'framer-motion'; import { useRef } from 'react'; prepareSprites(); -setupGamePad(); -setupKeyboard(); const startAction = { type: 'Start', diff --git a/docs/content/public/actions.dark.png b/docs/content/public/actions.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..32d20eab9997f5b05a614e1a7297e33c5ae88641 GIT binary patch literal 66649 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 ?ZI2O^z;A=pK4s-S^u~Bk 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

|z9d`{n_f)BbXE4JEJi)x7<+Y;N8#zpxi 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 literal 0 HcmV?d00001 diff --git a/docs/content/styles.css b/docs/content/styles.css index e69de29b..8e4f5678 100644 --- a/docs/content/styles.css +++ b/docs/content/styles.css @@ -0,0 +1,42 @@ +@font-face { + font-display: swap; + font-family: Athena; + src: url('/fonts/AthenaNova.woff2'); +} + +:root { + --vocs-space_56: var(--vocs-space_24); +} + +html, +body { + tab-size: 2; +} + +#app { + position: relative; +} + +.LogoLink { + align-items: center; + display: flex; + flex-direction: column; + width: 100%; +} + +div.vocs_HomePage_description { + text-wrap: balance; +} + +div.vocs_DocsLayout_gutterTop { + backdrop-filter: blur(2px); +} + +div.vocs_HomePage { + padding-top: 0; +} + +div[data-layout='minimal'] div#vocs-content, +div[data-layout='minimal'] article.vocs_Content { + max-width: initial; +} diff --git a/docs/vocs.config.tsx b/docs/vocs.config.tsx index a70893ff..1a782f96 100644 --- a/docs/vocs.config.tsx +++ b/docs/vocs.config.tsx @@ -73,15 +73,32 @@ export default defineConfig({ link: '/core-concepts/actions', text: 'Actions ', }, + { + link: '/core-concepts/ai', + text: 'AI Deep Dive', + }, ], text: 'Core Concepts', }, + { + items: [ + { + link: '/ui/game-components', + text: 'Game Components', + }, + ], + text: 'UI Components', + }, { items: [ { link: '/playground/map-editor', text: 'Map Editor', }, + { + link: '/playground/ai', + text: 'AI', + }, ], text: 'Playground', }, diff --git a/hera/editor/lib/ActionCard.tsx b/hera/editor/lib/ActionCard.tsx index c545dcd5..7eba27de 100644 --- a/hera/editor/lib/ActionCard.tsx +++ b/hera/editor/lib/ActionCard.tsx @@ -433,14 +433,16 @@ const headlineStyle = css` `; const textareaStyle = css` - background: none; - box-shadow: none; - line-height: 1.4em; - margin: 0; - padding: 0; - - &:focus { + html body & { + background: none; box-shadow: none; + line-height: 1.4em; + margin: 0; + padding: 0; + + &:focus { + box-shadow: none; + } } `; diff --git a/hera/ui/PlayerIcon.tsx b/hera/ui/PlayerIcon.tsx index b7475d3a..4dfce05d 100644 --- a/hera/ui/PlayerIcon.tsx +++ b/hera/ui/PlayerIcon.tsx @@ -35,9 +35,8 @@ export default function PlayerIcon({ onClick?: () => void; selected?: boolean; }) { - const Component = onClick ? 'a' : 'span'; return ( - {playerIconText(id)} - + ); } diff --git a/hera/ui/demo/UnitPreviews.tsx b/hera/ui/demo/UnitPreviews.tsx new file mode 100644 index 00000000..47c5aef2 --- /dev/null +++ b/hera/ui/demo/UnitPreviews.tsx @@ -0,0 +1,129 @@ +import { Plain } from '@deities/athena/info/Tile.tsx'; +import { mapUnitsWithContentRestriction } from '@deities/athena/info/Unit.tsx'; +import { Biome } from '@deities/athena/map/Biome.tsx'; +import { + AnimationConfig, + TileSize, +} from '@deities/athena/map/Configuration.tsx'; +import { PlayerIDs } from '@deities/athena/map/Player.tsx'; +import Unit from '@deities/athena/map/Unit.tsx'; +import vec from '@deities/athena/map/vec.tsx'; +import MapData from '@deities/athena/MapData.tsx'; +import randomEntry from '@deities/hephaestus/randomEntry.tsx'; +import { SquareButtonStyle } from '@deities/ui/Button.tsx'; +import useInput from '@deities/ui/controls/useInput.tsx'; +import Stack from '@deities/ui/Stack.tsx'; +import { css, cx } from '@emotion/css'; +import arrayShuffle from 'array-shuffle'; +import { MouseEvent, useCallback, useMemo, useState } from 'react'; +import { useSprites } from '../../hooks/useSprites.tsx'; +import toTransformOrigin from '../../lib/toTransformOrigin.tsx'; +import Tick from '../../Tick.tsx'; +import { MapInfoState } from '../../Types.tsx'; +import UnitTile from '../../Unit.tsx'; +import GameDialog from '../GameDialog.tsx'; + +const UnitPreview = ({ + onClick, + unit, +}: { + onClick?: (event: MouseEvent, unit: Unit) => void; + unit: Unit; +}) => ( +

+); + +const map = MapData.createMap({ + map: [1], + modifiers: [0], + teams: PlayerIDs.slice(1).map((id) => ({ + id, + name: '', + players: [{ funds: 0, id, name: `User-${id}`, teamId: id }], + })), +}); + +export default function UnitPreviews() { + const hasSprites = useSprites('all'); + + const [gameInfoState, setGameInfoState] = useState(null); + + useInput('cancel', () => setGameInfoState(null), 'top'); + + const showGameInfo = useCallback((event: MouseEvent, unit: Unit) => { + setGameInfoState({ + biome: map.config.biome, + origin: toTransformOrigin(event), + type: 'map-info', + unit, + vector: vec(1, 1), + }); + }, []); + + const unitPreviews = useMemo( + () => + arrayShuffle( + mapUnitsWithContentRestriction((unit) => unit, new Set()) + .filter( + (unit) => + unit.characterName !== 'Unknown' && + unit.characterDescription !== 'Unknown', + ) + .map((unit) => { + const player = randomEntry(PlayerIDs.slice(1)); + return ( + + showGameInfo(event, unit.create(player, { name: -1 })) + } + unit={unit.create(player)} + /> + ); + }), + ).slice(0, 5), + [showGameInfo], + ); + + return hasSprites ? ( + <> + + + {unitPreviews} + + + {gameInfoState && ( + setGameInfoState(null)} + state={ + { + currentViewer: gameInfoState.unit?.player || map.getPlayer(1).id, + factionNames: new Map(), + gameInfoState, + map, + } as const + } + /> + )} + + ) : null; +} + +const unitPreviewStyle = css` + cursor: pointer; +`; diff --git a/hera/ui/fps/FpsComponent.tsx b/hera/ui/fps/FpsComponent.tsx index 583344c1..ef002425 100644 --- a/hera/ui/fps/FpsComponent.tsx +++ b/hera/ui/fps/FpsComponent.tsx @@ -17,6 +17,7 @@ export default function Fps() { const style = css` bottom: 10px; + font-family: Athena, ui-sans-serif, system-ui, sans-serif; font-size: 12px; height: 12px; left: 0; diff --git a/tests/display.tsx b/tests/display.tsx index ad10602b..23a2b0bb 100644 --- a/tests/display.tsx +++ b/tests/display.tsx @@ -8,8 +8,8 @@ import { import MapData from '@deities/athena/MapData.tsx'; import NullBehavior from '@deities/hera/behavior/NullBehavior.tsx'; import GameMap from '@deities/hera/GameMap.tsx'; -import '@deities/ui/CSS.tsx'; import AudioPlayer from '@deities/ui/AudioPlayer.tsx'; +import initializeCSS from '@deities/ui/CSS.tsx'; import { applyVar } from '@deities/ui/cssVar.tsx'; import { css, cx, injectGlobal } from '@emotion/css'; import React, { useEffect, useMemo } from 'react'; @@ -23,6 +23,8 @@ declare global { var renderMap: (url: string) => void; } +initializeCSS(); + // Playwright does not like audio. AudioPlayer.pause(); diff --git a/ui/CSS.tsx b/ui/CSS.tsx index 42354851..fc9b8e84 100644 --- a/ui/CSS.tsx +++ b/ui/CSS.tsx @@ -5,125 +5,11 @@ import { applyVar, initializeCSSVariables } from './cssVar.tsx'; import getColor from './getColor.tsx'; import pixelBorder from './pixelBorder.tsx'; -initializeCSSVariables(); - -injectGlobal(` -* { - box-sizing: border-box; -} - -@media (prefers-color-scheme: dark) { - div.background { - filter: invert(1); - } -} - -html.dark div.background { - filter: invert(1); -} - -html { - -webkit-text-size-adjust: 100%; - height: 100vh; - height: -webkit-fill-available; - height: fill-available; -} - -body { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - background: ${applyVar('background-color')}; - color: ${applyVar('text-color')}; - font-family: Athena, ui-sans-serif, system-ui, sans-serif; - font-size: 20px; - font-weight: normal; - line-height: 1em; - margin: 0; - overscroll-behavior: none; - touch-action: pan-x pan-y; - user-select: none; -} - -::-webkit-scrollbar { - display: none; -} - -html[lang="ja_JP"] body, .locale-ja_JP { - font-family: Athena, MadouFutoMaru, ui-sans-serif, system-ui, sans-serif; - - & button, - & input, - & select, - & textarea { - font-family: Athena, MadouFutoMaru, ui-sans-serif, system-ui, sans-serif; - } -} - -html[lang="uk_UA"] body, html[lang="ru_RU"] body, .locale-uk_UA, .locale-ru_RU { - font-family: Athena, PressStart2P, ui-sans-serif, system-ui, sans-serif; - - & button, - & input, - & select, - & textarea { - font-family: Athena, PressStart2P, ui-sans-serif, system-ui, sans-serif; - } -} - -html[lang="ko_KR"] body, .locale-ko_KR { - font-family: AthenaLatin, ui-sans-serif, system-ui, sans-serif; - - & button, - & input, - & select, - & textarea { - font-family: AthenaLatin, ui-sans-serif, system-ui, sans-serif; - } -} - -html[lang="zh_CN"] body, .locale-zh_CN { - font-family: AthenaLatin, ui-sans-serif, system-ui, sans-serif; - - & button, - & input, - & select, - & textarea { - font-family: AthenaLatin, ui-sans-serif, system-ui, sans-serif; - } -} - -body .all-fonts { - font-family: Athena, PressStart2P, MadouFutoMaru, ui-sans-serif, system-ui, sans-serif; -} - +const scope = ` svg { vertical-align: middle; } -@media (orientation: portrait) { - body { - margin-top: env(safe-area-inset-top); - } -} - -div.background, div.background-absolute { - background-image: url('${Background}'); - bottom: 0; - image-rendering: pixelated; - left: -144px; - overflow: hidden; - pointer-events: none; - position: fixed; - right: -144px; - top: -144px; - transform: ${applyVar('perspective-transform')}; - zoom: ${applyVar('scale')}; -} - -div.background-absolute { - position: absolute; -} - table { border-collapse: collapse; border-spacing: 0; @@ -317,4 +203,135 @@ p { margin: 0; user-select: text; } -`); +`; + +const global = ` +* { + box-sizing: border-box; +} + +html.dark div.background { + filter: invert(1); +} + +html { + -webkit-text-size-adjust: 100%; + height: 100vh; + height: -webkit-fill-available; + height: fill-available; +} + +body { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + background: ${applyVar('background-color')}; + color: ${applyVar('text-color')}; + font-family: Athena, ui-sans-serif, system-ui, sans-serif; + font-size: 20px; + font-weight: normal; + line-height: 1em; + margin: 0; + overscroll-behavior: none; + touch-action: pan-x pan-y; + user-select: none; +} + +::-webkit-scrollbar { + display: none; +} + +html[lang="ja_JP"] body, .locale-ja_JP { + font-family: Athena, MadouFutoMaru, ui-sans-serif, system-ui, sans-serif; + + & button, + & input, + & select, + & textarea { + font-family: Athena, MadouFutoMaru, ui-sans-serif, system-ui, sans-serif; + } +} + +html[lang="uk_UA"] body, html[lang="ru_RU"] body, .locale-uk_UA, .locale-ru_RU { + font-family: Athena, PressStart2P, ui-sans-serif, system-ui, sans-serif; + + & button, + & input, + & select, + & textarea { + font-family: Athena, PressStart2P, ui-sans-serif, system-ui, sans-serif; + } +} + +html[lang="ko_KR"] body, .locale-ko_KR { + font-family: AthenaLatin, ui-sans-serif, system-ui, sans-serif; + + & button, + & input, + & select, + & textarea { + font-family: AthenaLatin, ui-sans-serif, system-ui, sans-serif; + } +} + +html[lang="zh_CN"] body, .locale-zh_CN { + font-family: AthenaLatin, ui-sans-serif, system-ui, sans-serif; + + & button, + & input, + & select, + & textarea { + font-family: AthenaLatin, ui-sans-serif, system-ui, sans-serif; + } +} + +body .all-fonts { + font-family: Athena, PressStart2P, MadouFutoMaru, ui-sans-serif, system-ui, sans-serif; +} + +@media (orientation: portrait) { + body { + margin-top: env(safe-area-inset-top); + } +} + +div.background, div.background-absolute { + background-image: url('${Background}'); + bottom: 0; + image-rendering: pixelated; + left: -144px; + overflow: hidden; + pointer-events: none; + position: fixed; + right: -144px; + top: -144px; + transform: ${applyVar('perspective-transform')}; + zoom: ${applyVar('scale')}; +} + +div.background-absolute { + position: absolute; +} + +@media (prefers-color-scheme: dark) { + div.background { + filter: invert(1); + } +} + +${scope} +`; + +let initialized = false; +export default function initializeCSS() { + if (initialized) { + return; + } + + initialized = true; + initializeCSSVariables(); + injectGlobal(global); +} + +export function getScopedCSSDefinitions() { + return scope; +} diff --git a/ui/Portal.tsx b/ui/Portal.tsx index cf180500..75ed98a4 100644 --- a/ui/Portal.tsx +++ b/ui/Portal.tsx @@ -1,9 +1,15 @@ import { ReactNode } from 'react'; import { createPortal } from 'react-dom'; +let defaultContainer = document.body; + +export function setDefaultPortalContainer(container: HTMLElement) { + defaultContainer = container; +} + export default function Portal({ children, - container = document.body, + container = defaultContainer, }: { children: ReactNode; container?: HTMLElement; diff --git a/ui/TagInput.tsx b/ui/TagInput.tsx index 0fa26a71..ddff1897 100644 --- a/ui/TagInput.tsx +++ b/ui/TagInput.tsx @@ -77,16 +77,18 @@ const inputStyle = css` `; const resetStyle = css` - background: transparent; - border: none; - box-shadow: none; - display: inline-block; - margin: -3px 0 0 4px; - padding: 2px; - width: 100%; - - &:focus { + html body & { + background: transparent; + border: none; box-shadow: none; + display: inline-block; + margin: -3px 0 0 4px; + padding: 2px; + width: 100%; + + &:focus { + box-shadow: none; + } } `;