sonolus.py 0.4.2__tar.gz → 0.5.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sonolus.py might be problematic. Click here for more details.
- sonolus_py-0.5.1/.python-version +1 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/PKG-INFO +1 -1
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/doc_stubs/builtins.pyi +10 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/concepts/builtins.md +1 -0
- sonolus_py-0.5.1/docs/guides/bucket.md +80 -0
- sonolus_py-0.5.1/docs/guides/coming-soon.md +3 -0
- sonolus_py-0.5.1/docs/guides/effect.md +99 -0
- sonolus_py-0.5.1/docs/guides/index.md +5 -0
- sonolus_py-0.5.1/docs/guides/particle.md +93 -0
- sonolus_py-0.5.1/docs/guides/play.md +102 -0
- sonolus_py-0.5.1/docs/guides/project-structure.md +70 -0
- sonolus_py-0.5.1/docs/guides/screen.md +30 -0
- sonolus_py-0.5.1/docs/guides/setup.md +15 -0
- sonolus_py-0.5.1/docs/guides/skin.md +128 -0
- sonolus_py-0.5.1/docs/guides/ui.md +143 -0
- sonolus_py-0.5.1/docs/guides/usage.md +37 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/index.md +6 -5
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/mkdocs.yml +13 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/pyproject.toml +1 -1
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/constant_evaluation.py +2 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/visitor.py +25 -9
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/build/compile.py +9 -4
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/archetype.py +134 -17
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/bucket.py +7 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/builtin_impls.py +7 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/context.py +10 -2
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/impl.py +1 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/introspection.py +3 -0
- sonolus_py-0.5.1/tests/script/test_super.py +90 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/uv.lock +1 -1
- sonolus_py-0.4.2/.python-version +0 -1
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/.gitattributes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/.github/workflows/publish.yaml +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/.gitignore +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/.run/Python tests in tests.run.xml +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/LICENSE +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/README.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/doc_stubs/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/doc_stubs/math.pyi +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/doc_stubs/num.pyi +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/doc_stubs/random.pyi +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/CNAME +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/concepts/cli.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/concepts/constructs.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/concepts/index.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/concepts/project.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/concepts/resources.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/concepts/types.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/overview.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/builtins.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/index.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/math.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/random.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.archetype.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.array.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.array_like.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.bucket.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.containers.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.debug.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.easing.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.effect.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.engine.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.globals.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.instruction.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.interval.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.iterator.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.level.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.maybe.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.metadata.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.num.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.options.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.particle.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.printing.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.project.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.quad.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.record.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.runtime.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.sprite.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.stream.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.text.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.timing.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.transform.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.ui.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.values.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/docs/reference/sonolus.script.vec.md +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/scripts/generate.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/scripts/runtimes/Engine/Tutorial/Blocks.json +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/scripts/runtimes/Functions.json +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/scripts/runtimes/Level/Play/Blocks.json +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/scripts/runtimes/Level/Preview/Blocks.json +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/scripts/runtimes/Level/Watch/Blocks.json +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/blocks.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/excepthook.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/finalize.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/interpret.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/ir.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/mode.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/node.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/ops.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/allocate.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/copy_coalesce.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/dead_code.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/dominance.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/flow.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/inlining.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/liveness.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/optimize.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/passes.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/simplify.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/optimize/ssa.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/place.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/backend/utils.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/build/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/build/cli.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/build/collection.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/build/engine.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/build/level.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/build/node.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/build/project.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/py.typed +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/array.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/array_like.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/containers.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/debug.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/easing.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/effect.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/engine.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/globals.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/instruction.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/callbacks.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/constant.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/descriptor.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/dict_impl.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/error.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/generic.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/math_impls.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/native.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/random.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/range.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/simulation_context.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/transient.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/tuple_impl.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/internal/value.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/interval.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/iterator.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/level.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/maybe.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/metadata.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/num.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/options.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/particle.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/pointer.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/printing.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/project.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/quad.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/record.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/runtime.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/sprite.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/stream.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/text.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/timing.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/transform.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/ui.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/values.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/sonolus/script/vec.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/level.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/buckets.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/connector.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/effect.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/layer.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/layout.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/note.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/options.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/particle.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/skin.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/stage.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/streams.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/lib/ui.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/play/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/play/connector.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/play/event.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/play/input.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/play/mode.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/play/note.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/play/stage.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/preview/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/preview/connector.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/preview/event.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/preview/layout.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/preview/mode.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/preview/note.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/preview/stage.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/project.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/tutorial/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/tutorial/framework.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/tutorial/instructions.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/tutorial/intro.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/tutorial/mode.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/tutorial/navigate.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/tutorial/painting.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/tutorial/phases.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/tutorial/preprocess.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/tutorial/update.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/watch/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/watch/connector.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/watch/event.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/watch/mode.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/watch/note.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/watch/stage.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/test_projects/pydori/watch/update_spawn.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/conftest.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_should_spawn_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_should_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_should_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_should_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_should_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_spawn_order_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_spawn_order_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_spawn_order_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_spawn_order_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_spawn_order_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_update_sequential_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_update_sequential_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_update_sequential_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_update_sequential_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_connector_update_sequential_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_manager_touch_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_manager_touch_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_manager_touch_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_manager_touch_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_manager_touch_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_manager_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_manager_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_manager_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_manager_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_hold_manager_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_initialize_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_initialize_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_initialize_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_initialize_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_initialize_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_should_spawn_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_should_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_should_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_should_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_should_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_spawn_order_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_spawn_order_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_spawn_order_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_spawn_order_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_spawn_order_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_terminate_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_terminate_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_terminate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_terminate_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_terminate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_touch_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_touch_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_touch_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_touch_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_touch_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_update_sequential_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_update_sequential_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_update_sequential_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_update_sequential_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_note_update_sequential_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_should_spawn_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_should_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_should_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_should_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_should_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_spawn_order_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_spawn_order_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_spawn_order_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_spawn_order_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_spawn_order_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_sim_line_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_should_spawn_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_should_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_should_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_should_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_should_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_spawn_order_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_spawn_order_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_spawn_order_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_spawn_order_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_spawn_order_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_touch_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_touch_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_touch_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_touch_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_touch_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_update_sequential_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_update_sequential_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_update_sequential_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_update_sequential_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_stage_update_sequential_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_initialize_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_initialize_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_initialize_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_initialize_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_initialize_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_should_spawn_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_should_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_should_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_should_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_should_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_spawn_order_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_spawn_order_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_spawn_order_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_spawn_order_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_spawn_order_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_terminate_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_terminate_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_terminate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_terminate_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_terminate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_touch_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_touch_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_touch_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_touch_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_touch_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_update_sequential_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_update_sequential_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_update_sequential_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_update_sequential_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_play_unscored_note_update_sequential_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_bpm_change_render_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_bpm_change_render_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_bpm_change_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_bpm_change_render_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_bpm_change_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_hold_connector_render_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_hold_connector_render_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_hold_connector_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_hold_connector_render_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_hold_connector_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_note_render_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_note_render_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_note_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_note_render_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_note_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_sim_line_render_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_sim_line_render_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_sim_line_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_sim_line_render_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_sim_line_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_stage_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_stage_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_stage_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_stage_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_stage_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_stage_render_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_stage_render_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_stage_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_stage_render_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_stage_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_timescale_change_render_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_timescale_change_render_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_timescale_change_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_timescale_change_render_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_timescale_change_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_unscored_note_render_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_unscored_note_render_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_unscored_note_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_unscored_note_render_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_preview_preview_unscored_note_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_navigate_fast_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_navigate_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_navigate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_navigate_standard_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_navigate_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_navigate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_preprocess_fast_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_preprocess_standard_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_update_fast_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_update_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_update_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_update_standard_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_update_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_tutorial_global_update_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_global_update_spawn_fast_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_global_update_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_global_update_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_global_update_spawn_standard_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_global_update_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_global_update_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_despawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_spawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_terminate_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_terminate_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_terminate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_terminate_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_terminate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_note_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/regressions/test_project.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/__init__.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/conftest.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_array.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_array_map.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_array_set.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_assert.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_dict.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_flow.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_functions.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_generator.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_genexpr.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_helpers.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_interval.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_match.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_maybe.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_num.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_operator.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_quad.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_random.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_range.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_record.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_transform.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_tuple.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_values.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_var_array.py +0 -0
- {sonolus_py-0.4.2 → sonolus_py-0.5.1}/tests/script/test_vec.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -287,3 +287,13 @@ def zip[T](*iterables: Iterable[T]) -> Iterator[tuple[T, ...]]:
|
|
|
287
287
|
An iterator of aggregated tuples.
|
|
288
288
|
"""
|
|
289
289
|
...
|
|
290
|
+
|
|
291
|
+
def super(cls: type = ..., instance: Any = ...) -> Any:
|
|
292
|
+
"""Return a proxy object that delegates method calls to a parent or sibling class.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
cls: The class to delegate
|
|
296
|
+
instance: The instance to delegate to.
|
|
297
|
+
Returns:
|
|
298
|
+
A proxy object that can be used to call methods from the parent or sibling class.
|
|
299
|
+
"""
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Buckets & Judgement
|
|
2
|
+
|
|
3
|
+
## Declaring Buckets
|
|
4
|
+
|
|
5
|
+
[Buckets][sonolus.script.bucket.Bucket] define how notes are displayed on the results screen. Typically, each kind of
|
|
6
|
+
note has its own bucket and therefore its own entry on the results screen. Buckets are defined using the
|
|
7
|
+
[`@buckets`][sonolus.script.bucket.buckets] decorator and the [`bucket`][sonolus.script.bucket.bucket] function:
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
from sonolus.script.bucket import buckets, bucket, Bucket, bucket_sprite
|
|
11
|
+
from sonolus.script.text import StandardText
|
|
12
|
+
|
|
13
|
+
Skin = ...
|
|
14
|
+
|
|
15
|
+
@buckets
|
|
16
|
+
class Buckets:
|
|
17
|
+
tap_note: Bucket = bucket(
|
|
18
|
+
sprites=[
|
|
19
|
+
bucket_sprite(
|
|
20
|
+
sprite=Skin.tap_note,
|
|
21
|
+
x=0,
|
|
22
|
+
y=0,
|
|
23
|
+
w=2,
|
|
24
|
+
h=2,
|
|
25
|
+
rotation=-90,
|
|
26
|
+
),
|
|
27
|
+
],
|
|
28
|
+
unit=StandardText.MILLISECOND_UNIT,
|
|
29
|
+
)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Buckets have sprites used for diplay on the results screen, which are defined using the
|
|
33
|
+
[`bucket_sprite`][sonolus.script.bucket.bucket_sprite] function. They may also have a unit, which can either be
|
|
34
|
+
a built-in from [`StandardText`][sonolus.script.text.StandardText] or a custom string. Conventionally, the unit for
|
|
35
|
+
most engines should be set to
|
|
36
|
+
[`StandardText.MILLISECOND_UNIT`][sonolus.script.text.StandardText] to indicate that the bucket is
|
|
37
|
+
measured in milliseconds.
|
|
38
|
+
|
|
39
|
+
## Judgement Windows
|
|
40
|
+
|
|
41
|
+
Sonolus notes are judged on a scale from best to worst of:
|
|
42
|
+
|
|
43
|
+
- [`Judgement.PERFECT`][sonolus.script.bucket.Judgment.PERFECT]
|
|
44
|
+
- [`Judgement.GREAT`][sonolus.script.bucket.Judgment.GREAT]
|
|
45
|
+
- [`Judgement.GOOD`][sonolus.script.bucket.Judgment.GOOD]
|
|
46
|
+
- [`Judgement.MISS`][sonolus.script.bucket.Judgment.MISS]
|
|
47
|
+
|
|
48
|
+
The [`JudgmentWindow`][sonolus.script.bucket.JudgmentWindow] class is useful for defining the judgement windows of a
|
|
49
|
+
note in seconds, and judging a note based on the actual and expected (target) hit times:
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
from sonolus.script.bucket import JudgmentWindow, Judgment
|
|
53
|
+
from sonolus.script.interval import Interval
|
|
54
|
+
|
|
55
|
+
note_judgment_window = JudgmentWindow(
|
|
56
|
+
perfect=Interval(-0.05, 0.05),
|
|
57
|
+
great=Interval(-0.1, 0.1),
|
|
58
|
+
good=Interval(-0.15, 0.15),
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
actual_time: float = ...
|
|
62
|
+
expected_time: float = ...
|
|
63
|
+
judgment = note_judgment_window.judge(actual=actual_time, expected=expected_time)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Bucket Window
|
|
67
|
+
|
|
68
|
+
For each bucket, the [`window`][sonolus.script.bucket.Bucket.window] attribute should be set during preprocessing to
|
|
69
|
+
define the judgment windows for the bucket:
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
from sonolus.script.bucket import JudgmentWindow
|
|
73
|
+
|
|
74
|
+
note_judgment_window: JudgmentWindow = ...
|
|
75
|
+
Buckets = ...
|
|
76
|
+
|
|
77
|
+
def init_buckets():
|
|
78
|
+
# Multiply by 1000 so buckets are in milliseconds.
|
|
79
|
+
Buckets.tap_note.window @= note_judgment_window * 1000
|
|
80
|
+
```
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Sound Effects
|
|
2
|
+
|
|
3
|
+
[Sound effects][sonolus.script.effect.Effect] are used to play audio, typically short clips, during the course of
|
|
4
|
+
a level.
|
|
5
|
+
|
|
6
|
+
## Declaration
|
|
7
|
+
|
|
8
|
+
Effects are declared with the [`@effects`][sonolus.script.effect.effects] decorator. Standard Sonolus effects are
|
|
9
|
+
declared by using a value from [`StandardEffect`][sonolus.script.effect.StandardEffect] as the type hint.
|
|
10
|
+
Custom effects may also be defined using the [`Effect`][sonolus.script.effect.Effect] type hint and the
|
|
11
|
+
[`effect`][sonolus.script.effect.effect] function.
|
|
12
|
+
|
|
13
|
+
```python
|
|
14
|
+
from sonolus.script.effect import effects, effect, StandardEffect, Effect
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@effects
|
|
18
|
+
class Effects:
|
|
19
|
+
perfect: StandardEffect.PERFECT
|
|
20
|
+
great: StandardEffect.GREAT
|
|
21
|
+
|
|
22
|
+
custom_effect: Effect = effect("name_of_custom_effect")
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Playing an Effect
|
|
26
|
+
|
|
27
|
+
To play an effect, you can use the [`play`][sonolus.script.effect.Effect.play] method of the effect. This method
|
|
28
|
+
accepts an optional distance parameter to prevent the effect from playing if it was already played within the specified
|
|
29
|
+
time in seconds:
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
from sonolus.script.effect import Effect
|
|
33
|
+
|
|
34
|
+
my_effect: Effect = ...
|
|
35
|
+
my_effect.play()
|
|
36
|
+
my_effect.play(distance=0.1)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Using a small non-zero distance is recommended as two instances of the same effect played in quick
|
|
40
|
+
succession can be unpleasant to hear.
|
|
41
|
+
|
|
42
|
+
## Scheduling an Effect
|
|
43
|
+
|
|
44
|
+
An effect can be scheduled to play at a specific time using the [`schedule`][sonolus.script.effect.Effect.schedule]
|
|
45
|
+
method:
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
from sonolus.script.effect import Effect
|
|
49
|
+
|
|
50
|
+
my_effect: Effect = ...
|
|
51
|
+
my_effect.schedule(time=5.0)
|
|
52
|
+
my_effect.schedule(time=5.0, distance=0.1)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Scheduling is not suitable for real-time effects such as responses to user input and may not work if the scheduled
|
|
56
|
+
time is too close to the current time. Use [`play`][sonolus.script.effect.Effect.play] instead for real-time effects.
|
|
57
|
+
|
|
58
|
+
## Looping an Effect
|
|
59
|
+
|
|
60
|
+
An effect can be played in a loop using the [`loop`][sonolus.script.effect.Effect.loop] method, which returns a
|
|
61
|
+
[`LoopedEffectHandle`][sonolus.script.effect.LoopedEffectHandle] that can be used to stop the loop:
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
from sonolus.script.effect import Effect, LoopedEffectHandle
|
|
65
|
+
|
|
66
|
+
my_effect: Effect = ...
|
|
67
|
+
loop_handle: LoopedEffectHandle = my_effect.loop()
|
|
68
|
+
|
|
69
|
+
# Later, stop the loop
|
|
70
|
+
loop_handle.stop()
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Similarly, an effect can be scheduled to loop using the [`schedule_loop`][sonolus.script.effect.Effect.schedule_loop]
|
|
74
|
+
method:
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
from sonolus.script.effect import Effect
|
|
78
|
+
|
|
79
|
+
my_effect: Effect = ...
|
|
80
|
+
my_effect.schedule_loop(start_time=3.0).stop(end_time=10.0)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Checking Effect Availability
|
|
84
|
+
|
|
85
|
+
Some effects may not be available depending on which effect packs a user has selected. To check if an effect is
|
|
86
|
+
available, you can use the [`is_available`][sonolus.script.effect.Effect.is_available] method:
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
from sonolus.script.effect import Effect
|
|
90
|
+
|
|
91
|
+
my_effect: Effect = ...
|
|
92
|
+
|
|
93
|
+
if my_effect.is_available():
|
|
94
|
+
# The effect is available, you can use it.
|
|
95
|
+
...
|
|
96
|
+
else:
|
|
97
|
+
# Do something else, such as using a fallback.
|
|
98
|
+
...
|
|
99
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Particles
|
|
2
|
+
|
|
3
|
+
[Particle effects][sonolus.script.particle.Particle] are typically used for visuals such as the
|
|
4
|
+
effect when a note is hit. They are somewhat similar to sprites, but may contain their own animations
|
|
5
|
+
and support functionality such as looping. However, they come with the restriction that they do not have
|
|
6
|
+
their own z-indexes, and thus are always drawn on top of sprites while having no set order between themselves.
|
|
7
|
+
|
|
8
|
+
## Declaration
|
|
9
|
+
|
|
10
|
+
Particles are declared with the [`@particles`][sonolus.script.particle.particles] decorator. Standard Sonolus particles
|
|
11
|
+
are declared by using a value from [`StandardParticle`][sonolus.script.particle.StandardParticle] as the type hint.
|
|
12
|
+
Custom particles may also be defined using the [`Particle`][sonolus.script.particle.Particle] type hint and the
|
|
13
|
+
[`particle`][sonolus.script.particle.particle] function.
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from sonolus.script.particle import particles, particle, StandardParticle, Particle
|
|
17
|
+
|
|
18
|
+
@particles
|
|
19
|
+
class Particle:
|
|
20
|
+
tap_note_hit_linear: StandardParticle.NOTE_LINEAR_TAP_CYAN
|
|
21
|
+
tap_note_hit_circular: StandardParticle.NOTE_CIRCULAR_TAP_CYAN
|
|
22
|
+
|
|
23
|
+
custom_particle: Particle = particle("name_of_custom_particle")
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Spawning a Particle
|
|
27
|
+
|
|
28
|
+
To spawn a particle, you can use the [`spawn`][sonolus.script.particle.Particle.spawn] method of the particle. This
|
|
29
|
+
method accepts a [`Quad`][sonolus.script.quad.Quad] object that defines the position of the particle on the screen,
|
|
30
|
+
a duration in seconds determining how quick the particle animation should play, and optionally whether the particle
|
|
31
|
+
should loop:
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
from sonolus.script.particle import Particle
|
|
35
|
+
from sonolus.script.quad import Quad
|
|
36
|
+
|
|
37
|
+
my_particle: Particle = ...
|
|
38
|
+
my_quad = Quad(
|
|
39
|
+
tl=Vec2(-0.5, 0.5),
|
|
40
|
+
tr=Vec2(0.5, 0.5),
|
|
41
|
+
bl=Vec2(-0.5, -0.5),
|
|
42
|
+
br=Vec2(0.5, -0.5),
|
|
43
|
+
)
|
|
44
|
+
handle = my_particle.spawn(my_quad, duration=0.5, loop=False)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The call to [`spawn`][sonolus.script.particle.Particle.spawn] will return a
|
|
48
|
+
[`ParticleHandle`][sonolus.script.particle.ParticleHandle] that can be used to control the particle after it has been
|
|
49
|
+
spawned.
|
|
50
|
+
|
|
51
|
+
## Moving a Particle
|
|
52
|
+
|
|
53
|
+
A particle can be moved using the [`move`][sonolus.script.particle.ParticleHandle.move] method of the
|
|
54
|
+
[`ParticleHandle`][sonolus.script.particle.ParticleHandle]:
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
from sonolus.script.particle import ParticleHandle
|
|
58
|
+
from sonolus.script.quad import Quad
|
|
59
|
+
|
|
60
|
+
my_particle_handle: ParticleHandle = ...
|
|
61
|
+
new_position: Quad = ...
|
|
62
|
+
my_particle_handle.move(new_position)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Destroying a Particle
|
|
66
|
+
|
|
67
|
+
A particle can be destroyed using the [`destroy`][sonolus.script.particle.ParticleHandle.destroy] method of the
|
|
68
|
+
[`ParticleHandle`][sonolus.script.particle.ParticleHandle]:
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
from sonolus.script.particle import ParticleHandle
|
|
72
|
+
|
|
73
|
+
my_particle_handle: ParticleHandle = ...
|
|
74
|
+
my_particle_handle.destroy()
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Checking Particle Availability
|
|
78
|
+
|
|
79
|
+
A particle effect may not be available depending on which effects a user has selected. To check if a particle is
|
|
80
|
+
available, you can use the [`is_available`][sonolus.script.particle.Particle.is_available] method of a
|
|
81
|
+
[`Particle`][sonolus.script.particle.Particle]:
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
from sonolus.script.particle import Particle
|
|
85
|
+
|
|
86
|
+
my_particle: Particle = ...
|
|
87
|
+
if my_particle.is_available():
|
|
88
|
+
# The particle is available, you can spawn it.
|
|
89
|
+
...
|
|
90
|
+
else:
|
|
91
|
+
# Do something else, such as using a fallback particle.
|
|
92
|
+
...
|
|
93
|
+
```
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Play
|
|
2
|
+
|
|
3
|
+
Play mode is generally the most important mode of a Sonolus engine, as it defines the interactive gameplay experience.
|
|
4
|
+
|
|
5
|
+
## Configuration
|
|
6
|
+
|
|
7
|
+
Play mode is configured using the [`PlayMode`][sonolus.script.engine.PlayMode] class:
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
from sonolus.script.engine import PlayMode
|
|
11
|
+
|
|
12
|
+
# ... import your archetypes, skin, effects, particles, and buckets
|
|
13
|
+
|
|
14
|
+
play_mode = PlayMode(
|
|
15
|
+
archetypes=[
|
|
16
|
+
Stage,
|
|
17
|
+
Note,
|
|
18
|
+
# etc.
|
|
19
|
+
],
|
|
20
|
+
skin=Skin,
|
|
21
|
+
effects=Effects,
|
|
22
|
+
particles=Particles,
|
|
23
|
+
buckets=Buckets,
|
|
24
|
+
)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Play Archetypes
|
|
28
|
+
|
|
29
|
+
Gameplay logic in play mode is defined via archetypes. Archetypes may correspond to individual notes, or other gameplay
|
|
30
|
+
elements such as the stage. They may also be dedicated to special purposes such as initializing, input handing, and
|
|
31
|
+
so forth depending on the needs of an engine.
|
|
32
|
+
|
|
33
|
+
In play mode, archetypes inherit from the [`PlayArchetype`][sonolus.script.archetype.PlayArchetype] class:
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
from sonolus.script.archetype import PlayArchetype
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class Note(PlayArchetype):
|
|
40
|
+
is_score = True
|
|
41
|
+
|
|
42
|
+
# All of these methods are optional
|
|
43
|
+
|
|
44
|
+
def preprocess(self):
|
|
45
|
+
...
|
|
46
|
+
|
|
47
|
+
def spawn_order(self) -> float:
|
|
48
|
+
...
|
|
49
|
+
|
|
50
|
+
def should_spawn(self) -> bool:
|
|
51
|
+
...
|
|
52
|
+
|
|
53
|
+
def initialize(self):
|
|
54
|
+
...
|
|
55
|
+
|
|
56
|
+
def update_sequential(self):
|
|
57
|
+
...
|
|
58
|
+
|
|
59
|
+
def touch(self):
|
|
60
|
+
...
|
|
61
|
+
|
|
62
|
+
def update_parallel(self):
|
|
63
|
+
...
|
|
64
|
+
|
|
65
|
+
def terminate(self):
|
|
66
|
+
...
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Archetypes that correspond to notes and contribute to scoring should set the `is_score` attribute to `True`.
|
|
71
|
+
|
|
72
|
+
### Entities
|
|
73
|
+
|
|
74
|
+
Entities are instances of archetypes. For example an engine may have a `Note` archetype, and each individual note is
|
|
75
|
+
considered an entity.
|
|
76
|
+
|
|
77
|
+
### Callbacks
|
|
78
|
+
|
|
79
|
+
Callbacks determine the behavior of entities in play mode:
|
|
80
|
+
|
|
81
|
+
- [`preprocess`][sonolus.script.archetype.PlayArchetype.preprocess]:
|
|
82
|
+
Called as the level is loaded
|
|
83
|
+
- [`spawn_order`][sonolus.script.archetype.PlayArchetype.spawn_order]:
|
|
84
|
+
Called after preprocessing is done to determine which order entities. should be spawned in.
|
|
85
|
+
Smaller values are spawned first; a common approach is to use the spawn time of the entity.
|
|
86
|
+
- [`should_spawn`][sonolus.script.archetype.PlayArchetype.should_spawn]:
|
|
87
|
+
Called to determine whether the entity should be spawned. Called each frame if the previous entity is spawned.
|
|
88
|
+
- [`initialize`][sonolus.script.archetype.PlayArchetype.initialize]:
|
|
89
|
+
Called when the entity is spawned at the start of the frame. Runs in parallel with other `initialize` calls.
|
|
90
|
+
- [`update_sequential`][sonolus.script.archetype.PlayArchetype.update_sequential]:
|
|
91
|
+
Called each frame an entity is active after `initialize` callbacks are done.
|
|
92
|
+
Since it's called sequentially, it can update shared state.
|
|
93
|
+
- [`touch`][sonolus.script.archetype.PlayArchetype.touch]:
|
|
94
|
+
Called sequentially each frame after `update_sequential` if there's touch input. Has access to touch input data.
|
|
95
|
+
- [`update_parallel`][sonolus.script.archetype.PlayArchetype.update_parallel]:
|
|
96
|
+
Called after `touch` and `update_sequential` callbacks are done. Runs in parallel with other `update_parallel` calls.
|
|
97
|
+
Has better performance due to parallel execution, so most logic such as drawing sprites should be done here.
|
|
98
|
+
- [`terminate`][sonolus.script.archetype.PlayArchetype.terminate]:
|
|
99
|
+
Called after `update_parallel` callbacks are done when an entity is being despawned.
|
|
100
|
+
Runs in parallel with other `terminate` calls.
|
|
101
|
+
|
|
102
|
+
If not defined in an archetype, the default behavior of each callback is to do nothing.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Project Structure
|
|
2
|
+
|
|
3
|
+
Typically, a Sonolus.py project will have something resembling the following structure:
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
<project_name>/
|
|
7
|
+
├── lib/ # Common code shared between modes
|
|
8
|
+
├── play/ # Code for play mode
|
|
9
|
+
├── watch/ # Code for watch mode
|
|
10
|
+
├── preview/ # Code for preview mode
|
|
11
|
+
├── tutorial/ # Code for tutorial mode
|
|
12
|
+
├── .../ # Additional code e.g. for converting charts from other formats
|
|
13
|
+
├── project.py # Project configuration
|
|
14
|
+
└── level.py # Level configuration (for development server levels)
|
|
15
|
+
resources/ # Resources for the engine
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
When starting a new project, you'll probably want to use the
|
|
19
|
+
[template project](https://github.com/qwewqa/sonolus.py-template-project) to initialize your project structure.
|
|
20
|
+
|
|
21
|
+
## Resources
|
|
22
|
+
|
|
23
|
+
The `resources/` directory contains the resources used by the engine, and its contents are used by the development
|
|
24
|
+
server. It supports resource source code (like the contents of
|
|
25
|
+
[sonolus-free-pack](https://github.com/Sonolus/sonolus-free-pack)) sonolus collection (`.scp`) files, and raw
|
|
26
|
+
image and audio files.
|
|
27
|
+
|
|
28
|
+
## Project Configuration
|
|
29
|
+
|
|
30
|
+
By default, Sonolus.py searches for a module named `project` in the root package of the project (i.e. the
|
|
31
|
+
`<project_name>/project.py` file). This module should contain the project configuration and typically should
|
|
32
|
+
contain the engine configuration as well. For example, pydori's project.py contains the following:
|
|
33
|
+
|
|
34
|
+
??? note "[pydori/project.py](https://github.com/qwewqa/pydori/blob/master/pydori/project.py)"
|
|
35
|
+
```python
|
|
36
|
+
from sonolus.script.engine import Engine, EngineData
|
|
37
|
+
from sonolus.script.project import Project
|
|
38
|
+
|
|
39
|
+
from pydori.level import load_levels
|
|
40
|
+
from pydori.lib.options import Options
|
|
41
|
+
from pydori.lib.ui import ui_config
|
|
42
|
+
from pydori.play.mode import play_mode
|
|
43
|
+
from pydori.preview.mode import preview_mode
|
|
44
|
+
from pydori.tutorial.mode import tutorial_mode
|
|
45
|
+
from pydori.watch.mode import watch_mode
|
|
46
|
+
|
|
47
|
+
engine = Engine(
|
|
48
|
+
name="pydori",
|
|
49
|
+
title="pydori",
|
|
50
|
+
skin="pixel",
|
|
51
|
+
particle="pixel",
|
|
52
|
+
background="darkblue",
|
|
53
|
+
data=EngineData(
|
|
54
|
+
ui=ui_config,
|
|
55
|
+
options=Options,
|
|
56
|
+
play=play_mode,
|
|
57
|
+
watch=watch_mode,
|
|
58
|
+
preview=preview_mode,
|
|
59
|
+
tutorial=tutorial_mode,
|
|
60
|
+
),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
project = Project(
|
|
64
|
+
engine=engine,
|
|
65
|
+
levels=load_levels,
|
|
66
|
+
)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
This file defines the name and title of the engine, some defaults for players, and links to the various modes as
|
|
70
|
+
well as the ui and option configurations. It also links to the levels to load for the development server.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Screen
|
|
2
|
+
|
|
3
|
+
Sonolus has a screen coordinate-system with y-coordinates ranging from `+1` at the top of the screen to `-1` at the
|
|
4
|
+
bottom of the screen. The x-coordinate in the screen depend on the aspect ratio of a device, with `-aspect_ratio`
|
|
5
|
+
at the left and `+aspect_ratio` at the right. When designing engines, it's important to keep in mind that aspect ratios
|
|
6
|
+
typically range from narrow (e.g. 4:3) to wide (e.g. 21:9) to ensure that nothing is cut off on devices with some
|
|
7
|
+
aspect ratios.
|
|
8
|
+
|
|
9
|
+
The screen coordinate system is used for drawing sprites, positioning particles, and positioning UI elements.
|
|
10
|
+
|
|
11
|
+
## Checking Screen Size
|
|
12
|
+
|
|
13
|
+
You can check aspect ratio using the [`aspect_ratio`][sonolus.script.runtime.aspect_ratio] function:
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from sonolus.script.runtime import aspect_ratio
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
the_aspect_ratio = aspect_ratio()
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
For convenience, the [`screen`][sonolus.script.runtime.screen] function returns a [`Rect`][sonolus.script.quad.Rect]
|
|
23
|
+
that can be used to check the coordinates of each corner of the screen:
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
from sonolus.script.runtime import screen
|
|
27
|
+
|
|
28
|
+
the_screen = screen()
|
|
29
|
+
top_left = the_screen.tl
|
|
30
|
+
```
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Setup
|
|
2
|
+
|
|
3
|
+
Sonolus.py is published on [PyPI](https://pypi.org/project/sonolus.py/), and can be installed with any package manager.
|
|
4
|
+
|
|
5
|
+
For example, you can use pip to install it:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install sonolus.py
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or add it to a project using [uv](https://docs.astral.sh/uv/getting-started/installation/):
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
uv add sonolus.py
|
|
15
|
+
```
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Skins & Sprites
|
|
2
|
+
|
|
3
|
+
[Skins][sonolus.script.sprite.skin] define [sprites][sonolus.script.sprite.Sprite] (images) that can be drawn in
|
|
4
|
+
Sonolus. An engine typically has a single skin used by all modes.
|
|
5
|
+
|
|
6
|
+
## Declaration
|
|
7
|
+
|
|
8
|
+
Skins are declared with the [`@skin`][sonolus.script.sprite.skin] decorator. Standard Sonolus sprites are declared by
|
|
9
|
+
using a value from [`StandardSprite`][sonolus.script.sprite.StandardSprite] as the type hint. Custom sprites may also be
|
|
10
|
+
defined using the [`Sprite`][sonolus.script.sprite.Sprite] type hint and the [`sprite`][sonolus.script.sprite.sprite]
|
|
11
|
+
function.
|
|
12
|
+
|
|
13
|
+
```python
|
|
14
|
+
from sonolus.script.sprite import skin, StandardSprite, sprite, Sprite
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@skin
|
|
18
|
+
class Skin:
|
|
19
|
+
tap_note: StandardSprite.NOTE_HEAD_CYAN
|
|
20
|
+
|
|
21
|
+
custom_sprite: Sprite = sprite("name_of_custom_sprite")
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Render Mode
|
|
25
|
+
|
|
26
|
+
The skin also defines the render mode for sprites. This is done by defining a `render_mode` attribute in a skin class
|
|
27
|
+
to a value from [`RenderMode`][sonolus.script.sprite.RenderMode].
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
from sonolus.script.sprite import skin, RenderMode
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@skin
|
|
34
|
+
class Skin:
|
|
35
|
+
render_mode = RenderMode.LIGHTWEIGHT
|
|
36
|
+
...
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The three render modes available are:
|
|
40
|
+
|
|
41
|
+
- [`RenderMode.LIGHTWEIGHT`][sonolus.script.sprite.RenderMode.LIGHTWEIGHT]: Less taxing and well suited for
|
|
42
|
+
engines implementing realistic 3D-like graphs, but is less accurate for some engines.
|
|
43
|
+
- [`RenderMode.STANDARD`][sonolus.script.sprite.RenderMode.STANDARD]: Slower, but more accurate for some engines and
|
|
44
|
+
works better with some special cases such as drawing sprites in a triangular shape.
|
|
45
|
+
- [`RenderMode.DEFAULT`][sonolus.script.sprite.RenderMode.DEFAULT]: Use either `LIGHTWEIGHT` or `STANDARD` based on
|
|
46
|
+
the user's preferences. This is the default mode, and is suitable for engines where `STANDARD` is preferred, but
|
|
47
|
+
are still playable in `LIGHTWEIGHT` when more performance is desired.
|
|
48
|
+
|
|
49
|
+
## Drawing a Sprite
|
|
50
|
+
|
|
51
|
+
To draw a sprite, you can use the [`draw`][sonolus.script.sprite.Sprite.draw] method of the sprite. This method
|
|
52
|
+
accepts a [`Quad`][sonolus.script.quad.Quad] object that defines the position of the sprite on the screen, as well as
|
|
53
|
+
an optional z-index to control the rendering order of the sprite and an alpha (transparency) value:
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
from sonolus.script.sprite import Sprite
|
|
57
|
+
from sonolus.script.quad import Quad
|
|
58
|
+
from sonolus.script.vec import Vec2
|
|
59
|
+
|
|
60
|
+
my_sprite: Sprite = ...
|
|
61
|
+
my_quad = Quad(
|
|
62
|
+
tl=Vec2(-0.5, 0.5),
|
|
63
|
+
tr=Vec2(0.5, 0.5),
|
|
64
|
+
bl=Vec2(-0.5, -0.5),
|
|
65
|
+
br=Vec2(0.5, -0.5),
|
|
66
|
+
)
|
|
67
|
+
my_sprite.draw(my_quad, z=123.4, a=1.0)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Z-index (`z`) is important to set correctly, as it ensures that sprites overlap in the correct order. It's especially
|
|
71
|
+
important for two sprites that may overlap to have different z-index values, or they may conflict and render
|
|
72
|
+
incorrectly ([z-fighting](https://en.wikipedia.org/wiki/Z-fighting)).
|
|
73
|
+
|
|
74
|
+
Alpha (`a`) is a value between `0.0` (fully transparent) and `1.0` (fully opaque). It controls the transparency of the
|
|
75
|
+
sprite when drawn. If not provided, it defaults to `1.0`.
|
|
76
|
+
|
|
77
|
+
## Checking Sprite Availability
|
|
78
|
+
|
|
79
|
+
Some skins may not have some sprites available, especially custom sprites. To check if a sprite is available, you can
|
|
80
|
+
use the [`is_available`][sonolus.script.sprite.Sprite.is_available] property:
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
from sonolus.script.sprite import Sprite
|
|
84
|
+
|
|
85
|
+
my_sprite: Sprite = ...
|
|
86
|
+
|
|
87
|
+
if my_sprite.is_available:
|
|
88
|
+
# The sprite is available, you can use it.
|
|
89
|
+
...
|
|
90
|
+
else:
|
|
91
|
+
# Do something else, such as using a fallback.
|
|
92
|
+
...
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Layers
|
|
96
|
+
|
|
97
|
+
To manage z-indexes, most engines will probably want to have some concept of a "layer" to categorize which
|
|
98
|
+
sprites should be drawn on top of others. Additionally, some offset computed based on position is useful to ensure
|
|
99
|
+
that two sprites on the same layer always have distinct z-indexes to prevent z-fighting.
|
|
100
|
+
|
|
101
|
+
For example, the pydori engine uses the following code to define layers:
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
LAYER_STAGE = 0
|
|
105
|
+
LAYER_LANE = 1
|
|
106
|
+
LAYER_JUDGE_LINE = 2
|
|
107
|
+
|
|
108
|
+
LAYER_CONNECTOR = 10
|
|
109
|
+
|
|
110
|
+
LAYER_PREVIEW_COVER = 20
|
|
111
|
+
LAYER_MEASURE_LINE = 21
|
|
112
|
+
LAYER_SIM_LINE = 22
|
|
113
|
+
LAYER_TIME_LINE = 23
|
|
114
|
+
LAYER_BPM_CHANGE_LINE = 24
|
|
115
|
+
LAYER_TIMESCALE_CHANGE_LINE = 25
|
|
116
|
+
|
|
117
|
+
LAYER_NOTE_HEAD = 30
|
|
118
|
+
LAYER_NOTE = 31
|
|
119
|
+
LAYER_ARROW = 32
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def get_z(layer: int, lane: float = 0, y: float = 0) -> float:
|
|
123
|
+
"""Calculate z-index based on layer, lane, and y-coordinate.
|
|
124
|
+
|
|
125
|
+
Lane and y are used to prevent z-fighting between sprites in the same layer.
|
|
126
|
+
"""
|
|
127
|
+
return layer * 10000 + lane * 100 + y
|
|
128
|
+
```
|