sonolus.py 0.1.9__py3-none-any.whl → 0.2.1__py3-none-any.whl

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.

Files changed (47) hide show
  1. sonolus/backend/optimize/constant_evaluation.py +2 -2
  2. sonolus/backend/optimize/optimize.py +12 -4
  3. sonolus/backend/optimize/passes.py +2 -1
  4. sonolus/backend/place.py +95 -14
  5. sonolus/backend/visitor.py +51 -3
  6. sonolus/build/cli.py +60 -9
  7. sonolus/build/collection.py +68 -26
  8. sonolus/build/compile.py +85 -27
  9. sonolus/build/engine.py +166 -40
  10. sonolus/build/node.py +8 -1
  11. sonolus/build/project.py +30 -11
  12. sonolus/script/archetype.py +154 -32
  13. sonolus/script/array.py +14 -3
  14. sonolus/script/array_like.py +6 -2
  15. sonolus/script/containers.py +166 -0
  16. sonolus/script/debug.py +22 -4
  17. sonolus/script/effect.py +2 -2
  18. sonolus/script/engine.py +125 -17
  19. sonolus/script/internal/builtin_impls.py +21 -2
  20. sonolus/script/internal/constant.py +8 -4
  21. sonolus/script/internal/context.py +30 -25
  22. sonolus/script/internal/math_impls.py +2 -1
  23. sonolus/script/internal/transient.py +7 -3
  24. sonolus/script/internal/value.py +33 -11
  25. sonolus/script/interval.py +8 -3
  26. sonolus/script/iterator.py +17 -0
  27. sonolus/script/level.py +113 -10
  28. sonolus/script/metadata.py +32 -0
  29. sonolus/script/num.py +35 -15
  30. sonolus/script/options.py +23 -6
  31. sonolus/script/pointer.py +11 -1
  32. sonolus/script/project.py +41 -5
  33. sonolus/script/quad.py +55 -1
  34. sonolus/script/record.py +10 -5
  35. sonolus/script/runtime.py +78 -16
  36. sonolus/script/sprite.py +18 -1
  37. sonolus/script/text.py +9 -0
  38. sonolus/script/ui.py +20 -7
  39. sonolus/script/values.py +8 -5
  40. sonolus/script/vec.py +28 -0
  41. sonolus_py-0.2.1.dist-info/METADATA +10 -0
  42. {sonolus_py-0.1.9.dist-info → sonolus_py-0.2.1.dist-info}/RECORD +46 -45
  43. {sonolus_py-0.1.9.dist-info → sonolus_py-0.2.1.dist-info}/WHEEL +1 -1
  44. sonolus_py-0.1.9.dist-info/METADATA +0 -9
  45. /sonolus/script/{print.py → printing.py} +0 -0
  46. {sonolus_py-0.1.9.dist-info → sonolus_py-0.2.1.dist-info}/entry_points.txt +0 -0
  47. {sonolus_py-0.1.9.dist-info → sonolus_py-0.2.1.dist-info}/licenses/LICENSE +0 -0
sonolus/script/runtime.py CHANGED
@@ -2,7 +2,8 @@ from enum import IntEnum
2
2
 
3
3
  from sonolus.backend.mode import Mode
4
4
  from sonolus.script.array import Array
5
- from sonolus.script.containers import VarArray
5
+ from sonolus.script.array_like import ArrayLike
6
+ from sonolus.script.containers import ArrayPointer
6
7
  from sonolus.script.globals import (
7
8
  _level_life,
8
9
  _level_score,
@@ -103,6 +104,12 @@ class _PreviewRuntimeCanvas:
103
104
  scroll_direction: ScrollDirection
104
105
  size: float
105
106
 
107
+ def update(self, scroll_direction: ScrollDirection | None = None, size: float | None = None):
108
+ if scroll_direction is not None:
109
+ self.scroll_direction = scroll_direction
110
+ if size is not None:
111
+ self.size = size
112
+
106
113
 
107
114
  class RuntimeUiConfig(Record):
108
115
  scale: float
@@ -253,42 +260,64 @@ class _TutorialRuntimeUi:
253
260
 
254
261
 
255
262
  class Touch(Record):
263
+ """Data of a touch event."""
264
+
256
265
  id: int
266
+ """The unique identifier of the touch."""
267
+
257
268
  started: bool
269
+ """Whether the touch has started this frame."""
270
+
258
271
  ended: bool
272
+ """Whether the touch has ended this frame."""
273
+
259
274
  time: float
275
+ """The time of the touch event.
276
+
277
+ May remain constant while there is no movement.
278
+ """
279
+
260
280
  start_time: float
281
+ """The time the touch started."""
282
+
261
283
  position: Vec2
284
+ """The current position of the touch."""
285
+
262
286
  start_position: Vec2
287
+ """The position the touch started."""
288
+
263
289
  delta: Vec2
290
+ """The change in position of the touch."""
291
+
264
292
  velocity: Vec2
293
+ """The velocity of the touch."""
294
+
265
295
  speed: float
296
+ """The speed of the touch's movement."""
297
+
266
298
  angle: float
299
+ """The angle of the touch's movement."""
267
300
 
268
301
  @property
269
- def total_time(self) -> float:
270
- return self.time - self.start_time
302
+ def prev_position(self) -> Vec2:
303
+ """The previous position of the touch."""
304
+ return self.position - self.delta
271
305
 
272
306
  @property
273
307
  def total_delta(self) -> Vec2:
308
+ """The total change in position of the touch."""
274
309
  return self.position - self.start_position
275
310
 
276
- @property
277
- def total_velocity(self) -> Vec2:
278
- return self.total_delta / self.total_time if self.total_time > 0 else Vec2(0, 0)
279
-
280
- @property
281
- def total_speed(self) -> float:
282
- return self.total_velocity.magnitude
283
-
284
311
  @property
285
312
  def total_angle(self) -> float:
313
+ """The total angle of the touch's movement."""
286
314
  return self.total_delta.angle
287
315
 
288
316
 
289
317
  @_runtime_touch_array
290
318
  class _TouchArray:
291
- touches: Array[Touch, 999]
319
+ # Handled specially, see touches()
320
+ pass
292
321
 
293
322
 
294
323
  @_runtime_skin_transform
@@ -449,6 +478,39 @@ def is_debug() -> bool:
449
478
  return False
450
479
 
451
480
 
481
+ @meta_fn
482
+ def is_play() -> bool:
483
+ """Check if the game is running in play mode."""
484
+ return ctx() and ctx().global_state.mode == Mode.PLAY
485
+
486
+
487
+ @meta_fn
488
+ def is_preview() -> bool:
489
+ """Check if the game is running in preview mode."""
490
+ return ctx() and ctx().global_state.mode == Mode.PREVIEW
491
+
492
+
493
+ @meta_fn
494
+ def is_watch() -> bool:
495
+ """Check if the game is running in watch mode."""
496
+ return ctx() and ctx().global_state.mode == Mode.WATCH
497
+
498
+
499
+ @meta_fn
500
+ def is_tutorial() -> bool:
501
+ """Check if the game is running in tutorial mode."""
502
+ return ctx() and ctx().global_state.mode == Mode.TUTORIAL
503
+
504
+
505
+ @meta_fn
506
+ def is_preprocessing() -> bool:
507
+ """Check if the game is in the preprocessing stage.
508
+
509
+ Returns True if the current callback is one of preprocess, spawn_order, spawn_time, or despawn_time.
510
+ """
511
+ return ctx() and ctx().callback in {"preprocess", "spawnOrder", "spawnTime", "despawnTime"}
512
+
513
+
452
514
  @meta_fn
453
515
  def aspect_ratio() -> float:
454
516
  """Get the aspect ratio of the game."""
@@ -589,15 +651,15 @@ def scaled_time() -> float:
589
651
 
590
652
 
591
653
  @meta_fn
592
- def touches() -> VarArray[Touch, 999]:
654
+ def touches() -> ArrayLike[Touch]:
593
655
  """Get the current touches of the game."""
594
656
  if not ctx():
595
- return VarArray(0, Array[Touch, 0]())
657
+ return Array[Touch, 0]()
596
658
  match ctx().global_state.mode:
597
659
  case Mode.PLAY:
598
- return VarArray(_PlayRuntimeUpdate.touch_count, _TouchArray.touches)
660
+ return ArrayPointer[Touch](_PlayRuntimeUpdate.touch_count, ctx().blocks.RuntimeTouchArray, 0)
599
661
  case _:
600
- return VarArray(0, Array[Touch, 0]())
662
+ return Array[Touch, 0]()
601
663
 
602
664
 
603
665
  @meta_fn
sonolus/script/sprite.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from dataclasses import dataclass
2
+ from enum import StrEnum
2
3
  from typing import Annotated, Any, NewType, dataclass_transform, get_origin
3
4
 
4
5
  from sonolus.backend.ops import Op
@@ -269,6 +270,19 @@ def sprite(name: str) -> Any:
269
270
  type Skin = NewType("Skin", Any)
270
271
 
271
272
 
273
+ class RenderMode(StrEnum):
274
+ """Render mode for sprites."""
275
+
276
+ DEFAULT = "default"
277
+ """Use the user's preferred render mode."""
278
+
279
+ STANDARD = "standard"
280
+ """Use the standard render mode with bilinear interpolation of textures."""
281
+
282
+ LIGHTWEIGHT = "lightweight"
283
+ """Use the lightweight render mode with projective interpolation of textures."""
284
+
285
+
272
286
  @dataclass_transform()
273
287
  def skin[T](cls: type[T]) -> T | Skin:
274
288
  """Decorator to define a skin.
@@ -277,6 +291,8 @@ def skin[T](cls: type[T]) -> T | Skin:
277
291
  ```python
278
292
  @skin
279
293
  class Skin:
294
+ render_mode: RenderMode
295
+
280
296
  note: StandardSprite.NOTE_HEAD_RED
281
297
  other: Sprite = skin_sprite("other")
282
298
  ```
@@ -285,7 +301,7 @@ def skin[T](cls: type[T]) -> T | Skin:
285
301
  raise ValueError("Skin class must not inherit from any class (except object)")
286
302
  instance = cls()
287
303
  names = []
288
- for i, (name, annotation) in enumerate(get_field_specifiers(cls).items()):
304
+ for i, (name, annotation) in enumerate(get_field_specifiers(cls, skip={"render_mode"}).items()):
289
305
  if get_origin(annotation) is not Annotated:
290
306
  raise TypeError(f"Invalid annotation for skin: {annotation}")
291
307
  annotation_type = annotation.__args__[0]
@@ -298,6 +314,7 @@ def skin[T](cls: type[T]) -> T | Skin:
298
314
  names.append(sprite_name)
299
315
  setattr(instance, name, Sprite(i))
300
316
  instance._sprites_ = names
317
+ instance.render_mode = RenderMode(getattr(instance, "render_mode", RenderMode.DEFAULT))
301
318
  instance._is_comptime_value_ = True
302
319
  return instance
303
320
 
sonolus/script/text.py CHANGED
@@ -157,6 +157,15 @@ class StandardText(StrEnum):
157
157
  SIMLINE_COLOR = "#SIMLINE_COLOR"
158
158
  SIMLINE_ALPHA = "#SIMLINE_ALPHA"
159
159
  SIMLINE_ANIMATION = "#SIMLINE_ANIMATION"
160
+ PREVIEW_SCALE_VERTICAL = "#PREVIEW_SCALE_VERTICAL"
161
+ PREVIEW_SCALE_HORIZONTAL = "#PREVIEW_SCALE_HORIZONTAL"
162
+ PREVIEW_TIME = "#PREVIEW_TIME"
163
+ PREVIEW_SCORE = "#PREVIEW_SCORE"
164
+ PREVIEW_BPM = "#PREVIEW_BPM"
165
+ PREVIEW_TIMESCALE = "#PREVIEW_TIMESCALE"
166
+ PREVIEW_BEAT = "#PREVIEW_BEAT"
167
+ PREVIEW_MEASURE = "#PREVIEW_MEASURE"
168
+ PREVIEW_COMBO = "#PREVIEW_COMBO"
160
169
  NONE = "#NONE"
161
170
  ANY = "#ANY"
162
171
  ALL = "#ALL"
sonolus/script/ui.py CHANGED
@@ -20,9 +20,14 @@ class UiMetric(StrEnum):
20
20
 
21
21
 
22
22
  class UiJudgmentErrorStyle(StrEnum):
23
- """The style of the judgment error."""
23
+ """The style of the judgment error.
24
+
25
+ The name of each member refers to what's used for positive (late) judgment errors.
26
+ """
24
27
 
25
28
  NONE = "none"
29
+ LATE = "late"
30
+ EARLY = "early" # Not really useful
26
31
  PLUS = "plus"
27
32
  MINUS = "minus"
28
33
  ARROW_UP = "arrowUp"
@@ -38,9 +43,13 @@ class UiJudgmentErrorStyle(StrEnum):
38
43
  class UiJudgmentErrorPlacement(StrEnum):
39
44
  """The placement of the judgment error."""
40
45
 
41
- BOTH = "both"
42
46
  LEFT = "left"
43
47
  RIGHT = "right"
48
+ LEFT_RIGHT = "leftRight"
49
+ TOP = "top"
50
+ BOTTOM = "bottom"
51
+ TOP_BOTTOM = "topBottom"
52
+ CENTER = "center"
44
53
 
45
54
 
46
55
  class EaseType(StrEnum):
@@ -120,8 +129,8 @@ class UiAnimation:
120
129
  alpha: The animation applied to alpha.
121
130
  """
122
131
 
123
- scale: UiAnimationTween = field(default_factory=lambda: UiAnimationTween(1, 1, 0, "none"))
124
- alpha: UiAnimationTween = field(default_factory=lambda: UiAnimationTween(1, 0, 0.2, "outCubic"))
132
+ scale: UiAnimationTween
133
+ alpha: UiAnimationTween
125
134
 
126
135
  def to_dict(self):
127
136
  return {
@@ -183,14 +192,18 @@ class UiConfig:
183
192
  progress_visibility: UiVisibility = field(default_factory=UiVisibility)
184
193
  tutorial_navigation_visibility: UiVisibility = field(default_factory=UiVisibility)
185
194
  tutorial_instruction_visibility: UiVisibility = field(default_factory=UiVisibility)
186
- judgment_animation: UiAnimation = field(default_factory=UiAnimation)
195
+ judgment_animation: UiAnimation = field(
196
+ default_factory=lambda: UiAnimation(
197
+ scale=UiAnimationTween(0, 1, 0.1, EaseType.OUT_CUBIC), alpha=UiAnimationTween(1, 0, 0.3, EaseType.NONE)
198
+ )
199
+ )
187
200
  combo_animation: UiAnimation = field(
188
201
  default_factory=lambda: UiAnimation(
189
202
  scale=UiAnimationTween(1.2, 1, 0.2, EaseType.IN_CUBIC), alpha=UiAnimationTween(1, 1, 0, EaseType.NONE)
190
203
  )
191
204
  )
192
- judgment_error_style: UiJudgmentErrorStyle = UiJudgmentErrorStyle.NONE
193
- judgment_error_placement: UiJudgmentErrorPlacement = UiJudgmentErrorPlacement.BOTH
205
+ judgment_error_style: UiJudgmentErrorStyle = UiJudgmentErrorStyle.LATE
206
+ judgment_error_placement: UiJudgmentErrorPlacement = UiJudgmentErrorPlacement.TOP
194
207
  judgment_error_min: float = 0.0
195
208
 
196
209
  def to_dict(self):
sonolus/script/values.py CHANGED
@@ -19,11 +19,7 @@ def alloc[T](type_: type[T]) -> T:
19
19
  @meta_fn
20
20
  def zeros[T](type_: type[T]) -> T:
21
21
  """Make a new instance of the given type initialized with zeros."""
22
- type_ = validate_concrete_type(type_)
23
- if ctx():
24
- return copy(type_._from_list_([0] * type_._size_()))
25
- else:
26
- return type_._from_list_([0] * type_._size_())._as_py_()
22
+ return validate_concrete_type(type_)._zero_()
27
23
 
28
24
 
29
25
  @meta_fn
@@ -34,3 +30,10 @@ def copy[T](value: T) -> T:
34
30
  return value._copy_()
35
31
  else:
36
32
  return value._copy_()._as_py_()
33
+
34
+
35
+ def swap[T](a: T, b: T):
36
+ """Swap the values of the two given arguments."""
37
+ temp = copy(a)
38
+ a @= b
39
+ b @= temp
sonolus/script/vec.py CHANGED
@@ -128,6 +128,25 @@ class Vec2(Record):
128
128
  """
129
129
  return (self - pivot).rotate(angle) + pivot
130
130
 
131
+ def normalize(self) -> Self:
132
+ """Normalize the vector (set the magnitude to 1) and return a new vector.
133
+
134
+ Returns:
135
+ A new vector with magnitude 1.
136
+ """
137
+ magnitude = self.magnitude
138
+ return Vec2(x=self.x / magnitude, y=self.y / magnitude)
139
+
140
+ def orthogonal(self) -> Self:
141
+ """Return a vector orthogonal to this vector.
142
+
143
+ The orthogonal vector is rotated 90 degrees counter-clockwise from this vector.
144
+
145
+ Returns:
146
+ A new vector orthogonal to this vector.
147
+ """
148
+ return Vec2(x=-self.y, y=self.x)
149
+
131
150
  @property
132
151
  def tuple(self) -> tuple[float, float]:
133
152
  """Return the vector as a tuple (x, y).
@@ -173,6 +192,15 @@ class Vec2(Record):
173
192
  return Vec2(x=self.x * x, y=self.y * y)
174
193
  case Num(factor):
175
194
  return Vec2(x=self.x * factor, y=self.y * factor)
195
+ case _:
196
+ return NotImplemented
197
+
198
+ def __rmul__(self, other):
199
+ match other:
200
+ case Num(factor):
201
+ return Vec2(x=self.x * factor, y=self.y * factor)
202
+ case _:
203
+ return NotImplemented
176
204
 
177
205
  def __truediv__(self, other: Self | float) -> Self:
178
206
  """Divide this vector by another vector or a scalar and return a new vector.
@@ -0,0 +1,10 @@
1
+ Metadata-Version: 2.4
2
+ Name: sonolus.py
3
+ Version: 0.2.1
4
+ Summary: Sonolus engine development in Python
5
+ License-File: LICENSE
6
+ Requires-Python: >=3.12
7
+ Description-Content-Type: text/markdown
8
+
9
+ # Sonolus.py
10
+ Sonolus engine development in Python. See [docs](https://sonolus.py.qwewqa.xyz) for more information.
@@ -9,81 +9,82 @@ sonolus/backend/ir.py,sha256=TCDLMvlX2S8emFDQwFVeD2OUC4fnhbrMObgYtoa_7PQ,2845
9
9
  sonolus/backend/mode.py,sha256=NkcPZJm8dn83LX35uP24MtQOCnfRDFZ280dHeEEfauE,613
10
10
  sonolus/backend/node.py,sha256=H8qgnNyIseR-DhfgtcbDX03SUmhAJSSrYAlUEJTkkUo,999
11
11
  sonolus/backend/ops.py,sha256=ekkHSdgRubIYLSYFk0wTUuBvyf3TKdApM4AyR_koTQ8,10122
12
- sonolus/backend/place.py,sha256=Z3yFx-Ki2z32MXsVb6TkZ_D95RyZCu8iJPQRXNiyiNg,2364
12
+ sonolus/backend/place.py,sha256=jABvLNNE-2pklTcb9WnyfHK8c-tYxn0ObsoLp5LYd5I,4703
13
13
  sonolus/backend/utils.py,sha256=9-mmCUwGlNdjp51jKrNBN2dGxCAXVV2PdJn031kaXHM,1717
14
- sonolus/backend/visitor.py,sha256=PRsF02Y664XrnBV_USQjtQ3ihqEeQR6zAcIRBTnhu18,46490
14
+ sonolus/backend/visitor.py,sha256=GvAEx8D3_YijTMUYBmir0IvDPAEpK1ObAuQOAcAMKm0,48157
15
15
  sonolus/backend/optimize/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  sonolus/backend/optimize/allocate.py,sha256=LCqxvT8YsVGTaVAu58fb6lrrytVLWx1LNbcOfx8CqL8,5671
17
- sonolus/backend/optimize/constant_evaluation.py,sha256=ty3vNey7I44GK17lQA-3whkioFQGleYKD3P5a22foj0,15997
17
+ sonolus/backend/optimize/constant_evaluation.py,sha256=ozYB__haE2A_L2NBh2H3IT__Z65FBBtbjh6BJfQRC_A,15988
18
18
  sonolus/backend/optimize/copy_coalesce.py,sha256=4vUe-y2w8sGyrguSlp8O_p0uy9rEUu5M-smI0F5UMQw,4404
19
19
  sonolus/backend/optimize/dead_code.py,sha256=qYmUqBmAp-O5mUpNusOoMEJVkbc9YIHx6Ynrg6dyNGY,8077
20
20
  sonolus/backend/optimize/dominance.py,sha256=oTFUqN8twrw6lTzqr1nlYs-Gk1NzIa-4qGdEQvDGzlM,3217
21
21
  sonolus/backend/optimize/flow.py,sha256=mMf5Um2uxwF65nw13UiIv7dFMHZZHnyWv2WaOVnGw2c,4266
22
22
  sonolus/backend/optimize/inlining.py,sha256=jwTiuHivSq9bB7FfVbD9Wd_Ztaz8ml_5CRnikr2d6yU,5719
23
23
  sonolus/backend/optimize/liveness.py,sha256=c0ejVf1LNcYBlByf3rxkNs18IoXmiOdCFwEk3Afv8DE,7121
24
- sonolus/backend/optimize/optimize.py,sha256=oGPmsDD0FFNihhrpV9uSybkGHP3C_EU0Rpw6x7kvf8c,1329
25
- sonolus/backend/optimize/passes.py,sha256=OPzcpFUU7qbQFSrgr84UuzDg_vB1GYkZj2K2aqGkkag,1643
24
+ sonolus/backend/optimize/optimize.py,sha256=It_z8fAaTsG8bRNrvR5mQzVjmwZT5I1whBvy4F-Xoos,1473
25
+ sonolus/backend/optimize/passes.py,sha256=BQy-BovGu234Y12c-vpBmTaNNl9oeW4qZ8A3q5y5nLs,1684
26
26
  sonolus/backend/optimize/simplify.py,sha256=Tz4RftjH5TpIxoIOwiZuLchsrwzI9GaS_exdjAW6HKk,7927
27
27
  sonolus/backend/optimize/ssa.py,sha256=D3CQm3s3gcuU0_k_0pXVrwirm4xjAZsX6corrTDS1Co,9013
28
28
  sonolus/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- sonolus/build/cli.py,sha256=12sFalCUJmn0Dg3f8ipNIkPmZ_djG15gldqWzDG7AYo,6241
30
- sonolus/build/collection.py,sha256=IsDgedsAJ-foHzQ4LnQ9zSVXSz5wVVt4sgqiUICBvCU,10573
31
- sonolus/build/compile.py,sha256=WhMwamVSi64gxrbj2tBdznHCT9pVLdR5lZS9WDapzg4,3521
32
- sonolus/build/engine.py,sha256=TAJCdSWOsEcTq9o6jfR3A2JZ8gOoc9YQx6FC_qW-dFw,6766
29
+ sonolus/build/cli.py,sha256=zWkiY2frHHIk3nqP8XrzV1ez1zU67deNZ7WeFR5SfVo,8801
30
+ sonolus/build/collection.py,sha256=kOVnpQC_KHAsyTM4nAplSh6QE16CgO-H6PP1GItWm78,12187
31
+ sonolus/build/compile.py,sha256=nWtQRao_k-ChJhjmYFpPMRlPgxFI0t9wtMWSRHQcnbQ,5586
32
+ sonolus/build/engine.py,sha256=AYzJHRcYaR-PidR9eG6Tbr4Xz5-spHTOp4S9F4nm-UY,11178
33
33
  sonolus/build/level.py,sha256=AjvK4725nqDcg7oGn5kWocBdG-AcirXpku74T7c2epA,673
34
- sonolus/build/node.py,sha256=jwsVWt6Brh4M9MypUt3Nqnxfm7fXrCMRWYQGwBTAszI,1162
35
- sonolus/build/project.py,sha256=QukkCVQBGxnp1F2jQjaAkTg3TutwhWqKGXAfQZDMk1c,5162
34
+ sonolus/build/node.py,sha256=gnX71RYDUOK_gYMpinQi-bLWO4csqcfiG5gFmhxzSec,1330
35
+ sonolus/build/project.py,sha256=DhNqgHnm73qKUOhrg1JPlWEL0Vg7VxcGUbNokpMWzVE,6315
36
36
  sonolus/script/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- sonolus/script/archetype.py,sha256=LGECC__TXb5km5UVk64fQr8AqduxmADIcKOmx1Z4qAY,35340
38
- sonolus/script/array.py,sha256=C_LP-bgYfpd43pm_nFlG0x9ojov1qV9JCVJmKnUiqdo,9347
39
- sonolus/script/array_like.py,sha256=OVOLMadS-Jj941S-EgoxlFPdaQLT6ZrHzaMnKtB6PfU,8346
37
+ sonolus/script/archetype.py,sha256=I-K9uT4l6S5w4toDplzG8v01w0KTM4TsZZPgiZgwOrA,40098
38
+ sonolus/script/array.py,sha256=l-KdtHvxF4NpCSZAw4t7MG4N5aZ_gOTGkemDobC6mQY,9791
39
+ sonolus/script/array_like.py,sha256=nCIt_TxV7Ck6ovbSXyViqUkxsO9BksFOjUhpwF0uuxA,8444
40
40
  sonolus/script/bucket.py,sha256=oaaB7OXtBWzr8sLzPOpm8-GMhs7FzEhYrI1uVcM0DHM,7453
41
- sonolus/script/containers.py,sha256=tf0-UUSq8NH6k9jIKq6qgXRxanFQ0f5olH6uHghTynk,13171
42
- sonolus/script/debug.py,sha256=ua8FM7h563ZMQp7oyjJRGzjjF0zi4xcnFhI3RgIdOSw,2443
41
+ sonolus/script/containers.py,sha256=QUFUk1lDwM2AzIPH6uHkZtZXT2D4_xT3P6pJIp6i7Ew,17640
42
+ sonolus/script/debug.py,sha256=aYyFm8DuoifK0L0pY4G7ZZEEeSqbig90Yogy6Z_M8Yg,3135
43
43
  sonolus/script/easing.py,sha256=7zaDKIfM_whUpb4FBz1DAF4NNG2vk_nDjl8kL2Y90aU,11396
44
- sonolus/script/effect.py,sha256=kFshJhpVh5XiRPYms30vhry7_P6bQMVEkZ1K90jprgk,5830
45
- sonolus/script/engine.py,sha256=WUCENp-G_12jN_QW-w1RJCJQrkyRbsVtB1z7OeNV2mQ,6975
44
+ sonolus/script/effect.py,sha256=V9bJvMzs1O4C1PjTOKgsAXov-l4AnDb2h38-DzmeWpI,5838
45
+ sonolus/script/engine.py,sha256=BhhQTrHuGAAAD6JPQ3R0jvHdimwW83PPghEIdAdtGMA,10683
46
46
  sonolus/script/globals.py,sha256=Z8RfLkgDuXPIKiq-aOqblP0s__ALGmvcKdlyWZH21EM,9166
47
47
  sonolus/script/instruction.py,sha256=PNfxC1dhT_hB0BxhDV3KXMn_kKxfI0t1iZmg8m6ddMU,6725
48
- sonolus/script/interval.py,sha256=3wMy7YlL6XV0g7w3eIDQDXl1WfTjW4NunKtwRxRMnDQ,9004
49
- sonolus/script/iterator.py,sha256=ZErUmpRrXISe1xiT3VOjHzcqqLhpfT9FI7Kz2s2vUpk,4163
50
- sonolus/script/level.py,sha256=BIkhNC6gOpXfIeScXhY_OQV6q7ivnHsUoOiW1Ot-Ec8,2297
51
- sonolus/script/num.py,sha256=4o0SQ9CpGpn5qddkVSwnJy6s5JHWW646BVNBWp2LMb0,13923
52
- sonolus/script/options.py,sha256=nTOuoRC2p_qoMx4ngOVDY2WZDooTxwwGTGKyb994v2A,7516
48
+ sonolus/script/interval.py,sha256=IYNgJx0ngREnEVu_yMAu0MrA_Q7mZuToT8U3fbdb3Sc,9122
49
+ sonolus/script/iterator.py,sha256=OHnIOKRchzVCMaN33Tubo6EzqV61ZYUxDWIJ2S5G6iQ,4590
50
+ sonolus/script/level.py,sha256=wR23xk-NOcW_JMRb3R12sqIXCLSZL-7cM3y7IpMF1J0,6333
51
+ sonolus/script/metadata.py,sha256=ttRK27eojHf3So50KQJ-8yj3udZoN1bli5iD-knaeLw,753
52
+ sonolus/script/num.py,sha256=FpMi-w_rdkozZSFxraNQ4IkOzQpTr4YAH3hbqMIFYy8,14612
53
+ sonolus/script/options.py,sha256=ZD9I898wMrpPQ8IyuDoYef804rZzhSvPoC_0bxovIec,8245
53
54
  sonolus/script/particle.py,sha256=K06ArT9tstRNdbuGIviDmDDWcK3-ieA53LHg0Xvizow,8304
54
- sonolus/script/pointer.py,sha256=pOh5vCSl6xR7mDm5PMOhBc_wf4O-b938DE0LtZWBmPc,1119
55
- sonolus/script/print.py,sha256=mNYu9QWiacBBGZrnePZQMVwbbguoelUps9GiOK_aVRU,2096
56
- sonolus/script/project.py,sha256=DhmBuH0CkFKmF27o1V9XhIOsywXDi57i-Wpwyd-70LM,2040
57
- sonolus/script/quad.py,sha256=e2kXKSp9K46Q9qstLsGLFPxaW7Z2kfVfignA8Ka2-Pw,8375
58
- sonolus/script/record.py,sha256=lIptvCrX0mTFMNZBOXyimO3OXMBPEBf6H0urh0eeMlE,11222
59
- sonolus/script/runtime.py,sha256=xeiLJFeqkCev1x6pBiM5afyvi3GWdpLJ5OYRg9M9nwo,18562
60
- sonolus/script/sprite.py,sha256=FOozsPtaQnInnm-QshtYznnC66_8jb1D2sHmo7nFEsY,15718
61
- sonolus/script/text.py,sha256=IsoINZJXefjReYDjJFwVaFsUCdgeQvPBDeywljM2dWo,13025
55
+ sonolus/script/pointer.py,sha256=IH2_a0XE76uG_UyYM9jAYIf7qZ5LhUNc9ksXDIvAPZA,1511
56
+ sonolus/script/printing.py,sha256=mNYu9QWiacBBGZrnePZQMVwbbguoelUps9GiOK_aVRU,2096
57
+ sonolus/script/project.py,sha256=jLndgGJHdkqFYe-lDl_IzTjQ4gOSuy80en8WoSWXnB8,3340
58
+ sonolus/script/quad.py,sha256=7uhBwRSvA4tZ_JFjc3Y9n8C9AwQirX5E8MAA0QaHCak,10067
59
+ sonolus/script/record.py,sha256=EV4wywagBl3RU40Bqo9DRdx7Ta8xBgwKtgKlDF02X0o,11332
60
+ sonolus/script/runtime.py,sha256=MIGqDqNitlI6vFtZ2SP32D6LCLJ3RAuGKSxKKl-1tJw,20303
61
+ sonolus/script/sprite.py,sha256=CMcRAZ2hejXnaBmY2_n1_rj6hGOgPP5zEW-BpyaEVOY,16256
62
+ sonolus/script/text.py,sha256=wxujIgKYcCfl2AD2_Im8g3vh0lDEHYwTSRZg9wsBPEU,13402
62
63
  sonolus/script/timing.py,sha256=ZR0ypV2PIoDCMHHGOMfCeezStCsBQdzomdqaz5VKex0,2981
63
64
  sonolus/script/transform.py,sha256=hH6KSRQC8vV-Z10CRCrGewMYqQwUMH3mQIEmniuC2Zw,10760
64
- sonolus/script/ui.py,sha256=kyuP88sLRJPT-Yx-7fx8Xu9Wdegyw_CJNslcP4WnDUs,7268
65
- sonolus/script/values.py,sha256=JuvJknskuY6FPprUp9R-6Gj2TDJLu4ppbVcYedG5dG0,1049
66
- sonolus/script/vec.py,sha256=looCsmYpt6jlasdBqddtkC0hA1exZ3lxPP3_BL8cPXw,6148
65
+ sonolus/script/ui.py,sha256=DYPGWIjHj1IFPxW1zaEuIUQx0b32FJPXtiwCvrtJ6oo,7528
66
+ sonolus/script/values.py,sha256=bwh_9ikxuKyrO_m3_lTKIvZDze4j88Fz-_HT_jB657g,1032
67
+ sonolus/script/vec.py,sha256=4ntfJ96zxKR-nVZluUgHd-Ud4vNfButfiv7EsroZxfE,7002
67
68
  sonolus/script/internal/__init__.py,sha256=T6rzLoiOUaiSQtaHMZ88SNO-ijSjSSv33TKtUwu-Ms8,136
68
- sonolus/script/internal/builtin_impls.py,sha256=w27aKMhLX4Ivd7uKz1ZgVy1lC5scSSJ23-VfsbCfIb0,7731
69
+ sonolus/script/internal/builtin_impls.py,sha256=w9QqxJQ2YR5pVy820qWmAy0utbsW4hcSzMvA_yNgsvg,8186
69
70
  sonolus/script/internal/callbacks.py,sha256=vWzJG8uiJoEtsNnbeZPqOHogCwoLpz2D1MnHY2wVV8s,2801
70
- sonolus/script/internal/constant.py,sha256=VblCGm61J7PCnErom8L9-WHisD6-C09_yeuiMxQog14,3782
71
- sonolus/script/internal/context.py,sha256=I9X89aTWgoY-_jgnJHEnzzVLAvILACtPfgdE4ipxjOc,13930
71
+ sonolus/script/internal/constant.py,sha256=XljC1bXpjmQsekFFDNbaCLoHLPXzDeE17QDHf-rY70Q,3835
72
+ sonolus/script/internal/context.py,sha256=xW7yFWr13yf77Uk4C_F7v9Kp4ZP1o30uZuBkvK1KyLA,14157
72
73
  sonolus/script/internal/descriptor.py,sha256=XRFey-EjiAm_--KsNl-8N0Mi_iyQwlPh68gDp0pKf3E,392
73
74
  sonolus/script/internal/dict_impl.py,sha256=alu_wKGSk1kZajNf64qbe7t71shEzD4N5xNIATH8Swo,1885
74
75
  sonolus/script/internal/error.py,sha256=ZNnsvQVQAnFKzcvsm6-sste2lo-tP5pPI8sD7XlAZWc,490
75
76
  sonolus/script/internal/generic.py,sha256=YU1hUJoBcGc0OSrFStK5JI6CikOwSmd_IR20pCuT82k,7310
76
77
  sonolus/script/internal/impl.py,sha256=HKQVoHknw5t43Wmj_G1vFjGSmnFpOj1FUYnhbUM3rHc,2969
77
78
  sonolus/script/internal/introspection.py,sha256=SL2zaYjid0kkcj6ZbFLIwhgh7WKZBaAHhlbSJGr6PWs,974
78
- sonolus/script/internal/math_impls.py,sha256=7L450U7gW-jUkTWcQ1AMg9IX0yhu4G2WUsJ5xMZ8r3o,2306
79
+ sonolus/script/internal/math_impls.py,sha256=Xk7tLMnV2npzPJWtHlspONQHt09Gh2YLdHhAjx4jkdE,2320
79
80
  sonolus/script/internal/native.py,sha256=XKlNnWSJ-lxbwVGWhGj_CSSoWsVN18imqT5sAsDJT1w,1551
80
81
  sonolus/script/internal/random.py,sha256=6Ku5edRcDUh7rtqEEYCJz0BQavw69RALsVHS25z50pI,1695
81
82
  sonolus/script/internal/range.py,sha256=lrTanQFHU7RuQxSSPwDdoC30Y8FnHGxcP1Ahditu3zU,2297
82
- sonolus/script/internal/transient.py,sha256=s-8284jDw1xZorOvLw9mG-ADhZqSWmzUgfL3AO5QcKE,1526
83
+ sonolus/script/internal/transient.py,sha256=d6iYhM9f6DPUX5nkYQGm-x0b9XEfZUmB4AtUNnyhixo,1636
83
84
  sonolus/script/internal/tuple_impl.py,sha256=vjXmScLVdeTkDn3t9fgIRqtW31iwngnaP2rmA6nlsLw,3431
84
- sonolus/script/internal/value.py,sha256=QcX-Ppv5IHQvJEupqAXCmXpaWao5_0XDvYvNk9J2PQU,4334
85
- sonolus_py-0.1.9.dist-info/METADATA,sha256=bqFPKVEV8CRv--1dBl6wh4WiOiX67OIet3NRKZO7WoE,216
86
- sonolus_py-0.1.9.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
87
- sonolus_py-0.1.9.dist-info/entry_points.txt,sha256=oTYspY_b7SA8TptEMTDxh4-Aj-ZVPnYC9f1lqH6s9G4,54
88
- sonolus_py-0.1.9.dist-info/licenses/LICENSE,sha256=JEKpqVhQYfEc7zg3Mj462sKbKYmO1K7WmvX1qvg9IJk,1067
89
- sonolus_py-0.1.9.dist-info/RECORD,,
85
+ sonolus/script/internal/value.py,sha256=St7OqBX-Tad_qBfu6aWMFU4lDXRyFnvzzkb-yFmOzg0,5042
86
+ sonolus_py-0.2.1.dist-info/METADATA,sha256=OZkz271-5AHDS0iRKllUD5f3Wb5FL9s7BQghhIhI6Nw,302
87
+ sonolus_py-0.2.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
88
+ sonolus_py-0.2.1.dist-info/entry_points.txt,sha256=oTYspY_b7SA8TptEMTDxh4-Aj-ZVPnYC9f1lqH6s9G4,54
89
+ sonolus_py-0.2.1.dist-info/licenses/LICENSE,sha256=JEKpqVhQYfEc7zg3Mj462sKbKYmO1K7WmvX1qvg9IJk,1067
90
+ sonolus_py-0.2.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.26.3
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,9 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: sonolus.py
3
- Version: 0.1.9
4
- Summary: Sonolus engine development in Python
5
- Requires-Python: >=3.12
6
- Description-Content-Type: text/markdown
7
-
8
- # Sonolus.py
9
- Sonolus engine development in Python.
File without changes