@origingame/create-game 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/archetypes/README.md +2 -1
- package/archetypes/arena/.origin/setup +14 -0
- package/archetypes/arena/LICENSES.md +8 -0
- package/archetypes/arena/README.md +67 -0
- package/archetypes/arena/assets/audio/coin.ogt +9 -0
- package/archetypes/arena/assets/audio/dash.ogt +9 -0
- package/archetypes/arena/assets/audio/win.ogt +9 -0
- package/archetypes/arena/assets/fx/coin.ogt +20 -0
- package/archetypes/arena/assets/looks/arena.ogt +10 -0
- package/archetypes/arena/gitattributes +22 -0
- package/archetypes/arena/gitignore +8 -0
- package/archetypes/arena/host.d.ts +46 -0
- package/archetypes/arena/package.json +18 -0
- package/archetypes/arena/project.ogt +14 -0
- package/archetypes/arena/src/game.ts +314 -0
- package/archetypes/arena/src/main.ts +100 -0
- package/archetypes/arena/tests/duel.og.ts +32 -0
- package/archetypes/arena/tests/solo.og.ts +22 -0
- package/archetypes/arena/tsconfig.json +17 -0
- package/archetypes/idle/LICENSES.md +1 -1
- package/archetypes/idle/README.md +5 -5
- package/archetypes/idle/assets/looks/idle.ogt +2 -2
- package/archetypes/idle/assets/{skins → styles}/sparkorb/LICENSES.md +6 -6
- package/archetypes/idle/assets/{skins/sparkorb/skin.ogt → styles/sparkorb/style.ogt} +47 -47
- package/archetypes/idle/package.json +1 -1
- package/archetypes/idle/project.ogt +1 -1
- package/archetypes/idle/references/metal/card.png +0 -0
- package/archetypes/idle/references/metal/orbit.png +0 -0
- package/archetypes/idle/references/metal/title.png +0 -0
- package/archetypes/idle/src/components.ts +1 -1
- package/archetypes/idle/src/main.ts +5 -5
- package/archetypes/idle/src/ui.ts +13 -13
- package/archetypes/idle/tools/make-assets.py +5 -5
- package/archetypes/match3/package.json +1 -1
- package/archetypes/match3/project.ogt +1 -1
- package/archetypes/rhythm/LICENSES.md +1 -1
- package/archetypes/rhythm/README.md +5 -5
- package/archetypes/rhythm/assets/{skins → styles}/lanebeat/LICENSES.md +6 -6
- package/archetypes/rhythm/assets/{skins/lanebeat/skin.ogt → styles/lanebeat/style.ogt} +45 -45
- package/archetypes/rhythm/package.json +1 -1
- package/archetypes/rhythm/project.ogt +1 -1
- package/archetypes/rhythm/references/metal/results.png +0 -0
- package/archetypes/rhythm/references/metal/title.png +0 -0
- package/archetypes/rhythm/src/components.ts +1 -1
- package/archetypes/rhythm/src/main.ts +3 -3
- package/archetypes/rhythm/src/ui.ts +12 -12
- package/archetypes/roguelike/LICENSES.md +1 -1
- package/archetypes/roguelike/README.md +5 -5
- package/archetypes/roguelike/assets/{skins → styles}/lampdive/LICENSES.md +6 -6
- package/archetypes/roguelike/assets/{skins/lampdive/skin.ogt → styles/lampdive/style.ogt} +41 -41
- package/archetypes/roguelike/package.json +1 -1
- package/archetypes/roguelike/project.ogt +1 -1
- package/archetypes/roguelike/references/metal/over.png +0 -0
- package/archetypes/roguelike/references/metal/title.png +0 -0
- package/archetypes/roguelike/src/components.ts +1 -1
- package/archetypes/roguelike/src/main.ts +2 -2
- package/archetypes/roguelike/src/ui.ts +8 -8
- package/archetypes/runner/package.json +1 -1
- package/archetypes/runner/project.ogt +1 -1
- package/archetypes/third-person/LICENSES.md +1 -1
- package/archetypes/third-person/README.md +4 -4
- package/archetypes/third-person/assets/{skins → styles}/ember/LICENSES.md +4 -4
- package/archetypes/third-person/assets/{skins/ember/skin.ogt → styles/ember/style.ogt} +40 -41
- package/archetypes/third-person/package.json +1 -1
- package/archetypes/third-person/project.ogt +1 -1
- package/archetypes/third-person/references/metal/beacon.png +0 -0
- package/archetypes/third-person/references/metal/dawn.png +0 -0
- package/archetypes/third-person/references/metal/title.png +0 -0
- package/archetypes/third-person/references/webgl2/beacon.png +0 -0
- package/archetypes/third-person/src/components.ts +1 -1
- package/archetypes/third-person/src/main.ts +3 -3
- package/archetypes/third-person/src/sound.ts +1 -1
- package/archetypes/third-person/src/ui.ts +11 -11
- package/archetypes/topdown/package.json +1 -1
- package/archetypes/topdown/project.ogt +1 -1
- package/archetypes/tower-defense/LICENSES.md +1 -1
- package/archetypes/tower-defense/README.md +5 -5
- package/archetypes/tower-defense/assets/{skins → styles}/pathguard/LICENSES.md +4 -4
- package/archetypes/tower-defense/assets/styles/pathguard/atlas.png +0 -0
- package/archetypes/tower-defense/assets/styles/pathguard/style.ogt +111 -0
- package/archetypes/tower-defense/package.json +1 -1
- package/archetypes/tower-defense/project.ogt +1 -1
- package/archetypes/tower-defense/references/metal/end.png +0 -0
- package/archetypes/tower-defense/references/metal/title.png +0 -0
- package/archetypes/tower-defense/references/metal/wave.png +0 -0
- package/archetypes/tower-defense/src/components.ts +1 -1
- package/archetypes/tower-defense/src/main.ts +2 -2
- package/archetypes/tower-defense/src/ui.ts +20 -18
- package/bin/create.ts +11 -8
- package/looks/catalogue.json +40 -40
- package/package.json +2 -2
- package/template/README.md +2 -1
- package/template/assets/audio/sting.ogt +10 -0
- package/template/assets/timelines/intro.ogt +101 -0
- package/template/assets/timelines/narration.srt +11 -0
- package/template/host.d.ts +46 -0
- package/template/package.json +1 -1
- package/template/project.ogt +1 -1
- package/template/references/metal/intro-4.png +0 -0
- package/template/references/metal/intro-8.png +0 -0
- package/template/src/main.ts +1 -1
- package/template/tests/frames.ts +134 -0
- package/template/tests/intro.og.ts +65 -0
- package/template/tests/smoke.og.ts +30 -36
- package/template/tsconfig.json +1 -1
- package/template-2d/LICENSES.md +1 -0
- package/template-2d/README.md +6 -2
- package/template-2d/assets/rigs/keeper.ogt +292 -0
- package/template-2d/assets/rigs/keeper.png +0 -0
- package/template-2d/assets/rigs/keeper.png.ogt +7 -0
- package/template-2d/package.json +1 -1
- package/template-2d/project.ogt +1 -1
- package/template-2d/src/main.ts +240 -4
- package/template-2d/tests/keeper.og.ts +178 -0
- package/archetypes/tower-defense/assets/skins/pathguard/atlas.png +0 -0
- package/archetypes/tower-defense/assets/skins/pathguard/skin.ogt +0 -111
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/ChakraPetch-BoldItalic.ttf +0 -0
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/ChakraPetch-BoldItalic.ttf.ogt +0 -0
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/OFL.txt +0 -0
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/Orbitron-Medium.ttf +0 -0
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/Orbitron-Medium.ttf.ogt +0 -0
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/Rajdhani-Bold.ttf +0 -0
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/Rajdhani-Bold.ttf.ogt +0 -0
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/atlas.png +0 -0
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/atlas.png.ogt +0 -0
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/icons.png +0 -0
- /package/archetypes/idle/assets/{skins → styles}/sparkorb/icons.png.ogt +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/ChakraPetch-Medium.ttf +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/ChakraPetch-Medium.ttf.ogt +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/JetBrainsMono-Regular.ttf +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/JetBrainsMono-Regular.ttf.ogt +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/OFL.txt +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/Orbitron-Bold.ttf +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/Orbitron-Bold.ttf.ogt +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/atlas.png +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/atlas.png.ogt +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/icons.png +0 -0
- /package/archetypes/rhythm/assets/{skins → styles}/lanebeat/icons.png.ogt +0 -0
- /package/archetypes/roguelike/assets/{skins → styles}/lampdive/DotGothic16-Regular.ttf +0 -0
- /package/archetypes/roguelike/assets/{skins → styles}/lampdive/DotGothic16-Regular.ttf.ogt +0 -0
- /package/archetypes/roguelike/assets/{skins → styles}/lampdive/OFL.txt +0 -0
- /package/archetypes/roguelike/assets/{skins → styles}/lampdive/atlas.png +0 -0
- /package/archetypes/roguelike/assets/{skins → styles}/lampdive/atlas.png.ogt +0 -0
- /package/archetypes/roguelike/assets/{skins → styles}/lampdive/icons.png +0 -0
- /package/archetypes/roguelike/assets/{skins → styles}/lampdive/icons.png.ogt +0 -0
- /package/archetypes/third-person/assets/{skins → styles}/ember/Cinzel-Bold.ttf +0 -0
- /package/archetypes/third-person/assets/{skins → styles}/ember/Cinzel-Bold.ttf.ogt +0 -0
- /package/archetypes/third-person/assets/{skins → styles}/ember/Newsreader-Medium.ttf +0 -0
- /package/archetypes/third-person/assets/{skins → styles}/ember/Newsreader-Medium.ttf.ogt +0 -0
- /package/archetypes/third-person/assets/{skins → styles}/ember/OFL.txt +0 -0
- /package/archetypes/third-person/assets/{skins → styles}/ember/atlas.png +0 -0
- /package/archetypes/third-person/assets/{skins → styles}/ember/atlas.png.ogt +0 -0
- /package/archetypes/third-person/assets/{skins → styles}/ember/icons.png +0 -0
- /package/archetypes/third-person/assets/{skins → styles}/ember/icons.png.ogt +0 -0
- /package/archetypes/tower-defense/assets/{skins → styles}/pathguard/Fredoka-SemiBold.ttf +0 -0
- /package/archetypes/tower-defense/assets/{skins → styles}/pathguard/Fredoka-SemiBold.ttf.ogt +0 -0
- /package/archetypes/tower-defense/assets/{skins → styles}/pathguard/LilitaOne-Regular.ttf +0 -0
- /package/archetypes/tower-defense/assets/{skins → styles}/pathguard/LilitaOne-Regular.ttf.ogt +0 -0
- /package/archetypes/tower-defense/assets/{skins → styles}/pathguard/OFL.txt +0 -0
- /package/archetypes/tower-defense/assets/{skins → styles}/pathguard/atlas.png.ogt +0 -0
- /package/archetypes/tower-defense/assets/{skins → styles}/pathguard/icons.png +0 -0
- /package/archetypes/tower-defense/assets/{skins → styles}/pathguard/icons.png.ogt +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Lamp Dive's screens on og.ui and the
|
|
1
|
+
// Lamp Dive's screens on og.ui and the style in assets/styles/lampdive (the
|
|
2
2
|
// engine's pixel pack in tomb colours): the title, the HUD (health, strike,
|
|
3
3
|
// armour and gold in the top-left corner, the floor and pause in the
|
|
4
4
|
// top-right, the draught and, on a touch screen, Wait and a d-pad along the
|
|
@@ -167,7 +167,7 @@ function platform(world: World, g: GameV, p: PrefsV): void {
|
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
function capsule(id: string, build: () => void): void {
|
|
170
|
-
og.ui.row(id, { gap: S.xs, cross: "center", padding: { left: S.sm, top: S.xs, right: S.md, bottom: S.xs }, frame: "
|
|
170
|
+
og.ui.row(id, { gap: S.xs, cross: "center", padding: { left: S.sm, top: S.xs, right: S.md, bottom: S.xs }, frame: "hud", background: { token: "panel" } }, build);
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
function hud(world: World, g: GameV): void {
|
|
@@ -176,7 +176,7 @@ function hud(world: World, g: GameV): void {
|
|
|
176
176
|
og.ui.setNavigation(false);
|
|
177
177
|
og.ui.anchor("Status", { anchor: "topLeft", direction: "column", gap: S.sm }, () => {
|
|
178
178
|
capsule("Health", () => {
|
|
179
|
-
og.ui.icon("Heart", "heart", { size: 22, tint: { token: g.hp * 3 <= g.hpMax ? "danger" : "
|
|
179
|
+
og.ui.icon("Heart", "heart", { size: 22, tint: { token: g.hp * 3 <= g.hpMax ? "danger" : "ink" } });
|
|
180
180
|
og.ui.meter("Bar", g.hp, g.hpMax, { kind: "health", label: `${g.hp}/${g.hpMax}`, width: px(touch ? 110 : 150) });
|
|
181
181
|
});
|
|
182
182
|
capsule("Stats", () => {
|
|
@@ -184,7 +184,7 @@ function hud(world: World, g: GameV): void {
|
|
|
184
184
|
og.ui.counter("Attack", g.attack, { font: "mono", width: px(22) });
|
|
185
185
|
og.ui.icon("Shield", "shield", { size: 20 });
|
|
186
186
|
og.ui.counter("Armour", g.armour, { font: "mono", width: px(22) });
|
|
187
|
-
og.ui.icon("Coin", "coin", { size: 20, tint: { token: "
|
|
187
|
+
og.ui.icon("Coin", "coin", { size: 20, tint: { token: "gold" } });
|
|
188
188
|
og.ui.counter("Gold", g.gold, { font: "mono", width: px(40) });
|
|
189
189
|
});
|
|
190
190
|
});
|
|
@@ -229,7 +229,7 @@ function settings(world: World, g: GameV, p: PrefsV): void {
|
|
|
229
229
|
p.master = slider("Master", "settings.master", p.master);
|
|
230
230
|
p.music = slider("Music", "settings.music", p.music);
|
|
231
231
|
p.effects = slider("Effects", "settings.effects", p.effects);
|
|
232
|
-
og.ui.label("LanguageLabel", say(world, "settings.language"), { color: { token: "
|
|
232
|
+
og.ui.label("LanguageLabel", say(world, "settings.language"), { color: { token: "inkMuted" } });
|
|
233
233
|
const r = og.ui.radio("Language", LANGUAGES.map((l) => say(world, l.key)), p.language, { horizontal: true });
|
|
234
234
|
if (r.selected !== p.language) setLanguage(world, p, r.selected);
|
|
235
235
|
p.reducedMotion = og.ui.toggle("Motion", p.reducedMotion, say(world, "settings.motion")).on;
|
|
@@ -250,7 +250,7 @@ function summary(world: World, g: GameV): "again" | "menu" | null {
|
|
|
250
250
|
let chose: "again" | "menu" | null = null;
|
|
251
251
|
og.ui.modal("Summary", g.phase === Phase.Over, { title: g.won ? say(world, "over.won") : say(world, "over.lost", { n: g.floor }), locked: true, width: px(Math.min(400, og.ui.frameViewport().width - 32)) }, () => {
|
|
252
252
|
og.ui.row("Mark", { width: grow, align: "center" }, () => {
|
|
253
|
-
og.ui.transition("Icon", true, { kind: "pop" }, () => og.ui.icon("Glyph", g.won ? "crown" : "skull", { size: 48, tint: { token: g.won ? "
|
|
253
|
+
og.ui.transition("Icon", true, { kind: "pop" }, () => og.ui.icon("Glyph", g.won ? "crown" : "skull", { size: 48, tint: { token: g.won ? "primary" : "inkMuted" } }));
|
|
254
254
|
if (g.won && g.overTicks === OVER_DELAY + 20) og.ui.burst({ count: 12 });
|
|
255
255
|
});
|
|
256
256
|
og.ui.column("Stats", { width: grow, gap: 0 }, () => {
|
|
@@ -261,7 +261,7 @@ function summary(world: World, g: GameV): "again" | "menu" | null {
|
|
|
261
261
|
og.ui.keyValue("Finds", say(world, "over.finds"), `${g.finds}`, true);
|
|
262
262
|
if (!g.won) og.ui.keyValue("By", say(world, "over.by"), say(world, g.killedBy >= 0 ? `foe.${FOES[g.killedBy]}` : "foe.none"), false);
|
|
263
263
|
});
|
|
264
|
-
og.ui.label("Record", say(world, "over.record", { dives: g.dives, relics: g.relics }), { color: { token: "
|
|
264
|
+
og.ui.label("Record", say(world, "over.record", { dives: g.dives, relics: g.relics }), { color: { token: "inkMuted" }, align: "center", width: grow });
|
|
265
265
|
og.ui.row("Actions", { width: grow, gap: S.sm }, () => {
|
|
266
266
|
if (og.ui.button("Again", say(world, "over.again"), { variant: "primary", width: grow }).clicked) chose = "again";
|
|
267
267
|
if (og.ui.button("Menu", say(world, "over.menu"), { width: grow }).clicked) chose = "menu";
|
|
@@ -317,7 +317,7 @@ export const Ui = defineSystem("Ui", { reads: [Tuning], writes: [Game, Prefs, og
|
|
|
317
317
|
],
|
|
318
318
|
footer: say(world, "title.footer"),
|
|
319
319
|
// The title the game opens on is built settled: the web draws it behind the play gate, where
|
|
320
|
-
// the
|
|
320
|
+
// the style's entrance would stand part-way until the tap (og-platform-sdk §3). Later titles enter.
|
|
321
321
|
instant: !g.leftTitle,
|
|
322
322
|
});
|
|
323
323
|
if (!g.settingsOpen && r.selected === "play") startDive(world, g);
|
|
@@ -19,5 +19,5 @@ Origin Engine authors or one of the engine's CC0 assets.
|
|
|
19
19
|
| `assets/audio/*.ogt` | CC0 1.0 | `og sfx` presets (click, select, back, error, levelup and a footstep) that `og cook` synthesises, written by the same script |
|
|
20
20
|
| `assets/strings/*.ogt` | CC0 1.0 | self-made: the English and Chinese string tables |
|
|
21
21
|
| `assets/fonts/NotoSansSC-subset.ttf` | SIL Open Font License 1.1 (`assets/fonts/OFL.txt`) | Noto Sans SC Regular, subset to Latin-1, CJK punctuation and the characters of `assets/strings/zh-CN.ogt` by the same script from the project template's `assets/fonts/NotoSansSC-Regular-subset.ttf` |
|
|
22
|
-
| `assets/
|
|
22
|
+
| `assets/styles/ember/*` | CC0 1.0 art, SIL OFL 1.1 fonts | the engine's fantasy style pack (`templates/ui-kit`), `assets/styles/ember/LICENSES.md` |
|
|
23
23
|
| `references/*/*.png` | CC0 1.0 | frames of this game recorded by `tests/frames.og.ts` |
|
|
@@ -60,7 +60,7 @@ og build . --publish # dist/: the play page as it ships (behind "tap to
|
|
|
60
60
|
vignette, the teal-orange LUT and film grain, the sky, height fog and
|
|
61
61
|
`og.DayNight` running from late afternoon to night as the run's clock.
|
|
62
62
|
- **Screens on og.ui with tokens and MSDF text** (og-ui §2–§6, og-taste):
|
|
63
|
-
the engine's fantasy pack as `assets/
|
|
63
|
+
the engine's fantasy pack as `assets/styles/ember` (Cinzel and Newsreader,
|
|
64
64
|
Noto Sans SC as the fallback, every font an MSDF atlas at cook time); the
|
|
65
65
|
title over an orbit of the vale, the HUD (hearts and beacons top-left,
|
|
66
66
|
the dusk clock and Pause top-right, the kindling prompt and its progress
|
|
@@ -180,7 +180,7 @@ stages.
|
|
|
180
180
|
2. **The pressure**: `duskSeconds`, the sentinels' speeds and sight, their
|
|
181
181
|
minds in `assets/ai/`, `HEARTS` in `src/components.ts`.
|
|
182
182
|
3. **The look**: the post stack, fog and sky in `buildVale`, the water's
|
|
183
|
-
colours, the
|
|
183
|
+
colours, the style's palette in `assets/styles/ember/style.ogt`.
|
|
184
184
|
4. **The characters**: another CC0 humanoid in `assets/models/` with the
|
|
185
185
|
clip library retargeted onto it (`src/anim.ts`), the graphs' thresholds.
|
|
186
186
|
5. **Words**: `assets/strings/*.ogt`; a new Chinese string needs the script
|
|
@@ -230,8 +230,8 @@ Nothing here is downloaded. `tools/make-assets.py` regenerates the vale's
|
|
|
230
230
|
heightmap and control map, the sounds and music, the `og sfx` presets, the
|
|
231
231
|
sentinels' minds and the font subset byte for byte; the characters, the
|
|
232
232
|
clip library, the textures and the beacon's effects are the engine's own
|
|
233
|
-
CC0 assets. `LICENSES.md` lists every file; the
|
|
234
|
-
`assets/
|
|
233
|
+
CC0 assets. `LICENSES.md` lists every file; the style's are in
|
|
234
|
+
`assets/styles/ember/LICENSES.md`.
|
|
235
235
|
|
|
236
236
|
## Known limits (engine gaps, not design)
|
|
237
237
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# The ember
|
|
1
|
+
# The ember style (a copy of the fantasy style pack): licences
|
|
2
2
|
|
|
3
3
|
| File | Licence | Origin |
|
|
4
4
|
|---|---|---|
|
|
5
|
-
| `atlas.png` | CC0 1.0 | self-made by the Origin Engine authors: drawn by `templates/ui-kit/tools/make-
|
|
5
|
+
| `atlas.png` | CC0 1.0 | self-made by the Origin Engine authors: drawn by `templates/ui-kit/tools/make-styles.py` (deterministic) |
|
|
6
6
|
| `icons.png` | CC0 1.0 | self-made: the kit's 32 icons (`tools/make-assets.py`) restyled by the same script |
|
|
7
|
-
| `
|
|
7
|
+
| `style.ogt`, `*.ogt` | CC0 1.0 | written by the same script |
|
|
8
8
|
| `Cinzel-Bold.ttf` | SIL Open Font License 1.1 (`OFL.txt`) | Cinzel Bold (github.com/NDISCOVER/Cinzel); unmodified. Copyright 2020 The Cinzel Project Authors (https://github.com/NDISCOVER/Cinzel) |
|
|
9
9
|
| `Newsreader-Medium.ttf` | SIL Open Font License 1.1 (`OFL.txt`) | Newsreader (github.com/productiontype/Newsreader); a static instance (wght 500, opsz 16) of the variable font, subset to Latin-1 with fontTools. Copyright 2020 The Newsreader Project Authors (http://github.com/productiontype/Newsreader) |
|
|
10
10
|
|
|
11
11
|
Characters these fonts lack (Chinese, Japanese, Korean) are drawn with the
|
|
12
|
-
|
|
12
|
+
style's `fallback` font, `fonts/NotoSansSC-subset.ttf` (the platform's
|
|
13
13
|
subset, OFL 1.1, `assets/fonts/OFL.txt`).
|
|
@@ -1,52 +1,51 @@
|
|
|
1
|
-
type
|
|
1
|
+
type style
|
|
2
2
|
version 1
|
|
3
3
|
---
|
|
4
|
-
# Ember Vale's
|
|
4
|
+
# Ember Vale's style: a copy of the fantasy style pack (templates/ui-kit/tools/make-styles.py; CC0 art, OFL fonts; LICENSES.md).
|
|
5
5
|
name "ember"
|
|
6
|
-
|
|
7
|
-
atlas "
|
|
6
|
+
scheme dark
|
|
7
|
+
atlas "styles/ember/atlas.png" 384 256
|
|
8
8
|
scale 1
|
|
9
9
|
palette {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
accentFg "#fff4dc"
|
|
30
|
-
accentInk "#6e470d"
|
|
31
|
-
accentSoft "#7a520f40"
|
|
10
|
+
backdrop "#1a120b"
|
|
11
|
+
well "#241910"
|
|
12
|
+
panel "#efdfb8"
|
|
13
|
+
panelHover "#f4e8c8"
|
|
14
|
+
panelRaised "#efdfb8"
|
|
15
|
+
line "#9b7a4a"
|
|
16
|
+
lineStrong "#5c4127"
|
|
17
|
+
ink "#2a1a0c"
|
|
18
|
+
inkMuted "#3d2a18"
|
|
19
|
+
inkFaint "#654b31"
|
|
20
|
+
inkInverse "#f4e8c8"
|
|
21
|
+
control "#e2cc98"
|
|
22
|
+
controlStrong "#d6bc82"
|
|
23
|
+
primary "#7a520f"
|
|
24
|
+
primaryHover "#74500e"
|
|
25
|
+
primaryActive "#6a470c"
|
|
26
|
+
onPrimary "#fff4dc"
|
|
27
|
+
primarySoft "#7a520f40"
|
|
28
|
+
highlight "#6e470d"
|
|
32
29
|
focus "#8f2d1f"
|
|
33
|
-
|
|
30
|
+
knob "#f4e8c8"
|
|
31
|
+
hud "#efdfb8"
|
|
34
32
|
scrim "#0d0805cc"
|
|
33
|
+
shadow "#000000aa"
|
|
34
|
+
sheen "#ffffff52"
|
|
35
35
|
success "#2d5a1e"
|
|
36
36
|
warn "#704713"
|
|
37
37
|
danger "#6e1b10"
|
|
38
38
|
info "#22517f"
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
health "#2d5a1e"
|
|
40
|
+
mana "#0a84ff"
|
|
41
|
+
xp "#bf5af2"
|
|
42
|
+
gold "#7a520f"
|
|
41
43
|
}
|
|
42
44
|
radius {
|
|
45
|
+
small 4
|
|
43
46
|
control 4
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
card 4
|
|
47
|
-
panel 6
|
|
48
|
-
sheet 6
|
|
49
|
-
button 6
|
|
47
|
+
bar 4
|
|
48
|
+
panel 4
|
|
50
49
|
}
|
|
51
50
|
ramp {
|
|
52
51
|
body 15 22
|
|
@@ -67,12 +66,12 @@ durations {
|
|
|
67
66
|
slow 480
|
|
68
67
|
}
|
|
69
68
|
fonts {
|
|
70
|
-
body "
|
|
71
|
-
display "
|
|
72
|
-
numeric "
|
|
69
|
+
body "styles/ember/Newsreader-Medium.ttf"
|
|
70
|
+
display "styles/ember/Cinzel-Bold.ttf"
|
|
71
|
+
numeric "styles/ember/Cinzel-Bold.ttf"
|
|
73
72
|
fallback "fonts/NotoSansSC-subset.ttf"
|
|
74
73
|
}
|
|
75
|
-
icons "
|
|
74
|
+
icons "styles/ember/icons.png" 8 4 {
|
|
76
75
|
names "heart" "star" "coin" "lock" "pause" "gear" "sword" "shield" "potion" "gem" "key" "map" "bolt" "clock" "trophy" "home" "plus" "close" "check" "play" "back" "bag" "bomb" "crown" "flag" "apple" "leaf" "fire" "drop" "skull" "music" "person"
|
|
77
76
|
}
|
|
78
77
|
slice panel 4 4 96 96 16 authored
|
|
@@ -84,7 +83,7 @@ slice buttonDisabled 328 4 48 48 10 tint
|
|
|
84
83
|
slice field 4 104 48 48 8 tint
|
|
85
84
|
slice slot 56 104 48 48 10 tint
|
|
86
85
|
slice tooltip 108 104 32 32 8 tint
|
|
87
|
-
slice
|
|
86
|
+
slice hud 144 104 32 32 12 tint
|
|
88
87
|
slice track 180 104 32 16 6 tint
|
|
89
88
|
slice fill 216 104 32 16 6 tint
|
|
90
89
|
soft 252 104 64 64 24
|
|
@@ -96,7 +95,7 @@ tile 204 172 64 64 64 64 0.5 6 panel card
|
|
|
96
95
|
shadow panel 0 10 18 2 "#000000b3"
|
|
97
96
|
shadow card 0 4 8 0 "#00000066"
|
|
98
97
|
shadow button 0 3 4 0 "#00000073"
|
|
99
|
-
shadow
|
|
98
|
+
shadow hud 0 3 6 0 "#00000080"
|
|
100
99
|
press 0.98 0.96 1
|
|
101
100
|
hover 0 1.0
|
|
102
101
|
motion {
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -31,7 +31,7 @@ export const HEARTS = 3;
|
|
|
31
31
|
/** The run: the hero's progress, the clock and the effects' bookkeeping. */
|
|
32
32
|
export const Game = defineResource("Game", {
|
|
33
33
|
phase: u32(Phase.Title, { doc: "Phase.* of src/components.ts." }),
|
|
34
|
-
leftTitle: bool(false, { doc: "The player has left the title the game opened on: from then on the title enters with the
|
|
34
|
+
leftTitle: bool(false, { doc: "The player has left the title the game opened on: from then on the title enters with the style's entrance (the opening one is built settled, og.ui.mainMenu's instant: the web draws it behind the play gate)." }),
|
|
35
35
|
ending: u32(Ending.None, { doc: "Ending.* once a run is over." }),
|
|
36
36
|
paused: bool(false),
|
|
37
37
|
settingsOpen: bool(false),
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// grab costs a heart. Three hearts gone, or night, ends the run; every
|
|
9
9
|
// beacon lit wins it. Then the summary, and again.
|
|
10
10
|
//
|
|
11
|
-
// `start` loads the strings, the
|
|
11
|
+
// `start` loads the strings, the style and the sounds, builds the vale
|
|
12
12
|
// (src/world.ts) and spawns the hero (src/hero.ts), the sentinels
|
|
13
13
|
// (src/sentinels.ts) and the voices (src/sound.ts). The beacons are in
|
|
14
14
|
// src/beacons.ts, the screens and the run's clock in src/ui.ts and the
|
|
@@ -26,9 +26,9 @@ import { BEACON_AT, buildVale, ground, HOURS, must, setHour } from "./world.ts";
|
|
|
26
26
|
|
|
27
27
|
function start(world: World): void {
|
|
28
28
|
for (const l of LANGUAGES) must(og.i18n.load(world, `strings/${l.code}.ogt`));
|
|
29
|
-
const
|
|
29
|
+
const style = must(og.load.style(world, "styles/ember/style.ogt"));
|
|
30
30
|
const sound = (path: string) => must(og.load.sound(world, path));
|
|
31
|
-
must(og.ui.configure(world, {
|
|
31
|
+
must(og.ui.configure(world, { style, sounds: { press: sound("audio/ui-press.ogt"), open: sound("audio/ui-open.ogt"), close: sound("audio/ui-close.ogt"), error: sound("audio/ui-error.ogt"), success: sound("audio/ui-success.ogt") } }));
|
|
32
32
|
buildVale(world);
|
|
33
33
|
spawnHero(world);
|
|
34
34
|
spawnSentinels(world);
|
|
@@ -31,7 +31,7 @@ export function spawnVoices(world: World): void {
|
|
|
31
31
|
must(world.insert(fx, og.AudioBusFx, { bus: "music", duck: true, duckBus: "sfx", duckDepth: 5, duckRelease: 0.6 }));
|
|
32
32
|
const echo = must(world.spawn({ name: "sfx-bus" }));
|
|
33
33
|
must(world.insert(echo, og.AudioBusFx, { bus: "sfx", reverb: 0.18 }));
|
|
34
|
-
// The touch HUD's Jump and Kindle: the
|
|
34
|
+
// The touch HUD's Jump and Kindle: the style's press sound on the ui bus,
|
|
35
35
|
// like every og.ui button, beside the jump's or the fire's own effect.
|
|
36
36
|
const tap = must(world.spawn({ name: `sfx-${Sound.Tap}` }));
|
|
37
37
|
must(world.insert(tap, og.AudioSource, { sound: sound("audio/ui-press.ogt"), playing: false, bus: "ui", volume: 0.5, priority: 150 }));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Ember Vale's screens on og.ui and the
|
|
1
|
+
// Ember Vale's screens on og.ui and the style in assets/styles/ember (the
|
|
2
2
|
// engine's fantasy pack): the title over an orbit of the vale, the HUD
|
|
3
3
|
// (hearts and beacons top-left, the dusk clock and pause top-right, the
|
|
4
4
|
// kindling prompt and its progress at the bottom; on a touch screen a
|
|
@@ -216,7 +216,7 @@ function clock(world: World, g: GameV, dt: number): void {
|
|
|
216
216
|
}
|
|
217
217
|
|
|
218
218
|
function capsule(id: string, build: () => void): void {
|
|
219
|
-
og.ui.row(id, { gap: S.xs, cross: "center", padding: { left: S.sm, top: S.xs, right: S.md, bottom: S.xs }, frame: "
|
|
219
|
+
og.ui.row(id, { gap: S.xs, cross: "center", padding: { left: S.sm, top: S.xs, right: S.md, bottom: S.xs }, frame: "hud", background: { token: "panel" } }, build);
|
|
220
220
|
}
|
|
221
221
|
|
|
222
222
|
function clockText(g: GameV): string {
|
|
@@ -232,10 +232,10 @@ function hud(world: World, g: GameV): void {
|
|
|
232
232
|
og.ui.setNavigation(false);
|
|
233
233
|
og.ui.anchor("Status", { anchor: "topLeft", direction: "column", gap: S.sm }, () => {
|
|
234
234
|
capsule("Hearts", () => {
|
|
235
|
-
for (let i = 0; i < HEARTS; i++) og.ui.icon(`Heart${i}`, "heart", { size: 22, tint: { token: i < g.hearts ? "danger" : "
|
|
235
|
+
for (let i = 0; i < HEARTS; i++) og.ui.icon(`Heart${i}`, "heart", { size: 22, tint: { token: i < g.hearts ? "danger" : "controlStrong" } });
|
|
236
236
|
});
|
|
237
237
|
capsule("Beacons", () => {
|
|
238
|
-
og.ui.icon("Fire", "fire", { size: 22, tint: { token: "
|
|
238
|
+
og.ui.icon("Fire", "fire", { size: 22, tint: { token: "primary" } });
|
|
239
239
|
og.ui.label("Count", say(world, "hud.beacons", { n: g.lit, total: BEACONS }), { step: "lg", font: "mono", nowrap: true });
|
|
240
240
|
});
|
|
241
241
|
});
|
|
@@ -243,9 +243,9 @@ function hud(world: World, g: GameV): void {
|
|
|
243
243
|
og.ui.anchor("Dusk", { anchor: "topRight", gap: S.sm, cross: "center" }, () => {
|
|
244
244
|
capsule("Clock", () => {
|
|
245
245
|
const left = 1 - (g.hour - HOURS.start) / (HOURS.night - HOURS.start);
|
|
246
|
-
og.ui.icon("Glyph", "clock", { size: 20, tint: { token: left < 0.25 ? "danger" : "
|
|
246
|
+
og.ui.icon("Glyph", "clock", { size: 20, tint: { token: left < 0.25 ? "danger" : "ink" } });
|
|
247
247
|
og.ui.label("Hour", clockText(g), { font: "mono", nowrap: true, width: px(48) });
|
|
248
|
-
og.ui.meter("Left", Math.max(0, left), 1, { kind: "
|
|
248
|
+
og.ui.meter("Left", Math.max(0, left), 1, { kind: "primary", width: px(touch ? 70 : 110) });
|
|
249
249
|
});
|
|
250
250
|
if (og.ui.actionButton("Pause", say(world, "hud.pause"), { icon: "pause", size: 48 }).clicked) paused = true;
|
|
251
251
|
});
|
|
@@ -254,7 +254,7 @@ function hud(world: World, g: GameV): void {
|
|
|
254
254
|
if (g.near >= 0 && g.ending === Ending.None) {
|
|
255
255
|
og.ui.anchor("Prompt", { anchor: "bottom", offsetY: touch ? -150 : -24, direction: "column", cross: "center", gap: S.xs }, () => {
|
|
256
256
|
capsule("Hint", () => {
|
|
257
|
-
og.ui.icon("Fire", "fire", { size: 18, tint: { token: "
|
|
257
|
+
og.ui.icon("Fire", "fire", { size: 18, tint: { token: "primary" } });
|
|
258
258
|
const pad = must(world.resource(og.Gamepad)).connected();
|
|
259
259
|
og.ui.label("Text", say(world, touch ? "hud.hint.touch" : pad ? "hud.hint.pad" : "hud.hint.keys"), { nowrap: true });
|
|
260
260
|
});
|
|
@@ -346,7 +346,7 @@ function settings(world: World, g: GameV, p: PrefsV): void {
|
|
|
346
346
|
p.master = slider("Master", "settings.master", p.master);
|
|
347
347
|
p.music = slider("Music", "settings.music", p.music);
|
|
348
348
|
p.effects = slider("Effects", "settings.effects", p.effects);
|
|
349
|
-
og.ui.label("LanguageLabel", say(world, "settings.language"), { color: { token: "
|
|
349
|
+
og.ui.label("LanguageLabel", say(world, "settings.language"), { color: { token: "inkMuted" } });
|
|
350
350
|
const r = og.ui.radio("Language", LANGUAGES.map((l) => say(world, l.key)), p.language, { horizontal: true });
|
|
351
351
|
if (r.selected !== p.language) setLanguage(world, p, r.selected);
|
|
352
352
|
p.reducedMotion = og.ui.toggle("Motion", p.reducedMotion, say(world, "settings.motion")).on;
|
|
@@ -375,7 +375,7 @@ function summary(world: World, g: GameV): "again" | "menu" | null {
|
|
|
375
375
|
const title = won ? "over.won" : g.ending === Ending.Caught ? "over.caught" : "over.night";
|
|
376
376
|
og.ui.modal("Summary", g.phase === Phase.Over, { title: say(world, title), locked: true, width: px(Math.min(400, og.ui.frameViewport().width - 32)) }, () => {
|
|
377
377
|
og.ui.row("Mark", { width: grow, align: "center" }, () => {
|
|
378
|
-
og.ui.transition("Icon", true, { kind: "pop" }, () => og.ui.icon("Glyph", won ? "fire" : g.ending === Ending.Caught ? "skull" : "clock", { size: 48, tint: { token: won ? "
|
|
378
|
+
og.ui.transition("Icon", true, { kind: "pop" }, () => og.ui.icon("Glyph", won ? "fire" : g.ending === Ending.Caught ? "skull" : "clock", { size: 48, tint: { token: won ? "primary" : "inkMuted" } }));
|
|
379
379
|
// From a third of a second into the summary, every frame: a burst plays only while it is called.
|
|
380
380
|
if (won && g.overTicks >= OVER_DELAY + 20) og.ui.burst({ count: 14 });
|
|
381
381
|
});
|
|
@@ -385,7 +385,7 @@ function summary(world: World, g: GameV): "again" | "menu" | null {
|
|
|
385
385
|
og.ui.keyValue("Hurts", say(world, "over.hurts"), `${g.hurts}`, true);
|
|
386
386
|
og.ui.keyValue("Best", say(world, "over.best"), g.best > 0 ? seconds(g.best) + (g.newBest ? " ★" : "") : say(world, "over.none"), false);
|
|
387
387
|
});
|
|
388
|
-
og.ui.label("Record", say(world, "over.record", { runs: g.runs, wins: g.wins }), { color: { token: "
|
|
388
|
+
og.ui.label("Record", say(world, "over.record", { runs: g.runs, wins: g.wins }), { color: { token: "inkMuted" }, align: "center", width: grow });
|
|
389
389
|
og.ui.row("Actions", { width: grow, gap: S.sm }, () => {
|
|
390
390
|
if (og.ui.button("Again", say(world, "over.again"), { variant: "primary", width: grow }).clicked) chose = "again";
|
|
391
391
|
if (og.ui.button("Menu", say(world, "over.menu"), { width: grow }).clicked) chose = "menu";
|
|
@@ -421,7 +421,7 @@ export const Ui = defineSystem("Ui", { reads: [Tuning, og.Gamepad, og.Pointers],
|
|
|
421
421
|
],
|
|
422
422
|
footer: say(world, og.ui.frameViewport().coarsePointer ? "title.footer.touch" : "title.footer"),
|
|
423
423
|
// The title the game opens on is built settled: the web draws it behind the play gate, where
|
|
424
|
-
// the
|
|
424
|
+
// the style's entrance would stand part-way until the tap (og-platform-sdk §3). Later titles enter.
|
|
425
425
|
instant: !g.leftTitle,
|
|
426
426
|
});
|
|
427
427
|
if (!g.settingsOpen && r.selected === "play" && g.phase === Phase.Title) startRun(world, g);
|
|
@@ -11,5 +11,5 @@
|
|
|
11
11
|
| `assets/audio/*.ogt` | CC0 1.0 | `og sfx` presets (click, select, back, error, levelup) that `og cook` synthesises, written by the same script |
|
|
12
12
|
| `assets/strings/*.ogt` | CC0 1.0 | self-made: the English and Chinese string tables |
|
|
13
13
|
| `assets/fonts/NotoSansSC-subset.ttf` | SIL Open Font License 1.1 (`assets/fonts/OFL.txt`) | Noto Sans SC Regular, subset to Latin-1 and the characters of `assets/strings/zh-CN.ogt` by the same script from the project template's `assets/fonts/NotoSansSC-Regular-subset.ttf` |
|
|
14
|
-
| `assets/
|
|
14
|
+
| `assets/styles/pathguard/*` | CC0 1.0 art, SIL OFL 1.1 fonts | the engine's cartoon style pack (`templates/styles/cartoon`, `assets/styles/pathguard/LICENSES.md`) with this game's palette |
|
|
15
15
|
| `references/*/*.png` | CC0 1.0 | frames of this game recorded by `tests/frames.og.ts` |
|
|
@@ -55,10 +55,10 @@ og build . --publish # dist/: the play page as it ships
|
|
|
55
55
|
doorstep is a red number, a 6-tick hit stop, trauma and a kick, the
|
|
56
56
|
lantern flashing red and squashing. Plants pop up when set and squash
|
|
57
57
|
when they shoot.
|
|
58
|
-
- **Screens on og.ui with a
|
|
59
|
-
engine's cartoon pack recoloured as `assets/
|
|
58
|
+
- **Screens on og.ui with a style** (og-ui §2–§6, og-taste §1–§7): the
|
|
59
|
+
engine's cartoon pack recoloured as `assets/styles/pathguard` (cream
|
|
60
60
|
panels on the night lawn, the lantern's orange as the one accent); the
|
|
61
|
-
title (`og.ui.mainMenu`), the HUD as
|
|
61
|
+
title (`og.ui.mainMenu`), the HUD as boxes in the corners with
|
|
62
62
|
counting numbers (`og.ui.counter`), the plant tray (right on a wide
|
|
63
63
|
screen, along the bottom on a phone), `og.ui.pauseMenu`, a settings
|
|
64
64
|
dialog and the end card built from widgets (stars landing with
|
|
@@ -176,7 +176,7 @@ The visitors' numbers are `KINDS` and the waves `WAVES` in `src/systems.ts`.
|
|
|
176
176
|
`fire`.
|
|
177
177
|
3. **The field**: `MAP` in `tools/make-assets.py` (H hedge, R stone, G the
|
|
178
178
|
gate, D the doorstep), then `python3 tools/make-assets.py && og cook .`.
|
|
179
|
-
4. **The look**: `assets/
|
|
179
|
+
4. **The look**: `assets/styles/pathguard/style.ogt`'s palette and the art
|
|
180
180
|
in `tools/make-assets.py`.
|
|
181
181
|
5. **Words**: `assets/strings/*.ogt`; a new Chinese string needs the
|
|
182
182
|
script run again to subset the font.
|
|
@@ -225,7 +225,7 @@ in the engine repository).
|
|
|
225
225
|
give the same bytes): the tileset, the map, the sprite sheet, the glow and
|
|
226
226
|
particle textures and emitters, the sounds and the music, the `og sfx`
|
|
227
227
|
preset files of the UI's sounds, and the font subset. `LICENSES.md` lists
|
|
228
|
-
them; the
|
|
228
|
+
them; the style's are in `assets/styles/pathguard/LICENSES.md`.
|
|
229
229
|
|
|
230
230
|
## Known limits (engine gaps, not design)
|
|
231
231
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# Path Guard's
|
|
1
|
+
# Path Guard's style (the engine's cartoon style pack, recoloured): licences
|
|
2
2
|
|
|
3
3
|
| File | Licence | Origin |
|
|
4
4
|
|---|---|---|
|
|
5
|
-
| `atlas.png` | CC0 1.0 | self-made by the Origin Engine authors: drawn by `templates/ui-kit/tools/make-
|
|
5
|
+
| `atlas.png` | CC0 1.0 | self-made by the Origin Engine authors: drawn by `templates/ui-kit/tools/make-styles.py` (deterministic) |
|
|
6
6
|
| `icons.png` | CC0 1.0 | self-made: the kit's 32 icons (`tools/make-assets.py`) restyled by the same script |
|
|
7
|
-
| `
|
|
7
|
+
| `style.ogt`, `*.ogt` | CC0 1.0 | written by the same script |
|
|
8
8
|
| `Fredoka-SemiBold.ttf` | SIL Open Font License 1.1 (`OFL.txt`) | Fredoka SemiBold (Google Fonts); unmodified. Copyright 2016 The Fredoka Project Authors (https://github.com/hafontia/Fredoka-One) |
|
|
9
9
|
| `LilitaOne-Regular.ttf` | SIL Open Font License 1.1 (`OFL.txt`) | Lilita One (Google Fonts); unmodified (Reserved Font Name "Lilita One"). Copyright (c) 2011 Juan Montoreano (juan@remolacha.biz), with Reserved Font Names "Lilita One" |
|
|
10
10
|
|
|
11
11
|
Characters these fonts lack (Chinese, Japanese, Korean) are drawn with the
|
|
12
|
-
|
|
12
|
+
style's `fallback` font, `fonts/NotoSansSC-Regular-subset.ttf` (the platform's
|
|
13
13
|
subset, OFL 1.1, `assets/fonts/OFL.txt`).
|
|
Binary file
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
type style
|
|
2
|
+
version 1
|
|
3
|
+
---
|
|
4
|
+
# Path Guard's style: the engine's cartoon style pack (templates/ui-kit/tools/make-styles.py; CC0 art, OFL fonts;
|
|
5
|
+
# LICENSES.md) in a night-garden palette: cream panels on the dark lawn, the lantern's orange as the one accent.
|
|
6
|
+
name "pathguard"
|
|
7
|
+
scheme light
|
|
8
|
+
atlas "styles/pathguard/atlas.png" 384 256
|
|
9
|
+
scale 1
|
|
10
|
+
palette {
|
|
11
|
+
backdrop "#10231a"
|
|
12
|
+
well "#15301f"
|
|
13
|
+
panel "#fff4dc"
|
|
14
|
+
panelHover "#ffe9bd"
|
|
15
|
+
panelRaised "#fff4dc"
|
|
16
|
+
line "#20302a"
|
|
17
|
+
lineStrong "#20302a"
|
|
18
|
+
ink "#0f1a14"
|
|
19
|
+
inkMuted "#3a483f"
|
|
20
|
+
inkFaint "#45534a"
|
|
21
|
+
inkInverse "#fff4dc"
|
|
22
|
+
control "#ffe08a"
|
|
23
|
+
controlStrong "#ffd466"
|
|
24
|
+
primary "#974009"
|
|
25
|
+
primaryHover "#8f3c0a"
|
|
26
|
+
primaryActive "#863809"
|
|
27
|
+
onPrimary "#fff4dc"
|
|
28
|
+
primarySoft "#ff8c3a40"
|
|
29
|
+
highlight "#a8400a"
|
|
30
|
+
focus "#5cb6e8"
|
|
31
|
+
knob "#ffffff"
|
|
32
|
+
hud "#fff4dcf5"
|
|
33
|
+
scrim "#07120ccc"
|
|
34
|
+
shadow "#0b1a1299"
|
|
35
|
+
sheen "#ffffff52"
|
|
36
|
+
success "#06681b"
|
|
37
|
+
warn "#7b5102"
|
|
38
|
+
danger "#700b1c"
|
|
39
|
+
info "#2256af"
|
|
40
|
+
health "#06681b"
|
|
41
|
+
mana "#007aff"
|
|
42
|
+
xp "#af52de"
|
|
43
|
+
gold "#b44c0d"
|
|
44
|
+
}
|
|
45
|
+
radius {
|
|
46
|
+
small 6
|
|
47
|
+
control 6
|
|
48
|
+
bar 6
|
|
49
|
+
panel 10
|
|
50
|
+
}
|
|
51
|
+
ramp {
|
|
52
|
+
body 15 20
|
|
53
|
+
meta 13 18
|
|
54
|
+
caption 13 18
|
|
55
|
+
lg 19 26
|
|
56
|
+
xl 22 28
|
|
57
|
+
xl2 26 30
|
|
58
|
+
xl3 30 34
|
|
59
|
+
displaySm 32 36
|
|
60
|
+
displayMd 40 44
|
|
61
|
+
displayLg 52 56
|
|
62
|
+
}
|
|
63
|
+
durations {
|
|
64
|
+
instant 110
|
|
65
|
+
fast 160
|
|
66
|
+
base 280
|
|
67
|
+
slow 420
|
|
68
|
+
}
|
|
69
|
+
fonts {
|
|
70
|
+
body "styles/pathguard/Fredoka-SemiBold.ttf"
|
|
71
|
+
display "styles/pathguard/LilitaOne-Regular.ttf"
|
|
72
|
+
numeric "styles/pathguard/LilitaOne-Regular.ttf"
|
|
73
|
+
fallback "fonts/NotoSansSC-subset.ttf"
|
|
74
|
+
}
|
|
75
|
+
icons "styles/pathguard/icons.png" 8 4 {
|
|
76
|
+
names "heart" "star" "coin" "lock" "pause" "gear" "sword" "shield" "potion" "gem" "key" "map" "bolt" "clock" "trophy" "home" "plus" "close" "check" "play" "back" "bag" "bomb" "crown" "flag" "apple" "leaf" "fire" "drop" "skull" "music" "person"
|
|
77
|
+
}
|
|
78
|
+
slice panel 4 4 96 96 16 tint
|
|
79
|
+
slice card 104 4 64 64 14 tint
|
|
80
|
+
slice button 172 4 48 48 12 tint
|
|
81
|
+
slice buttonHover 224 4 48 48 12 tint
|
|
82
|
+
slice buttonPressed 276 4 48 48 12 tint
|
|
83
|
+
slice buttonDisabled 328 4 48 48 12 tint
|
|
84
|
+
slice field 4 104 48 48 10 tint
|
|
85
|
+
slice slot 56 104 48 48 10 tint
|
|
86
|
+
slice tooltip 108 104 32 32 10 tint
|
|
87
|
+
slice hud 144 104 32 32 10 tint
|
|
88
|
+
slice track 180 104 32 16 7 tint
|
|
89
|
+
slice fill 216 104 32 16 7 tint
|
|
90
|
+
soft 252 104 64 64 24
|
|
91
|
+
divider 4 172 128 24 48 16 primary
|
|
92
|
+
flourish 136 172 64 24 22 10 primary 2
|
|
93
|
+
shadow panel 0 8 0 0 "#0b1a12cc"
|
|
94
|
+
shadow card 0 5 0 0 "#0b1a1299"
|
|
95
|
+
shadow button 0 5 0 0 "#0b1a12cc"
|
|
96
|
+
shadow hud 0 4 0 0 "#0b1a1299"
|
|
97
|
+
shadow slot 0 3 0 0 "#0b1a1266"
|
|
98
|
+
textShadow display 0 4 0 "#0b1a12"
|
|
99
|
+
# Body text gets a hairline of its own ink to the right: the Chinese fallback
|
|
100
|
+
# (Noto Sans SC Regular) reads at the weight of the Latin face.
|
|
101
|
+
textShadow body 1 0 0 "#20302a"
|
|
102
|
+
press 1.08 0.88 3
|
|
103
|
+
hover -3 1.04
|
|
104
|
+
motion {
|
|
105
|
+
enter pop
|
|
106
|
+
stagger 50
|
|
107
|
+
toast pop
|
|
108
|
+
progress 360
|
|
109
|
+
shake 8
|
|
110
|
+
pop 0.22
|
|
111
|
+
}
|