diff --git a/.gitignore b/.gitignore index ea8c4bf..e71c7de 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ /target +/assets/* +!/assets/.gitkeep +thbgm.dat diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6aede6d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "rust-analyzer.cargo.buildScripts.rebuildOnSave": false +} diff --git a/Cargo.lock b/Cargo.lock index ba865e1..3c79383 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "ab_glyph" -version = "0.2.28" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79faae4620f45232f599d9bc7b290f88247a0834162c4495ab2f02d60004adfb" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -20,9 +20,9 @@ checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -49,7 +49,7 @@ dependencies = [ "getrandom", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -67,6 +67,28 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +[[package]] +name = "alsa" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" +dependencies = [ + "alsa-sys", + "bitflags 2.6.0", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + [[package]] name = "android-activity" version = "0.6.0" @@ -81,7 +103,7 @@ dependencies = [ "jni-sys", "libc", "log", - "ndk", + "ndk 0.9.0", "ndk-context", "ndk-sys 0.6.0+11769913", "num_enum", @@ -105,9 +127,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" dependencies = [ "anstyle", "anstyle-parse", @@ -120,43 +142,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" dependencies = [ "backtrace", ] @@ -203,6 +225,119 @@ dependencies = [ "libloading", ] +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-std" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "atomic-waker" version = "1.1.2" @@ -247,6 +382,24 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.87", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -304,6 +457,19 @@ dependencies = [ "objc2", ] +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -312,22 +478,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -338,9 +504,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "calloop" @@ -370,9 +536,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.22" +version = "1.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9540e661f81799159abee814118cc139a2004b3a3aa3ea37724a1b66530b90e0" +checksum = "67b9470d453346108f93a59222a9a1a5724db32d0a4727b7ab7ace4b4d822dc9" dependencies = [ "jobserver", "libc", @@ -385,6 +551,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -408,22 +583,47 @@ name = "chireiden-thing" version = "0.1.0" dependencies = [ "anyhow", + "async-std", "bytemuck", + "crossbeam", "env_logger", "glam", + "identconv", "log", "macros", + "memmap2", + "microstate", "ndarray", "nonoverlapping_interval_tree", "num-derive", "num-traits", - "pollster", + "paste", "rand", + "rodio", + "sfsm", "truth", "wgpu", "winit", + "zerocopy 0.8.8", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "claxon" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" + [[package]] name = "codespan" version = "0.11.1" @@ -451,9 +651,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "com" @@ -505,6 +705,21 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -545,6 +760,49 @@ dependencies = [ "libc", ] +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2", + "ndk 0.8.0", + "ndk-context", + "oboe", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.54.0", +] + [[package]] name = "crc32fast" version = "1.4.2" @@ -554,6 +812,56 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.20" @@ -583,6 +891,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + [[package]] name = "deflate" version = "0.8.6" @@ -673,9 +987,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -740,6 +1054,39 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener 5.3.1", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + [[package]] name = "fixedbitset" version = "0.4.2" @@ -770,7 +1117,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -779,6 +1126,40 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f1fa2f9765705486b33fd2acf1577f8ec449c2ba1f318ae5447697b7c08d210" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "gethostname" version = "0.4.3" @@ -821,9 +1202,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git-version" @@ -842,7 +1223,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -858,13 +1239,31 @@ dependencies = [ [[package]] name = "glam" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28091a37a5d09b555cb6628fd954da299b536433834f5b8e59eba78e0cbbf8a" +checksum = "480c9417a5dc586fc0c0cb67891170e59cc11e9dc79ba1c11ddd2c56ca3f3b90" dependencies = [ "bytemuck", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "glow" version = "0.13.1" @@ -915,7 +1314,7 @@ dependencies = [ "presser", "thiserror", "winapi", - "windows", + "windows 0.52.0", ] [[package]] @@ -954,6 +1353,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + [[package]] name = "hassle-rs" version = "0.11.0" @@ -999,12 +1404,28 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "identconv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02df3085f97750c1f8deb1b56aeb168f242f303e363aee16284821c0a14ff90e" +dependencies = [ + "convert_case 0.6.0", + "litrs", +] + [[package]] name = "image" version = "0.23.14" @@ -1033,12 +1454,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -1067,6 +1488,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -1106,9 +1536,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1130,6 +1560,15 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lalrpop" version = "0.19.12" @@ -1141,7 +1580,7 @@ dependencies = [ "diff", "ena", "is-terminal", - "itertools", + "itertools 0.10.5", "lalrpop-util", "petgraph", "regex", @@ -1168,10 +1607,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "libc" -version = "0.2.159" +name = "lewton" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + +[[package]] +name = "libc" +version = "0.2.161" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libloading" @@ -1183,17 +1633,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "libredox" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" -dependencies = [ - "bitflags 2.6.0", - "libc", - "redox_syscall 0.4.1", -] - [[package]] name = "libredox" version = "0.1.3" @@ -1202,6 +1641,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", + "redox_syscall 0.5.7", ] [[package]] @@ -1215,6 +1655,9 @@ name = "litrs" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +dependencies = [ + "proc-macro2", +] [[package]] name = "lock_api" @@ -1231,6 +1674,9 @@ name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +dependencies = [ + "value-bag", +] [[package]] name = "logos" @@ -1255,13 +1701,22 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "macros" version = "0.1.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", "truth", ] @@ -1314,6 +1769,18 @@ dependencies = [ "paste", ] +[[package]] +name = "microstate" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397648ede92f9f106601b9fa9926b72277c5ac82dc8d7d38b89620350a2437e5" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.3.7" @@ -1344,7 +1811,7 @@ dependencies = [ "cfg_aliases 0.1.1", "codespan-reporting", "hexf-parse", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "rustc-hash", "spirv", @@ -1368,6 +1835,20 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum", + "thiserror", +] + [[package]] name = "ndk" version = "0.9.0" @@ -1413,6 +1894,16 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nonoverlapping_interval_tree" version = "0.1.5" @@ -1436,7 +1927,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -1497,7 +1988,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -1714,40 +2205,75 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] -name = "once_cell" -version = "1.20.1" +name = "oboe" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" dependencies = [ - "portable-atomic", + "jni", + "ndk 0.8.0", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", ] [[package]] -name = "orbclient" -version = "0.3.47" +name = "oboe-sys" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" dependencies = [ - "libredox 0.0.2", + "cc", +] + +[[package]] +name = "ogg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +dependencies = [ + "byteorder", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "orbclient" +version = "0.3.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +dependencies = [ + "libredox", ] [[package]] name = "owned_ttf_parser" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490d3a563d3122bf7c911a59b0add9389e5ec0f5f0c3ac6b91ff235a0e6a7f90" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" dependencies = [ "ttf-parser", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.3" @@ -1766,7 +2292,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.6", + "redox_syscall 0.5.7", "smallvec", "windows-targets 0.52.6", ] @@ -1790,7 +2316,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.5.0", + "indexmap 2.6.0", ] [[package]] @@ -1804,29 +2330,46 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] [[package]] name = "pkg-config" @@ -1861,12 +2404,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "pollster" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" - [[package]] name = "portable-atomic" version = "1.9.0" @@ -1875,9 +2412,9 @@ checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" [[package]] name = "portable-atomic-util" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdd8420072e66d54a407b3316991fe946ce3ab1083a7f575b2463866624704d" +checksum = "90a7d5beecc52a491b54d6dd05c7a45ba1801666a5baad9fdbfc6fef8d2d206c" dependencies = [ "portable-atomic", ] @@ -1888,7 +2425,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -1914,18 +2451,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" [[package]] name = "quick-xml" @@ -2004,9 +2541,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355ae415ccd3a04315d3f8246e86d67689ea74d88d915576e1589a351062a13b" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -2018,15 +2555,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", - "libredox 0.1.3", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -2063,6 +2600,20 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "rodio" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6006a627c1a38d37f3d3a85c6575418cfe34a5392d60a686d0071e1c8d427acb" +dependencies = [ + "claxon", + "cpal", + "hound", + "lewton", + "symphonia", + "thiserror", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -2077,9 +2628,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" dependencies = [ "bitflags 2.6.0", "errno", @@ -2090,9 +2641,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" @@ -2136,29 +2687,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -2166,6 +2717,35 @@ dependencies = [ "serde", ] +[[package]] +name = "sfsm" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a289ce9b0eba12af4255644fb14c0bffeeaf5bf5330fd9263934fcec08b6d8d" +dependencies = [ + "sfsm-base", + "sfsm-proc", +] + +[[package]] +name = "sfsm-base" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd9e118b1836f9a7ace413b1b6d43f966d17a91511b391cd71d7f17cad6bfce" + +[[package]] +name = "sfsm-proc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb0715248b6926a29181937bc0bddf6c35e521d2896924a7934877caeea474b" +dependencies = [ + "convert_case 0.4.0", + "proc-macro2", + "quote", + "sfsm-base", + "syn 1.0.109", +] + [[package]] name = "shlex" version = "1.3.0" @@ -2297,6 +2877,55 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "symphonia" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" +dependencies = [ + "lazy_static", + "symphonia-bundle-mp3", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-core" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + [[package]] name = "syn" version = "1.0.109" @@ -2310,9 +2939,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -2341,22 +2970,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -2393,6 +3022,21 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "toml_datetime" version = "0.6.8" @@ -2405,7 +3049,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "toml_datetime", "winnow", ] @@ -2457,9 +3101,9 @@ dependencies = [ [[package]] name = "ttf-parser" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be21190ff5d38e8b4a2d3b6a3ae57f612cc39c96e83cedeaf7abc338a8bac4a" +checksum = "5902c5d130972a0000f60860bfbf46f7ca3db5391eddfedd1b8728bd9dc96c0e" [[package]] name = "unicode-ident" @@ -2491,6 +3135,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "value-bag" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" + [[package]] name = "version_check" version = "0.9.5" @@ -2515,9 +3165,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -2526,24 +3176,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -2553,9 +3203,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2563,22 +3213,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wayland-backend" @@ -2596,9 +3246,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" +checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ "bitflags 2.6.0", "rustix", @@ -2619,9 +3269,9 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a94697e66e76c85923b0d28a0c251e8f0666f58fc47d316c0f4da6da75d37cb" +checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" dependencies = [ "rustix", "wayland-client", @@ -2630,9 +3280,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.4" +version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" +checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -2642,9 +3292,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0a41a6875e585172495f7a96dfa42ca7e0213868f4f15c313f7c33221a7eff" +checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -2655,9 +3305,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad87b5fd1b1d3ca2f792df8f686a2a11e3fe1077b71096f7a175ab699f89109" +checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -2691,9 +3341,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -2751,7 +3401,7 @@ dependencies = [ "bitflags 2.6.0", "cfg_aliases 0.1.1", "document-features", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "naga", "once_cell", @@ -2864,7 +3514,17 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core", + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", "windows-targets 0.52.6", ] @@ -2877,6 +3537,25 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -3104,7 +3783,7 @@ dependencies = [ "js-sys", "libc", "memmap2", - "ndk", + "ndk 0.9.0", "objc2", "objc2-app-kit", "objc2-foundation", @@ -3213,7 +3892,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a4e33e6dce36f2adba29746927f8e848ba70989fdb61c772773bbdda8b5d6a7" +dependencies = [ + "zerocopy-derive 0.8.8", ] [[package]] @@ -3224,5 +3912,16 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cd137b4cc21bde6ecce3bbbb3350130872cda0be2c6888874279ea76e17d4c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", ] diff --git a/Cargo.toml b/Cargo.toml index fc81d05..ac16442 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,7 @@ edition = "2021" [dependencies] env_logger = "0.11.5" log = "0.4.22" -pollster = "0.3.0" -wgpu = "22.1.0" +wgpu = "22.1" winit = "0.30.5" macros = { path = "macros" } ndarray = "0.16.1" @@ -15,7 +14,16 @@ num-derive = "0.4.2" num-traits = "0.2.19" rand = "0.8.5" truth = { git = "https://github.com/ExpHP/truth" } -anyhow = { version = "1.0.89", features = ["backtrace"] } -glam = { version = "0.29.0", features = ["bytemuck"] } -bytemuck = { version = "1.18.0", features = ["derive"] } +anyhow = { version = "1.0", features = ["backtrace"] } +glam = { version = "0.29", features = ["bytemuck"] } +bytemuck = { version = "1.18", features = ["derive"] } nonoverlapping_interval_tree = "0.1.5" +memmap2 = "0.9.5" +rodio = "0.19.0" +zerocopy = { version = "0.8.8", features = ["derive"] } +microstate = "1.0.0" +sfsm = "0.4.3" +identconv = "0.2.0" +paste = "1.0.15" +crossbeam = "0.8.4" +async-std = { version = "1.13.0" } diff --git a/assets/.gitkeep b/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/assets/ascii.anm b/assets/ascii.anm deleted file mode 100644 index 5ea5b64..0000000 Binary files a/assets/ascii.anm and /dev/null differ diff --git a/assets/bullet.anm b/assets/bullet.anm deleted file mode 100644 index 11fa1c5..0000000 Binary files a/assets/bullet.anm and /dev/null differ diff --git a/assets/default.ecl b/assets/default.ecl deleted file mode 100644 index 68cf468..0000000 Binary files a/assets/default.ecl and /dev/null differ diff --git a/assets/demo0.rpy b/assets/demo0.rpy deleted file mode 100644 index 9aa304d..0000000 Binary files a/assets/demo0.rpy and /dev/null differ diff --git a/assets/demo1.rpy b/assets/demo1.rpy deleted file mode 100644 index 9563aae..0000000 Binary files a/assets/demo1.rpy and /dev/null differ diff --git a/assets/demo2.rpy b/assets/demo2.rpy deleted file mode 100644 index ab4c5ba..0000000 Binary files a/assets/demo2.rpy and /dev/null differ diff --git a/assets/demo3.rpy b/assets/demo3.rpy deleted file mode 100644 index cc7fe53..0000000 Binary files a/assets/demo3.rpy and /dev/null differ diff --git a/assets/e00.anm b/assets/e00.anm deleted file mode 100644 index be59d56..0000000 Binary files a/assets/e00.anm and /dev/null differ diff --git a/assets/e00.msg b/assets/e00.msg deleted file mode 100644 index 035b583..0000000 Binary files a/assets/e00.msg and /dev/null differ diff --git a/assets/e01.anm b/assets/e01.anm deleted file mode 100644 index a49c9f0..0000000 Binary files a/assets/e01.anm and /dev/null differ diff --git a/assets/e01.msg b/assets/e01.msg deleted file mode 100644 index 9fbfe22..0000000 Binary files a/assets/e01.msg and /dev/null differ diff --git a/assets/e02.anm b/assets/e02.anm deleted file mode 100644 index d079390..0000000 Binary files a/assets/e02.anm and /dev/null differ diff --git a/assets/e02.msg b/assets/e02.msg deleted file mode 100644 index 6a24373..0000000 Binary files a/assets/e02.msg and /dev/null differ diff --git a/assets/e03.anm b/assets/e03.anm deleted file mode 100644 index d8b17e1..0000000 Binary files a/assets/e03.anm and /dev/null differ diff --git a/assets/e03.msg b/assets/e03.msg deleted file mode 100644 index e0d3a19..0000000 Binary files a/assets/e03.msg and /dev/null differ diff --git a/assets/e04.anm b/assets/e04.anm deleted file mode 100644 index 9ed3def..0000000 Binary files a/assets/e04.anm and /dev/null differ diff --git a/assets/e04.msg b/assets/e04.msg deleted file mode 100644 index 891e75d..0000000 Binary files a/assets/e04.msg and /dev/null differ diff --git a/assets/e05.anm b/assets/e05.anm deleted file mode 100644 index 23e99da..0000000 Binary files a/assets/e05.anm and /dev/null differ diff --git a/assets/e05.msg b/assets/e05.msg deleted file mode 100644 index 900ea00..0000000 Binary files a/assets/e05.msg and /dev/null differ diff --git a/assets/e06.anm b/assets/e06.anm deleted file mode 100644 index ec0a054..0000000 Binary files a/assets/e06.anm and /dev/null differ diff --git a/assets/e06.msg b/assets/e06.msg deleted file mode 100644 index 0c4df67..0000000 Binary files a/assets/e06.msg and /dev/null differ diff --git a/assets/e07.anm b/assets/e07.anm deleted file mode 100644 index 2ec449f..0000000 Binary files a/assets/e07.anm and /dev/null differ diff --git a/assets/e07.msg b/assets/e07.msg deleted file mode 100644 index 02fbf32..0000000 Binary files a/assets/e07.msg and /dev/null differ diff --git a/assets/e08.anm b/assets/e08.anm deleted file mode 100644 index fdea92e..0000000 Binary files a/assets/e08.anm and /dev/null differ diff --git a/assets/e08.msg b/assets/e08.msg deleted file mode 100644 index f157ed4..0000000 Binary files a/assets/e08.msg and /dev/null differ diff --git a/assets/e09.anm b/assets/e09.anm deleted file mode 100644 index e0b7a3a..0000000 Binary files a/assets/e09.anm and /dev/null differ diff --git a/assets/e09.msg b/assets/e09.msg deleted file mode 100644 index d154348..0000000 Binary files a/assets/e09.msg and /dev/null differ diff --git a/assets/e10.anm b/assets/e10.anm deleted file mode 100644 index 0879102..0000000 Binary files a/assets/e10.anm and /dev/null differ diff --git a/assets/e10.msg b/assets/e10.msg deleted file mode 100644 index ccb060c..0000000 Binary files a/assets/e10.msg and /dev/null differ diff --git a/assets/e11.anm b/assets/e11.anm deleted file mode 100644 index d6bda2c..0000000 Binary files a/assets/e11.anm and /dev/null differ diff --git a/assets/e11.msg b/assets/e11.msg deleted file mode 100644 index f2b3539..0000000 Binary files a/assets/e11.msg and /dev/null differ diff --git a/assets/enemy.anm b/assets/enemy.anm deleted file mode 100644 index 74e3254..0000000 Binary files a/assets/enemy.anm and /dev/null differ diff --git a/assets/front.anm b/assets/front.anm deleted file mode 100644 index a044add..0000000 Binary files a/assets/front.anm and /dev/null differ diff --git a/assets/musiccmt.txt b/assets/musiccmt.txt deleted file mode 100644 index da0a3c6..0000000 --- a/assets/musiccmt.txt +++ /dev/null @@ -1,221 +0,0 @@ -# -# 曲のコメント -# - -#0123456789012345678901234567890 -@bgm/th11_00.wav -No. 1 地霊達の起床 -♪地霊達の起床 -  - タイトル画面のテーマです。 -  - まあいつもの感じで。 - 洞窟って音が響くとそれっぽいのでそれっぽくなるように - 努力しました。 - 洞窟いいね。 - -@bgm/th11_01.wav -No. 2 暗闇の風穴 -♪暗闇の風穴 -  - 1面のテーマです。 - 折角の洞窟って事で、1面にしてはちょっと暗い感じにしました。 -  - 可愛い感じに少し不気味さを乗せて……ってノリがいいと不気味に - 聞こえない罠。 - スピード感のあるホラーゲームもしてみたい。 - -@bgm/th11_02.wav -No. 3 封じられた妖怪 〜 Lost Place -♪封じられた妖怪 〜 Lost Place -  - 黒谷ヤマメのテーマです。 -  - 1面にしては格好良く創ってみようと書きました。 - 昔ながらのゲームミュージックらしさ溢れるシンプルな曲です。 - つくづく判りやすいメロディの方がゲームが盛り上がっていいなと - 思うのです。 - -@bgm/th11_03.wav -No. 4 渡る者の途絶えた橋 -♪渡る者の途絶えた橋 -  - 2面のテーマです。 -  - 深く深く降りていく。 - 自己主張は少なめに雰囲気重視でと、まさに道中オブ道中曲。 - 妙に和風になってしまったのは意図した訳ではなく、なっちゃった - だけともいう。関係無いけど洞窟いいね。 - -#0123456789012345678901234567890 -@bgm/th11_05.wav -No. 5 緑眼のジェラシー -♪緑眼のジェラシー -  - 水橋パルスィのテーマです。 -  - 心の病んだ妖怪です。 - そんな訳でメロディアスな曲にしたいと思ってこんな感じに。 - シューティングとは思えないような曲だけどシューティングに合う - 曲を考えていたらこんな感じに落ち着きました。 - - -#0123456789012345678901234567890 -@bgm/th11_06.wav -No. 6 旧地獄街道を行く -♪旧地獄街道を行く -  - 3面のテーマです。 -  - 平和で喧嘩が華の江戸の町っぽいイメージで書きました。 - やっぱり楽しげで軽快なのは良いですよね。 - 何とも懐かしい雰囲気のする曲です。 - 街を歩くときも、この曲位うきうき気分で闊歩したいものです。 - -#0123456789012345678901234567890 -@bgm/th11_07.wav -No. 7 華のさかづき大江山 -♪華のさかづき大江山 -  - 星熊 勇儀のテーマです。 -  - 強そうで遊び心溢れる感じを目指しました。 - 実は勇儀、お酒を一滴も零さずに闘うというルールを自分に課して - います。やっぱり退屈なんですね。 - 何か、人間より地獄の鬼の方が面白みがある気がします。 - - -#0123456789012345678901234567890 -@bgm/th11_08.wav -No. 8 ハートフェルトファンシー -♪ハートフェルトファンシー -  - 4面のテーマです。 -  - 余り和風に偏りすぎないように創りました。 - 地霊殿は思いの外西洋風の造りなんですね。住んでいる人達も - どこかしらファンシー。 - でも猫屋敷。猫に飼われたいですね。 - - -#0123456789012345678901234567890 -@bgm/th11_10.wav -No. 9 少女さとり 〜 3rd eye -♪少女さとり 〜 3rd eye -  - 古明地さとりのテーマです。 -  - 地霊殿の主です。ちょっとファンシーで動物好き。 - 実は今回の地霊殿の中では一番の大物、の筈ですが、戦闘は余り - 得意ではない様子。 - 曲も大物っぽさと不気味さを出してみました。 - - -#0123456789012345678901234567890 -@bgm/th11_12.wav -No.10 廃獄ララバイ -♪廃獄ララバイ -  - 5面のテーマです。 -  - 灼熱地獄も罪人が落とされなくなってから、鬼が訪れる事も無く - 怨霊と動物達の遊び場と化している様子。 - 実は人の住まなくなった建物とか見るとゾクゾクします。 - 旧地獄も廃墟特有の切なさに包まれて……と想像して創った曲です。 - - -#0123456789012345678901234567890 -@bgm/th11_13.wav -No.11 死体旅行 〜 Be of good cheer! -♪死体旅行 〜 Be of good cheer! -  - お燐のテーマです。 -  - 元気さが不気味な猫のテーマです。 - 4、5面と重い感じにしてきたので、一気に明るくしてみました。 - お燐が押している車は猫車です。何を運んでいるかって? - 聞かない方が良かったと思う筈ですよ。 - -#0123456789012345678901234567890 -@bgm/th11_14.wav -No.12 業火マントル - -♪業火マントル -  - 最終面のテーマです。 -  - いかにも終盤って感じを出してみました。 - 溶岩の中を進むのはシューティングゲームでは定番ですね。 - 何が言いたいかというと、巫女さんが溶岩の上を飛んでも特に - 不思議ではない、という事です。カラスもね。 - - -#0123456789012345678901234567890 -@bgm/th11_16.wav -No.13 霊知の太陽信仰 〜 Nuclear Fusion - -♪霊知の太陽信仰 〜 Nuclear Fusion -  - 霊烏路 空のテーマです。 -  - 出来る限り軽く近代的で、単純にボスっぽい感じで攻めてみました。 - 事実、ラスボスとしては相当軽い妖怪です。しょせん鳥だしね。 - ただ力は滅茶苦茶強いのです。強い力でも馬鹿に持たせれば悪用す - らできないって事がよく判ります。ああ夢のエネルギーなのに。 - - -#0123456789012345678901234567890 -@bgm/th11_15.wav -No.14 ラストリモート - -♪ラストリモート -  - エキストラステージのテーマです。 -  - 何故か急いでいる感じになっていますが、そこまで緊急な出来事が - あった訳でもなくみんなは暢気です。 - 特に守矢神社の奴らの暢気っぷりといったら、霊夢でも敵いそうに - ありません。曲名は某STGと関係ありません。 - - -#0123456789012345678901234567890 -@bgm/th11_17.wav -No.15 ハルトマンの妖怪少女 - -♪ハルトマンの妖怪少女 -  - 古明地こいしのテーマです。 -  - 不気味で壊れた少女っぽさを出そうとしてみました。 - 不気味さがおまけのボスっぽさを出しているかと思います。 - 本当は薔薇を敷き詰めた庭とかで、茨が痛そうな場所で戦うのが - 似合う筈ですが、今回は何故か神社。 - - -#0123456789012345678901234567890 -@bgm/th11_18.wav -No.16 地霊達の帰宅 - -♪地霊達の帰宅 -  - エンディングのテーマです。 -  - 朝まで呑んで寂しく帰る時のイメージで創りました。 - 「祭りも終わりかのう」「ぼちぼち引き上げるか」と心の中で - 会話しながら怨霊達が土の下へ戻っていきます。 - なんというオヤジ怨霊。 - - -#0123456789012345678901234567890 -@bgm/th11_19.wav -No.17 エネルギー黎明 〜 Future Dream... - -♪エネルギー黎明 〜 Future Dream... -  - スタッフロールのテーマです。 -  - いつもの感じで作りました。まんまいつもの感じ。 - これでお仕舞いですよーって感じ。 - お仕舞いでも曲名は黎明。たみあき、じゃ無いですよ。 -  -  diff --git a/assets/pl00.anm b/assets/pl00.anm deleted file mode 100644 index 572142d..0000000 Binary files a/assets/pl00.anm and /dev/null differ diff --git a/assets/pl00a.sht b/assets/pl00a.sht deleted file mode 100644 index 5707ae0..0000000 Binary files a/assets/pl00a.sht and /dev/null differ diff --git a/assets/pl00b.sht b/assets/pl00b.sht deleted file mode 100644 index cc6d9d9..0000000 Binary files a/assets/pl00b.sht and /dev/null differ diff --git a/assets/pl00c.sht b/assets/pl00c.sht deleted file mode 100644 index 147ead8..0000000 Binary files a/assets/pl00c.sht and /dev/null differ diff --git a/assets/pl01.anm b/assets/pl01.anm deleted file mode 100644 index a292aa8..0000000 Binary files a/assets/pl01.anm and /dev/null differ diff --git a/assets/pl01a.sht b/assets/pl01a.sht deleted file mode 100644 index 1df83e4..0000000 Binary files a/assets/pl01a.sht and /dev/null differ diff --git a/assets/pl01b.sht b/assets/pl01b.sht deleted file mode 100644 index fb40cdb..0000000 Binary files a/assets/pl01b.sht and /dev/null differ diff --git a/assets/pl01c.sht b/assets/pl01c.sht deleted file mode 100644 index 770a95b..0000000 Binary files a/assets/pl01c.sht and /dev/null differ diff --git a/assets/se_alert.wav b/assets/se_alert.wav deleted file mode 100644 index b3a919c..0000000 Binary files a/assets/se_alert.wav and /dev/null differ diff --git a/assets/se_bonus.wav b/assets/se_bonus.wav deleted file mode 100644 index 2cdcf52..0000000 Binary files a/assets/se_bonus.wav and /dev/null differ diff --git a/assets/se_bonus2.wav b/assets/se_bonus2.wav deleted file mode 100644 index 32b3dae..0000000 Binary files a/assets/se_bonus2.wav and /dev/null differ diff --git a/assets/se_cancel00.wav b/assets/se_cancel00.wav deleted file mode 100644 index 4bb7b75..0000000 Binary files a/assets/se_cancel00.wav and /dev/null differ diff --git a/assets/se_cardget.wav b/assets/se_cardget.wav deleted file mode 100644 index 9f7a6c6..0000000 Binary files a/assets/se_cardget.wav and /dev/null differ diff --git a/assets/se_cat00.wav b/assets/se_cat00.wav deleted file mode 100644 index ab3dcb1..0000000 Binary files a/assets/se_cat00.wav and /dev/null differ diff --git a/assets/se_cat01.wav b/assets/se_cat01.wav deleted file mode 100644 index 97285f0..0000000 Binary files a/assets/se_cat01.wav and /dev/null differ diff --git a/assets/se_ch00.wav b/assets/se_ch00.wav deleted file mode 100644 index 8ffee97..0000000 Binary files a/assets/se_ch00.wav and /dev/null differ diff --git a/assets/se_ch01.wav b/assets/se_ch01.wav deleted file mode 100644 index 9d6d630..0000000 Binary files a/assets/se_ch01.wav and /dev/null differ diff --git a/assets/se_damage00.wav b/assets/se_damage00.wav deleted file mode 100644 index 4bc6fde..0000000 Binary files a/assets/se_damage00.wav and /dev/null differ diff --git a/assets/se_damage01.wav b/assets/se_damage01.wav deleted file mode 100644 index a3e9446..0000000 Binary files a/assets/se_damage01.wav and /dev/null differ diff --git a/assets/se_enep00.wav b/assets/se_enep00.wav deleted file mode 100644 index 81e3967..0000000 Binary files a/assets/se_enep00.wav and /dev/null differ diff --git a/assets/se_enep01.wav b/assets/se_enep01.wav deleted file mode 100644 index 3020f3e..0000000 Binary files a/assets/se_enep01.wav and /dev/null differ diff --git a/assets/se_enep02.wav b/assets/se_enep02.wav deleted file mode 100644 index 8b3c001..0000000 Binary files a/assets/se_enep02.wav and /dev/null differ diff --git a/assets/se_extend.wav b/assets/se_extend.wav deleted file mode 100644 index dae7203..0000000 Binary files a/assets/se_extend.wav and /dev/null differ diff --git a/assets/se_graze.wav b/assets/se_graze.wav deleted file mode 100644 index 442476a..0000000 Binary files a/assets/se_graze.wav and /dev/null differ diff --git a/assets/se_gun00.wav b/assets/se_gun00.wav deleted file mode 100644 index 9c95600..0000000 Binary files a/assets/se_gun00.wav and /dev/null differ diff --git a/assets/se_hint00.wav b/assets/se_hint00.wav deleted file mode 100644 index e63c494..0000000 Binary files a/assets/se_hint00.wav and /dev/null differ diff --git a/assets/se_invalid.wav b/assets/se_invalid.wav deleted file mode 100644 index 5a237f0..0000000 Binary files a/assets/se_invalid.wav and /dev/null differ diff --git a/assets/se_item00.wav b/assets/se_item00.wav deleted file mode 100644 index 32cc246..0000000 Binary files a/assets/se_item00.wav and /dev/null differ diff --git a/assets/se_kira00.wav b/assets/se_kira00.wav deleted file mode 100644 index df9f801..0000000 Binary files a/assets/se_kira00.wav and /dev/null differ diff --git a/assets/se_kira01.wav b/assets/se_kira01.wav deleted file mode 100644 index 04da1cc..0000000 Binary files a/assets/se_kira01.wav and /dev/null differ diff --git a/assets/se_kira02.wav b/assets/se_kira02.wav deleted file mode 100644 index 69a8311..0000000 Binary files a/assets/se_kira02.wav and /dev/null differ diff --git a/assets/se_lazer00.wav b/assets/se_lazer00.wav deleted file mode 100644 index 716a976..0000000 Binary files a/assets/se_lazer00.wav and /dev/null differ diff --git a/assets/se_lazer01.wav b/assets/se_lazer01.wav deleted file mode 100644 index ea7e31a..0000000 Binary files a/assets/se_lazer01.wav and /dev/null differ diff --git a/assets/se_msl.wav b/assets/se_msl.wav deleted file mode 100644 index dd785d0..0000000 Binary files a/assets/se_msl.wav and /dev/null differ diff --git a/assets/se_nep00.wav b/assets/se_nep00.wav deleted file mode 100644 index 079f850..0000000 Binary files a/assets/se_nep00.wav and /dev/null differ diff --git a/assets/se_ok00.wav b/assets/se_ok00.wav deleted file mode 100644 index 1077b02..0000000 Binary files a/assets/se_ok00.wav and /dev/null differ diff --git a/assets/se_option.wav b/assets/se_option.wav deleted file mode 100644 index be90319..0000000 Binary files a/assets/se_option.wav and /dev/null differ diff --git a/assets/se_pause.wav b/assets/se_pause.wav deleted file mode 100644 index 39b3006..0000000 Binary files a/assets/se_pause.wav and /dev/null differ diff --git a/assets/se_pldead00.wav b/assets/se_pldead00.wav deleted file mode 100644 index ce26f95..0000000 Binary files a/assets/se_pldead00.wav and /dev/null differ diff --git a/assets/se_plst00.wav b/assets/se_plst00.wav deleted file mode 100644 index 440f94a..0000000 Binary files a/assets/se_plst00.wav and /dev/null differ diff --git a/assets/se_power0.wav b/assets/se_power0.wav deleted file mode 100644 index 1bf4f87..0000000 Binary files a/assets/se_power0.wav and /dev/null differ diff --git a/assets/se_power1.wav b/assets/se_power1.wav deleted file mode 100644 index 1a90ab2..0000000 Binary files a/assets/se_power1.wav and /dev/null differ diff --git a/assets/se_powerup.wav b/assets/se_powerup.wav deleted file mode 100644 index 466088c..0000000 Binary files a/assets/se_powerup.wav and /dev/null differ diff --git a/assets/se_select00.wav b/assets/se_select00.wav deleted file mode 100644 index cc5328d..0000000 Binary files a/assets/se_select00.wav and /dev/null differ diff --git a/assets/se_slash.wav b/assets/se_slash.wav deleted file mode 100644 index b0fc5d5..0000000 Binary files a/assets/se_slash.wav and /dev/null differ diff --git a/assets/se_tan00.wav b/assets/se_tan00.wav deleted file mode 100644 index 06c6f0b..0000000 Binary files a/assets/se_tan00.wav and /dev/null differ diff --git a/assets/se_tan01.wav b/assets/se_tan01.wav deleted file mode 100644 index 9bd2fb5..0000000 Binary files a/assets/se_tan01.wav and /dev/null differ diff --git a/assets/se_tan02.wav b/assets/se_tan02.wav deleted file mode 100644 index 77ecc5d..0000000 Binary files a/assets/se_tan02.wav and /dev/null differ diff --git a/assets/se_timeout.wav b/assets/se_timeout.wav deleted file mode 100644 index 4468f7a..0000000 Binary files a/assets/se_timeout.wav and /dev/null differ diff --git a/assets/se_timeout2.wav b/assets/se_timeout2.wav deleted file mode 100644 index 67a8d2b..0000000 Binary files a/assets/se_timeout2.wav and /dev/null differ diff --git a/assets/se_warpl.wav b/assets/se_warpl.wav deleted file mode 100644 index 4083c20..0000000 Binary files a/assets/se_warpl.wav and /dev/null differ diff --git a/assets/se_warpr.wav b/assets/se_warpr.wav deleted file mode 100644 index 49fbc28..0000000 Binary files a/assets/se_warpr.wav and /dev/null differ diff --git a/assets/se_water.wav b/assets/se_water.wav deleted file mode 100644 index 46081e2..0000000 Binary files a/assets/se_water.wav and /dev/null differ diff --git a/assets/sig.anm b/assets/sig.anm deleted file mode 100644 index 57ad4f4..0000000 Binary files a/assets/sig.anm and /dev/null differ diff --git a/assets/st01_00a.msg b/assets/st01_00a.msg deleted file mode 100644 index ef1f8f8..0000000 Binary files a/assets/st01_00a.msg and /dev/null differ diff --git a/assets/st01_00b.msg b/assets/st01_00b.msg deleted file mode 100644 index 1d60763..0000000 Binary files a/assets/st01_00b.msg and /dev/null differ diff --git a/assets/st01_00c.msg b/assets/st01_00c.msg deleted file mode 100644 index a09bc5c..0000000 Binary files a/assets/st01_00c.msg and /dev/null differ diff --git a/assets/st01_01a.msg b/assets/st01_01a.msg deleted file mode 100644 index 76d878c..0000000 Binary files a/assets/st01_01a.msg and /dev/null differ diff --git a/assets/st01_01b.msg b/assets/st01_01b.msg deleted file mode 100644 index 78ba5c7..0000000 Binary files a/assets/st01_01b.msg and /dev/null differ diff --git a/assets/st01_01c.msg b/assets/st01_01c.msg deleted file mode 100644 index 83020dd..0000000 Binary files a/assets/st01_01c.msg and /dev/null differ diff --git a/assets/st01logo.anm b/assets/st01logo.anm deleted file mode 100644 index a20710f..0000000 Binary files a/assets/st01logo.anm and /dev/null differ diff --git a/assets/st02_00a.msg b/assets/st02_00a.msg deleted file mode 100644 index 56c0b08..0000000 Binary files a/assets/st02_00a.msg and /dev/null differ diff --git a/assets/st02_00b.msg b/assets/st02_00b.msg deleted file mode 100644 index a0a82f2..0000000 Binary files a/assets/st02_00b.msg and /dev/null differ diff --git a/assets/st02_00c.msg b/assets/st02_00c.msg deleted file mode 100644 index b67e9d7..0000000 Binary files a/assets/st02_00c.msg and /dev/null differ diff --git a/assets/st02_01a.msg b/assets/st02_01a.msg deleted file mode 100644 index 0f53b20..0000000 Binary files a/assets/st02_01a.msg and /dev/null differ diff --git a/assets/st02_01b.msg b/assets/st02_01b.msg deleted file mode 100644 index 04f384f..0000000 Binary files a/assets/st02_01b.msg and /dev/null differ diff --git a/assets/st02_01c.msg b/assets/st02_01c.msg deleted file mode 100644 index 896c0da..0000000 Binary files a/assets/st02_01c.msg and /dev/null differ diff --git a/assets/st02logo.anm b/assets/st02logo.anm deleted file mode 100644 index 368e036..0000000 Binary files a/assets/st02logo.anm and /dev/null differ diff --git a/assets/st03_00a.msg b/assets/st03_00a.msg deleted file mode 100644 index 7bc18a3..0000000 Binary files a/assets/st03_00a.msg and /dev/null differ diff --git a/assets/st03_00b.msg b/assets/st03_00b.msg deleted file mode 100644 index 80250b5..0000000 Binary files a/assets/st03_00b.msg and /dev/null differ diff --git a/assets/st03_00c.msg b/assets/st03_00c.msg deleted file mode 100644 index 3b3ee80..0000000 Binary files a/assets/st03_00c.msg and /dev/null differ diff --git a/assets/st03_01a.msg b/assets/st03_01a.msg deleted file mode 100644 index 0342bb1..0000000 Binary files a/assets/st03_01a.msg and /dev/null differ diff --git a/assets/st03_01b.msg b/assets/st03_01b.msg deleted file mode 100644 index ae9bde0..0000000 Binary files a/assets/st03_01b.msg and /dev/null differ diff --git a/assets/st03_01c.msg b/assets/st03_01c.msg deleted file mode 100644 index 045ee7e..0000000 Binary files a/assets/st03_01c.msg and /dev/null differ diff --git a/assets/st03logo.anm b/assets/st03logo.anm deleted file mode 100644 index 3448f90..0000000 Binary files a/assets/st03logo.anm and /dev/null differ diff --git a/assets/st04_00a.msg b/assets/st04_00a.msg deleted file mode 100644 index 6b01bd9..0000000 Binary files a/assets/st04_00a.msg and /dev/null differ diff --git a/assets/st04_00b.msg b/assets/st04_00b.msg deleted file mode 100644 index 3fc954a..0000000 Binary files a/assets/st04_00b.msg and /dev/null differ diff --git a/assets/st04_00c.msg b/assets/st04_00c.msg deleted file mode 100644 index e8bb724..0000000 Binary files a/assets/st04_00c.msg and /dev/null differ diff --git a/assets/st04_01a.msg b/assets/st04_01a.msg deleted file mode 100644 index fdd8339..0000000 Binary files a/assets/st04_01a.msg and /dev/null differ diff --git a/assets/st04_01b.msg b/assets/st04_01b.msg deleted file mode 100644 index 7de8d59..0000000 Binary files a/assets/st04_01b.msg and /dev/null differ diff --git a/assets/st04_01c.msg b/assets/st04_01c.msg deleted file mode 100644 index 7221286..0000000 Binary files a/assets/st04_01c.msg and /dev/null differ diff --git a/assets/st04logo.anm b/assets/st04logo.anm deleted file mode 100644 index a801baa..0000000 Binary files a/assets/st04logo.anm and /dev/null differ diff --git a/assets/st05_00a.msg b/assets/st05_00a.msg deleted file mode 100644 index d9704a1..0000000 Binary files a/assets/st05_00a.msg and /dev/null differ diff --git a/assets/st05_00b.msg b/assets/st05_00b.msg deleted file mode 100644 index 5ee7875..0000000 Binary files a/assets/st05_00b.msg and /dev/null differ diff --git a/assets/st05_00c.msg b/assets/st05_00c.msg deleted file mode 100644 index dd18b0f..0000000 Binary files a/assets/st05_00c.msg and /dev/null differ diff --git a/assets/st05_01a.msg b/assets/st05_01a.msg deleted file mode 100644 index a88c352..0000000 Binary files a/assets/st05_01a.msg and /dev/null differ diff --git a/assets/st05_01b.msg b/assets/st05_01b.msg deleted file mode 100644 index 373834b..0000000 Binary files a/assets/st05_01b.msg and /dev/null differ diff --git a/assets/st05_01c.msg b/assets/st05_01c.msg deleted file mode 100644 index a45ee5c..0000000 Binary files a/assets/st05_01c.msg and /dev/null differ diff --git a/assets/st05logo.anm b/assets/st05logo.anm deleted file mode 100644 index 432d891..0000000 Binary files a/assets/st05logo.anm and /dev/null differ diff --git a/assets/st06_00a.msg b/assets/st06_00a.msg deleted file mode 100644 index de2467b..0000000 Binary files a/assets/st06_00a.msg and /dev/null differ diff --git a/assets/st06_00b.msg b/assets/st06_00b.msg deleted file mode 100644 index 8fae12e..0000000 Binary files a/assets/st06_00b.msg and /dev/null differ diff --git a/assets/st06_00c.msg b/assets/st06_00c.msg deleted file mode 100644 index cec5a98..0000000 Binary files a/assets/st06_00c.msg and /dev/null differ diff --git a/assets/st06_01a.msg b/assets/st06_01a.msg deleted file mode 100644 index e14bbfe..0000000 Binary files a/assets/st06_01a.msg and /dev/null differ diff --git a/assets/st06_01b.msg b/assets/st06_01b.msg deleted file mode 100644 index a194b23..0000000 Binary files a/assets/st06_01b.msg and /dev/null differ diff --git a/assets/st06_01c.msg b/assets/st06_01c.msg deleted file mode 100644 index a6a29c8..0000000 Binary files a/assets/st06_01c.msg and /dev/null differ diff --git a/assets/st06logo.anm b/assets/st06logo.anm deleted file mode 100644 index 6fedf2b..0000000 Binary files a/assets/st06logo.anm and /dev/null differ diff --git a/assets/st07_00a.msg b/assets/st07_00a.msg deleted file mode 100644 index 880f09b..0000000 Binary files a/assets/st07_00a.msg and /dev/null differ diff --git a/assets/st07_00b.msg b/assets/st07_00b.msg deleted file mode 100644 index 124e1c1..0000000 Binary files a/assets/st07_00b.msg and /dev/null differ diff --git a/assets/st07_00c.msg b/assets/st07_00c.msg deleted file mode 100644 index 2a4b8a9..0000000 Binary files a/assets/st07_00c.msg and /dev/null differ diff --git a/assets/st07_01a.msg b/assets/st07_01a.msg deleted file mode 100644 index b5411d9..0000000 Binary files a/assets/st07_01a.msg and /dev/null differ diff --git a/assets/st07_01b.msg b/assets/st07_01b.msg deleted file mode 100644 index 1d7e8c2..0000000 Binary files a/assets/st07_01b.msg and /dev/null differ diff --git a/assets/st07_01c.msg b/assets/st07_01c.msg deleted file mode 100644 index 8cef6aa..0000000 Binary files a/assets/st07_01c.msg and /dev/null differ diff --git a/assets/st07logo.anm b/assets/st07logo.anm deleted file mode 100644 index d9f8378..0000000 Binary files a/assets/st07logo.anm and /dev/null differ diff --git a/assets/staff.anm b/assets/staff.anm deleted file mode 100644 index 9e9a0eb..0000000 Binary files a/assets/staff.anm and /dev/null differ diff --git a/assets/staff.msg b/assets/staff.msg deleted file mode 100644 index a7dca90..0000000 Binary files a/assets/staff.msg and /dev/null differ diff --git a/assets/stage01.anm b/assets/stage01.anm deleted file mode 100644 index c352026..0000000 Binary files a/assets/stage01.anm and /dev/null differ diff --git a/assets/stage01.ecl b/assets/stage01.ecl deleted file mode 100644 index 89d0465..0000000 Binary files a/assets/stage01.ecl and /dev/null differ diff --git a/assets/stage01.std b/assets/stage01.std deleted file mode 100644 index 592c4c3..0000000 Binary files a/assets/stage01.std and /dev/null differ diff --git a/assets/stage02.anm b/assets/stage02.anm deleted file mode 100644 index d0444ff..0000000 Binary files a/assets/stage02.anm and /dev/null differ diff --git a/assets/stage02.ecl b/assets/stage02.ecl deleted file mode 100644 index 8e14ba9..0000000 Binary files a/assets/stage02.ecl and /dev/null differ diff --git a/assets/stage02.std b/assets/stage02.std deleted file mode 100644 index 9d5c972..0000000 Binary files a/assets/stage02.std and /dev/null differ diff --git a/assets/stage03.anm b/assets/stage03.anm deleted file mode 100644 index c74bf84..0000000 Binary files a/assets/stage03.anm and /dev/null differ diff --git a/assets/stage03.ecl b/assets/stage03.ecl deleted file mode 100644 index 774bb91..0000000 Binary files a/assets/stage03.ecl and /dev/null differ diff --git a/assets/stage03.std b/assets/stage03.std deleted file mode 100644 index 67ab09e..0000000 Binary files a/assets/stage03.std and /dev/null differ diff --git a/assets/stage04.anm b/assets/stage04.anm deleted file mode 100644 index 0ff1534..0000000 Binary files a/assets/stage04.anm and /dev/null differ diff --git a/assets/stage04.ecl b/assets/stage04.ecl deleted file mode 100644 index 2f6ea25..0000000 Binary files a/assets/stage04.ecl and /dev/null differ diff --git a/assets/stage04.std b/assets/stage04.std deleted file mode 100644 index 570d61a..0000000 Binary files a/assets/stage04.std and /dev/null differ diff --git a/assets/stage05.anm b/assets/stage05.anm deleted file mode 100644 index d728c53..0000000 Binary files a/assets/stage05.anm and /dev/null differ diff --git a/assets/stage05.ecl b/assets/stage05.ecl deleted file mode 100644 index 778c6a5..0000000 Binary files a/assets/stage05.ecl and /dev/null differ diff --git a/assets/stage05.std b/assets/stage05.std deleted file mode 100644 index a96c15e..0000000 Binary files a/assets/stage05.std and /dev/null differ diff --git a/assets/stage05boss.ecl b/assets/stage05boss.ecl deleted file mode 100644 index 4b2598a..0000000 Binary files a/assets/stage05boss.ecl and /dev/null differ diff --git a/assets/stage05mboss.ecl b/assets/stage05mboss.ecl deleted file mode 100644 index 819c6ed..0000000 Binary files a/assets/stage05mboss.ecl and /dev/null differ diff --git a/assets/stage06.anm b/assets/stage06.anm deleted file mode 100644 index 1437173..0000000 Binary files a/assets/stage06.anm and /dev/null differ diff --git a/assets/stage06.ecl b/assets/stage06.ecl deleted file mode 100644 index dcf3eb5..0000000 Binary files a/assets/stage06.ecl and /dev/null differ diff --git a/assets/stage06.std b/assets/stage06.std deleted file mode 100644 index 6640fb2..0000000 Binary files a/assets/stage06.std and /dev/null differ diff --git a/assets/stage06boss.ecl b/assets/stage06boss.ecl deleted file mode 100644 index d41f200..0000000 Binary files a/assets/stage06boss.ecl and /dev/null differ diff --git a/assets/stage06mboss.ecl b/assets/stage06mboss.ecl deleted file mode 100644 index 406bdc4..0000000 Binary files a/assets/stage06mboss.ecl and /dev/null differ diff --git a/assets/stage07.anm b/assets/stage07.anm deleted file mode 100644 index 84fb723..0000000 Binary files a/assets/stage07.anm and /dev/null differ diff --git a/assets/stage07.ecl b/assets/stage07.ecl deleted file mode 100644 index c087e66..0000000 Binary files a/assets/stage07.ecl and /dev/null differ diff --git a/assets/stage07.std b/assets/stage07.std deleted file mode 100644 index 72ea6a1..0000000 Binary files a/assets/stage07.std and /dev/null differ diff --git a/assets/stage07boss.ecl b/assets/stage07boss.ecl deleted file mode 100644 index fcd9928..0000000 Binary files a/assets/stage07boss.ecl and /dev/null differ diff --git a/assets/stage07mboss.ecl b/assets/stage07mboss.ecl deleted file mode 100644 index e33be4b..0000000 Binary files a/assets/stage07mboss.ecl and /dev/null differ diff --git a/assets/stage4c00a.ecl b/assets/stage4c00a.ecl deleted file mode 100644 index 9e754ae..0000000 Binary files a/assets/stage4c00a.ecl and /dev/null differ diff --git a/assets/stage4c00b.ecl b/assets/stage4c00b.ecl deleted file mode 100644 index 6fc9db9..0000000 Binary files a/assets/stage4c00b.ecl and /dev/null differ diff --git a/assets/stage4c00c.ecl b/assets/stage4c00c.ecl deleted file mode 100644 index f524c6f..0000000 Binary files a/assets/stage4c00c.ecl and /dev/null differ diff --git a/assets/stage4c01a.ecl b/assets/stage4c01a.ecl deleted file mode 100644 index dd61d0e..0000000 Binary files a/assets/stage4c01a.ecl and /dev/null differ diff --git a/assets/stage4c01b.ecl b/assets/stage4c01b.ecl deleted file mode 100644 index b34f6f5..0000000 Binary files a/assets/stage4c01b.ecl and /dev/null differ diff --git a/assets/stage4c01c.ecl b/assets/stage4c01c.ecl deleted file mode 100644 index bd8bf13..0000000 Binary files a/assets/stage4c01c.ecl and /dev/null differ diff --git a/assets/stgenm01.anm b/assets/stgenm01.anm deleted file mode 100644 index 906855a..0000000 Binary files a/assets/stgenm01.anm and /dev/null differ diff --git a/assets/stgenm02.anm b/assets/stgenm02.anm deleted file mode 100644 index de8dcc7..0000000 Binary files a/assets/stgenm02.anm and /dev/null differ diff --git a/assets/stgenm03.anm b/assets/stgenm03.anm deleted file mode 100644 index 7e72c9f..0000000 Binary files a/assets/stgenm03.anm and /dev/null differ diff --git a/assets/stgenm04.anm b/assets/stgenm04.anm deleted file mode 100644 index 079967a..0000000 Binary files a/assets/stgenm04.anm and /dev/null differ diff --git a/assets/stgenm05.anm b/assets/stgenm05.anm deleted file mode 100644 index a899b9e..0000000 Binary files a/assets/stgenm05.anm and /dev/null differ diff --git a/assets/stgenm06.anm b/assets/stgenm06.anm deleted file mode 100644 index f70b630..0000000 Binary files a/assets/stgenm06.anm and /dev/null differ diff --git a/assets/stgenm07.anm b/assets/stgenm07.anm deleted file mode 100644 index 2674751..0000000 Binary files a/assets/stgenm07.anm and /dev/null differ diff --git a/assets/text.anm b/assets/text.anm deleted file mode 100644 index 7ac7277..0000000 Binary files a/assets/text.anm and /dev/null differ diff --git a/assets/th11_0100a.ver b/assets/th11_0100a.ver deleted file mode 100644 index a6776b9..0000000 --- a/assets/th11_0100a.ver +++ /dev/null @@ -1,3 +0,0 @@ -0001a 460800 1940315954 -0002a 476672 1580249768 -0100a 487936 3243633801 diff --git a/assets/thbgm.fmt b/assets/thbgm.fmt deleted file mode 100644 index 45fee26..0000000 Binary files a/assets/thbgm.fmt and /dev/null differ diff --git a/assets/title.anm b/assets/title.anm deleted file mode 100644 index e6108f9..0000000 Binary files a/assets/title.anm and /dev/null differ diff --git a/assets/title_v.anm b/assets/title_v.anm deleted file mode 100644 index 0312109..0000000 Binary files a/assets/title_v.anm and /dev/null differ diff --git a/build.nu b/build.nu new file mode 100644 index 0000000..37bd3da --- /dev/null +++ b/build.nu @@ -0,0 +1,4 @@ +try { + mkdir overrides/build +} catch {} +truanm compile -g 11 -i research/dumptk overrides/test_anm.tanm --output assets/build/test_anm.anm diff --git a/overrides/test_anm.tanm b/overrides/test_anm.tanm new file mode 100644 index 0000000..07370e0 --- /dev/null +++ b/overrides/test_anm.tanm @@ -0,0 +1,449 @@ +#pragma mapfile "utils/v4.anmm" + +entry { + path: "title/title00a.png", + img_width: 640, + img_height: 480, + sprites: { + sprite64: {x: 0.0, y: 0.0, w: 512.0, h: 480.0}, + sprite65: {x: 512.0, y: 0.0, w: 128.0, h: 480.0} + }, +} + + +script 0 script79 { + scriptNew(script81); + sprite(sprite64); + ins_85(1); + randMode(1); + anchor(1, 1); + layer(20); + pos(0.0, 0.0, 0.0); + alpha(0); ++80: // 80 + alphaTime(30, 0, 255); ++60: // 140 + stop(); + +interrupt[1]: + alphaTime(60, 0, 0); ++60: // 200 + delete(); +} + + +script 1 script80 { + scriptNew(script82); + sprite(sprite64); + ins_85(1); + randMode(1); + anchor(1, 1); + layer(20); + pos(0.0, 0.0, 0.0); + alpha(0); + alphaTime(30, 0, 255); ++60: // 60 + stop(); + +interrupt[1]: + alphaTime(60, 0, 0); ++60: // 120 + delete(); +} + + + + +script 2 script81 { + sprite(sprite65); + ins_85(1); + randMode(1); + anchor(1, 1); + layer(20); + pos(512.0, 0.0, 0.0); + alpha(0); ++80: // 80 + alphaTime(30, 0, 255); ++60: // 140 + stop(); + +interrupt[1]: + alphaTime(60, 0, 0); ++60: // 200 + delete(); +} + + +script 3 script82 { + sprite(sprite65); + ins_85(1); + randMode(1); + anchor(1, 1); + layer(20); + pos(512.0, 0.0, 0.0); + alpha(0); + alphaTime(30, 0, 255); ++60: // 60 + stop(); + +interrupt[1]: + alphaTime(60, 0, 0); ++60: // 120 + delete(); +} + + +entry { + path: "title/title_logo.png", + img_width: 1024, + img_height: 256, + img_format: FORMAT_ARGB_4444, + sprites: { + sprite66: {x: 0.0, y: 0.0, w: 128.0, h: 128.0}, + sprite67: {x: 128.0, y: 0.0, w: 96.0, h: 96.0}, + sprite68: {x: 224.0, y: 0.0, w: 160.0, h: 128.0}, + sprite69: {x: 384.0, y: 0.0, w: 128.0, h: 128.0}, + sprite70: {x: 512.0, y: 0.0, w: 96.0, h: 96.0}, + sprite71: {x: 608.0, y: 0.0, w: 224.0, h: 16.0}, + sprite72: {x: 0.0, y: 128.0, w: 640.0, h: 64.0}, + }, +} + + +script 4 script83 { + alpha(0); + scriptNew(script85); ++14: // 14 + scriptNew(script86); ++14: // 28 + scriptNew(script87); ++14: // 42 + scriptNew(script88); ++14: // 56 + scriptNew(script89); ++14: // 70 + scriptNew(script90); + scriptNew(script91); + stop(); + +interrupt[1]: ++15: // 85 + delete(); +} + + +script 5 script84 { + alpha(0); + scriptNew(script85); + scriptNew(script86); + scriptNew(script87); + scriptNew(script88); + scriptNew(script89); + scriptNew(script90); + scriptNew(script91); + stop(); + +interrupt[1]: ++15: // 15 + delete(); +} + + +script 6 script85 { + sprite(sprite66); + ins_85(1); + randMode(1); + blendMode(1); + layer(22); + pos(270.0, 70.0, 0.0); + type(3); + rotate(0.0, 0.0, -3.1415927); + rotateTime(16, 4, 0.0, 0.0, 0.0); + scale(0.0, 0.0); + scaleTime(8, 4, 1.5, 1.5); ++8: // 8 + scaleTime(8, 1, 1.0, 1.0); ++8: // 16 + type(3); + blendMode(0); + wait(120); + loop { + posTime(200, 9, 274.0, 70.0, 0.0); ++200: // 216 + posTime(200, 9, 266.0, 70.0, 0.0); + //posTime(200, 9, 480.0, 70.0, 0.0); ++200: // 416 + } ++60: // 476 + stop(); + +interrupt[7]: ++20: // 496 + colorTime(20, 4, 128, 128, 128); + posTime(20, 4, 12.0, 420.0, 0.0); + scaleTime(20, 4, 0.5, 0.5); ++20: // 516 + stop(); + +interrupt[8]: + colorTime(20, 4, 255, 255, 255); + posTime(20, 4, 32.0, 240.0, 0.0); + scaleTime(20, 4, 1.0, 1.0); + stop(); + +interrupt[1]: + alphaTime(15, 0, 0); ++15: // 531 + delete(); +} + + +script 7 script86 { + sprite(sprite67); + ins_85(1); + randMode(1); + blendMode(1); + layer(22); + pos(338.0, 136.0, 0.0); + type(3); + rotate(0.0, 0.0, -3.1415927); + rotateTime(16, 4, 0.0, 0.0, 0.0); + scale(0.0, 0.0); + scaleTime(8, 4, 1.5, 1.5); ++8: // 8 + scaleTime(8, 1, 1.0, 1.0); ++8: // 16 + type(3); + blendMode(0); + wait(60); + loop { + posTime(200, 9, 334.0, 136.0, 0.0); ++200: // 216 + posTime(200, 9, 342.0, 136.0, 0.0); ++200: // 416 + } ++60: // 476 + stop(); + +interrupt[7]: ++20: // 496 + colorTime(20, 4, 128, 128, 128); + posTime(20, 4, 12.0, 420.0, 0.0); + scaleTime(20, 4, 0.5, 0.5); ++20: // 516 + stop(); + +interrupt[8]: + colorTime(20, 4, 255, 255, 255); + posTime(20, 4, 32.0, 240.0, 0.0); + scaleTime(20, 4, 1.0, 1.0); + stop(); + +interrupt[1]: + alphaTime(15, 0, 0); ++15: // 531 + delete(); +} + + +script 8 script87 { + sprite(sprite68); + ins_85(1); + randMode(1); + blendMode(1); + layer(22); + pos(320.0, 218.0, 0.0); + type(3); + rotate(0.0, 0.0, -3.1415927); + rotateTime(16, 4, 0.0, 0.0, 0.0); + scale(0.0, 0.0); + scaleTime(8, 4, 1.5, 1.5); ++8: // 8 + scaleTime(8, 1, 1.0, 1.0); ++8: // 16 + type(3); + blendMode(0); + wait(170); + loop { + posTime(200, 9, 316.0, 218.0, 0.0); ++200: // 216 + posTime(200, 9, 324.0, 218.0, 0.0); ++200: // 416 + } ++60: // 476 + stop(); + +interrupt[7]: ++20: // 496 + colorTime(20, 4, 128, 128, 128); + posTime(20, 4, 12.0, 420.0, 0.0); + scaleTime(20, 4, 0.5, 0.5); ++20: // 516 + stop(); + +interrupt[8]: + colorTime(20, 4, 255, 255, 255); + posTime(20, 4, 32.0, 240.0, 0.0); + scaleTime(20, 4, 1.0, 1.0); + stop(); + +interrupt[1]: + alphaTime(15, 0, 0); ++15: // 531 + delete(); +} + + +script 9 script88 { + sprite(sprite69); + ins_85(1); + randMode(1); + blendMode(1); + layer(22); + pos(404.0, 314.0, 0.0); + type(3); + rotate(0.0, 0.0, -3.1415927); + rotateTime(16, 4, 0.0, 0.0, 0.0); + scale(0.0, 0.0); + scaleTime(8, 4, 1.5, 1.5); ++8: // 8 + scaleTime(8, 1, 1.0, 1.0); ++8: // 16 + type(3); + blendMode(0); + wait(20); + loop { + posTime(200, 9, 408.0, 314.0, 0.0); ++200: // 216 + posTime(200, 9, 400.0, 314.0, 0.0); ++200: // 416 + } ++60: // 476 + stop(); + +interrupt[7]: ++20: // 496 + colorTime(20, 4, 128, 128, 128); + posTime(20, 4, 12.0, 420.0, 0.0); + scaleTime(20, 4, 0.5, 0.5); ++20: // 516 + stop(); + +interrupt[8]: + colorTime(20, 4, 255, 255, 255); + posTime(20, 4, 32.0, 240.0, 0.0); + scaleTime(20, 4, 1.0, 1.0); + stop(); + +interrupt[1]: + alphaTime(15, 0, 0); ++15: // 531 + delete(); +} + + +script 10 script89 { + sprite(sprite70); + ins_85(1); + randMode(1); + blendMode(1); + layer(22); + pos(368.0, 392.0, 0.0); + type(3); + rotate(0.0, 0.0, -3.1415927); + rotateTime(16, 4, 0.0, 0.0, 0.0); + scale(0.0, 0.0); + scaleTime(8, 4, 1.5, 1.5); ++8: // 8 + scaleTime(8, 1, 1.0, 1.0); ++8: // 16 + type(3); + blendMode(0); + wait(90); + loop { + posTime(200, 9, 371.0, 392.0, 0.0); ++200: // 216 + posTime(200, 9, 365.0, 392.0, 0.0); ++200: // 416 + } ++60: // 476 + stop(); + +interrupt[7]: ++20: // 496 + colorTime(20, 4, 128, 128, 128); + posTime(20, 4, 12.0, 420.0, 0.0); + scaleTime(20, 4, 0.5, 0.5); ++20: // 516 + stop(); + +interrupt[8]: + colorTime(20, 4, 255, 255, 255); + posTime(20, 4, 32.0, 240.0, 0.0); + scaleTime(20, 4, 1.0, 1.0); + stop(); + +interrupt[1]: + alphaTime(15, 0, 0); ++15: // 531 + delete(); +} + + +script 11 script90 { + sprite(sprite72); + ins_85(1); + randMode(1); + type(3); + layer(23); + pos(320.0, 260.0, 0.0); + posTime(16, 0, 320.0, 260.0, 0.0); + rotateTime(16, 4, 0.0, 0.0, -0.3926991); + //rotateTime(999999, 7, 0.0, 0.0, -0.001); + scale(0.0, 0.1); + scaleTime(10, 4, 1.0, 0.1); ++10: // 10 + scaleTime(10, 4, 1.0, 1.0); ++600: // 610 + nop(); + loop { ++2: // 612 + blendMode(1); ++2: // 614 + blendMode(0); ++2: // 616 + blendMode(1); ++2: // 618 + blendMode(0); ++2: // 620 + blendMode(1); ++2: // 622 + blendMode(0); ++300: // 922 + } + stop(); + +interrupt[1]: + alphaTime(15, 0, 0); ++15: // 937 + delete(); +} + + +script 12 script91 { + sprite(sprite71); + ins_85(1); + randMode(1); + type(0); + layer(23); + anchor(2, 0); + alpha(0); + alphaTime(60, 0, 255); + pos(244.0, 468.0, 0.0); + stop(); + +interrupt[1]: + alphaTime(15, 0, 0); ++15: // 15 + delete(); +} diff --git a/research/notes/type.md b/research/notes/type.md new file mode 100644 index 0000000..2fafcf0 --- /dev/null +++ b/research/notes/type.md @@ -0,0 +1,10 @@ +# SA Anm Type documentation + +## Type 0 +Basic sprite rendering, nothing crazy +## Type 1 - Rotate around Z axis +`if (rotation z == 0)` Basic sprite rendering +`else` Rotate around z axis +## Type 2 - Rotate in 3d +## Type 3 - Rotate around Z in 3D +## Type 4 - Billboarding? diff --git a/sound_check.nu b/sound_check.nu new file mode 100644 index 0000000..d0c7244 --- /dev/null +++ b/sound_check.nu @@ -0,0 +1,2 @@ +rustc -o /tmp/rustcTmpExecutable examples/sound.rs +/tmp/rustcTmpExecutable diff --git a/src/engine.rs b/src/engine.rs index 9662ca5..c9474b9 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -1,6 +1,8 @@ -use std::{cell::RefCell, rc::Rc, sync::Arc}; +use std::{ + cell::RefCell, rc::Rc, sync::{Arc, Mutex} +}; -use pollster::FutureExt; +use crossbeam::atomic::AtomicCell; use wgpu::{ naga::FastHashMap, Backends, CommandEncoder, Device, DeviceDescriptor, Features, Instance, InstanceDescriptor, InstanceFlags, Queue, RequestAdapterOptions, Surface, SurfaceConfiguration, Texture, TextureFormat, TextureUsages }; @@ -12,16 +14,15 @@ use crate::game::Game; pub struct Engine<'a> { surface: Surface<'a>, - pub device: Device, - pub queue: Queue, - pub config: SurfaceConfiguration, + pub device: Arc, + pub queue: Arc, + pub config: Arc>, pub size: PhysicalSize, pub window: Arc, keys: Keys, + state: Game, focused: bool, - - state: Rc>, } #[derive(Debug, Default)] @@ -93,32 +94,37 @@ impl<'a> Engine<'a> { let surface = instance.create_surface(window.clone()).unwrap(); - let adapter = instance - .request_adapter(&RequestAdapterOptions { - compatible_surface: Some(&surface), - ..Default::default() - }) - .block_on() - .unwrap(); - - let (device, queue) = adapter - .request_device( - &DeviceDescriptor { - label: Some("device"), - required_features: Features::empty(), + let (adapter, device, queue) = async_std::task::block_on(async { + let adapter = instance + .request_adapter(&RequestAdapterOptions { + compatible_surface: Some(&surface), ..Default::default() - }, - None, - ) - .block_on() - .unwrap(); + }) + .await + .unwrap(); + + let (device, queue) = adapter + .request_device( + &DeviceDescriptor { + label: Some("device"), + required_features: Features::empty(), + ..Default::default() + }, + None, + ) + .await + .unwrap(); + + (adapter, device, queue) + }); + + let (device, queue) = (Arc::new(device), Arc::new(queue)); let size = window.inner_size(); let caps = surface.get_capabilities(&adapter); - println!("formats: {:#?}", caps.formats); let format = caps.formats.iter().find(|f| matches!(f, TextureFormat::Bgra8Unorm)).cloned().unwrap_or(caps.formats[0]); - let config = SurfaceConfiguration { + let config = Arc::new(Mutex::new(SurfaceConfiguration { usage: TextureUsages::RENDER_ATTACHMENT, format, width: size.width, @@ -127,18 +133,20 @@ impl<'a> Engine<'a> { desired_maximum_frame_latency: 2, alpha_mode: caps.alpha_modes[0], view_formats: vec![], - }; + })); - surface.configure(&device, &config); + surface.configure(&device, &config.lock().unwrap()); - let viewer = Game::new(InitContext { + let keys = Keys::default(); + let state = Game::new(&UpdateContext { device: &device, queue: &queue, window: &window, - config: &config, + keys: &keys, + config: &config.clone(), }); - Self { + let mut engine = Self { surface, device, queue, @@ -149,8 +157,10 @@ impl<'a> Engine<'a> { keys: Keys::default(), focused: false, - state: Rc::new(RefCell::new(viewer)), - } + state, + }; + + engine } pub fn handle_event(&mut self, window_event: &WindowEvent) { @@ -180,27 +190,43 @@ impl<'a> Engine<'a> { pub fn resize(&mut self, new_size: PhysicalSize) { if new_size.width > 0 && new_size.height > 0 { self.size = new_size; - self.config.width = new_size.width; - self.config.height = new_size.height; - self.surface.configure(&self.device, &self.config); + { + let mut config = self.config.lock().unwrap(); + config.width = new_size.width; + config.height = new_size.height; + self.surface.configure(&self.device, &config); + } + + self.state.resize( + &UpdateContext { + device: &self.device, + queue: &self.queue, + keys: &self.keys, + window: &self.window, + config: &self.config, + }, + new_size, + ); } } pub fn update(&mut self) { - self.state.borrow_mut().update(&UpdateContext { + self.state.update(&UpdateContext { device: &self.device, queue: &self.queue, keys: &self.keys, window: &self.window, + config: &self.config, }); self.keys.tick_keys(); } + pub fn render(&self) -> Result<(), wgpu::SurfaceError> { let output = self.surface.get_current_texture()?; let mut encoder = self.device.create_command_encoder(&Default::default()); - self.state.borrow().render(self, &output.texture, &mut encoder); + self.state.render(self, &output.texture, &mut encoder); self.queue.submit(std::iter::once(encoder.finish())); output.present(); @@ -209,24 +235,19 @@ impl<'a> Engine<'a> { } } -pub struct InitContext<'a> { - pub device: &'a Device, - pub queue: &'a Queue, - pub window: &'a Window, - pub config: &'a SurfaceConfiguration, -} - pub struct UpdateContext<'a> { pub device: &'a Device, pub queue: &'a Queue, pub keys: &'a Keys, pub window: &'a Window, + pub config: &'a Arc>, } pub trait EngineState { - fn new(context: InitContext) -> Self + fn new(context: &UpdateContext) -> Self where Self: Sized; - fn update(&mut self, device: &UpdateContext); + fn update(&mut self, context: &UpdateContext); + fn resize(&mut self, context: &UpdateContext, new_size: PhysicalSize); fn render(&self, engine: &Engine, surface: &Texture, encoder: &mut CommandEncoder); } diff --git a/src/game.rs b/src/game.rs index f52dac6..2ae8e67 100644 --- a/src/game.rs +++ b/src/game.rs @@ -1,52 +1,66 @@ -use loading::LoadingState; +use std::{rc::Rc, sync::Arc}; + +use anm::LoadedFile; +use states::GameStateMachine; use wgpu::RenderPass; use crate::engine::{self, Engine, EngineState, UpdateContext}; mod anm; -mod loading; -mod title; +mod snd; +pub mod states; pub struct Game { + sound_manager: snd::Manager, anm_manager: anm::Manager, - loading: LoadingState, + state: GameStateMachine, } -struct GameInitContext<'a> { - anm_manager: &'a mut anm::Manager, - engine: engine::InitContext<'a>, -} - -struct GameUpdateContext<'a> { +struct GameContext<'a> { engine: &'a UpdateContext<'a>, + sound_manager: &'a mut snd::Manager, anm_manager: &'a mut anm::Manager, } -trait GameState { - fn update(&mut self, _context: &GameUpdateContext) {} +impl GameContext<'_> { + pub fn load_anm(&mut self, file_name: &str) -> Arc { + self.anm_manager.load_anm(&self.engine.device, &self.engine.queue, &self.engine.window, file_name) + } } impl EngineState for Game { - fn new(context: crate::engine::InitContext) -> Self + fn new(context: &UpdateContext) -> Self where Self: Sized, { + let mut sound_manager = snd::Manager::new(); let mut anm_manager = anm::Manager::new(&context); - let mut context = GameInitContext { + let mut context = GameContext { anm_manager: &mut anm_manager, + sound_manager: &mut sound_manager, engine: context, }; - Self { - loading: LoadingState::new(&mut context), + let state = GameStateMachine::new(&mut context); + + let game = Self { + sound_manager, anm_manager, - } + state, + }; + + game + } + + fn resize(&mut self, context: &UpdateContext, new_size: winit::dpi::PhysicalSize) { + self.anm_manager.resize(context.device, new_size); } fn update(&mut self, _context: &UpdateContext) { - self.loading.update(&GameUpdateContext { + self.state.update(&mut GameContext { engine: _context, + sound_manager: &mut self.sound_manager, anm_manager: &mut self.anm_manager, }); self.anm_manager.update(); diff --git a/src/game/anm/clear.wgsl b/src/game/anm/clear.wgsl new file mode 100644 index 0000000..4716639 --- /dev/null +++ b/src/game/anm/clear.wgsl @@ -0,0 +1,26 @@ +struct VertexOutput { + @builtin(position) clip_pos: vec4, +}; + +@vertex +fn vs_main( + @builtin(vertex_index) in_vertex_index: u32, +) -> VertexOutput { + var out: VertexOutput; + var vertex_pos = vec2( + f32(in_vertex_index & 1), + f32(in_vertex_index >> 1), + ); + out.clip_pos = vec4(vertex_pos * 2 - 1, 0.0, 1.0); + return out; +} + +@group(0) @binding(0) +var t_diffuse: texture_2d; +@group(1) @binding(0) +var s_diffuse: sampler; + +@fragment +fn fs_main() -> @location(0) vec4 { + return vec4(0.0, 0.0, 0.0, 1.0); +} diff --git a/src/game/anm/image.rs b/src/game/anm/image.rs index ed22ec5..c2aa30c 100644 --- a/src/game/anm/image.rs +++ b/src/game/anm/image.rs @@ -35,7 +35,7 @@ pub fn produce_image_from_entry(entry: &Entry) -> anyhow::Result { let mut final_view = ArrayViewMut2::from_shape((4 * final_width, final_height), &mut final_image) .expect("failed to interpret final image as a 2d array"); - println!("rt: {final_width}x{final_height} entry: {width}x{height}"); + // log::debug!("rt: {final_width}x{final_height} entry: {width}x{height}"); let mut content_view = final_view.slice_mut(s![0..width * 4, 0..height]); content_view.assign(&ArrayView2::from_shape((4 * width, height), &mut content).unwrap()); diff --git a/src/game/anm/loaded_file.rs b/src/game/anm/loaded_file.rs index d766813..e17d81b 100644 --- a/src/game/anm/loaded_file.rs +++ b/src/game/anm/loaded_file.rs @@ -1,4 +1,4 @@ -use std::{io::Cursor, ops::Add, rc::Rc}; +use std::{io::Cursor, ops::Add, sync::Arc}; use bytemuck::{Pod, Zeroable}; use glam::Vec2; @@ -10,7 +10,7 @@ use wgpu::{ use winit::window::Window; use super::{ - image::{produce_image_from_entry, Image}, vm::opcodes::Instruction + image::{produce_image_from_entry, Image}, vm::opcodes::{Instruction, Op} }; pub struct LoadedEntry { @@ -22,7 +22,7 @@ pub struct LoadedEntry { } impl LoadedEntry { - fn load(device: &Device, queue: &Queue, window: &Window, entry: &truth::anm::Entry) -> Rc { + fn load(device: &Device, queue: &Queue, window: &Window, entry: &truth::anm::Entry) -> Arc { let image = entry.img_data().is_some().then(|| produce_image_from_entry(&entry).expect("failed to parse...")); let (width, height, usages) = if *entry.path == "@R" { @@ -49,7 +49,7 @@ impl LoadedEntry { let sprites = entry.sprites.iter().map(|(_, sprite)| LoadedSprite::load(sprite, entry_size)).collect::>(); - Rc::new(LoadedEntry { + Arc::new(LoadedEntry { _texture: texture, bind_group, _rt_texture_size: entry_size, @@ -82,8 +82,6 @@ impl LoadedEntry { }; let texture = if let Some(image) = image { - let _ = std::fs::create_dir_all("engine_dump"); - device.create_texture_with_data( &queue, descriptor, @@ -161,10 +159,11 @@ impl Add for SpriteUvs { pub struct LoadedScript { pub instructions: Vec, + pub interrupts: FastHashMap, } impl LoadedScript { - fn load(script: &truth::anm::Script) -> Rc { + fn load(script: &truth::anm::Script) -> Arc { let mut offset_instructions: FastHashMap<_, _> = Default::default(); let mut current_offset = 0; for (index, inst) in script.instrs.iter().enumerate() { @@ -175,17 +174,32 @@ impl LoadedScript { let instructions: Vec<_> = script.instrs.iter().map(|inst| Instruction::from_raw(inst.clone(), &offset_instructions)).collect(); - Rc::new(LoadedScript { instructions }) + let interrupts = instructions + .iter() + .enumerate() + .filter_map(|(index, inst)| { + if let Op::InterruptLabel(label) = inst.op { + Some((label, index)) + } else { + None + } + }) + .collect(); + + Arc::new(LoadedScript { + instructions, + interrupts, + }) } } pub struct LoadedFile { - pub scripts: Vec>, - pub sprite_entries: NonOverlappingIntervalTree)>, + pub(super) scripts: Vec>, + pub(super) sprite_entries: NonOverlappingIntervalTree)>, } impl LoadedFile { - pub fn load(device: &Device, queue: &Queue, window: &Window, file_name: &str, file_data: &[u8]) -> Rc { + pub fn load(device: &Device, queue: &Queue, window: &Window, file_name: &str, file_data: &[u8]) -> Self { let file = AnmFile::read_from_stream( &mut BinReader::from_reader(&RootEmitter::new_stderr(), file_name, Cursor::new(file_data)), Game::Th11, @@ -207,9 +221,9 @@ impl LoadedFile { sprite_entries.insert(start..id, (start, entry.clone())); } - Rc::new(Self { + Self { scripts, sprite_entries, - }) + } } } diff --git a/src/game/anm/manager.rs b/src/game/anm/manager.rs index 7c8082a..91bc105 100644 --- a/src/game/anm/manager.rs +++ b/src/game/anm/manager.rs @@ -1,16 +1,16 @@ use std::{ - cell::RefCell, collections::VecDeque, num::NonZero, path::Path, rc::{Rc, Weak} + cell::RefCell, collections::VecDeque, num::NonZero, path::Path, rc::{Rc, Weak}, sync::Arc }; use bytemuck::{bytes_of, Pod, Zeroable}; use glam::{Mat4, Vec3, Vec4}; use num_traits::FloatConst; use wgpu::{ - include_wgsl, naga::FastHashMap, util::{BufferInitDescriptor, DeviceExt}, BindGroup, BindGroupDescriptor, BindGroupEntry, BindGroupLayoutDescriptor, BindGroupLayoutEntry, BindingResource, BlendState, Buffer, BufferUsages, ColorTargetState, ColorWrites, Device, FragmentState, PipelineLayout, PipelineLayoutDescriptor, PrimitiveState, Queue, RenderPipeline, RenderPipelineDescriptor, ShaderModule, ShaderStages, VertexState + include_wgsl, naga::FastHashMap, util::{BufferInitDescriptor, DeviceExt}, BindGroup, BindGroupDescriptor, BindGroupEntry, BindGroupLayoutDescriptor, BindGroupLayoutEntry, BindingResource, BlendState, Buffer, BufferUsages, ColorTargetState, ColorWrites, DepthStencilState, Device, FragmentState, PipelineLayout, PipelineLayoutDescriptor, PrimitiveState, Queue, RenderPipeline, RenderPipelineDescriptor, ShaderModule, ShaderStages, Texture, TextureFormat, VertexState }; use winit::window::Window; -use crate::engine::InitContext; +use crate::engine::UpdateContext; use super::{ loaded_file::{LoadedFile, SpriteUvs}, AnmVm @@ -23,14 +23,6 @@ pub use location::VmLocation; pub type Vm = Rc>; pub type WeakVm = Weak>; -#[derive(Default, Clone, Copy, Pod, Zeroable)] -#[repr(C, packed)] -pub(super) struct Instance { - matrix: Mat4, - sprite_uv: SpriteUvs, - color: Vec4, -} - #[derive(Clone, Copy, Pod, Zeroable)] #[repr(C, packed)] struct Uniform { @@ -38,23 +30,27 @@ struct Uniform { } pub struct Manager { - anm_files: FastHashMap>, + anm_files: FastHashMap>, world_backbuffer_anm: WeakVm, ui_vms: VecDeque, world_vms: VecDeque, + depth_texture: Texture, ui_uniform: Uniform, _world_uniform: Uniform, uniform_buffer: Buffer, render_bind_group: BindGroup, render_pipeline_layout: PipelineLayout, render_shader: ShaderModule, + clear_pipeline: RenderPipeline, blit_pipeline: RenderPipeline, } impl Manager { - pub fn new(context: &InitContext) -> Manager { + pub fn new(context: &UpdateContext) -> Manager { + let depth_texture = Self::create_depth_texture(context.device, context.window.inner_size()); + let texture_bind_group_layout = context.device.create_bind_group_layout(&BindGroupLayoutDescriptor { entries: &[BindGroupLayoutEntry { binding: 0, @@ -103,7 +99,7 @@ impl Manager { }); let ui_uniform = Uniform { - proj_matrix: Mat4::orthographic_lh(0.0, 640.0, 480.0, 0.0, -1.0, 1.0), + proj_matrix: Mat4::orthographic_lh(0.0, 640.0, 480.0, 0.0, 100.0, -100.0), }; let uniform_buffer = context.device.create_buffer_init(&BufferInitDescriptor { @@ -134,15 +130,21 @@ impl Manager { }); let render_shader = context.device.create_shader_module(include_wgsl!("./render.wgsl")); + let blit_shader = context.device.create_shader_module(include_wgsl!("./blit_screen.wgsl")); + let clear_shader = context.device.create_shader_module(include_wgsl!("./clear.wgsl")); - let shader = context.device.create_shader_module(include_wgsl!("./blit_screen.wgsl")); + let config = context.config.lock().unwrap(); - let blit_pipeline = context.device.create_render_pipeline(&RenderPipelineDescriptor { - label: Some("blit"), - layout: Some(&pipeline_layout), + let clear_pipeline = context.device.create_render_pipeline(&RenderPipelineDescriptor { + label: Some("clear"), + layout: Some(&context.device.create_pipeline_layout(&PipelineLayoutDescriptor { + label: None, + bind_group_layouts: &[], + push_constant_ranges: &[], + })), vertex: VertexState { buffers: &[], - module: &shader, + module: &clear_shader, compilation_options: Default::default(), entry_point: "vs_main", }, @@ -150,21 +152,70 @@ impl Manager { topology: wgpu::PrimitiveTopology::TriangleStrip, ..Default::default() }, - depth_stencil: None, + depth_stencil: Some(DepthStencilState { + format: TextureFormat::Depth32Float, + depth_write_enabled: true, + depth_compare: wgpu::CompareFunction::Less, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), multisample: Default::default(), fragment: Some(FragmentState { targets: &[Some(ColorTargetState { - format: context.config.format, + format: config.format, + blend: Some(BlendState::REPLACE), + write_mask: ColorWrites::ALL, + })], + compilation_options: Default::default(), + entry_point: "fs_main", + module: &clear_shader, + }), + multiview: None, + cache: None, + }); + + let blit_pipeline = context.device.create_render_pipeline(&RenderPipelineDescriptor { + label: Some("blit"), + layout: Some(&pipeline_layout), + vertex: VertexState { + buffers: &[], + module: &blit_shader, + compilation_options: Default::default(), + entry_point: "vs_main", + }, + primitive: PrimitiveState { + topology: wgpu::PrimitiveTopology::TriangleStrip, + ..Default::default() + }, + depth_stencil: Some(DepthStencilState { + format: TextureFormat::Depth32Float, + depth_write_enabled: true, + depth_compare: wgpu::CompareFunction::Less, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), + multisample: Default::default(), + fragment: Some(FragmentState { + targets: &[Some(ColorTargetState { + format: config.format, blend: Some(BlendState::ALPHA_BLENDING), write_mask: ColorWrites::ALL, })], compilation_options: Default::default(), entry_point: "fs_main", - module: &shader, + module: &blit_shader, }), multiview: None, cache: None, }); + let world_uniform = Uniform { + proj_matrix: Mat4::perspective_lh( + 45.0 * (f32::PI() / 180.0), + config.width as f32 / config.height as f32, + 0.1, + 1000.0, + ), + }; Manager { anm_files: FastHashMap::default(), @@ -173,37 +224,40 @@ impl Manager { ui_vms: VecDeque::new(), world_vms: VecDeque::new(), + depth_texture, ui_uniform, - _world_uniform: Uniform { - proj_matrix: Mat4::perspective_lh( - 45.0 * (f32::PI() / 180.0), - context.config.width as f32 / context.config.height as f32, - 0.1, - 1000.0, - ), - }, + _world_uniform: world_uniform, uniform_buffer, render_bind_group, render_pipeline_layout: pipeline_layout, render_shader, + clear_pipeline, blit_pipeline, } } - pub fn load_anm(&mut self, device: &Device, queue: &Queue, window: &Window, file_name: &str) -> Rc { - if let Some(loaded_anm) = self.anm_files.get(file_name) { + pub fn load_anm( + &mut self, + device: &Device, + queue: &Queue, + window: &Window, + file_name: impl AsRef, + ) -> Arc { + let file_name_str = file_name.as_ref().to_str().unwrap().to_owned(); + if let Some(loaded_anm) = self.anm_files.get(&file_name_str) { return loaded_anm.clone(); } - let file_data = std::fs::read(Path::new("./assets").join(file_name)).expect("failed to load anm file"); - let loaded_anm = LoadedFile::load(device, queue, window, file_name, &file_data); - self.anm_files.insert(file_name.to_owned(), loaded_anm.clone()); + let file_data = std::fs::read(Path::new("./assets").join(file_name)).expect("failed to load anm file"); + let loaded_anm = Arc::new(LoadedFile::load(device, queue, window, &file_name_str, &file_data)); + + self.anm_files.insert(file_name_str.to_owned(), loaded_anm.clone()); loaded_anm } #[allow(unused)] - pub fn set_world_backbuffer_anm(&mut self, file: Rc, script: usize) -> Vm { - let vm = Rc::new(RefCell::new(AnmVm::new(file, None, false, script, 0))); + pub fn set_world_backbuffer_anm(&mut self, file: Arc, script: usize) -> Vm { + let vm = Rc::new(RefCell::new(AnmVm::new(file, None, false, false, script, 0))); self.update_single(&vm); self.world_backbuffer_anm = Rc::downgrade(&vm); @@ -213,15 +267,23 @@ impl Manager { pub fn new_vm( &mut self, - file: Rc, + file: Arc, origin: Option, ticked_by_parent: bool, + debug: bool, script: usize, location: VmLocation, ) -> Vm { let layer = location.layer(); - let vm = Rc::new(RefCell::new(AnmVm::new(file, origin, ticked_by_parent, script, layer))); + let vm = Rc::new(RefCell::new(AnmVm::new( + file, + origin, + ticked_by_parent, + debug, + script, + layer, + ))); self.update_single(&vm); let mut context = ManagerUpdate::new(); @@ -290,15 +352,23 @@ impl ManagerUpdate { pub fn new_vm( &mut self, - file: Rc, + file: Arc, origin: Option, ticked_by_parent: bool, + debug: bool, script: usize, location: VmLocation, ) -> Vm { let layer = location.layer(); - let vm = Rc::new(RefCell::new(AnmVm::new(file, origin, ticked_by_parent, script, layer))); + let vm = Rc::new(RefCell::new(AnmVm::new( + file, + origin, + ticked_by_parent, + debug, + script, + layer, + ))); vm.borrow_mut().tick(self); let vm_list = match location { diff --git a/src/game/anm/manager/rendering.rs b/src/game/anm/manager/rendering.rs index 08077c3..ea0924c 100644 --- a/src/game/anm/manager/rendering.rs +++ b/src/game/anm/manager/rendering.rs @@ -1,14 +1,26 @@ -use bytemuck::bytes_of; -use glam::{Mat4, Vec3}; +use std::collections::VecDeque; + +use bytemuck::{bytes_of, Pod, Zeroable}; +use glam::{Mat4, Vec2, Vec3, Vec4}; use wgpu::{ - BufferDescriptor, BufferUsages, Color, ColorTargetState, ColorWrites, FragmentState, LoadOp, Operations, PrimitiveState, RenderPass, RenderPassColorAttachment, RenderPassDescriptor, RenderPipeline, RenderPipelineDescriptor, VertexAttribute, VertexBufferLayout, VertexState + BufferDescriptor, BufferUsages, Color, ColorTargetState, ColorWrites, DepthStencilState, Device, Extent3d, FragmentState, LoadOp, Operations, PrimitiveState, RenderPass, RenderPassColorAttachment, RenderPassDepthStencilAttachment, RenderPassDescriptor, RenderPipeline, RenderPipelineDescriptor, StoreOp, TextureDescriptor, TextureFormat, TextureUsages, VertexAttribute, VertexBufferLayout, VertexState }; +use winit::dpi::PhysicalSize; use crate::{ - engine::Engine, game::anm::{vm::RenderingState, AnmVm} + engine::Engine, game::anm::{loaded_file::SpriteUvs, vm::RenderingState, AnmVm} }; -use super::{Instance, Manager}; +use super::{Manager, WeakVm}; + +#[derive(Default, Clone, Copy, Pod, Zeroable)] +#[repr(C, packed)] +pub(super) struct Instance { + matrix: Mat4, + sprite_uv: SpriteUvs, + color: Vec4, + anchor_offset: Vec2, +} impl Manager { fn new_pipeline(&self, engine: &Engine, vm: &AnmVm) -> RenderPipeline { @@ -48,6 +60,11 @@ impl Manager { offset: 16 * 5, shader_location: 5, }, + VertexAttribute { + format: wgpu::VertexFormat::Float32x2, + offset: 16 * 6, + shader_location: 6, + }, ], array_stride: std::mem::size_of::() as u64, step_mode: wgpu::VertexStepMode::Instance, @@ -60,11 +77,17 @@ impl Manager { topology: wgpu::PrimitiveTopology::TriangleStrip, ..Default::default() }, - depth_stencil: None, + depth_stencil: Some(DepthStencilState { + format: TextureFormat::Depth32Float, + depth_write_enabled: false, + depth_compare: wgpu::CompareFunction::Less, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), multisample: Default::default(), fragment: Some(FragmentState { targets: &[Some(ColorTargetState { - format: engine.config.format, + format: engine.config.lock().unwrap().format, blend: Some(vm.blend_state), write_mask: ColorWrites::ALL, })], @@ -80,17 +103,28 @@ impl Manager { } pub fn render_vms(&self, engine: &Engine, pass: &mut RenderPass) { - for vm in &self.ui_vms { + self.render_layer(engine, pass, &self.ui_vms, 21); + self.render_layer(engine, pass, &self.ui_vms, 22); + self.render_layer(engine, pass, &self.ui_vms, 23); + self.render_layer(engine, pass, &self.ui_vms, 29); + } + + fn render_layer(&self, engine: &Engine, pass: &mut RenderPass, list: &VecDeque, layer: u32) { + for vm in list { if let Some(vm) = vm.upgrade() { - self.render_vm(engine, pass, &vm.borrow(), &Vec3::ZERO); + let vm = vm.borrow(); + if vm.layer != layer { + self.render_vm(engine, pass, &vm, &Vec3::new(0.0, 0.0, layer as f32)); + } } } } - fn render_vm(&self, engine: &Engine, pass: &mut RenderPass, vm: &AnmVm, parent_origin: &Vec3) { + fn render_vm(&self, engine: &Engine, pass: &mut RenderPass, vm: &AnmVm, layer_origin: &Vec3) { if !vm.visible { return; } + if let Some((sprite, entry)) = vm.sprite_entry_pair() { let mut rendering_state = vm.rendering_state.borrow_mut(); if rendering_state.is_none() { @@ -103,39 +137,45 @@ impl Manager { *rendering_state = Some(RenderingState { instance_buffer: instance_buffer, - pipeline: self.new_pipeline(engine, vm), + pipeline: Some(self.new_pipeline(engine, vm)), }); } - let rendering_state = &rendering_state.as_ref().unwrap(); + let rendering_state = rendering_state.as_mut().unwrap(); - let anchor_offset = (sprite.size * vm.anchor_offset).extend(0.0); - let translation_mat = Mat4::from_translation(vm.position() - anchor_offset); + if rendering_state.pipeline.is_none() { + rendering_state.pipeline = Some(self.new_pipeline(engine, vm)) + } - let rest_mat = - Mat4::from_scale_rotation_translation((sprite.size * vm.scale()).extend(1.0), vm.rotation(), Vec3::ZERO); + // let mut matrix = Mat4::from_translation(layer_origin + vm.position()); + let offset = sprite.size.extend(1.0) * vm.anchor_offset.extend(0.0); + let mut matrix = Mat4::IDENTITY; + matrix *= Mat4::from_translation(layer_origin + vm.position()); + matrix *= Mat4::from_rotation_translation(vm.rotation(), Vec3::ZERO); + // matrix *= Mat4::from_translation(-offset); + matrix *= Mat4::from_scale((sprite.size * vm.scale()).extend(1.0)); engine.queue.write_buffer( &rendering_state.instance_buffer, 0, bytes_of(&Instance { - matrix: translation_mat * rest_mat, + matrix, sprite_uv: sprite.uvs + vm.scroll(), color: vm.color().extend(vm.alpha()), + anchor_offset: vm.anchor_offset, }), ); - pass.set_pipeline(&rendering_state.pipeline); + pass.set_pipeline(rendering_state.pipeline.as_ref().unwrap()); pass.set_bind_group(0, &entry.bind_group, &[]); pass.set_bind_group(1, &self.render_bind_group, &[]); pass.set_vertex_buffer(0, rendering_state.instance_buffer.slice(..)); pass.draw(0..4, 0..1 as u32); } - // let origin_vec = parent_origin + vm.origin_vec; for child in vm.children.iter() { let child = child.borrow(); - self.render_vm(engine, pass, &child, &parent_origin); + self.render_vm(engine, pass, &child, &layer_origin); } } @@ -147,23 +187,65 @@ impl Manager { view: &surface.create_view(&Default::default()), resolve_target: None, ops: Operations { - load: LoadOp::Clear(Color { - r: 100. / 255., - g: 149. / 255., - b: 237. / 255., - a: 1.0, - }), - // load: LoadOp::Load, + // load: LoadOp::Clear(Color { + // r: 100. / 255., + // g: 149. / 255., + // b: 237. / 255., + // a: 1.0, + // }), + load: LoadOp::Load, ..Default::default() }, })], + depth_stencil_attachment: Some(RenderPassDepthStencilAttachment { + view: &self.depth_texture.create_view(&Default::default()), + depth_ops: Some(Operations { + load: LoadOp::Clear(1.0), + store: StoreOp::Store, + }), + stencil_ops: None, + }), ..Default::default() }); self.render_vms(engine, &mut pass); } + fn clear(&self, encoder: &mut wgpu::CommandEncoder, surface: &wgpu::Texture) { + let mut pass = encoder.begin_render_pass(&RenderPassDescriptor { + label: Some("clear"), + color_attachments: &[Some(RenderPassColorAttachment { + view: &surface.create_view(&Default::default()), + resolve_target: None, + ops: Operations { + load: LoadOp::Clear(Color { + r: 100. / 255., + g: 149. / 255., + b: 0. / 255., + a: 1.0, + }), + ..Default::default() + }, + })], + depth_stencil_attachment: Some(RenderPassDepthStencilAttachment { + view: &self.depth_texture.create_view(&Default::default()), + depth_ops: Some(Operations { + load: LoadOp::Clear(1.0), + store: StoreOp::Store, + }), + stencil_ops: None, + }), + ..Default::default() + }); + + pass.set_pipeline(&self.clear_pipeline); + pass.draw(0..4, 0..1); + } + pub fn render(&self, engine: &Engine, surface: &wgpu::Texture, encoder: &mut wgpu::CommandEncoder) { + self.clear(encoder, surface); + self.render_ui(engine, encoder, surface); + if let Some(backbuffer_anm) = self.world_backbuffer_anm.upgrade() { let mut pass = encoder.begin_render_pass(&RenderPassDescriptor { label: Some("blit"), @@ -180,6 +262,14 @@ impl Manager { ..Default::default() }, })], + depth_stencil_attachment: Some(RenderPassDepthStencilAttachment { + view: &self.depth_texture.create_view(&Default::default()), + depth_ops: Some(Operations { + load: LoadOp::Load, + store: StoreOp::Store, + }), + stencil_ops: None, + }), ..Default::default() }); @@ -191,10 +281,27 @@ impl Manager { ); pass.set_bind_group(1, &self.render_bind_group, &[]); pass.draw(0..4, 0..1); - } else { - // encoder.clear_texture(surface, &Default::default()); } + } - self.render_ui(engine, encoder, surface); + pub(super) fn create_depth_texture(device: &Device, size: PhysicalSize) -> wgpu::Texture { + device.create_texture(&TextureDescriptor { + label: Some("depth texture"), + size: Extent3d { + width: size.width.max(1), + height: size.height.max(1), + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Depth32Float, + usage: TextureUsages::RENDER_ATTACHMENT | TextureUsages::TEXTURE_BINDING, + view_formats: &[], + }) + } + + pub fn resize(&mut self, device: &Device, new_size: PhysicalSize) { + self.depth_texture = Self::create_depth_texture(device, new_size) } } diff --git a/src/game/anm/mod.rs b/src/game/anm/mod.rs index ec567c1..3b2c39a 100644 --- a/src/game/anm/mod.rs +++ b/src/game/anm/mod.rs @@ -4,4 +4,5 @@ mod manager; mod vm; pub use manager::{Manager, VmLocation, Vm}; +pub use loaded_file::LoadedFile; pub use vm::AnmVm; diff --git a/src/game/anm/render.wgsl b/src/game/anm/render.wgsl index 025f9f2..7d20639 100644 --- a/src/game/anm/render.wgsl +++ b/src/game/anm/render.wgsl @@ -22,6 +22,7 @@ struct VmInstance { @location(3) mtx_3: vec4, @location(4) sprite: vec4, @location(5) color: vec4, + @location(6) offset: vec2, } @group(1) @binding(1) @@ -43,7 +44,7 @@ fn vs_main( instance.mtx_2, instance.mtx_3, ); - out.clip_pos = proj_mtx * in_mtx * vec4((vertex_pos.x), vertex_pos.y, 0.0, 1.0); + out.clip_pos = proj_mtx * in_mtx * vec4(vertex_pos.xy - instance.offset, 0.0, 1.0); out.texture_coords = rescale_to_sprite(vertex_pos, instance.sprite); out.color = instance.color; return out; @@ -56,5 +57,5 @@ var s_diffuse: sampler; @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4 { - return textureSample(t_diffuse, s_diffuse, in.texture_coords); + return in.color * textureSample(t_diffuse, s_diffuse, in.texture_coords); } diff --git a/src/game/anm/vm/execute.rs b/src/game/anm/vm/execute.rs index 945b7fa..fd99e9f 100644 --- a/src/game/anm/vm/execute.rs +++ b/src/game/anm/vm/execute.rs @@ -12,6 +12,10 @@ use super::{ impl AnmVm { fn next_instruction(&mut self) -> Option { + if self.waiting_countdown > 0 { + return None; + } + let instructions = &self.script.instructions; if self.pc >= instructions.len() { return None; @@ -26,14 +30,18 @@ impl AnmVm { } pub(super) fn advance_time(&mut self) { - if self.waiting.is_none() { + if self.waiting_countdown == 0 { self.time += 1; } + + self.waiting_countdown = self.waiting_countdown.saturating_sub(1); } fn store_int(&mut self, var: i32, value: i32) { match var { - 10000..=10009 => self.gp_vars[var as usize - 10000] = value, + 10000..=10003 => self.int_vars[var as usize - 10000] = value, + 10004..=10007 => self.float_vars[var as usize - 10004] = value as f32, + 10008..=10009 => self.int_vars[var as usize - 10008] = value, 10010..=10012 | 10022 => {} // rand 10013..=10015 => {} // 10013 => self.position.current().x = value as f32, @@ -45,7 +53,9 @@ impl AnmVm { fn store_float(&mut self, var: i32, value: f32) { match var { - 10000..=10009 => self.gp_vars[var as usize - 10000] = i32::from_ne_bytes(f32::to_ne_bytes(value)), + 10000..=10003 => self.int_vars[var as usize - 10000] = value as i32, + 10004..=10007 => self.float_vars[var as usize - 10004] = value, + 10008..=10009 => self.int_vars[var as usize - 10008] = value as i32, 10010..=10012 | 10022 => {} // rand 10013..=10015 => {} // 10013 => self.position.current().x = value as f32, @@ -58,10 +68,12 @@ impl AnmVm { fn param_int(&self, param: Param) -> i32 { match param { Param::Variable(var) => match var { - 10000..=10009 => self.gp_vars[var as usize - 10000], + 10000..=10003 => self.int_vars[var as usize - 10000], + 10004..=10007 => self.float_vars[var as usize - 10004] as i32, + 10008..=10009 => self.int_vars[var as usize - 10008], 10010 => rand::thread_rng().gen_range((-f32::PI() as i32)..(f32::PI() as i32)), - 10011 => rand::thread_rng().gen_range(0..1), - 10012 => rand::thread_rng().gen_range(-1..1), + 10011 => rand::thread_rng().gen_range(0..=1), + 10012 => rand::thread_rng().gen_range(-1..=1), 10013 => self.position_interpolator.current().x as i32, 10014 => self.position_interpolator.current().y as i32, 10015 => self.position_interpolator.current().z as i32, @@ -77,7 +89,9 @@ impl AnmVm { match param { Param::Variable(var) => { match var { - 10000..=10009 => f32::from_ne_bytes(i32::to_ne_bytes(self.gp_vars[var as usize - 10000])), + 10000..=10003 => self.int_vars[var as usize - 10000] as f32, + 10004..=10007 => self.float_vars[var as usize - 10004], + 10008..=10009 => self.int_vars[var as usize - 10008] as f32, 10010 => rand::thread_rng().gen_range(-f32::PI()..=f32::PI()), // rand 10011 => rand::thread_rng().gen_range(0.0..=1.0), 10012 => rand::thread_rng().gen_range(-1.0..=1.0), @@ -94,10 +108,19 @@ impl AnmVm { } pub(super) fn execute(&mut self, manager: &mut ManagerUpdate) { + if let Some(interrupt) = self.pending_interrupt { + + } while let Some(inst) = self.next_instruction() { + if self.debug { + log::info!("executing {inst:?}"); + } match inst.op { Op::Nop => {} - Op::Delete => self.delete(), + Op::Delete => { + self.delete(); + return; + } Op::Sprite(sprite) => self.sprite = sprite, Op::Jump { index, time } => { self.pc = index; @@ -117,7 +140,7 @@ impl AnmVm { self.store_int(dest, op(self.param_int(Param::Variable(dest)), self.param_int(input))); } Op::FloatOp { op, dest, input } => { - let op: fn(f32, f32) -> f32 = match op { + let op_func: fn(f32, f32) -> f32 = match op { PrimOp::Set => |_, input| input, PrimOp::Add => std::ops::Add::add, PrimOp::Sub => std::ops::Sub::sub, @@ -127,9 +150,19 @@ impl AnmVm { PrimOp::Rand => |_, end| rand::thread_rng().gen_range(0.0..end), }; + if self.debug { + log::info!( + "{dest} {op:?}Assign {input:?} = {}", + op_func( + self.param_float(Param::Variable(dest)), + self.param_float(input) + ) + ); + } + self.store_float( dest, - op(self.param_float(Param::Variable(dest)), self.param_float(input)), + op_func(self.param_float(Param::Variable(dest)), self.param_float(input)), ); } Op::IntSetOp { op, dest, left, right } => { @@ -144,7 +177,7 @@ impl AnmVm { self.store_int(dest, op(self.param_int(left), self.param_int(right))); } Op::FloatSetOp { op, dest, left, right } => { - let op: fn(f32, f32) -> f32 = match op { + let op_func: fn(f32, f32) -> f32 = match op { PrimSetOp::Add => std::ops::Add::add, PrimSetOp::Sub => std::ops::Sub::sub, PrimSetOp::Mul => std::ops::Mul::mul, @@ -152,13 +185,29 @@ impl AnmVm { PrimSetOp::Mod => std::ops::Rem::rem, }; - self.store_float(dest, op(self.param_float(left), self.param_float(right))); + if self.debug { + log::info!( + "{dest} = {left:?} {op:?} {right:?} = {}", + op_func(self.param_float(left), self.param_float(right)) + ); + } + self.store_float(dest, op_func(self.param_float(left), self.param_float(right))); + } + Op::Pos { x, y, z } => { + if self.debug { + log::warn!( + "pos: {} {} {}", + self.param_float(x), + self.param_float(y), + self.param_float(z) + ) + } + self.position_interpolator.reset_immediate(Vec3::new( + self.param_float(x), + self.param_float(y), + self.param_float(z), + )) } - Op::Pos { x, y, z } => self.position_interpolator.reset_immediate(Vec3::new( - self.param_float(x), - self.param_float(y), - self.param_float(z), - )), Op::Rotate { x, y, z } => self.rotation_interpolator.reset_immediate(Vec3::new( self.param_float(x), self.param_float(y), @@ -186,21 +235,8 @@ impl AnmVm { let mode = Mode::from_i32(self.param_int(mode)).expect("bad mode passed"); let pos = Vec3::new(self.param_float(x), self.param_float(y), self.param_float(z)); // println!("mode set {mode:?} {pos} {}", self.position_interpolator.current()); - self.position_interpolator.reset( - mode, - self.param_int(time), - pos, - None, - None, - ) + self.position_interpolator.reset(mode, self.param_int(time), pos, None, None) } - Op::AlphaTime { time, mode, alpha } => self.alpha_interpolator.reset( - Mode::from_i32(self.param_int(mode)).expect("bad mode passed"), - self.param_int(time), - self.param_int(alpha) as f32, - None, - None, - ), Op::ColorTime { red, green, @@ -218,7 +254,28 @@ impl AnmVm { None, None, ), - Op::Stop => self.waiting = Some(inst), + Op::AlphaTime { time, mode, alpha } => self.alpha_interpolator.reset( + Mode::from_i32(self.param_int(mode)).expect("bad mode passed"), + self.param_int(time), + self.param_int(alpha) as f32, + None, + None, + ), + Op::RotateTime { time, mode, x, y, z } => self.rotation_interpolator.reset( + Mode::from_i32(self.param_int(mode)).expect("bad mode passed"), + self.param_int(time), + Vec3::new(self.param_float(x), self.param_float(y), self.param_float(z)), + None, + None, + ), + Op::ScaleTime { time, mode, x, y } => self.scale_interpolator.reset( + Mode::from_i32(self.param_int(mode)).expect("bad mode passed"), + self.param_int(time), + Vec2::new(self.param_float(x), self.param_float(y)), + None, + None, + ), + Op::Stop => self.waiting_countdown = u32::MAX, Op::InterruptLabel(_) => {} Op::Anchor { horizontal, vertical } => { let axis = |value: i16| match value { @@ -236,6 +293,8 @@ impl AnmVm { self.sprite_mode = mode; } Op::Layer { layer } => self.layer = layer as u32, + Op::Wait { time } => self.waiting_countdown = time as u32, + Op::CaseReturn => {} Op::UnknownBitflag { .. } => {} Op::RandMode { mode } => self.random_mode = mode, Op::ScriptNew { script } => { @@ -243,6 +302,7 @@ impl AnmVm { self.file.clone(), Some(self.position()), true, + false, script as usize, VmLocation::new_child(self.layer), )); @@ -252,6 +312,7 @@ impl AnmVm { self.file.clone(), Some(self.position()), true, + false, script as usize, VmLocation::new_child_ui(self.layer), )); @@ -261,6 +322,7 @@ impl AnmVm { self.file.clone(), Some(self.position()), true, + false, script as usize, VmLocation::new_child_front(self.layer), )); @@ -270,6 +332,7 @@ impl AnmVm { self.file.clone(), Some(self.position()), true, + false, script as usize, VmLocation::new_child_ui_front(self.layer), )); diff --git a/src/game/anm/vm/mod.rs b/src/game/anm/vm/mod.rs index e0dc170..5571ac8 100644 --- a/src/game/anm/vm/mod.rs +++ b/src/game/anm/vm/mod.rs @@ -1,6 +1,7 @@ -use std::{cell::RefCell, rc::Rc}; +use std::{cell::RefCell, rc::Rc, sync::Arc}; use glam::{Quat, Vec2, Vec3}; +use log::warn; use opcodes::{Instruction, SpriteType}; use wgpu::{BlendComponent, BlendFactor, BlendOperation, BlendState, Buffer, RenderPipeline}; @@ -15,10 +16,12 @@ pub(super) mod opcodes; pub(super) struct RenderingState { pub instance_buffer: Buffer, - pub pipeline: RenderPipeline, + pub pipeline: Option, } pub struct AnmVm { + debug: bool, + pub(super) deleted: bool, fully_static: bool, frozen: bool, @@ -26,10 +29,13 @@ pub struct AnmVm { time: i32, pc: usize, - pub(super) file: Rc, - script: Rc, - gp_vars: [i32; 10], - waiting: Option, + pub(super) file: Arc, + script: Arc, + int_vars: [i32; 6], + float_vars: [f32; 4], + waiting_countdown: u32, + pending_interrupt: Option, + interrupt_return: Option<(usize, i32)>, origin: Option, position_interpolator: Vec3Interpolator, @@ -54,31 +60,36 @@ pub struct AnmVm { impl AnmVm { pub(super) fn new( - file: Rc, + file: Arc, origin: Option, ticked_by_parent: bool, + debug: bool, script: usize, default_layer: u32, ) -> AnmVm { - AnmVm { + let mut new = AnmVm { deleted: false, fully_static: false, frozen: false, ticked_by_parent, + debug, time: 0, pc: 0, script: file.scripts[script].clone(), file, - gp_vars: [Default::default(); 10], - waiting: None, + int_vars: [0; 6], + float_vars: [0.0; 4], + waiting_countdown: 0, + pending_interrupt: None, + interrupt_return: None, origin, position_interpolator: Vec3Interpolator::new(Vec3::ZERO), rotation_interpolator: Vec3Interpolator::new(Vec3::ZERO), scale_interpolator: Vec2Interpolator::new(Vec2::ONE), - color_interpolator: Vec3Interpolator::new(Vec3::ONE), - alpha_interpolator: FloatInterpolator::new(1.0), + color_interpolator: Vec3Interpolator::new(Vec3::new(255.0, 255.0, 255.0)), + alpha_interpolator: FloatInterpolator::new(255.0), anchor_offset: Vec2::new(0.5, 0.5), scroll_x: FloatInterpolator::new(0.0), scroll_y: FloatInterpolator::new(0.0), @@ -86,16 +97,20 @@ impl AnmVm { sprite: None, layer: default_layer, sprite_mode: SpriteType::NoRotate, - blend_state: BlendState::ALPHA_BLENDING, + blend_state: BlendState::REPLACE, random_mode: 0, rendering_state: Default::default(), children: vec![], - } + }; + + new.set_blend_mode(0); + + new } - pub(super) fn sprite_entry_pair(&self) -> Option<(LoadedSprite, Rc)> { + pub(super) fn sprite_entry_pair(&self) -> Option<(LoadedSprite, Arc)> { if !self.visible { return None; } @@ -107,6 +122,10 @@ impl AnmVm { }) } + pub fn debug_freeze(&mut self) { + self.frozen = true; + } + pub fn scale(&self) -> Vec2 { self.scale_interpolator.current() } @@ -119,9 +138,18 @@ impl AnmVm { pub fn position(&self) -> Vec3 { self.origin.unwrap_or(Vec3::ZERO) + self.position_interpolator.current() } + pub fn raw_position(&self) -> Vec3 { + self.position_interpolator.current() + } pub fn color(&self) -> Vec3 { - self.color_interpolator.current() / 255.0 + let color = self.color_interpolator.current() / 255.0; + + if color.length() > 1.75 { + panic!("large color {color:?}") + } + + color } pub fn alpha(&self) -> f32 { @@ -132,7 +160,11 @@ impl AnmVm { Vec2::new(self.scroll_x.current(), self.scroll_y.current()) } - fn tick_interpolators(&mut self) { + pub fn deleted(&self) -> bool { + self.deleted + } + + pub fn tick_interpolators(&mut self) { self.position_interpolator.tick(); self.rotation_interpolator.tick(); self.scale_interpolator.tick(); @@ -149,6 +181,7 @@ impl AnmVm { if self.deleted { return; } + if !self.fully_static && !self.frozen { self.tick_interpolators(); self.execute(manager); @@ -160,22 +193,44 @@ impl AnmVm { child.origin = Some(self.position()); child.tick(manager); } + self.children.retain(|vm| !vm.borrow().deleted); } pub fn set_blend_mode(&mut self, mode: i32) { let mode = match mode { - 0 => BlendState::ALPHA_BLENDING, + 0 => BlendState { + // alpha blending + color: BlendComponent { + src_factor: BlendFactor::SrcAlpha, + dst_factor: BlendFactor::OneMinusSrcAlpha, + operation: BlendOperation::Add, + }, + alpha: BlendComponent::REPLACE, + }, 1 => BlendState { + // additive blending color: BlendComponent { src_factor: BlendFactor::SrcAlpha, dst_factor: BlendFactor::One, operation: BlendOperation::Add, }, - alpha: BlendComponent::OVER, + alpha: BlendComponent::REPLACE, }, - _ => unimplemented!("blend mode {mode} not added"), + 3 => BlendState { + color: BlendComponent::REPLACE, + alpha: BlendComponent::REPLACE, + }, + _ => unimplemented!("blend mode {mode} not supported"), }; self.blend_state = mode; + self.reset_render_pipeline(); + } + + fn reset_render_pipeline(&self) { + let mut state = self.rendering_state.borrow_mut(); + if let Some(state) = state.as_mut() { + state.pipeline = None; + } } } diff --git a/src/game/anm/vm/opcodes.rs b/src/game/anm/vm/opcodes.rs index 8055f49..782eaad 100644 --- a/src/game/anm/vm/opcodes.rs +++ b/src/game/anm/vm/opcodes.rs @@ -158,8 +158,9 @@ pub enum SpriteType { RotateZ = 1, // like mode 0, but shifts the position by (-0.5, -0.5) pixels, // making it appear ever-so-slightly larger and blurrier. - RotateZShifted = 2, - Rotate3D = 8, + Rotate3D = 2, + RotateZ3D = 3, + RotateBillboard = 4, } #[derive(Debug, Clone, Copy)] @@ -690,7 +691,7 @@ impl Instruction { let r#type = decode_args!(args, "S"); Op::Type { - mode: SpriteType::from_i32(r#type).expect("unexpected type"), + mode: SpriteType::from_i32(r#type).unwrap_or_else(|| unimplemented!("unexpected type {type}")), } } Opcode::Layer => { diff --git a/src/game/loading.rs b/src/game/loading.rs deleted file mode 100644 index fadd2ab..0000000 --- a/src/game/loading.rs +++ /dev/null @@ -1,51 +0,0 @@ -use glam::Vec3; -use num_traits::FloatConst; -use rand::Rng; -use winit::keyboard::KeyCode; - -use super::{ - anm::{Vm, VmLocation}, GameInitContext, GameState -}; - -pub struct LoadingState { - sig: Vm, - ascii_loading: Vm, -} - -impl LoadingState { - pub fn new(context: &mut GameInitContext) -> LoadingState { - let ascii = context.anm_manager.load_anm( - &context.engine.device, - &context.engine.queue, - &context.engine.window, - "ascii.anm", - ); - let sig_anm = context.anm_manager.load_anm( - &context.engine.device, - &context.engine.queue, - &context.engine.window, - "sig.anm", - ); - let sig = context.anm_manager.new_vm(sig_anm, None, false, 0, VmLocation::new_ui()); - let ascii_loading = context.anm_manager.new_vm( - ascii, - Some(Vec3::new(480.0, 392.0, 0.0)), - false, - 18, - VmLocation::new_ui(), - ); - - LoadingState { sig, ascii_loading } - } -} - -impl GameState for LoadingState { - fn update(&mut self, _context: &super::GameUpdateContext) { - if _context.engine.keys.was_key_pressed(KeyCode::Space) { - println!( - "{}", - rand::thread_rng().gen_range((-f32::PI() as i32)..(f32::PI() as i32)) - ) - } - } -} diff --git a/src/game/snd/bgm/format.rs b/src/game/snd/bgm/format.rs new file mode 100644 index 0000000..c53be83 --- /dev/null +++ b/src/game/snd/bgm/format.rs @@ -0,0 +1,78 @@ +use std::ffi::CStr; + +use rodio::cpal::{BufferSize, SampleFormat, SampleRate, StreamConfig}; +use wgpu::naga::FastHashMap; +use zerocopy::{FromBytes, Immutable, KnownLayout}; + +pub struct BgmFormat { + pub tracks: FastHashMap, +} + +pub struct BgmTrack { + pub(super) config: StreamConfig, + pub(super) format: SampleFormat, + + pub(super) track_offset: u32, + pub(super) intro_size: u32, + pub(super) track_size: u32, +} + +impl BgmFormat { + pub fn new(bytes: Vec) -> BgmFormat { + #[derive(FromBytes, KnownLayout, Immutable)] + #[repr(C, packed)] + struct Track { + track_offset: u32, + _preload_size: u32, + intro_size: u32, + track_size: u32, + + format_type: u16, + channels: u16, + samples_per_sec: u32, + average_bytes_per_sec: u32, + block_align: u16, + bits_per_sample: u16, + extra_byte_count: u16, + pad: u16, + } + type TrackName = [u8; 16]; + + const TRACK_NAME_SIZE: usize = size_of::(); + const TRACK_SIZE: usize = size_of::() + size_of::(); + + assert_eq!(TRACK_SIZE, 0x34); + + let mut count = 0; + let mut tracks = FastHashMap::default(); + loop { + let start = TRACK_SIZE * count; + let track_name = TrackName::ref_from_bytes(&bytes[start..(start + TRACK_NAME_SIZE)]).unwrap(); + let track_name = CStr::from_bytes_until_nul(track_name).expect("name has no null byte"); + if track_name.count_bytes() == 0 { + break; + } + + let track_name = track_name.to_str().unwrap().to_owned(); + let track = Track::ref_from_bytes(&bytes[(start + TRACK_NAME_SIZE)..(start + TRACK_SIZE)]).unwrap(); + tracks.insert( + track_name, + BgmTrack { + config: StreamConfig { + channels: track.channels, + sample_rate: SampleRate(track.samples_per_sec), + buffer_size: BufferSize::Fixed(track.intro_size + track.track_size), + }, + format: SampleFormat::I16, + track_offset: track.track_offset, + intro_size: track.intro_size, + track_size: track.track_size, + }, + ); + + count += 1; + } + + Self { tracks } + } +} diff --git a/src/game/snd/bgm/mod.rs b/src/game/snd/bgm/mod.rs new file mode 100644 index 0000000..db7b59d --- /dev/null +++ b/src/game/snd/bgm/mod.rs @@ -0,0 +1 @@ +pub mod format; diff --git a/src/game/snd/mod.rs b/src/game/snd/mod.rs new file mode 100644 index 0000000..a24b41f --- /dev/null +++ b/src/game/snd/mod.rs @@ -0,0 +1,23 @@ +use std::{ + fs::{self, File}, sync::Arc +}; + +use bgm::format::BgmFormat; +use memmap2::{Mmap, MmapOptions}; + +pub mod bgm; + +pub struct Manager { + bgm_format: bgm::format::BgmFormat, + bgm_file: Arc, +} + +impl Manager { + pub fn new() -> Self { + let bgm_format = BgmFormat::new(fs::read("assets/thbgm.fmt").unwrap()); + let bgm_file = Arc::new(unsafe { + MmapOptions::new().map(&File::open("./thbgm.dat").unwrap()).expect("failed to open thbgm.dat") + }); + Self { bgm_format, bgm_file } + } +} diff --git a/src/game/states/guard.rs b/src/game/states/guard.rs new file mode 100644 index 0000000..cc5d577 --- /dev/null +++ b/src/game/states/guard.rs @@ -0,0 +1,26 @@ +use std::marker::PhantomData; + +use sfsm::TransitGuard; + +use crate::game::GameContext; + +pub enum TimeGuard { + Idle, + Waiting(u32), +} + +impl TimeGuard { + pub fn start_wait(&mut self, time: u32) { + *self = Self::Waiting(time); + } + + pub fn tick(&mut self) { + if let TimeGuard::Waiting(ref mut counter) = self { + *counter = counter.saturating_sub(1); + } + } + + pub fn guard(&self) -> TransitGuard { + matches!(self, TimeGuard::Waiting(0)).into() + } +} diff --git a/src/game/states/loading.rs b/src/game/states/loading.rs new file mode 100644 index 0000000..186262d --- /dev/null +++ b/src/game/states/loading.rs @@ -0,0 +1,66 @@ +use std::{ops::RangeInclusive, rc::Rc, sync::Arc}; + +use glam::Vec3; +use sfsm::{State, TransitGuard, Transition}; +use winit::keyboard::KeyCode; + +use crate::game::{ + anm::{Vm, VmLocation}, GameContext +}; + +use super::{guard::TimeGuard, title::TitleScreen, UPDATE_CONTEXT}; + +pub struct Loading { + sig: Vm, + ascii_loading: Vm, + test_snowflakes: Vec, + time: u32, + range: RangeInclusive, + done: TimeGuard, +} + +impl Loading { + pub fn new(context: &mut GameContext) -> Loading { + let ascii = context.load_anm("ascii.anm"); + let sig_anm = context.load_anm("sig.anm"); + let sig = context.anm_manager.new_vm(sig_anm, None, false, false, 0, VmLocation::new_ui()); + let ascii_loading = context.anm_manager.new_vm( + ascii.clone(), + Some(Vec3::new(480.0, 392.0, 0.0)), + // Some(Vec3::new(300.0, 300.0, 0.0)), + false, + false, + 16, + VmLocation::new_ui(), + ); + // ascii_loading.borrow_mut().debug_freeze(); + + Loading { + sig, + ascii_loading, + test_snowflakes: vec![], + time: 0, + range: f32::MAX..=f32::MIN, + done: TimeGuard::Idle, + } + // LoadingState{ascii_loading} + } +} + +impl State for Loading { + fn execute(&mut self) { + self.test_snowflakes.retain(|vm| !vm.borrow().deleted()); + self.time += 1; + } +} + +impl Transition for Loading { + fn guard(&self) -> TransitGuard { + // if self.time > 60 { + // TransitGuard::Transit + // } else { + // TransitGuard::Remain + // } + UPDATE_CONTEXT.with(|context| context.engine.keys.was_key_pressed(KeyCode::Space)).into() + } +} diff --git a/src/game/states/mod.rs b/src/game/states/mod.rs new file mode 100644 index 0000000..84d9a9d --- /dev/null +++ b/src/game/states/mod.rs @@ -0,0 +1,38 @@ +mod guard; +mod loading; +mod title; + +use sfsm::*; + +use crate::utils::context::ContextMut; +use loading::Loading; +use title::TitleScreen; + +use super::GameContext; + +pub(super) static UPDATE_CONTEXT: ContextMut = ContextMut::new(); + +add_state_machine!(Machine, Loading, {Loading, TitleScreen}, { + Loading => TitleScreen, + TitleScreen => TitleScreen +}); + +pub(super) struct GameStateMachine(Machine); + +impl GameStateMachine { + pub fn new(context: &mut GameContext) -> Self { + UPDATE_CONTEXT.scoped(context, || { + let mut machine = GameStateMachine(Machine::new()); + + UPDATE_CONTEXT.with(|context| machine.0.start(Loading::new(context))).unwrap(); + + machine + }) + } + + pub fn update(&mut self, context: &mut GameContext) { + UPDATE_CONTEXT.scoped(context, || { + self.0.step().expect("state machine error"); + }) + } +} diff --git a/src/game/states/title.rs b/src/game/states/title.rs new file mode 100644 index 0000000..dcef7e5 --- /dev/null +++ b/src/game/states/title.rs @@ -0,0 +1,47 @@ +use sfsm::{State, Transition}; +use winit::keyboard::KeyCode; + +use crate::game::{ + anm::{Vm, VmLocation}, GameContext +}; + +use super::{loading::Loading, UPDATE_CONTEXT}; + +pub struct TitleScreen { + _logo: Vm, + _splash: Vm, +} + +impl TitleScreen { + fn new(context: &mut GameContext, from_startup: bool) -> Self { + let title = context.load_anm("title.anm"); + + // 79, 83 + let splash = context.anm_manager.new_vm(title.clone(), None, false, false, 79, VmLocation::new_ui()); + let logo = context.anm_manager.new_vm(title.clone(), None, false, true, 83, VmLocation::new_ui()); + + Self { + _logo: logo, + _splash: splash, + } + } +} + +impl State for TitleScreen { + fn execute(&mut self) {} +} + +impl From for TitleScreen { + fn from(_: Loading) -> Self { + UPDATE_CONTEXT.with(|context| TitleScreen::new(context, true)) + } +} + +impl Transition for TitleScreen { + fn action(&mut self) { + *self = UPDATE_CONTEXT.with(|context| TitleScreen::new(context, true)) + } + fn guard(&self) -> sfsm::TransitGuard { + UPDATE_CONTEXT.with(|context| context.engine.keys.was_key_pressed(KeyCode::Space)).into() + } +} diff --git a/src/game/title.rs b/src/game/title.rs deleted file mode 100644 index ff2b67e..0000000 --- a/src/game/title.rs +++ /dev/null @@ -1,7 +0,0 @@ -use super::GameInitContext; - -pub struct TitleState {} - -impl TitleState { - pub fn new(context: &GameInitContext) {} -} diff --git a/src/interp.rs b/src/interp.rs index 1b7bef5..b7e6389 100644 --- a/src/interp.rs +++ b/src/interp.rs @@ -106,6 +106,7 @@ impl + Display, const N: usize> Interpolator { self.goal = goal; self.extra_1 = extra_1.unwrap_or_default(); self.extra_2 = extra_2.unwrap_or_default(); + self.tick(); } pub fn reset_immediate(&mut self, goal: I) { @@ -181,7 +182,9 @@ impl + Display, const N: usize> Interpolator { Mode::EaseOut => invert(invert(t).powf(2.0)), Mode::EaseOutCubic => invert(invert(t).powf(3.0)), Mode::EaseOutQuartic => invert(invert(t).powf(4.0)), - Mode::EaseInOut => lerp(t.powf(2.0), invert(invert(t).powf(2.0)), t), + Mode::EaseInOut => { + lerp(t.powf(2.0), invert(invert(t).powf(2.0)), t) + } Mode::EaseInOutCubic => todo!(), Mode::EaseInOutQuartic => todo!(), Mode::EaseOutIn => todo!(), diff --git a/src/main.rs b/src/main.rs index 2018a76..f547f8a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,9 @@ pub mod engine; pub mod game; pub mod interp; +pub mod utils { + pub mod context; +} use std::{ sync::Arc, time::{Duration, Instant} diff --git a/src/utils/context.rs b/src/utils/context.rs new file mode 100644 index 0000000..22d8fb0 --- /dev/null +++ b/src/utils/context.rs @@ -0,0 +1,148 @@ +/// A scoped thread-local memory place. +/// +/// ``` +/// sound::thread_context! { pub context Context: u32 }; +/// +/// Context::scoped(&mut value, || { +/// Context::with(|value| { +/// assert_eq!(*value, 52); +/// +/// *value = 42; +/// }); +/// +/// Context::with(|value| assert_eq!(*value, 42)); +/// }); +/// ``` +/// +/// ## Safety +#[macro_export] +macro_rules! thread_context { + ($($vis:vis static $name:ident: $ty:ty;)*) => { + $(thread_context! {$vis $name $ty})* + }; + + ($vis:vis $name:ident $ty:ty) => { + pub struct $name { + data: std::cell::RefCell>, + } + + #[allow(unused)] + impl $name { + #[doc(hidden)] + fn thread_local() -> &'static std::thread::LocalKey<$name> { + std::thread_local! { + static CTX: $name = $name { data: Default::default() }; + } + + &CTX + } + + pub fn with(func: impl FnOnce(&mut $ty) -> U) -> U { + Self::thread_local().with(|context| { + let borrow = context.data.borrow().expect("attempted to access context while it was vacant"); + let value = unsafe { &mut *borrow }; + + func(value) + }) + } + + pub fn scoped(value: &mut $ty, func: impl FnOnce() -> U) -> U { + Self::thread_local().with(|context| { + assert_eq!(context.data.replace(Some(value)), None); + }); + + let retval = func(); + + Self::thread_local().with(|context| context.data.replace(None)); + + retval + } + } + }; +} + +use std::marker::PhantomData; + +#[doc(hidden)] +#[derive(Default)] +pub struct ContextMut(PhantomData); + +unsafe impl Sync for ContextMut {} + +#[allow(unused)] +impl ContextMut { + pub const fn new() -> ContextMut { + ContextMut(PhantomData) + } + + fn thread_local() -> &'static std::thread::LocalKey>> { + std::thread_local! { + static CTX: std::cell::RefCell> = Default::default(); + } + + &CTX + } + + pub fn with(&'static self, func: impl FnOnce(&mut T) -> U) -> U { + Self::thread_local().with_borrow(|borrow| { + let value = unsafe { &mut *(borrow.expect("attempted to access context while it was vacant") as *mut _) }; + + func(value) + }) + } + + pub fn scoped<'a, U>(&'a self, value: &'a mut T, func: impl 'a + FnOnce() -> U) -> U { + Self::thread_local().with_borrow_mut(|context| { + let ptr: *mut T = value; + assert_eq!(context.replace(ptr as *mut _), None); + }); + + let retval = func(); + + Self::thread_local().with_borrow_mut(|context| context.take()); + + retval + } +} + +#[doc(hidden)] +#[derive(Default)] +pub struct Context(PhantomData); + +unsafe impl Sync for Context {} + +#[allow(unused)] +impl Context { + pub const fn new() -> Context { + Context(PhantomData) + } + + fn thread_local() -> &'static std::thread::LocalKey>> { + std::thread_local! { + static CTX: std::cell::RefCell> = Default::default(); + } + + &CTX + } + + pub fn with<'a, U>(&'static self, func: impl FnOnce(&'a T) -> U) -> U { + Self::thread_local().with_borrow(|borrow| { + let value = unsafe { &mut *(borrow.expect("attempted to access context while it was vacant") as *mut _) }; + + func(value) + }) + } + + pub fn scoped<'a, U>(&'a self, value: &'a T, func: impl FnOnce() -> U) -> U { + let ptr: *const T = value; + Self::thread_local().with_borrow_mut(|context| { + assert_eq!(context.replace(ptr as *const _), None); + }); + + let retval = func(); + + Self::thread_local().with_borrow_mut(|context| context.take()); + + retval + } +}