Compare commits

...
1 Commits
Author SHA1 Message Date
Warren H bef71d391a Release v0.1.4 2026-07-12 2026-07-12 13:49:46 -04:00
803 changed files with 3800 additions and 358322 deletions
+1
View File
@@ -1,5 +1,6 @@
node_modules/ node_modules/
dist/ dist/
game_assets/
*.tsbuildinfo *.tsbuildinfo
vite.config.js vite.config.js
vite.config.d.ts vite.config.d.ts
+15
View File
@@ -6,6 +6,13 @@ These requirements apply to every screen, feature, game system, and code change
AYN Thor Android app is the primary product. Browser build is a secondary access path for players without an AYN Thor. Do not weaken the Thor experience to simplify the browser version; provide an adaptive browser fallback instead. AYN Thor Android app is the primary product. Browser build is a secondary access path for players without an AYN Thor. Do not weaken the Thor experience to simplify the browser version; provide an adaptive browser fallback instead.
## Game asset workflow
- `game_assets/` is an ignored local source library. Never load or import a runtime asset directly from it.
- When adopting a model, animation, texture, audio file, or other game asset from `game_assets/`, copy it into the tracked `src/assets/game/` runtime library first. Preserve its path relative to `game_assets/`.
- Use `pnpm assets:import <path-within-game_assets>` for the copy. Use `--replace` only to deliberately update an existing runtime copy. Copy required companion files and license/attribution notices with assets that are not self-contained.
- Reference only `src/assets/game/` copies from game code. Keep `game_assets/` as source material for future imports, conversions, and authoring work.
## AYN Thor display and layout targets ## AYN Thor display and layout targets
Design and test against both physical displays in landscape orientation. Physical panel resolution and Android CSS/layout viewport are different concepts; record and validate both. Design and test against both physical displays in landscape orientation. Physical panel resolution and Android CSS/layout viewport are different concepts; record and validate both.
@@ -84,6 +91,14 @@ Stable locked 60 FPS is a release requirement, not a best-effort goal.
- Favor algorithms and data layouts that reduce CPU and RAM together. Do not trade a large permanent memory increase for a tiny unmeasured CPU gain. - Favor algorithms and data layouts that reduce CPU and RAM together. Do not trade a large permanent memory increase for a tiny unmeasured CPU gain.
- Performance fixes must preserve deterministic rules, input responsiveness, visual clarity, and controller accessibility. - Performance fixes must preserve deterministic rules, input responsiveness, visual clarity, and controller accessibility.
## Verification scope
- Verify the changed code and its direct dependencies. Do not run tests, visual QA, or controller checks for unrelated screens or systems by default.
- For a screen change, check that screen's applicable display layouts, browser fallback, and controller path only.
- For a reusable mechanic or domain change, run its focused tests plus direct consumers affected by the change.
- Expand to broader regression or full-suite verification only for shared foundations, cross-cutting changes, risky refactors, release validation, or when explicitly requested.
- State what was verified and any deliberately unverified scope in the handoff.
## Definition of done ## Definition of done
A screen or mechanic is not complete until: A screen or mechanic is not complete until:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 436 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 422 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

@@ -1,35 +0,0 @@
# Blender3D MTL File: Rathalos.blend
# Material Count: 3
newmtl Rathalos2_em002_BM_02.png
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 0
map_Kd em002_BM_02.png
newmtl Rathalos1_em002_BM_01.png
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 0
map_Kd em002_BM_01.png
newmtl Rathalos3_em002_BM_03.png
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 0.000000
illum 0
map_Kd em002_BM_03.png
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 769 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 KiB

@@ -1,64 +0,0 @@
KayKit : Character Animations (1.1)
Created/distributed by Kay Lousberg (www.kaylousberg.com)
Creation date: 10/12/2025 09:00
------------------------------
License: (Creative Commons Zero, CC0)
http://creativecommons.org/publicdomain/zero/1.0/
This content is free to use in personal, educational and commercial projects.
You can support me by purchasing an asset pack at the EXTRA or SOURCE tiers, leaving a donation/tip on itch.io, or joining my Patreon.
If you wish to credit me you can do so by crediting "Kay Lousberg, www.kaylousberg.com" (this is not mandatory)
------------------------------
This asset pack is here thanks to all the wonderful people who support KayKit on Patreon and those who buy EXTRA or SOURCE packs on itch.io.
And a big, special thank you to my Super Supporters on Patreon:
- Brian McBarron
- Silva
- Joseph Preston
- Leon Burkhardt
- NickyBHobbying
- Emilia
- Darren Laing
- Magic Pig Games
- Lennart Steinke
- OWSC
- tenthtonman
- Ducain23
- flo-bit
- Jezzy Sukaemi
- Martyn Rushton
- Joe
- estee
- Gustavo
- AngyZinn
- Alex Cea
- Matthew A
- Stephen Williams
- Wenpu Ng
- Kevin
- Legionof Light
- Dazusu
- Arnaud Schlupp
- JB
- Neil Castle
- Cedrico Serbruyns
- ovenaut
- Pawel Jarosz
------------------------------
Patreon: http://patreon.com/kaylousberg
Follow here for updates:
http://twitter.com/KayLousberg
https://mastodon.gamedev.place/@Kay
http://twitter.com/KayLousberg
@@ -1,136 +0,0 @@
{
"asset" : {
"generator" : "Khronos glTF Blender I/O v3.4.50",
"version" : "2.0"
},
"scene" : 0,
"scenes" : [
{
"name" : "Scene",
"nodes" : [
0
]
}
],
"nodes" : [
{
"mesh" : 0,
"name" : "banner_blue"
}
],
"materials" : [
{
"name" : "texture",
"pbrMetallicRoughness" : {
"baseColorTexture" : {
"index" : 0
},
"metallicFactor" : 0,
"roughnessFactor" : 0.44999998807907104
}
}
],
"meshes" : [
{
"name" : "banner_blue",
"primitives" : [
{
"attributes" : {
"POSITION" : 0,
"TEXCOORD_0" : 1,
"NORMAL" : 2
},
"indices" : 3,
"material" : 0
}
]
}
],
"textures" : [
{
"sampler" : 0,
"source" : 0
}
],
"images" : [
{
"mimeType" : "image/png",
"name" : "dungeon_texture",
"uri" : "dungeon_texture.png"
}
],
"accessors" : [
{
"bufferView" : 0,
"componentType" : 5126,
"count" : 187,
"max" : [
0.7500076293945312,
3.7274699211120605,
0.6895275712013245
],
"min" : [
-0.749992847442627,
0.5313930511474609,
0.3776381015777588
],
"type" : "VEC3"
},
{
"bufferView" : 1,
"componentType" : 5126,
"count" : 187,
"type" : "VEC2"
},
{
"bufferView" : 2,
"componentType" : 5126,
"count" : 187,
"type" : "VEC3"
},
{
"bufferView" : 3,
"componentType" : 5123,
"count" : 291,
"type" : "SCALAR"
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteLength" : 2244,
"byteOffset" : 0,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 1496,
"byteOffset" : 2244,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 2244,
"byteOffset" : 3740,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 582,
"byteOffset" : 5984,
"target" : 34963
}
],
"samplers" : [
{
"magFilter" : 9729,
"minFilter" : 9987
}
],
"buffers" : [
{
"byteLength" : 6568,
"uri" : "banner_blue.bin"
}
]
}
@@ -1,136 +0,0 @@
{
"asset" : {
"generator" : "Khronos glTF Blender I/O v3.4.50",
"version" : "2.0"
},
"scene" : 0,
"scenes" : [
{
"name" : "Scene",
"nodes" : [
0
]
}
],
"nodes" : [
{
"mesh" : 0,
"name" : "banner_brown"
}
],
"materials" : [
{
"name" : "texture",
"pbrMetallicRoughness" : {
"baseColorTexture" : {
"index" : 0
},
"metallicFactor" : 0,
"roughnessFactor" : 0.44999998807907104
}
}
],
"meshes" : [
{
"name" : "banner_brown",
"primitives" : [
{
"attributes" : {
"POSITION" : 0,
"TEXCOORD_0" : 1,
"NORMAL" : 2
},
"indices" : 3,
"material" : 0
}
]
}
],
"textures" : [
{
"sampler" : 0,
"source" : 0
}
],
"images" : [
{
"mimeType" : "image/png",
"name" : "dungeon_texture",
"uri" : "dungeon_texture.png"
}
],
"accessors" : [
{
"bufferView" : 0,
"componentType" : 5126,
"count" : 187,
"max" : [
0.7500076293945312,
3.7274699211120605,
0.6895275712013245
],
"min" : [
-0.749992847442627,
0.5313930511474609,
0.3776381015777588
],
"type" : "VEC3"
},
{
"bufferView" : 1,
"componentType" : 5126,
"count" : 187,
"type" : "VEC2"
},
{
"bufferView" : 2,
"componentType" : 5126,
"count" : 187,
"type" : "VEC3"
},
{
"bufferView" : 3,
"componentType" : 5123,
"count" : 291,
"type" : "SCALAR"
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteLength" : 2244,
"byteOffset" : 0,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 1496,
"byteOffset" : 2244,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 2244,
"byteOffset" : 3740,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 582,
"byteOffset" : 5984,
"target" : 34963
}
],
"samplers" : [
{
"magFilter" : 9729,
"minFilter" : 9987
}
],
"buffers" : [
{
"byteLength" : 6568,
"uri" : "banner_brown.bin"
}
]
}
@@ -1,136 +0,0 @@
{
"asset" : {
"generator" : "Khronos glTF Blender I/O v3.4.50",
"version" : "2.0"
},
"scene" : 0,
"scenes" : [
{
"name" : "Scene",
"nodes" : [
0
]
}
],
"nodes" : [
{
"mesh" : 0,
"name" : "banner_green"
}
],
"materials" : [
{
"name" : "texture",
"pbrMetallicRoughness" : {
"baseColorTexture" : {
"index" : 0
},
"metallicFactor" : 0,
"roughnessFactor" : 0.44999998807907104
}
}
],
"meshes" : [
{
"name" : "banner_green",
"primitives" : [
{
"attributes" : {
"POSITION" : 0,
"TEXCOORD_0" : 1,
"NORMAL" : 2
},
"indices" : 3,
"material" : 0
}
]
}
],
"textures" : [
{
"sampler" : 0,
"source" : 0
}
],
"images" : [
{
"mimeType" : "image/png",
"name" : "dungeon_texture",
"uri" : "dungeon_texture.png"
}
],
"accessors" : [
{
"bufferView" : 0,
"componentType" : 5126,
"count" : 187,
"max" : [
0.7500076293945312,
3.7274699211120605,
0.6895275712013245
],
"min" : [
-0.749992847442627,
0.5313930511474609,
0.3776381015777588
],
"type" : "VEC3"
},
{
"bufferView" : 1,
"componentType" : 5126,
"count" : 187,
"type" : "VEC2"
},
{
"bufferView" : 2,
"componentType" : 5126,
"count" : 187,
"type" : "VEC3"
},
{
"bufferView" : 3,
"componentType" : 5123,
"count" : 291,
"type" : "SCALAR"
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteLength" : 2244,
"byteOffset" : 0,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 1496,
"byteOffset" : 2244,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 2244,
"byteOffset" : 3740,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 582,
"byteOffset" : 5984,
"target" : 34963
}
],
"samplers" : [
{
"magFilter" : 9729,
"minFilter" : 9987
}
],
"buffers" : [
{
"byteLength" : 6568,
"uri" : "banner_green.bin"
}
]
}
@@ -1,136 +0,0 @@
{
"asset" : {
"generator" : "Khronos glTF Blender I/O v3.4.50",
"version" : "2.0"
},
"scene" : 0,
"scenes" : [
{
"name" : "Scene",
"nodes" : [
0
]
}
],
"nodes" : [
{
"mesh" : 0,
"name" : "banner_patternA_blue"
}
],
"materials" : [
{
"name" : "texture",
"pbrMetallicRoughness" : {
"baseColorTexture" : {
"index" : 0
},
"metallicFactor" : 0,
"roughnessFactor" : 0.44999998807907104
}
}
],
"meshes" : [
{
"name" : "banner_patternA_blue",
"primitives" : [
{
"attributes" : {
"POSITION" : 0,
"TEXCOORD_0" : 1,
"NORMAL" : 2
},
"indices" : 3,
"material" : 0
}
]
}
],
"textures" : [
{
"sampler" : 0,
"source" : 0
}
],
"images" : [
{
"mimeType" : "image/png",
"name" : "dungeon_texture",
"uri" : "dungeon_texture.png"
}
],
"accessors" : [
{
"bufferView" : 0,
"componentType" : 5126,
"count" : 220,
"max" : [
0.7500076293945312,
3.7274699211120605,
0.6895275712013245
],
"min" : [
-0.749992847442627,
0.5313930511474609,
0.3776381015777588
],
"type" : "VEC3"
},
{
"bufferView" : 1,
"componentType" : 5126,
"count" : 220,
"type" : "VEC2"
},
{
"bufferView" : 2,
"componentType" : 5126,
"count" : 220,
"type" : "VEC3"
},
{
"bufferView" : 3,
"componentType" : 5123,
"count" : 330,
"type" : "SCALAR"
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteLength" : 2640,
"byteOffset" : 0,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 1760,
"byteOffset" : 2640,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 2640,
"byteOffset" : 4400,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 660,
"byteOffset" : 7040,
"target" : 34963
}
],
"samplers" : [
{
"magFilter" : 9729,
"minFilter" : 9987
}
],
"buffers" : [
{
"byteLength" : 7700,
"uri" : "banner_patternA_blue.bin"
}
]
}
@@ -1,136 +0,0 @@
{
"asset" : {
"generator" : "Khronos glTF Blender I/O v3.4.50",
"version" : "2.0"
},
"scene" : 0,
"scenes" : [
{
"name" : "Scene",
"nodes" : [
0
]
}
],
"nodes" : [
{
"mesh" : 0,
"name" : "banner_patternA_brown"
}
],
"materials" : [
{
"name" : "texture",
"pbrMetallicRoughness" : {
"baseColorTexture" : {
"index" : 0
},
"metallicFactor" : 0,
"roughnessFactor" : 0.44999998807907104
}
}
],
"meshes" : [
{
"name" : "banner_patternA_brown",
"primitives" : [
{
"attributes" : {
"POSITION" : 0,
"TEXCOORD_0" : 1,
"NORMAL" : 2
},
"indices" : 3,
"material" : 0
}
]
}
],
"textures" : [
{
"sampler" : 0,
"source" : 0
}
],
"images" : [
{
"mimeType" : "image/png",
"name" : "dungeon_texture",
"uri" : "dungeon_texture.png"
}
],
"accessors" : [
{
"bufferView" : 0,
"componentType" : 5126,
"count" : 220,
"max" : [
0.7500076293945312,
3.7274699211120605,
0.6895275712013245
],
"min" : [
-0.749992847442627,
0.5313930511474609,
0.3776381015777588
],
"type" : "VEC3"
},
{
"bufferView" : 1,
"componentType" : 5126,
"count" : 220,
"type" : "VEC2"
},
{
"bufferView" : 2,
"componentType" : 5126,
"count" : 220,
"type" : "VEC3"
},
{
"bufferView" : 3,
"componentType" : 5123,
"count" : 330,
"type" : "SCALAR"
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteLength" : 2640,
"byteOffset" : 0,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 1760,
"byteOffset" : 2640,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 2640,
"byteOffset" : 4400,
"target" : 34962
},
{
"buffer" : 0,
"byteLength" : 660,
"byteOffset" : 7040,
"target" : 34963
}
],
"samplers" : [
{
"magFilter" : 9729,
"minFilter" : 9987
}
],
"buffers" : [
{
"byteLength" : 7700,
"uri" : "banner_patternA_brown.bin"
}
]
}

Some files were not shown because too many files have changed in this diff Show More