@origingame/create-game 0.0.0-stage → 0.1.1

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.
Files changed (590) hide show
  1. package/README.md +57 -2
  2. package/archetypes/README.md +99 -0
  3. package/archetypes/idle/.origin/setup +14 -0
  4. package/archetypes/idle/LICENSES.md +12 -0
  5. package/archetypes/idle/README.md +234 -0
  6. package/archetypes/idle/assets/audio/buy.wav +0 -0
  7. package/archetypes/idle/assets/audio/milestone.wav +0 -0
  8. package/archetypes/idle/assets/audio/nova.wav +0 -0
  9. package/archetypes/idle/assets/audio/orbit.wav +0 -0
  10. package/archetypes/idle/assets/audio/tap.wav +0 -0
  11. package/archetypes/idle/assets/audio/ui-close.ogt +9 -0
  12. package/archetypes/idle/assets/audio/ui-error.ogt +9 -0
  13. package/archetypes/idle/assets/audio/ui-open.ogt +9 -0
  14. package/archetypes/idle/assets/audio/ui-press.ogt +9 -0
  15. package/archetypes/idle/assets/audio/ui-success.ogt +9 -0
  16. package/archetypes/idle/assets/fonts/NotoSansSC-subset.ttf +0 -0
  17. package/archetypes/idle/assets/fonts/NotoSansSC-subset.ttf.ogt +10 -0
  18. package/archetypes/idle/assets/fonts/OFL.txt +93 -0
  19. package/archetypes/idle/assets/fx/drift.ogt +21 -0
  20. package/archetypes/idle/assets/fx/milestone.ogt +21 -0
  21. package/archetypes/idle/assets/fx/nova.ogt +22 -0
  22. package/archetypes/idle/assets/fx/stars.ogt +20 -0
  23. package/archetypes/idle/assets/fx/tap.ogt +23 -0
  24. package/archetypes/idle/assets/looks/idle.ogt +17 -0
  25. package/archetypes/idle/assets/skins/sparkorb/ChakraPetch-BoldItalic.ttf +0 -0
  26. package/archetypes/idle/assets/skins/sparkorb/ChakraPetch-BoldItalic.ttf.ogt +9 -0
  27. package/archetypes/idle/assets/skins/sparkorb/LICENSES.md +19 -0
  28. package/archetypes/idle/assets/skins/sparkorb/OFL.txt +95 -0
  29. package/archetypes/idle/assets/skins/sparkorb/Orbitron-Medium.ttf +0 -0
  30. package/archetypes/idle/assets/skins/sparkorb/Orbitron-Medium.ttf.ogt +9 -0
  31. package/archetypes/idle/assets/skins/sparkorb/Rajdhani-Bold.ttf +0 -0
  32. package/archetypes/idle/assets/skins/sparkorb/Rajdhani-Bold.ttf.ogt +9 -0
  33. package/archetypes/idle/assets/skins/sparkorb/atlas.png +0 -0
  34. package/archetypes/idle/assets/skins/sparkorb/atlas.png.ogt +7 -0
  35. package/archetypes/idle/assets/skins/sparkorb/icons.png +0 -0
  36. package/archetypes/idle/assets/skins/sparkorb/icons.png.ogt +7 -0
  37. package/archetypes/idle/assets/skins/sparkorb/skin.ogt +113 -0
  38. package/archetypes/idle/assets/sprites/glow.png +0 -0
  39. package/archetypes/idle/assets/sprites/glow.png.ogt +8 -0
  40. package/archetypes/idle/assets/sprites/mote-crystal.png +0 -0
  41. package/archetypes/idle/assets/sprites/mote-crystal.png.ogt +7 -0
  42. package/archetypes/idle/assets/sprites/mote-ember.png +0 -0
  43. package/archetypes/idle/assets/sprites/mote-ember.png.ogt +7 -0
  44. package/archetypes/idle/assets/sprites/mote-star.png +0 -0
  45. package/archetypes/idle/assets/sprites/mote-star.png.ogt +7 -0
  46. package/archetypes/idle/assets/sprites/mote-storm.png +0 -0
  47. package/archetypes/idle/assets/sprites/mote-storm.png.ogt +7 -0
  48. package/archetypes/idle/assets/sprites/orb.png +0 -0
  49. package/archetypes/idle/assets/sprites/orb.png.ogt +7 -0
  50. package/archetypes/idle/assets/sprites/spark.png +0 -0
  51. package/archetypes/idle/assets/sprites/spark.png.ogt +7 -0
  52. package/archetypes/idle/assets/strings/en.ogt +62 -0
  53. package/archetypes/idle/assets/strings/zh-CN.ogt +62 -0
  54. package/archetypes/idle/gitattributes +22 -0
  55. package/archetypes/idle/gitignore +8 -0
  56. package/archetypes/idle/host.d.ts +46 -0
  57. package/archetypes/idle/package.json +18 -0
  58. package/archetypes/idle/project.ogt +14 -0
  59. package/archetypes/idle/references/metal/card.png +0 -0
  60. package/archetypes/idle/references/metal/orbit.png +0 -0
  61. package/archetypes/idle/references/metal/title.png +0 -0
  62. package/archetypes/idle/src/components.ts +139 -0
  63. package/archetypes/idle/src/main.ts +247 -0
  64. package/archetypes/idle/src/numbers.ts +126 -0
  65. package/archetypes/idle/src/systems.ts +340 -0
  66. package/archetypes/idle/src/ui.ts +412 -0
  67. package/archetypes/idle/tests/away.og.ts +42 -0
  68. package/archetypes/idle/tests/flow.og.ts +57 -0
  69. package/archetypes/idle/tests/frames.og.ts +33 -0
  70. package/archetypes/idle/tests/frames.ts +134 -0
  71. package/archetypes/idle/tests/lib.ts +74 -0
  72. package/archetypes/idle/tests/milestone.og.ts +32 -0
  73. package/archetypes/idle/tests/nova.og.ts +52 -0
  74. package/archetypes/idle/tests/offline.og.ts +60 -0
  75. package/archetypes/idle/tests/pad.og.ts +55 -0
  76. package/archetypes/idle/tests/pause.og.ts +68 -0
  77. package/archetypes/idle/tests/phone.og.ts +50 -0
  78. package/archetypes/idle/tests/replay.og.ts +28 -0
  79. package/archetypes/idle/tools/make-assets.py +448 -0
  80. package/archetypes/idle/tools/oglite.py +285 -0
  81. package/archetypes/idle/tsconfig.json +17 -0
  82. package/archetypes/match3/.origin/setup +14 -0
  83. package/archetypes/match3/LICENSES.md +7 -0
  84. package/archetypes/match3/README.md +205 -0
  85. package/archetypes/match3/assets/audio/cascade.wav +0 -0
  86. package/archetypes/match3/assets/audio/clear.wav +0 -0
  87. package/archetypes/match3/assets/audio/lost.wav +0 -0
  88. package/archetypes/match3/assets/audio/refused.wav +0 -0
  89. package/archetypes/match3/assets/audio/select.wav +0 -0
  90. package/archetypes/match3/assets/audio/swap.wav +0 -0
  91. package/archetypes/match3/assets/audio/won.wav +0 -0
  92. package/archetypes/match3/assets/fonts/OFL.txt +93 -0
  93. package/archetypes/match3/assets/fonts/ui.ttf +0 -0
  94. package/archetypes/match3/assets/fonts/ui.ttf.ogt +11 -0
  95. package/archetypes/match3/assets/scenes/main.ogt +24 -0
  96. package/archetypes/match3/assets/sprites/backdrop.png +0 -0
  97. package/archetypes/match3/assets/sprites/board.ogt +21 -0
  98. package/archetypes/match3/assets/sprites/cells.ogt +7 -0
  99. package/archetypes/match3/assets/sprites/cells.png +0 -0
  100. package/archetypes/match3/assets/sprites/cells.png.ogt +7 -0
  101. package/archetypes/match3/assets/sprites/gems.ogt +75 -0
  102. package/archetypes/match3/assets/sprites/gems.png +0 -0
  103. package/archetypes/match3/assets/sprites/panel.png +0 -0
  104. package/archetypes/match3/assets/sprites/ring.png +0 -0
  105. package/archetypes/match3/gitattributes +22 -0
  106. package/archetypes/match3/gitignore +8 -0
  107. package/archetypes/match3/host.d.ts +46 -0
  108. package/archetypes/match3/package.json +18 -0
  109. package/archetypes/match3/project.ogt +18 -0
  110. package/archetypes/match3/references/metal/cascade.png +0 -0
  111. package/archetypes/match3/references/metal/clearing.png +0 -0
  112. package/archetypes/match3/references/metal/dealt.png +0 -0
  113. package/archetypes/match3/src/art.ts +54 -0
  114. package/archetypes/match3/src/board.ts +112 -0
  115. package/archetypes/match3/src/components.ts +95 -0
  116. package/archetypes/match3/src/layout.ts +25 -0
  117. package/archetypes/match3/src/main.ts +199 -0
  118. package/archetypes/match3/src/systems.ts +631 -0
  119. package/archetypes/match3/tests/drag.og.ts +31 -0
  120. package/archetypes/match3/tests/endings.og.ts +40 -0
  121. package/archetypes/match3/tests/frames.og.ts +49 -0
  122. package/archetypes/match3/tests/frames.ts +134 -0
  123. package/archetypes/match3/tests/hidpi.og.ts +41 -0
  124. package/archetypes/match3/tests/lib.ts +64 -0
  125. package/archetypes/match3/tests/replay.og.ts +28 -0
  126. package/archetypes/match3/tests/sounds.og.ts +50 -0
  127. package/archetypes/match3/tests/swap.og.ts +67 -0
  128. package/archetypes/match3/tools/make-assets.py +404 -0
  129. package/archetypes/match3/tools/oglite.py +285 -0
  130. package/archetypes/match3/tsconfig.json +17 -0
  131. package/archetypes/rhythm/.origin/setup +14 -0
  132. package/archetypes/rhythm/LICENSES.md +13 -0
  133. package/archetypes/rhythm/README.md +235 -0
  134. package/archetypes/rhythm/assets/audio/bass0.wav +0 -0
  135. package/archetypes/rhythm/assets/audio/bass1.wav +0 -0
  136. package/archetypes/rhythm/assets/audio/bass2.wav +0 -0
  137. package/archetypes/rhythm/assets/audio/bass3.wav +0 -0
  138. package/archetypes/rhythm/assets/audio/chords0.wav +0 -0
  139. package/archetypes/rhythm/assets/audio/chords1.wav +0 -0
  140. package/archetypes/rhythm/assets/audio/chords2.wav +0 -0
  141. package/archetypes/rhythm/assets/audio/chords3.wav +0 -0
  142. package/archetypes/rhythm/assets/audio/clear.wav +0 -0
  143. package/archetypes/rhythm/assets/audio/click.wav +0 -0
  144. package/archetypes/rhythm/assets/audio/drums.wav +0 -0
  145. package/archetypes/rhythm/assets/audio/fail.wav +0 -0
  146. package/archetypes/rhythm/assets/audio/leadA.wav +0 -0
  147. package/archetypes/rhythm/assets/audio/leadB.wav +0 -0
  148. package/archetypes/rhythm/assets/audio/miss.wav +0 -0
  149. package/archetypes/rhythm/assets/audio/tap0.wav +0 -0
  150. package/archetypes/rhythm/assets/audio/tap1.wav +0 -0
  151. package/archetypes/rhythm/assets/audio/tap2.wav +0 -0
  152. package/archetypes/rhythm/assets/audio/ui-close.ogt +9 -0
  153. package/archetypes/rhythm/assets/audio/ui-error.ogt +9 -0
  154. package/archetypes/rhythm/assets/audio/ui-open.ogt +9 -0
  155. package/archetypes/rhythm/assets/audio/ui-press.ogt +9 -0
  156. package/archetypes/rhythm/assets/audio/ui-success.ogt +9 -0
  157. package/archetypes/rhythm/assets/charts/neon-pulse.ogt +919 -0
  158. package/archetypes/rhythm/assets/fonts/NotoSansSC-subset.ttf +0 -0
  159. package/archetypes/rhythm/assets/fonts/NotoSansSC-subset.ttf.ogt +10 -0
  160. package/archetypes/rhythm/assets/fonts/OFL.txt +93 -0
  161. package/archetypes/rhythm/assets/fx/hit.ogt +22 -0
  162. package/archetypes/rhythm/assets/skins/lanebeat/ChakraPetch-Medium.ttf +0 -0
  163. package/archetypes/rhythm/assets/skins/lanebeat/ChakraPetch-Medium.ttf.ogt +9 -0
  164. package/archetypes/rhythm/assets/skins/lanebeat/JetBrainsMono-Regular.ttf +0 -0
  165. package/archetypes/rhythm/assets/skins/lanebeat/JetBrainsMono-Regular.ttf.ogt +9 -0
  166. package/archetypes/rhythm/assets/skins/lanebeat/LICENSES.md +17 -0
  167. package/archetypes/rhythm/assets/skins/lanebeat/OFL.txt +95 -0
  168. package/archetypes/rhythm/assets/skins/lanebeat/Orbitron-Bold.ttf +0 -0
  169. package/archetypes/rhythm/assets/skins/lanebeat/Orbitron-Bold.ttf.ogt +9 -0
  170. package/archetypes/rhythm/assets/skins/lanebeat/atlas.png +0 -0
  171. package/archetypes/rhythm/assets/skins/lanebeat/atlas.png.ogt +7 -0
  172. package/archetypes/rhythm/assets/skins/lanebeat/icons.png +0 -0
  173. package/archetypes/rhythm/assets/skins/lanebeat/icons.png.ogt +7 -0
  174. package/archetypes/rhythm/assets/skins/lanebeat/skin.ogt +110 -0
  175. package/archetypes/rhythm/assets/sprites/lane.png +0 -0
  176. package/archetypes/rhythm/assets/sprites/lane.png.ogt +7 -0
  177. package/archetypes/rhythm/assets/sprites/note.png +0 -0
  178. package/archetypes/rhythm/assets/sprites/note.png.ogt +7 -0
  179. package/archetypes/rhythm/assets/sprites/ring.png +0 -0
  180. package/archetypes/rhythm/assets/sprites/ring.png.ogt +7 -0
  181. package/archetypes/rhythm/assets/sprites/spark.png +0 -0
  182. package/archetypes/rhythm/assets/sprites/spark.png.ogt +7 -0
  183. package/archetypes/rhythm/assets/strings/en.ogt +61 -0
  184. package/archetypes/rhythm/assets/strings/zh-CN.ogt +61 -0
  185. package/archetypes/rhythm/gitattributes +22 -0
  186. package/archetypes/rhythm/gitignore +8 -0
  187. package/archetypes/rhythm/host.d.ts +46 -0
  188. package/archetypes/rhythm/package.json +18 -0
  189. package/archetypes/rhythm/project.ogt +14 -0
  190. package/archetypes/rhythm/references/metal/highway.png +0 -0
  191. package/archetypes/rhythm/references/metal/results.png +0 -0
  192. package/archetypes/rhythm/references/metal/title.png +0 -0
  193. package/archetypes/rhythm/src/components.ts +147 -0
  194. package/archetypes/rhythm/src/main.ts +202 -0
  195. package/archetypes/rhythm/src/systems.ts +490 -0
  196. package/archetypes/rhythm/src/ui.ts +421 -0
  197. package/archetypes/rhythm/tests/band.og.ts +45 -0
  198. package/archetypes/rhythm/tests/calibrate.og.ts +49 -0
  199. package/archetypes/rhythm/tests/clear.og.ts +51 -0
  200. package/archetypes/rhythm/tests/fail.og.ts +40 -0
  201. package/archetypes/rhythm/tests/flow.og.ts +54 -0
  202. package/archetypes/rhythm/tests/frames.og.ts +35 -0
  203. package/archetypes/rhythm/tests/frames.ts +134 -0
  204. package/archetypes/rhythm/tests/lib.ts +123 -0
  205. package/archetypes/rhythm/tests/pad.og.ts +41 -0
  206. package/archetypes/rhythm/tests/pause.og.ts +77 -0
  207. package/archetypes/rhythm/tests/phone.og.ts +44 -0
  208. package/archetypes/rhythm/tests/replay.og.ts +27 -0
  209. package/archetypes/rhythm/tests/timing.og.ts +37 -0
  210. package/archetypes/rhythm/tools/make-assets.py +383 -0
  211. package/archetypes/rhythm/tools/oglite.py +285 -0
  212. package/archetypes/rhythm/tsconfig.json +17 -0
  213. package/archetypes/roguelike/.origin/setup +14 -0
  214. package/archetypes/roguelike/LICENSES.md +14 -0
  215. package/archetypes/roguelike/README.md +256 -0
  216. package/archetypes/roguelike/assets/ai/foe.ogt +28 -0
  217. package/archetypes/roguelike/assets/ai/guardian.ogt +26 -0
  218. package/archetypes/roguelike/assets/audio/bump.wav +0 -0
  219. package/archetypes/roguelike/assets/audio/drink.wav +0 -0
  220. package/archetypes/roguelike/assets/audio/fall.wav +0 -0
  221. package/archetypes/roguelike/assets/audio/hit.wav +0 -0
  222. package/archetypes/roguelike/assets/audio/hurt.wav +0 -0
  223. package/archetypes/roguelike/assets/audio/item.wav +0 -0
  224. package/archetypes/roguelike/assets/audio/kill.wav +0 -0
  225. package/archetypes/roguelike/assets/audio/pickup.wav +0 -0
  226. package/archetypes/roguelike/assets/audio/roar.wav +0 -0
  227. package/archetypes/roguelike/assets/audio/stairs.wav +0 -0
  228. package/archetypes/roguelike/assets/audio/step.ogt +9 -0
  229. package/archetypes/roguelike/assets/audio/telegraph.wav +0 -0
  230. package/archetypes/roguelike/assets/audio/tomb.wav +0 -0
  231. package/archetypes/roguelike/assets/audio/ui-close.ogt +9 -0
  232. package/archetypes/roguelike/assets/audio/ui-error.ogt +9 -0
  233. package/archetypes/roguelike/assets/audio/ui-open.ogt +9 -0
  234. package/archetypes/roguelike/assets/audio/ui-press.ogt +9 -0
  235. package/archetypes/roguelike/assets/audio/ui-success.ogt +9 -0
  236. package/archetypes/roguelike/assets/audio/won.wav +0 -0
  237. package/archetypes/roguelike/assets/fonts/NotoSansSC-subset.ttf +0 -0
  238. package/archetypes/roguelike/assets/fonts/NotoSansSC-subset.ttf.ogt +10 -0
  239. package/archetypes/roguelike/assets/fonts/OFL.txt +93 -0
  240. package/archetypes/roguelike/assets/maps/dive.ogt +106 -0
  241. package/archetypes/roguelike/assets/skins/lampdive/DotGothic16-Regular.ttf +0 -0
  242. package/archetypes/roguelike/assets/skins/lampdive/DotGothic16-Regular.ttf.ogt +9 -0
  243. package/archetypes/roguelike/assets/skins/lampdive/LICENSES.md +16 -0
  244. package/archetypes/roguelike/assets/skins/lampdive/OFL.txt +93 -0
  245. package/archetypes/roguelike/assets/skins/lampdive/atlas.png +0 -0
  246. package/archetypes/roguelike/assets/skins/lampdive/atlas.png.ogt +7 -0
  247. package/archetypes/roguelike/assets/skins/lampdive/icons.png +0 -0
  248. package/archetypes/roguelike/assets/skins/lampdive/icons.png.ogt +7 -0
  249. package/archetypes/roguelike/assets/skins/lampdive/skin.ogt +115 -0
  250. package/archetypes/roguelike/assets/sprites/dive.ogt +50 -0
  251. package/archetypes/roguelike/assets/sprites/dive.png +0 -0
  252. package/archetypes/roguelike/assets/sprites/dive.png.ogt +7 -0
  253. package/archetypes/roguelike/assets/sprites/glow.png +0 -0
  254. package/archetypes/roguelike/assets/sprites/glow.png.ogt +7 -0
  255. package/archetypes/roguelike/assets/strings/en.ogt +57 -0
  256. package/archetypes/roguelike/assets/strings/zh-CN.ogt +57 -0
  257. package/archetypes/roguelike/assets/tiles/tomb.ogt +31 -0
  258. package/archetypes/roguelike/assets/tiles/tomb.png +0 -0
  259. package/archetypes/roguelike/assets/tiles/tomb.png.ogt +7 -0
  260. package/archetypes/roguelike/gitattributes +22 -0
  261. package/archetypes/roguelike/gitignore +8 -0
  262. package/archetypes/roguelike/host.d.ts +46 -0
  263. package/archetypes/roguelike/package.json +18 -0
  264. package/archetypes/roguelike/project.ogt +14 -0
  265. package/archetypes/roguelike/references/metal/dive.png +0 -0
  266. package/archetypes/roguelike/references/metal/over.png +0 -0
  267. package/archetypes/roguelike/references/metal/title.png +0 -0
  268. package/archetypes/roguelike/src/art.ts +23 -0
  269. package/archetypes/roguelike/src/components.ts +169 -0
  270. package/archetypes/roguelike/src/dive.ts +144 -0
  271. package/archetypes/roguelike/src/foes.ts +174 -0
  272. package/archetypes/roguelike/src/main.ts +258 -0
  273. package/archetypes/roguelike/src/systems.ts +620 -0
  274. package/archetypes/roguelike/src/ui.ts +350 -0
  275. package/archetypes/roguelike/tests/flow.og.ts +54 -0
  276. package/archetypes/roguelike/tests/foes.og.ts +45 -0
  277. package/archetypes/roguelike/tests/frames.og.ts +32 -0
  278. package/archetypes/roguelike/tests/frames.ts +134 -0
  279. package/archetypes/roguelike/tests/lib.ts +83 -0
  280. package/archetypes/roguelike/tests/lose.og.ts +44 -0
  281. package/archetypes/roguelike/tests/pad.og.ts +54 -0
  282. package/archetypes/roguelike/tests/pause.og.ts +59 -0
  283. package/archetypes/roguelike/tests/phone.og.ts +54 -0
  284. package/archetypes/roguelike/tests/replay.og.ts +24 -0
  285. package/archetypes/roguelike/tests/win.og.ts +60 -0
  286. package/archetypes/roguelike/tools/make-assets.py +518 -0
  287. package/archetypes/roguelike/tools/oglite.py +285 -0
  288. package/archetypes/roguelike/tsconfig.json +17 -0
  289. package/archetypes/runner/.origin/setup +14 -0
  290. package/archetypes/runner/LICENSES.md +10 -0
  291. package/archetypes/runner/README.md +225 -0
  292. package/archetypes/runner/assets/audio/coin.wav +0 -0
  293. package/archetypes/runner/assets/audio/crash.wav +0 -0
  294. package/archetypes/runner/assets/audio/hold.ogt +9 -0
  295. package/archetypes/runner/assets/audio/jump.wav +0 -0
  296. package/archetypes/runner/assets/audio/start.wav +0 -0
  297. package/archetypes/runner/assets/fonts/OFL.txt +93 -0
  298. package/archetypes/runner/assets/fonts/ui.ttf +0 -0
  299. package/archetypes/runner/assets/fonts/ui.ttf.ogt +11 -0
  300. package/archetypes/runner/assets/maps/far.ogt +25 -0
  301. package/archetypes/runner/assets/maps/near.ogt +25 -0
  302. package/archetypes/runner/assets/maps/roofs.ogt +19 -0
  303. package/archetypes/runner/assets/scenes/main.ogt +35 -0
  304. package/archetypes/runner/assets/sprites/coin.ogt +11 -0
  305. package/archetypes/runner/assets/sprites/coin.png +0 -0
  306. package/archetypes/runner/assets/sprites/coin.png.ogt +7 -0
  307. package/archetypes/runner/assets/sprites/courier.ogt +32 -0
  308. package/archetypes/runner/assets/sprites/courier.png +0 -0
  309. package/archetypes/runner/assets/sprites/courier.png.ogt +7 -0
  310. package/archetypes/runner/assets/sprites/props.ogt +21 -0
  311. package/archetypes/runner/assets/sprites/props.png +0 -0
  312. package/archetypes/runner/assets/sprites/props.png.ogt +7 -0
  313. package/archetypes/runner/assets/sprites/sky.png +0 -0
  314. package/archetypes/runner/assets/sprites/sky.png.ogt +7 -0
  315. package/archetypes/runner/assets/tiles/city.ogt +18 -0
  316. package/archetypes/runner/assets/tiles/city.png +0 -0
  317. package/archetypes/runner/assets/tiles/city.png.ogt +7 -0
  318. package/archetypes/runner/gitattributes +22 -0
  319. package/archetypes/runner/gitignore +8 -0
  320. package/archetypes/runner/host.d.ts +46 -0
  321. package/archetypes/runner/package.json +18 -0
  322. package/archetypes/runner/project.ogt +18 -0
  323. package/archetypes/runner/references/metal/frames-coin.png +0 -0
  324. package/archetypes/runner/references/metal/frames-crash.png +0 -0
  325. package/archetypes/runner/references/metal/frames-title.png +0 -0
  326. package/archetypes/runner/src/art.ts +57 -0
  327. package/archetypes/runner/src/components.ts +94 -0
  328. package/archetypes/runner/src/main.ts +241 -0
  329. package/archetypes/runner/src/systems.ts +553 -0
  330. package/archetypes/runner/tests/coins.og.ts +30 -0
  331. package/archetypes/runner/tests/flow.og.ts +72 -0
  332. package/archetypes/runner/tests/frames.og.ts +37 -0
  333. package/archetypes/runner/tests/frames.ts +134 -0
  334. package/archetypes/runner/tests/jump.og.ts +44 -0
  335. package/archetypes/runner/tests/lib.ts +42 -0
  336. package/archetypes/runner/tests/records.og.ts +43 -0
  337. package/archetypes/runner/tests/replay.og.ts +36 -0
  338. package/archetypes/runner/tests/sounds.og.ts +43 -0
  339. package/archetypes/runner/tests/tune.og.ts +36 -0
  340. package/archetypes/runner/tools/make-assets.py +603 -0
  341. package/archetypes/runner/tools/oglite.py +285 -0
  342. package/archetypes/runner/tsconfig.json +17 -0
  343. package/archetypes/third-person/.origin/setup +14 -0
  344. package/archetypes/third-person/LICENSES.md +23 -0
  345. package/archetypes/third-person/README.md +249 -0
  346. package/archetypes/third-person/assets/ai/sentinel-east.ogt +69 -0
  347. package/archetypes/third-person/assets/ai/sentinel-north.ogt +69 -0
  348. package/archetypes/third-person/assets/ai/sentinel-west.ogt +69 -0
  349. package/archetypes/third-person/assets/anims/humanoid-clips.glb +0 -0
  350. package/archetypes/third-person/assets/audio/alarm.wav +0 -0
  351. package/archetypes/third-person/assets/audio/dawn.wav +0 -0
  352. package/archetypes/third-person/assets/audio/grab.wav +0 -0
  353. package/archetypes/third-person/assets/audio/ignite.wav +0 -0
  354. package/archetypes/third-person/assets/audio/jump.wav +0 -0
  355. package/archetypes/third-person/assets/audio/night.wav +0 -0
  356. package/archetypes/third-person/assets/audio/splash.wav +0 -0
  357. package/archetypes/third-person/assets/audio/step.ogt +9 -0
  358. package/archetypes/third-person/assets/audio/ui-close.ogt +9 -0
  359. package/archetypes/third-person/assets/audio/ui-error.ogt +9 -0
  360. package/archetypes/third-person/assets/audio/ui-open.ogt +9 -0
  361. package/archetypes/third-person/assets/audio/ui-press.ogt +9 -0
  362. package/archetypes/third-person/assets/audio/ui-success.ogt +9 -0
  363. package/archetypes/third-person/assets/audio/vale.wav +0 -0
  364. package/archetypes/third-person/assets/fonts/NotoSansSC-subset.ttf +0 -0
  365. package/archetypes/third-person/assets/fonts/NotoSansSC-subset.ttf.ogt +10 -0
  366. package/archetypes/third-person/assets/fonts/OFL.txt +93 -0
  367. package/archetypes/third-person/assets/fx/burst.ogt +25 -0
  368. package/archetypes/third-person/assets/fx/fire.ogt +24 -0
  369. package/archetypes/third-person/assets/fx/smoke.ogt +24 -0
  370. package/archetypes/third-person/assets/fx/splash.ogt +24 -0
  371. package/archetypes/third-person/assets/luts/teal-orange.cube +4917 -0
  372. package/archetypes/third-person/assets/models/stout.glb +0 -0
  373. package/archetypes/third-person/assets/models/strider.glb +0 -0
  374. package/archetypes/third-person/assets/models/strider.glb.ogt +9 -0
  375. package/archetypes/third-person/assets/nav/vale.ogt +43 -0
  376. package/archetypes/third-person/assets/rigs/strider.ogt +6 -0
  377. package/archetypes/third-person/assets/skins/ember/Cinzel-Bold.ttf +0 -0
  378. package/archetypes/third-person/assets/skins/ember/Cinzel-Bold.ttf.ogt +9 -0
  379. package/archetypes/third-person/assets/skins/ember/LICENSES.md +13 -0
  380. package/archetypes/third-person/assets/skins/ember/Newsreader-Medium.ttf +0 -0
  381. package/archetypes/third-person/assets/skins/ember/Newsreader-Medium.ttf.ogt +9 -0
  382. package/archetypes/third-person/assets/skins/ember/OFL.txt +94 -0
  383. package/archetypes/third-person/assets/skins/ember/atlas.png +0 -0
  384. package/archetypes/third-person/assets/skins/ember/atlas.png.ogt +7 -0
  385. package/archetypes/third-person/assets/skins/ember/icons.png +0 -0
  386. package/archetypes/third-person/assets/skins/ember/icons.png.ogt +7 -0
  387. package/archetypes/third-person/assets/skins/ember/skin.ogt +109 -0
  388. package/archetypes/third-person/assets/strings/en.ogt +47 -0
  389. package/archetypes/third-person/assets/strings/zh-CN.ogt +47 -0
  390. package/archetypes/third-person/assets/terrain/vale-control.png +0 -0
  391. package/archetypes/third-person/assets/terrain/vale.ogt +42 -0
  392. package/archetypes/third-person/assets/terrain/vale.png +0 -0
  393. package/archetypes/third-person/assets/textures/decals.png +0 -0
  394. package/archetypes/third-person/assets/textures/flame.png +0 -0
  395. package/archetypes/third-person/assets/textures/smoke.png +0 -0
  396. package/archetypes/third-person/assets/textures/spark.png +0 -0
  397. package/archetypes/third-person/assets/textures/terrain-grass.png +0 -0
  398. package/archetypes/third-person/assets/textures/terrain-path.png +0 -0
  399. package/archetypes/third-person/assets/textures/terrain-rock.png +0 -0
  400. package/archetypes/third-person/assets/textures/terrain-sand.png +0 -0
  401. package/archetypes/third-person/gitattributes +22 -0
  402. package/archetypes/third-person/gitignore +8 -0
  403. package/archetypes/third-person/host.d.ts +46 -0
  404. package/archetypes/third-person/package.json +18 -0
  405. package/archetypes/third-person/project.ogt +14 -0
  406. package/archetypes/third-person/references/metal/beacon.png +0 -0
  407. package/archetypes/third-person/references/metal/dawn.png +0 -0
  408. package/archetypes/third-person/references/metal/title.png +0 -0
  409. package/archetypes/third-person/references/webgl2/beacon.png +0 -0
  410. package/archetypes/third-person/src/anim.ts +87 -0
  411. package/archetypes/third-person/src/beacons.ts +80 -0
  412. package/archetypes/third-person/src/components.ts +148 -0
  413. package/archetypes/third-person/src/hero.ts +293 -0
  414. package/archetypes/third-person/src/main.ts +164 -0
  415. package/archetypes/third-person/src/sentinels.ts +159 -0
  416. package/archetypes/third-person/src/sound.ts +66 -0
  417. package/archetypes/third-person/src/ui.ts +451 -0
  418. package/archetypes/third-person/src/world.ts +212 -0
  419. package/archetypes/third-person/tests/flow.og.ts +70 -0
  420. package/archetypes/third-person/tests/frames.og.ts +35 -0
  421. package/archetypes/third-person/tests/frames.ts +134 -0
  422. package/archetypes/third-person/tests/hitstop.og.ts +26 -0
  423. package/archetypes/third-person/tests/lib.ts +87 -0
  424. package/archetypes/third-person/tests/lose.og.ts +44 -0
  425. package/archetypes/third-person/tests/pause.og.ts +64 -0
  426. package/archetypes/third-person/tests/phone.og.ts +65 -0
  427. package/archetypes/third-person/tests/replay.og.ts +32 -0
  428. package/archetypes/third-person/tests/restart.og.ts +28 -0
  429. package/archetypes/third-person/tests/sentinels.og.ts +48 -0
  430. package/archetypes/third-person/tests/win.og.ts +62 -0
  431. package/archetypes/third-person/tools/make-assets.py +353 -0
  432. package/archetypes/third-person/tools/oglite.py +285 -0
  433. package/archetypes/third-person/tsconfig.json +17 -0
  434. package/archetypes/topdown/.origin/setup +14 -0
  435. package/archetypes/topdown/LICENSES.md +10 -0
  436. package/archetypes/topdown/README.md +235 -0
  437. package/archetypes/topdown/assets/ai/slime.ogt +49 -0
  438. package/archetypes/topdown/assets/audio/coin.wav +0 -0
  439. package/archetypes/topdown/assets/audio/door.wav +0 -0
  440. package/archetypes/topdown/assets/audio/hit.wav +0 -0
  441. package/archetypes/topdown/assets/audio/hurt.wav +0 -0
  442. package/archetypes/topdown/assets/audio/key.wav +0 -0
  443. package/archetypes/topdown/assets/audio/step.ogt +9 -0
  444. package/archetypes/topdown/assets/fonts/OFL.txt +93 -0
  445. package/archetypes/topdown/assets/fonts/ui.ttf +0 -0
  446. package/archetypes/topdown/assets/fonts/ui.ttf.ogt +9 -0
  447. package/archetypes/topdown/assets/maps/tomb.tmj +2183 -0
  448. package/archetypes/topdown/assets/sprites/hero.ogt +58 -0
  449. package/archetypes/topdown/assets/sprites/hero.png +0 -0
  450. package/archetypes/topdown/assets/sprites/hero.png.ogt +7 -0
  451. package/archetypes/topdown/assets/sprites/items.ogt +15 -0
  452. package/archetypes/topdown/assets/sprites/items.png +0 -0
  453. package/archetypes/topdown/assets/sprites/items.png.ogt +7 -0
  454. package/archetypes/topdown/assets/sprites/slime.ogt +17 -0
  455. package/archetypes/topdown/assets/sprites/slime.png +0 -0
  456. package/archetypes/topdown/assets/sprites/slime.png.ogt +7 -0
  457. package/archetypes/topdown/assets/tiles/dungeon.ogt +65 -0
  458. package/archetypes/topdown/assets/tiles/dungeon.png +0 -0
  459. package/archetypes/topdown/assets/tiles/dungeon.png.ogt +7 -0
  460. package/archetypes/topdown/gitattributes +22 -0
  461. package/archetypes/topdown/gitignore +8 -0
  462. package/archetypes/topdown/host.d.ts +46 -0
  463. package/archetypes/topdown/package.json +18 -0
  464. package/archetypes/topdown/project.ogt +14 -0
  465. package/archetypes/topdown/references/metal/crit.png +0 -0
  466. package/archetypes/topdown/references/metal/dash.png +0 -0
  467. package/archetypes/topdown/references/metal/east.png +0 -0
  468. package/archetypes/topdown/references/metal/start.png +0 -0
  469. package/archetypes/topdown/src/art.ts +48 -0
  470. package/archetypes/topdown/src/components.ts +128 -0
  471. package/archetypes/topdown/src/main.ts +275 -0
  472. package/archetypes/topdown/src/systems.ts +503 -0
  473. package/archetypes/topdown/tests/ai.og.ts +64 -0
  474. package/archetypes/topdown/tests/combat.og.ts +72 -0
  475. package/archetypes/topdown/tests/door.og.ts +62 -0
  476. package/archetypes/topdown/tests/flee.og.ts +49 -0
  477. package/archetypes/topdown/tests/frames.og.ts +45 -0
  478. package/archetypes/topdown/tests/frames.ts +134 -0
  479. package/archetypes/topdown/tests/lib.ts +71 -0
  480. package/archetypes/topdown/tests/replay.og.ts +40 -0
  481. package/archetypes/topdown/tests/walk.og.ts +46 -0
  482. package/archetypes/topdown/tools/make-assets.py +623 -0
  483. package/archetypes/topdown/tools/oglite.py +285 -0
  484. package/archetypes/topdown/tsconfig.json +17 -0
  485. package/archetypes/tower-defense/.origin/setup +14 -0
  486. package/archetypes/tower-defense/LICENSES.md +15 -0
  487. package/archetypes/tower-defense/README.md +240 -0
  488. package/archetypes/tower-defense/assets/ai/plant.ogt +16 -0
  489. package/archetypes/tower-defense/assets/audio/clear.wav +0 -0
  490. package/archetypes/tower-defense/assets/audio/frost.wav +0 -0
  491. package/archetypes/tower-defense/assets/audio/leak.wav +0 -0
  492. package/archetypes/tower-defense/assets/audio/lost.wav +0 -0
  493. package/archetypes/tower-defense/assets/audio/night.wav +0 -0
  494. package/archetypes/tower-defense/assets/audio/plant.wav +0 -0
  495. package/archetypes/tower-defense/assets/audio/pop.wav +0 -0
  496. package/archetypes/tower-defense/assets/audio/thorn.wav +0 -0
  497. package/archetypes/tower-defense/assets/audio/ui-close.ogt +9 -0
  498. package/archetypes/tower-defense/assets/audio/ui-error.ogt +9 -0
  499. package/archetypes/tower-defense/assets/audio/ui-open.ogt +9 -0
  500. package/archetypes/tower-defense/assets/audio/ui-press.ogt +9 -0
  501. package/archetypes/tower-defense/assets/audio/ui-success.ogt +9 -0
  502. package/archetypes/tower-defense/assets/audio/wave.wav +0 -0
  503. package/archetypes/tower-defense/assets/audio/won.wav +0 -0
  504. package/archetypes/tower-defense/assets/fonts/NotoSansSC-subset.ttf +0 -0
  505. package/archetypes/tower-defense/assets/fonts/NotoSansSC-subset.ttf.ogt +10 -0
  506. package/archetypes/tower-defense/assets/fonts/OFL.txt +93 -0
  507. package/archetypes/tower-defense/assets/fx/fireflies.ogt +21 -0
  508. package/archetypes/tower-defense/assets/fx/pop.ogt +21 -0
  509. package/archetypes/tower-defense/assets/maps/garden.ogt +91 -0
  510. package/archetypes/tower-defense/assets/skins/pathguard/Fredoka-SemiBold.ttf +0 -0
  511. package/archetypes/tower-defense/assets/skins/pathguard/Fredoka-SemiBold.ttf.ogt +9 -0
  512. package/archetypes/tower-defense/assets/skins/pathguard/LICENSES.md +13 -0
  513. package/archetypes/tower-defense/assets/skins/pathguard/LilitaOne-Regular.ttf +0 -0
  514. package/archetypes/tower-defense/assets/skins/pathguard/LilitaOne-Regular.ttf.ogt +9 -0
  515. package/archetypes/tower-defense/assets/skins/pathguard/OFL.txt +94 -0
  516. package/archetypes/tower-defense/assets/skins/pathguard/atlas.png +0 -0
  517. package/archetypes/tower-defense/assets/skins/pathguard/atlas.png.ogt +7 -0
  518. package/archetypes/tower-defense/assets/skins/pathguard/icons.png +0 -0
  519. package/archetypes/tower-defense/assets/skins/pathguard/icons.png.ogt +7 -0
  520. package/archetypes/tower-defense/assets/skins/pathguard/skin.ogt +111 -0
  521. package/archetypes/tower-defense/assets/sprites/garden.ogt +66 -0
  522. package/archetypes/tower-defense/assets/sprites/garden.png +0 -0
  523. package/archetypes/tower-defense/assets/sprites/garden.png.ogt +7 -0
  524. package/archetypes/tower-defense/assets/sprites/glow.png +0 -0
  525. package/archetypes/tower-defense/assets/sprites/glow.png.ogt +7 -0
  526. package/archetypes/tower-defense/assets/sprites/ring.png +0 -0
  527. package/archetypes/tower-defense/assets/sprites/ring.png.ogt +7 -0
  528. package/archetypes/tower-defense/assets/sprites/spark.png +0 -0
  529. package/archetypes/tower-defense/assets/sprites/spark.png.ogt +7 -0
  530. package/archetypes/tower-defense/assets/strings/en.ogt +47 -0
  531. package/archetypes/tower-defense/assets/strings/zh-CN.ogt +47 -0
  532. package/archetypes/tower-defense/assets/tiles/garden.ogt +10 -0
  533. package/archetypes/tower-defense/assets/tiles/garden.png +0 -0
  534. package/archetypes/tower-defense/assets/tiles/garden.png.ogt +7 -0
  535. package/archetypes/tower-defense/gitattributes +22 -0
  536. package/archetypes/tower-defense/gitignore +8 -0
  537. package/archetypes/tower-defense/host.d.ts +46 -0
  538. package/archetypes/tower-defense/package.json +18 -0
  539. package/archetypes/tower-defense/project.ogt +14 -0
  540. package/archetypes/tower-defense/references/metal/end.png +0 -0
  541. package/archetypes/tower-defense/references/metal/title.png +0 -0
  542. package/archetypes/tower-defense/references/metal/wave.png +0 -0
  543. package/archetypes/tower-defense/src/art.ts +24 -0
  544. package/archetypes/tower-defense/src/components.ts +156 -0
  545. package/archetypes/tower-defense/src/main.ts +253 -0
  546. package/archetypes/tower-defense/src/systems.ts +658 -0
  547. package/archetypes/tower-defense/src/ui.ts +382 -0
  548. package/archetypes/tower-defense/tests/flow.og.ts +56 -0
  549. package/archetypes/tower-defense/tests/frames.og.ts +31 -0
  550. package/archetypes/tower-defense/tests/frames.ts +134 -0
  551. package/archetypes/tower-defense/tests/lib.ts +81 -0
  552. package/archetypes/tower-defense/tests/lose.og.ts +40 -0
  553. package/archetypes/tower-defense/tests/maze.og.ts +53 -0
  554. package/archetypes/tower-defense/tests/pad.og.ts +41 -0
  555. package/archetypes/tower-defense/tests/pause.og.ts +59 -0
  556. package/archetypes/tower-defense/tests/phone.og.ts +49 -0
  557. package/archetypes/tower-defense/tests/replay.og.ts +28 -0
  558. package/archetypes/tower-defense/tests/win.og.ts +58 -0
  559. package/archetypes/tower-defense/tools/make-assets.py +640 -0
  560. package/archetypes/tower-defense/tools/oglite.py +285 -0
  561. package/archetypes/tower-defense/tsconfig.json +17 -0
  562. package/bin/create.ts +503 -0
  563. package/looks/catalogue.json +1871 -0
  564. package/package.json +31 -4
  565. package/template/.origin/setup +14 -0
  566. package/template/LICENSES.md +23 -0
  567. package/template/README.md +37 -0
  568. package/template/assets/ai/guard.ogt +48 -0
  569. package/template/assets/audio/blip.wav +0 -0
  570. package/template/assets/audio/click.ogt +9 -0
  571. package/template/assets/fonts/NotoSansSC-Regular-subset.ttf +0 -0
  572. package/template/assets/fonts/NotoSansSC-Regular-subset.ttf.ogt +12 -0
  573. package/template/assets/fonts/OFL.txt +93 -0
  574. package/template/assets/looks/origin-game.ogt +12 -0
  575. package/template/assets/models/dropship.glb +0 -0
  576. package/template/assets/models/walker.glb +0 -0
  577. package/template/assets/nav/yard.ogt +27 -0
  578. package/template/assets/scenes/main.ogt +34 -0
  579. package/template/assets/strings/en.ogt +14 -0
  580. package/template/assets/textures/stone.png +0 -0
  581. package/template/assets/textures/stone_n.png +0 -0
  582. package/template/assets/textures/stone_n.png.ogt +7 -0
  583. package/template/gitattributes +22 -0
  584. package/template/gitignore +8 -0
  585. package/template/package.json +18 -0
  586. package/template/project.ogt +25 -0
  587. package/template/src/main.ts +246 -0
  588. package/template/tests/guard.og.ts +67 -0
  589. package/template/tests/smoke.og.ts +43 -0
  590. package/template/tsconfig.json +17 -0
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "origin-rhythm",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "og dev .",
8
+ "start": "og run .",
9
+ "build": "og build .",
10
+ "publish-build": "og build . --publish",
11
+ "cook": "og cook .",
12
+ "check": "og check .",
13
+ "test": "og test ."
14
+ },
15
+ "dependencies": {
16
+ "@origingame/engine": "0.1.1"
17
+ }
18
+ }
@@ -0,0 +1,14 @@
1
+ type project
2
+ version 1
3
+ ---
4
+ name "Three-Lane Beat"
5
+ id "rhythm"
6
+ engine "0.1.1"
7
+ entry "src/main.ts"
8
+ profile "2d"
9
+ tick 60
10
+ seed 1
11
+ publish {
12
+ probe player
13
+ out "dist"
14
+ }
@@ -0,0 +1,147 @@
1
+ // Every piece of Three-Lane Beat's state lives in these reflected types:
2
+ // dumps, the probe, Tune and the command channel's `get` and `set` read and
3
+ // write them by name.
4
+ //
5
+ // The play (Game), the knobs (Tuning) and the player's settings with the
6
+ // calibrated offset (Prefs) are resources. The chart is a scene
7
+ // (assets/charts/*.ogt): its `Song` row and one `Note` row per note. The
8
+ // stems, the lanes' receptors and the voices are rows spawned in `start`.
9
+
10
+ import { bool, defineComponent, defineResource, f32, f64, i32, u32 } from "@origingame/engine";
11
+
12
+ /** The screen the game is on. */
13
+ export const Phase = { Title: 0, Play: 1, Results: 2, Calibrate: 3 } as const;
14
+
15
+ /** A note's judgement (Note.judged - 1, Game.lastJudgement). */
16
+ export const Judgement = { Perfect: 0, Great: 1, Good: 2, Miss: 3 } as const;
17
+ export const JUDGEMENTS = ["perfect", "great", "good", "miss"] as const;
18
+
19
+ /** The lanes. */
20
+ export const LANES = 3;
21
+
22
+ /** Sound requests: bits of Game.sfx that the Voices system plays once each. */
23
+ export const Sound = { Tap0: 1, Tap1: 2, Tap2: 4, Miss: 8, Clear: 16, Fail: 32, Move: 64, Break: 128 } as const;
24
+
25
+ /** The play: the song's clock, the judgements, the score, the groove, the calibration, the best. */
26
+ export const Game = defineResource("Game", {
27
+ phase: u32(Phase.Title, { doc: "Phase.* of src/components.ts." }),
28
+ leftTitle: bool(false, { doc: "The player has left the title the game opened on: from then on the title enters with the skin's entrance (the opening one is built settled, og.ui.mainMenu's instant: the web draws it behind the play gate)." }),
29
+ paused: bool(false),
30
+ settingsOpen: bool(false),
31
+ held: bool(false, { doc: "The time scale is held at 0 (paused or in the settings)." }),
32
+ songStart: f64(0, { unit: "s", doc: "The world time of bar 1's first beat (og.Music.start): every note's time is songStart + beat × 60 / bpm." }),
33
+ pausedAt: f64(-1, { unit: "s", doc: "The world time the play was paused at (-1 not paused)." }),
34
+ countTo: f64(0, { unit: "s", doc: "The count-in ends at this world time (after a start or a resume)." }),
35
+ score: u32(0),
36
+ combo: u32(0),
37
+ maxCombo: u32(0),
38
+ perfect: u32(0),
39
+ great: u32(0),
40
+ good: u32(0),
41
+ miss: u32(0),
42
+ hits: u32(0, { doc: "Notes hit (perfect, great or good)." }),
43
+ judged: u32(0, { doc: "Notes judged (hit or missed)." }),
44
+ notes: u32(0, { doc: "Notes in the chart." }),
45
+ taps: u32(0, { doc: "Lane presses." }),
46
+ groove: f32(0.5, { doc: "The life gauge, 0 to 1: hits fill it, misses drain it; empty fails the song." }),
47
+ failed: bool(false),
48
+ cleared: bool(false),
49
+ lastJudgement: i32(-1, { doc: "Judgement.* of the last judged note." }),
50
+ lastOffsetMs: f32(0, { unit: "ms", doc: "The last hit's error: negative early, positive late." }),
51
+ lastLane: i32(-1),
52
+ scheduled: u32(0, { doc: "Notes put on the highway so far by og.MusicBeat (the next note to schedule)." }),
53
+ nextBar: u32(0, { doc: "The bar whose stems the Band starts next." }),
54
+ endAt: f64(0, { unit: "s", doc: "The world time the results come up (a beat after the last note, or after the groove ran out)." }),
55
+ calTaps: u32(0, { doc: "Calibration taps so far (of 8)." }),
56
+ calSum: f64(0, { unit: "ms", doc: "The calibration taps' errors, summed." }),
57
+ best: u32(0),
58
+ bestRequest: u32(0),
59
+ bestRevision: u32(0),
60
+ bestWrite: u32(0),
61
+ newBest: bool(false),
62
+ padLane: i32(-1, { doc: "A lane a command pressed this tick (-1 none)." }),
63
+ bpm: f32(120, { unit: "bpm", doc: "The chart's tempo (its Song row)." }),
64
+ bars: u32(0, { doc: "The chart's length in bars." }),
65
+ pressMask: u32(0, { doc: "The lanes pressed this tick (bit per lane)." }),
66
+ hitMask: u32(0, { doc: "The lanes whose press hit a note this tick." }),
67
+ resetNotes: bool(false, { doc: "A new play: the Play system clears every note's judgement this tick." }),
68
+ fromBeat: f32(0, { unit: "beats", doc: "Where this play started (play:<bar> starts later): earlier notes are skipped, not judged." }),
69
+ scheduleUpTo: f32(-1, { unit: "beats", doc: "A start or a resume puts the notes up to this beat on the highway (-1 none); og.MusicBeat does the rest." }),
70
+ countShown: i32(-1, { doc: "The count-in number last shown." }),
71
+ over: bool(false, { doc: "The play is over: the Ui system shows the results." }),
72
+ stopBand: bool(false, { doc: "Stop every stem this tick (a pause, a fail, the title)." }),
73
+ bandFrom: u32(0, { doc: "A start or a resume: the bar the Band starts at Game.countTo, after the count-in's clicks (0 none)." }),
74
+ bandBeat: f64(0, { doc: "Where in the song (beats from bar 1) the Band starts at Game.countTo: a bar line after a start, the beat it paused on after a resume, so the bar's stems start part-way (AudioSource.startOffset)." }),
75
+ noteTexture: f64(0, { doc: "The note's texture handle." }),
76
+ sfx: u32(0),
77
+ laneW: f32(1.5, { unit: "m", doc: "A lane's width (src/ui.ts sets the layout for the surface)." }),
78
+ hitY: f32(-3.2, { unit: "m", doc: "The hit line's height." }),
79
+ topY: f32(4.8, { unit: "m", doc: "Where notes appear." }),
80
+ viewW: f32(0, { unit: "cssPx" }),
81
+ viewH: f32(0, { unit: "cssPx" }),
82
+ language: u32(0),
83
+ });
84
+
85
+ /** The knobs. Tune reads the tunable fields; `set:Tuning.<field>=<value>` writes them. */
86
+ export const Tuning = defineResource("Tuning", {
87
+ perfectMs: f32(45, { min: 5, max: 200, step: 1, unit: "ms", tunable: true, label: "Perfect window", doc: "A hit within this of the note's time (either side) is Perfect." }),
88
+ greatMs: f32(90, { min: 5, max: 250, step: 1, unit: "ms", tunable: true, label: "Great window" }),
89
+ goodMs: f32(135, { min: 5, max: 300, step: 1, unit: "ms", tunable: true, label: "Good window", doc: "Past this late, an unhit note is a Miss." }),
90
+ scrollBeats: f32(2, { min: 0.5, max: 8, step: 0.25, unit: "beats", tunable: true, label: "Scroll", doc: "How many beats ahead a note appears at the top." }),
91
+ countInBeats: u32(4, { min: 1, max: 4, tunable: true, label: "Count-in", doc: "Beats of clicks before the song, and before it resumes." }),
92
+ grooveStart: f32(0.5, { min: 0.05, max: 1, step: 0.05, tunable: true, label: "Groove at the start" }),
93
+ grooveGain: f32(0.03, { min: 0, max: 0.5, step: 0.005, tunable: true, label: "Groove per hit" }),
94
+ grooveLoss: f32(0.1, { min: 0, max: 1, step: 0.01, tunable: true, label: "Groove per miss" }),
95
+ perfectPoints: u32(300, { min: 0, max: 10000, tunable: true }),
96
+ greatPoints: u32(200, { min: 0, max: 10000, tunable: true }),
97
+ goodPoints: u32(100, { min: 0, max: 10000, tunable: true }),
98
+ comboStep: u32(10, { min: 1, max: 100, tunable: true, label: "Combo per multiplier", doc: "Every this many in a row raises the multiplier by one, up to four." }),
99
+ });
100
+
101
+ /** The player's settings: kept in og.platform's settings, restored on the first ticks. */
102
+ export const Prefs = defineResource("Prefs", {
103
+ master: f32(1, { min: 0, max: 1 }),
104
+ music: f32(0.8, { min: 0, max: 1 }),
105
+ effects: f32(0.8, { min: 0, max: 1 }),
106
+ language: u32(0, { doc: "0 English, 1 简体中文 (LANGUAGES in src/ui.ts)." }),
107
+ reducedMotion: bool(false),
108
+ offsetMs: f32(0, { min: -250, max: 250, unit: "ms", doc: "How late this device's sound and picture reach the player (calibrated): a press is judged this much earlier." }),
109
+ loadRequest: u32(0),
110
+ saves: u32(0),
111
+ });
112
+
113
+ /** The chart's song: tempo, metre and length (one row, from the chart scene). */
114
+ export const Song = defineComponent("Song", {
115
+ bpm: f32(120, { unit: "bpm" }),
116
+ beatsPerBar: u32(4),
117
+ bars: u32(0),
118
+ notes: u32(0),
119
+ });
120
+
121
+ /** A note of the chart (a row from the chart scene): its lane and beat, then how it went. */
122
+ export const Note = defineComponent("Note", {
123
+ index: u32(0, { doc: "Its place in the chart, in time order." }),
124
+ lane: u32(0, { doc: "0 left, 1 middle, 2 right." }),
125
+ beat: f32(0, { unit: "beats", doc: "From 0 at bar 1's first beat." }),
126
+ live: bool(false, { doc: "On the highway (scheduled by og.MusicBeat, not yet judged)." }),
127
+ judged: u32(0, { doc: "0 not yet, else Judgement.* + 1 (5: skipped, before a play that started later)." }),
128
+ errorMs: f32(0, { unit: "ms", doc: "How early (negative) or late it was hit." }),
129
+ });
130
+
131
+ /** A stem of the song: started on its bar lines by the Band. */
132
+ export const Stem = defineComponent("Stem", {
133
+ part: u32(0, { doc: "PARTS index in src/systems.ts." }),
134
+ starts: u32(0, { doc: "Times started." }),
135
+ });
136
+
137
+ /** A lane's receptor at the hit line: it flashes and squashes on a press. */
138
+ export const Receptor = defineComponent("Receptor", {
139
+ lane: u32(0),
140
+ presses: u32(0),
141
+ });
142
+
143
+ /** One voice: plays its sound once when Game.sfx asks for its bit. */
144
+ export const Sfx = defineComponent("Sfx", {
145
+ bit: u32(0),
146
+ plays: u32(0),
147
+ });
@@ -0,0 +1,202 @@
1
+ // Three-Lane Beat, the rhythm archetype (2D profile): notes fall down three
2
+ // lanes to the hit line in time with "Neon Pulse" (120 BPM, 24 bars); hit
3
+ // each as it crosses the line (A S D, the arrows, a finger on the lane, the
4
+ // pad). Every hit is judged by how far it was from the note's exact time
5
+ // (Perfect, Great, Good), every note let past is a Miss; hits build the
6
+ // combo and its multiplier and fill the groove, misses drain it, and an
7
+ // empty groove ends the song early. A calibration measures how late this
8
+ // device's sound and picture reach the player.
9
+ //
10
+ // The song is its stems, started on bar lines through og.Music (src/
11
+ // systems.ts's Band); the chart is a scene (assets/charts/neon-pulse.ogt)
12
+ // of a Song row and a Note row per note. `start` loads them, the skin, the
13
+ // strings and the sounds, and spawns the clock, the stems, the receptors
14
+ // and the voices. The systems are in src/systems.ts, the screens in
15
+ // src/ui.ts and the state in src/components.ts.
16
+
17
+ import { og } from "@origingame/engine";
18
+ import type { World } from "@origingame/engine";
19
+ import { Game, LANES, Prefs, Receptor, Sfx, Song, Sound, Stem, Tuning } from "./components.ts";
20
+ import { Band, Clock, LANE_COLOURS, Lanes, PARTS, Play, Voices, worldTime } from "./systems.ts";
21
+ import { accuracy, begin, calibrate, LANGUAGES, pause, resume, Ui } from "./ui.ts";
22
+
23
+ /** The night, linear. */
24
+ const NIGHT = { r: 0.002, g: 0.006, b: 0.014 };
25
+
26
+ function must<T>(r: { ok: true; value: T } | { ok: false; reason: string }): T;
27
+ function must(r: { ok: true } | { ok: false; reason: string }): void;
28
+ function must<T>(r: { ok: true; value?: T } | { ok: false; reason: string }): T | void {
29
+ if (!r.ok) throw new Error(r.reason);
30
+ return r.value;
31
+ }
32
+
33
+ function start(world: World): void {
34
+ for (const l of LANGUAGES) must(og.i18n.load(world, `strings/${l.code}.ogt`));
35
+ const skin = must(og.load.skin(world, "skins/lanebeat/skin.ogt"));
36
+ const sound = (path: string) => must(og.load.sound(world, path));
37
+ must(og.ui.configure(world, { skin, 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") } }));
38
+
39
+ const settings = must(world.resource(og.RenderSettings));
40
+ settings.environmentIntensity = 0;
41
+ settings.toneMapped = false;
42
+ const camera = must(world.resource(og.Camera));
43
+ camera.orthographic = true;
44
+ camera.height = 10;
45
+ camera.position = { x: 0, y: 0, z: 50 };
46
+ camera.background = NIGHT;
47
+
48
+ // The chart: a Song row and a Note row per note.
49
+ must(world.instantiate(must(og.load.scene(world, "charts/neon-pulse.ogt")), { name: "chart" }));
50
+ const songRow = world.find("song");
51
+ if (songRow === null) throw new Error("charts/neon-pulse.ogt has no entity named song");
52
+ const song = must(world.get(songRow, Song));
53
+ const game = must(world.resource(Game));
54
+ game.bpm = song.bpm;
55
+ game.bars = song.bars;
56
+ game.notes = song.notes;
57
+ const texture = (path: string) => must(og.load.texture(world, path));
58
+ game.noteTexture = texture("sprites/note.png") as unknown as number;
59
+
60
+ // The clock the stems start on (og.Music; the Clock system keeps it on Game.songStart).
61
+ const clock = must(world.spawn({ name: "clock" }));
62
+ must(world.insert(clock, og.Music, { bpm: song.bpm, beatsPerBar: song.beatsPerBar, start: 1e6 }));
63
+ PARTS.forEach((part, i) => {
64
+ const e = must(world.spawn({ name: `stem-${part}` }));
65
+ const click = part.startsWith("click");
66
+ must(world.insert(e, og.AudioSource, { sound: sound(`audio/${click ? "click" : part}.wav`), playing: false, bus: click ? "ui" : "music", volume: click ? 0.6 : part === "drums" ? 0.8 : 0.6, priority: 240, fade: 0.004 }));
67
+ must(world.insert(e, Stem, { part: i }));
68
+ });
69
+
70
+ // The highway: three lanes' glow, the hit line's receptors (with their bursts).
71
+ const lane = texture("sprites/lane.png");
72
+ const ring = texture("sprites/ring.png");
73
+ const hit = must(og.load.emitter(world, "fx/hit.ogt"));
74
+ for (let i = 0; i < LANES; i++) {
75
+ const c = LANE_COLOURS[i]!;
76
+ const glow = must(world.spawn({ name: `lane-${i}`, position: { x: (i - 1) * 1.5, y: -0.2, z: 0 } }));
77
+ must(world.insert(glow, og.Sprite, { texture: lane, width: 1.4, height: 9.6, color: c, opacity: 0.22, blend: "additive", layer: 1 }));
78
+ const r = must(world.spawn({ name: `receptor-${i}`, position: { x: (i - 1) * 1.5, y: -3.2, z: 0 } }));
79
+ must(world.insert(r, og.Sprite, { texture: ring, width: 1.29, height: 0.54, color: c, opacity: 0.6, layer: 5, visible: false }));
80
+ must(world.insert(r, og.ParticleSystem, { emitter: hit, seed: i + 1, visible: false }));
81
+ must(world.insert(r, Receptor, { lane: i }));
82
+ }
83
+
84
+ const voices: [string, number, "sfx" | "ui", number][] = [
85
+ ["audio/tap0.wav", Sound.Tap0, "ui", 0.45],
86
+ ["audio/tap1.wav", Sound.Tap1, "ui", 0.45],
87
+ ["audio/tap2.wav", Sound.Tap2, "ui", 0.45],
88
+ ["audio/miss.wav", Sound.Miss, "sfx", 0.5],
89
+ ["audio/miss.wav", Sound.Break, "sfx", 0.8],
90
+ ["audio/clear.wav", Sound.Clear, "sfx", 0.7],
91
+ ["audio/fail.wav", Sound.Fail, "sfx", 0.7],
92
+ ["audio/ui-press.ogt", Sound.Move, "ui", 0.3],
93
+ ];
94
+ for (const [path, bit, bus, volume] of voices) {
95
+ const v = must(world.spawn({ name: `sfx-${bit}` }));
96
+ must(world.insert(v, og.AudioSource, { sound: sound(path), playing: false, bus, volume, priority: 200 }));
97
+ must(world.insert(v, Sfx, { bit }));
98
+ }
99
+ }
100
+
101
+ function gameOf(world: World) {
102
+ return must(world.resource(Game));
103
+ }
104
+
105
+ function num(s: string | undefined, what: string): number {
106
+ const n = Number(s);
107
+ if (s === undefined || !Number.isFinite(n)) throw new Error(`${what} is a number`);
108
+ return n;
109
+ }
110
+
111
+ /** `play[:<bar>]`: start the song now, as Play does; from a later bar, the notes before it skipped. */
112
+ function play(world: World, args: readonly string[]): void {
113
+ begin(world, gameOf(world), args[0] === undefined ? 1 : num(args[0], "bar"));
114
+ }
115
+
116
+ /** `hit:<lane>`: press a lane this tick, as a key or a finger does. */
117
+ function hit(world: World, args: readonly string[]): void {
118
+ const lane = num(args[0], "lane");
119
+ if (lane < 0 || lane >= LANES) throw new Error("the lane is 0, 1 or 2");
120
+ gameOf(world).padLane = lane;
121
+ }
122
+
123
+ /** `groove:<0-1>`: set the groove. */
124
+ function groove(world: World, args: readonly string[]): void {
125
+ gameOf(world).groove = num(args[0], "groove");
126
+ }
127
+
128
+ /** `offset:<ms>`: set the calibrated offset. */
129
+ function offset(world: World, args: readonly string[]): void {
130
+ must(world.resource(Prefs)).offsetMs = num(args[0], "ms");
131
+ }
132
+
133
+ /** `viewport:<desktop|phone>`: lay the UI out for a phone in portrait. */
134
+ function viewport(world: World, args: readonly string[]): void {
135
+ const phone = { width: 390, height: 844, dpr: 3, safeArea: { left: 0, top: 47, right: 0, bottom: 34 }, coarsePointer: true, breakpoint: "phonePortrait" } as const;
136
+ og.ui.previewViewport(world, args[0] === "phone" ? phone : null);
137
+ }
138
+
139
+ /** `language:<en|zh-CN>`. */
140
+ function language(world: World, args: readonly string[]): void {
141
+ const p = must(world.resource(Prefs));
142
+ const at = LANGUAGES.findIndex((l) => l.code === args[0]);
143
+ if (at < 0) throw new Error("write language:<en|zh-CN>");
144
+ p.language = at;
145
+ og.i18n.setLocale(world, LANGUAGES[at]!.code);
146
+ }
147
+
148
+ export default og.game({
149
+ tick: 60,
150
+ seed: 1,
151
+ resources: [Game, Tuning, Prefs],
152
+ systems: [Ui, Clock, Play, Band, Lanes, Voices],
153
+ render: { antialias: "msaa4" },
154
+ start,
155
+ commands: {
156
+ play,
157
+ hit,
158
+ groove,
159
+ offset,
160
+ calibrate: (world: World) => calibrate(world, gameOf(world)),
161
+ hold: (world: World) => pause(world, gameOf(world)),
162
+ unhold: (world: World) => resume(world, gameOf(world)),
163
+ viewport,
164
+ language,
165
+ },
166
+ commandHelp: {
167
+ play: { usage: "[<bar>]", doc: "Start the song now, as Play does (the count-in, then bar 1); from a later bar, the earlier notes skipped." },
168
+ hit: { usage: "<lane 0-2>", doc: "Press a lane this tick, as a key or a finger does." },
169
+ groove: { usage: "<0-1>", doc: "Set the groove (the life gauge)." },
170
+ offset: { usage: "<ms>", doc: "Set the calibrated offset." },
171
+ calibrate: { usage: "", doc: "Open the calibration, as Calibrate does." },
172
+ hold: { usage: "", doc: "Pause the play, as Escape does." },
173
+ unhold: { usage: "", doc: "Resume the play, as Resume does (on its phrase's bar line, after a count-in)." },
174
+ viewport: { usage: "<desktop|phone>", doc: "Lay the UI out for a phone in portrait (390×844 at 3×)." },
175
+ language: { usage: "<en|zh-CN>", doc: "Switch the language as the settings do." },
176
+ },
177
+ facts: (world) => {
178
+ const game = world.resource(Game);
179
+ if (!game.ok) return null;
180
+ const g = game.value;
181
+ return {
182
+ phase: ["title", "play", "results", "calibrate"][g.phase],
183
+ time: worldTime(world) - g.songStart,
184
+ score: g.score,
185
+ combo: g.combo,
186
+ maxCombo: g.maxCombo,
187
+ perfect: g.perfect,
188
+ great: g.great,
189
+ good: g.good,
190
+ miss: g.miss,
191
+ judged: g.judged,
192
+ notes: g.notes,
193
+ groove: g.groove,
194
+ accuracy: accuracy(g),
195
+ cleared: g.cleared,
196
+ failed: g.failed,
197
+ best: g.best,
198
+ language: LANGUAGES[g.language]!.code,
199
+ };
200
+ },
201
+ });
202
+