sonolus.py 0.1.3__py3-none-any.whl → 0.1.4__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 (68) hide show
  1. sonolus/backend/allocate.py +125 -51
  2. sonolus/backend/blocks.py +756 -756
  3. sonolus/backend/coalesce.py +85 -0
  4. sonolus/backend/constant_evaluation.py +374 -0
  5. sonolus/backend/dead_code.py +80 -0
  6. sonolus/backend/dominance.py +111 -0
  7. sonolus/backend/excepthook.py +37 -37
  8. sonolus/backend/finalize.py +69 -69
  9. sonolus/backend/flow.py +121 -92
  10. sonolus/backend/inlining.py +150 -0
  11. sonolus/backend/ir.py +5 -3
  12. sonolus/backend/liveness.py +173 -0
  13. sonolus/backend/mode.py +24 -24
  14. sonolus/backend/node.py +40 -40
  15. sonolus/backend/ops.py +197 -197
  16. sonolus/backend/optimize.py +37 -9
  17. sonolus/backend/passes.py +52 -6
  18. sonolus/backend/simplify.py +47 -30
  19. sonolus/backend/ssa.py +187 -0
  20. sonolus/backend/utils.py +48 -48
  21. sonolus/backend/visitor.py +892 -882
  22. sonolus/build/cli.py +7 -1
  23. sonolus/build/compile.py +88 -90
  24. sonolus/build/level.py +24 -23
  25. sonolus/build/node.py +43 -43
  26. sonolus/script/archetype.py +23 -6
  27. sonolus/script/array.py +2 -2
  28. sonolus/script/bucket.py +191 -191
  29. sonolus/script/callbacks.py +127 -127
  30. sonolus/script/comptime.py +1 -1
  31. sonolus/script/containers.py +23 -0
  32. sonolus/script/debug.py +19 -3
  33. sonolus/script/easing.py +323 -0
  34. sonolus/script/effect.py +131 -131
  35. sonolus/script/globals.py +269 -269
  36. sonolus/script/graphics.py +200 -150
  37. sonolus/script/instruction.py +151 -151
  38. sonolus/script/internal/__init__.py +5 -5
  39. sonolus/script/internal/builtin_impls.py +144 -144
  40. sonolus/script/internal/context.py +12 -4
  41. sonolus/script/internal/descriptor.py +17 -17
  42. sonolus/script/internal/introspection.py +14 -14
  43. sonolus/script/internal/native.py +40 -38
  44. sonolus/script/internal/value.py +3 -3
  45. sonolus/script/interval.py +120 -112
  46. sonolus/script/iterator.py +214 -214
  47. sonolus/script/math.py +30 -1
  48. sonolus/script/num.py +1 -1
  49. sonolus/script/options.py +191 -191
  50. sonolus/script/particle.py +157 -157
  51. sonolus/script/pointer.py +30 -30
  52. sonolus/script/print.py +81 -81
  53. sonolus/script/random.py +14 -0
  54. sonolus/script/range.py +58 -58
  55. sonolus/script/record.py +3 -3
  56. sonolus/script/runtime.py +2 -0
  57. sonolus/script/sprite.py +333 -333
  58. sonolus/script/text.py +407 -407
  59. sonolus/script/timing.py +42 -42
  60. sonolus/script/transform.py +77 -23
  61. sonolus/script/ui.py +160 -160
  62. sonolus/script/vec.py +81 -78
  63. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.4.dist-info}/METADATA +1 -1
  64. sonolus_py-0.1.4.dist-info/RECORD +84 -0
  65. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.4.dist-info}/WHEEL +1 -1
  66. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.4.dist-info}/licenses/LICENSE +21 -21
  67. sonolus_py-0.1.3.dist-info/RECORD +0 -75
  68. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.4.dist-info}/entry_points.txt +0 -0
sonolus/script/sprite.py CHANGED
@@ -1,333 +1,333 @@
1
- from dataclasses import dataclass
2
- from typing import Annotated, Any, NewType, dataclass_transform, get_origin
3
-
4
- from sonolus.backend.ops import Op
5
- from sonolus.script.graphics import QuadLike, flatten_quad
6
- from sonolus.script.internal.introspection import get_field_specifiers
7
- from sonolus.script.internal.native import native_function
8
- from sonolus.script.record import Record
9
- from sonolus.script.vec import Vec2
10
-
11
-
12
- class Sprite(Record):
13
- id: int
14
-
15
- @property
16
- def is_available(self) -> bool:
17
- return _has_skin_sprite(self.id)
18
-
19
- def draw(self, quad: QuadLike, z: float = 0.0, a: float = 1.0):
20
- _draw(self.id, *flatten_quad(quad), z, a)
21
-
22
- def draw_curved_b(self, quad: QuadLike, cp: Vec2, n: float, z: float = 0.0, a: float = 1.0):
23
- _draw_curved_b(self.id, *flatten_quad(quad), z, a, n, *cp.tuple)
24
-
25
- def draw_curved_t(self, quad: QuadLike, cp: Vec2, n: float, z: float = 0.0, a: float = 1.0):
26
- _draw_curved_t(self.id, *flatten_quad(quad), z, a, n, *cp.tuple)
27
-
28
- def draw_curved_l(self, quad: QuadLike, cp: Vec2, n: float, z: float = 0.0, a: float = 1.0):
29
- _draw_curved_l(self.id, *flatten_quad(quad), z, a, n, *cp.tuple)
30
-
31
- def draw_curved_r(self, quad: QuadLike, cp: Vec2, n: float, z: float = 0.0, a: float = 1.0):
32
- _draw_curved_r(self.id, *flatten_quad(quad), z, a, n, *cp.tuple)
33
-
34
- def draw_curved_bt(self, quad: QuadLike, cp1: Vec2, cp2: Vec2, n: float, z: float = 0.0, a: float = 1.0):
35
- _draw_curved_bt(self.id, *flatten_quad(quad), z, a, n, *cp1.tuple, *cp2.tuple)
36
-
37
- def draw_curved_lr(self, quad: QuadLike, cp1: Vec2, cp2: Vec2, n: float, z: float = 0.0, a: float = 1.0):
38
- _draw_curved_lr(self.id, *flatten_quad(quad), z, a, n, *cp1.tuple, *cp2.tuple)
39
-
40
-
41
- @native_function(Op.HasSkinSprite)
42
- def _has_skin_sprite(sprite_id: int) -> bool:
43
- raise NotImplementedError
44
-
45
-
46
- @native_function(Op.Draw)
47
- def _draw(
48
- sprite_id: int,
49
- x1: float,
50
- y1: float,
51
- x2: float,
52
- y2: float,
53
- x3: float,
54
- y3: float,
55
- x4: float,
56
- y4: float,
57
- z: float,
58
- a: float,
59
- ):
60
- raise NotImplementedError
61
-
62
-
63
- @native_function(Op.DrawCurvedB)
64
- def _draw_curved_b(
65
- sprite_id: int,
66
- x1: float,
67
- y1: float,
68
- x2: float,
69
- y2: float,
70
- x3: float,
71
- y3: float,
72
- x4: float,
73
- y4: float,
74
- z: float,
75
- a: float,
76
- n: int,
77
- p: float,
78
- q: float,
79
- ):
80
- raise NotImplementedError
81
-
82
-
83
- @native_function(Op.DrawCurvedT)
84
- def _draw_curved_t(
85
- sprite_id: int,
86
- x1: float,
87
- y1: float,
88
- x2: float,
89
- y2: float,
90
- x3: float,
91
- y3: float,
92
- x4: float,
93
- y4: float,
94
- z: float,
95
- a: float,
96
- n: int,
97
- p: float,
98
- q: float,
99
- ):
100
- raise NotImplementedError
101
-
102
-
103
- @native_function(Op.DrawCurvedL)
104
- def _draw_curved_l(
105
- sprite_id: int,
106
- x1: float,
107
- y1: float,
108
- x2: float,
109
- y2: float,
110
- x3: float,
111
- y3: float,
112
- x4: float,
113
- y4: float,
114
- z: float,
115
- a: float,
116
- n: int,
117
- p: float,
118
- q: float,
119
- ):
120
- raise NotImplementedError
121
-
122
-
123
- @native_function(Op.DrawCurvedR)
124
- def _draw_curved_r(
125
- sprite_id: int,
126
- x1: float,
127
- y1: float,
128
- x2: float,
129
- y2: float,
130
- x3: float,
131
- y3: float,
132
- x4: float,
133
- y4: float,
134
- z: float,
135
- a: float,
136
- n: int,
137
- p: float,
138
- q: float,
139
- ):
140
- raise NotImplementedError
141
-
142
-
143
- @native_function(Op.DrawCurvedBT)
144
- def _draw_curved_bt(
145
- sprite_id: int,
146
- x1: float,
147
- y1: float,
148
- x2: float,
149
- y2: float,
150
- x3: float,
151
- y3: float,
152
- x4: float,
153
- y4: float,
154
- z: float,
155
- a: float,
156
- n: int,
157
- p1: float,
158
- q1: float,
159
- p2: float,
160
- q2: float,
161
- ):
162
- raise NotImplementedError
163
-
164
-
165
- @native_function(Op.DrawCurvedLR)
166
- def _draw_curved_lr(
167
- sprite_id: int,
168
- x1: float,
169
- y1: float,
170
- x2: float,
171
- y2: float,
172
- x3: float,
173
- y3: float,
174
- x4: float,
175
- y4: float,
176
- z: float,
177
- a: float,
178
- n: int,
179
- p1: float,
180
- q1: float,
181
- p2: float,
182
- q2: float,
183
- ):
184
- raise NotImplementedError
185
-
186
-
187
- @dataclass
188
- class SkinSprite:
189
- name: str
190
-
191
-
192
- def skin_sprite(name: str) -> Any:
193
- return SkinSprite(name)
194
-
195
-
196
- type Skin = NewType("Skin", Any)
197
-
198
-
199
- @dataclass_transform()
200
- def skin[T](cls: type[T]) -> T | Skin:
201
- if len(cls.__bases__) != 1:
202
- raise ValueError("Skin class must not inherit from any class (except object)")
203
- instance = cls()
204
- names = []
205
- for i, (name, annotation) in enumerate(get_field_specifiers(cls).items()):
206
- if get_origin(annotation) is not Annotated:
207
- raise TypeError(f"Invalid annotation for skin: {annotation}")
208
- annotation_type = annotation.__args__[0]
209
- annotation_values = annotation.__metadata__
210
- if annotation_type is not Sprite:
211
- raise TypeError(f"Invalid annotation for skin: {annotation}, expected annotation of type Sprite")
212
- if len(annotation_values) != 1 or not isinstance(annotation_values[0], SkinSprite):
213
- raise TypeError(f"Invalid annotation for skin: {annotation}, expected a single string annotation value")
214
- sprite_name = annotation_values[0].name
215
- names.append(sprite_name)
216
- setattr(instance, name, Sprite(i))
217
- instance._sprites_ = names
218
- instance._is_comptime_value_ = True
219
- return instance
220
-
221
-
222
- class StandardSprite:
223
- NOTE_HEAD_NEUTRAL = Annotated[Sprite, skin_sprite("#NOTE_HEAD_NEUTRAL")]
224
- NOTE_HEAD_RED = Annotated[Sprite, skin_sprite("#NOTE_HEAD_RED")]
225
- NOTE_HEAD_GREEN = Annotated[Sprite, skin_sprite("#NOTE_HEAD_GREEN")]
226
- NOTE_HEAD_BLUE = Annotated[Sprite, skin_sprite("#NOTE_HEAD_BLUE")]
227
- NOTE_HEAD_YELLOW = Annotated[Sprite, skin_sprite("#NOTE_HEAD_YELLOW")]
228
- NOTE_HEAD_PURPLE = Annotated[Sprite, skin_sprite("#NOTE_HEAD_PURPLE")]
229
- NOTE_HEAD_CYAN = Annotated[Sprite, skin_sprite("#NOTE_HEAD_CYAN")]
230
-
231
- NOTE_TICK_NEUTRAL = Annotated[Sprite, skin_sprite("#NOTE_TICK_NEUTRAL")]
232
- NOTE_TICK_RED = Annotated[Sprite, skin_sprite("#NOTE_TICK_RED")]
233
- NOTE_TICK_GREEN = Annotated[Sprite, skin_sprite("#NOTE_TICK_GREEN")]
234
- NOTE_TICK_BLUE = Annotated[Sprite, skin_sprite("#NOTE_TICK_BLUE")]
235
- NOTE_TICK_YELLOW = Annotated[Sprite, skin_sprite("#NOTE_TICK_YELLOW")]
236
- NOTE_TICK_PURPLE = Annotated[Sprite, skin_sprite("#NOTE_TICK_PURPLE")]
237
- NOTE_TICK_CYAN = Annotated[Sprite, skin_sprite("#NOTE_TICK_CYAN")]
238
-
239
- NOTE_TAIL_NEUTRAL = Annotated[Sprite, skin_sprite("#NOTE_TAIL_NEUTRAL")]
240
- NOTE_TAIL_RED = Annotated[Sprite, skin_sprite("#NOTE_TAIL_RED")]
241
- NOTE_TAIL_GREEN = Annotated[Sprite, skin_sprite("#NOTE_TAIL_GREEN")]
242
- NOTE_TAIL_BLUE = Annotated[Sprite, skin_sprite("#NOTE_TAIL_BLUE")]
243
- NOTE_TAIL_YELLOW = Annotated[Sprite, skin_sprite("#NOTE_TAIL_YELLOW")]
244
- NOTE_TAIL_PURPLE = Annotated[Sprite, skin_sprite("#NOTE_TAIL_PURPLE")]
245
- NOTE_TAIL_CYAN = Annotated[Sprite, skin_sprite("#NOTE_TAIL_CYAN")]
246
-
247
- NOTE_CONNECTION_NEUTRAL = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_NEUTRAL")]
248
- NOTE_CONNECTION_RED = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_RED")]
249
- NOTE_CONNECTION_GREEN = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_GREEN")]
250
- NOTE_CONNECTION_BLUE = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_BLUE")]
251
- NOTE_CONNECTION_YELLOW = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_YELLOW")]
252
- NOTE_CONNECTION_PURPLE = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_PURPLE")]
253
- NOTE_CONNECTION_CYAN = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_CYAN")]
254
-
255
- NOTE_CONNECTION_NEUTRAL_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_NEUTRAL_SEAMLESS")]
256
- NOTE_CONNECTION_RED_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_RED_SEAMLESS")]
257
- NOTE_CONNECTION_GREEN_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_GREEN_SEAMLESS")]
258
- NOTE_CONNECTION_BLUE_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_BLUE_SEAMLESS")]
259
- NOTE_CONNECTION_YELLOW_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_YELLOW_SEAMLESS")]
260
- NOTE_CONNECTION_PURPLE_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_PURPLE_SEAMLESS")]
261
- NOTE_CONNECTION_CYAN_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_CYAN_SEAMLESS")]
262
-
263
- SIMULTANEOUS_CONNECTION_NEUTRAL = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_NEUTRAL")]
264
- SIMULTANEOUS_CONNECTION_RED = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_RED")]
265
- SIMULTANEOUS_CONNECTION_GREEN = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_GREEN")]
266
- SIMULTANEOUS_CONNECTION_BLUE = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_BLUE")]
267
- SIMULTANEOUS_CONNECTION_YELLOW = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_YELLOW")]
268
- SIMULTANEOUS_CONNECTION_PURPLE = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_PURPLE")]
269
- SIMULTANEOUS_CONNECTION_CYAN = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_CYAN")]
270
-
271
- SIMULTANEOUS_CONNECTION_NEUTRAL_SEAMLESS = Annotated[
272
- Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_NEUTRAL_SEAMLESS")
273
- ]
274
- SIMULTANEOUS_CONNECTION_RED_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_RED_SEAMLESS")]
275
- SIMULTANEOUS_CONNECTION_GREEN_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_GREEN_SEAMLESS")]
276
- SIMULTANEOUS_CONNECTION_BLUE_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_BLUE_SEAMLESS")]
277
- SIMULTANEOUS_CONNECTION_YELLOW_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_YELLOW_SEAMLESS")]
278
- SIMULTANEOUS_CONNECTION_PURPLE_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_PURPLE_SEAMLESS")]
279
- SIMULTANEOUS_CONNECTION_CYAN_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_CYAN_SEAMLESS")]
280
-
281
- DIRECTIONAL_MARKER_NEUTRAL = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_NEUTRAL")]
282
- DIRECTIONAL_MARKER_RED = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_RED")]
283
- DIRECTIONAL_MARKER_GREEN = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_GREEN")]
284
- DIRECTIONAL_MARKER_BLUE = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_BLUE")]
285
- DIRECTIONAL_MARKER_YELLOW = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_YELLOW")]
286
- DIRECTIONAL_MARKER_PURPLE = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_PURPLE")]
287
- DIRECTIONAL_MARKER_CYAN = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_CYAN")]
288
-
289
- SIMULTANEOUS_MARKER_NEUTRAL = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_NEUTRAL")]
290
- SIMULTANEOUS_MARKER_RED = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_RED")]
291
- SIMULTANEOUS_MARKER_GREEN = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_GREEN")]
292
- SIMULTANEOUS_MARKER_BLUE = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_BLUE")]
293
- SIMULTANEOUS_MARKER_YELLOW = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_YELLOW")]
294
- SIMULTANEOUS_MARKER_PURPLE = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_PURPLE")]
295
- SIMULTANEOUS_MARKER_CYAN = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_CYAN")]
296
-
297
- STAGE_MIDDLE = Annotated[Sprite, skin_sprite("#STAGE_MIDDLE")]
298
- STAGE_LEFT_BORDER = Annotated[Sprite, skin_sprite("#STAGE_LEFT_BORDER")]
299
- STAGE_RIGHT_BORDER = Annotated[Sprite, skin_sprite("#STAGE_RIGHT_BORDER")]
300
- STAGE_TOP_BORDER = Annotated[Sprite, skin_sprite("#STAGE_TOP_BORDER")]
301
- STAGE_BOTTOM_BORDER = Annotated[Sprite, skin_sprite("#STAGE_BOTTOM_BORDER")]
302
-
303
- STAGE_LEFT_BORDER_SEAMLESS = Annotated[Sprite, skin_sprite("#STAGE_LEFT_BORDER_SEAMLESS")]
304
- STAGE_RIGHT_BORDER_SEAMLESS = Annotated[Sprite, skin_sprite("#STAGE_RIGHT_BORDER_SEAMLESS")]
305
- STAGE_TOP_BORDER_SEAMLESS = Annotated[Sprite, skin_sprite("#STAGE_TOP_BORDER_SEAMLESS")]
306
- STAGE_BOTTOM_BORDER_SEAMLESS = Annotated[Sprite, skin_sprite("#STAGE_BOTTOM_BORDER_SEAMLESS")]
307
-
308
- STAGE_TOP_LEFT_CORNER = Annotated[Sprite, skin_sprite("#STAGE_TOP_LEFT_CORNER")]
309
- STAGE_TOP_RIGHT_CORNER = Annotated[Sprite, skin_sprite("#STAGE_TOP_RIGHT_CORNER")]
310
- STAGE_BOTTOM_LEFT_CORNER = Annotated[Sprite, skin_sprite("#STAGE_BOTTOM_LEFT_CORNER")]
311
- STAGE_BOTTOM_RIGHT_CORNER = Annotated[Sprite, skin_sprite("#STAGE_BOTTOM_RIGHT_CORNER")]
312
-
313
- LANE = Annotated[Sprite, skin_sprite("#LANE")]
314
- LANE_SEAMLESS = Annotated[Sprite, skin_sprite("#LANE_SEAMLESS")]
315
- LANE_ALTERNATIVE = Annotated[Sprite, skin_sprite("#LANE_ALTERNATIVE")]
316
- LANE_ALTERNATIVE_SEAMLESS = Annotated[Sprite, skin_sprite("#LANE_ALTERNATIVE_SEAMLESS")]
317
-
318
- JUDGMENT_LINE = Annotated[Sprite, skin_sprite("#JUDGMENT_LINE")]
319
- NOTE_SLOT = Annotated[Sprite, skin_sprite("#NOTE_SLOT")]
320
- STAGE_COVER = Annotated[Sprite, skin_sprite("#STAGE_COVER")]
321
-
322
- GRID_NEUTRAL = Annotated[Sprite, skin_sprite("#GRID_NEUTRAL")]
323
- GRID_RED = Annotated[Sprite, skin_sprite("#GRID_RED")]
324
- GRID_GREEN = Annotated[Sprite, skin_sprite("#GRID_GREEN")]
325
- GRID_BLUE = Annotated[Sprite, skin_sprite("#GRID_BLUE")]
326
- GRID_YELLOW = Annotated[Sprite, skin_sprite("#GRID_YELLOW")]
327
- GRID_PURPLE = Annotated[Sprite, skin_sprite("#GRID_PURPLE")]
328
- GRID_CYAN = Annotated[Sprite, skin_sprite("#GRID_CYAN")]
329
-
330
-
331
- @skin
332
- class EmptySkin:
333
- pass
1
+ from dataclasses import dataclass
2
+ from typing import Annotated, Any, NewType, dataclass_transform, get_origin
3
+
4
+ from sonolus.backend.ops import Op
5
+ from sonolus.script.graphics import QuadLike, flatten_quad
6
+ from sonolus.script.internal.introspection import get_field_specifiers
7
+ from sonolus.script.internal.native import native_function
8
+ from sonolus.script.record import Record
9
+ from sonolus.script.vec import Vec2
10
+
11
+
12
+ class Sprite(Record):
13
+ id: int
14
+
15
+ @property
16
+ def is_available(self) -> bool:
17
+ return _has_skin_sprite(self.id)
18
+
19
+ def draw(self, quad: QuadLike, z: float = 0.0, a: float = 1.0):
20
+ _draw(self.id, *flatten_quad(quad), z, a)
21
+
22
+ def draw_curved_b(self, quad: QuadLike, cp: Vec2, n: float, z: float = 0.0, a: float = 1.0):
23
+ _draw_curved_b(self.id, *flatten_quad(quad), z, a, n, *cp.tuple)
24
+
25
+ def draw_curved_t(self, quad: QuadLike, cp: Vec2, n: float, z: float = 0.0, a: float = 1.0):
26
+ _draw_curved_t(self.id, *flatten_quad(quad), z, a, n, *cp.tuple)
27
+
28
+ def draw_curved_l(self, quad: QuadLike, cp: Vec2, n: float, z: float = 0.0, a: float = 1.0):
29
+ _draw_curved_l(self.id, *flatten_quad(quad), z, a, n, *cp.tuple)
30
+
31
+ def draw_curved_r(self, quad: QuadLike, cp: Vec2, n: float, z: float = 0.0, a: float = 1.0):
32
+ _draw_curved_r(self.id, *flatten_quad(quad), z, a, n, *cp.tuple)
33
+
34
+ def draw_curved_bt(self, quad: QuadLike, cp1: Vec2, cp2: Vec2, n: float, z: float = 0.0, a: float = 1.0):
35
+ _draw_curved_bt(self.id, *flatten_quad(quad), z, a, n, *cp1.tuple, *cp2.tuple)
36
+
37
+ def draw_curved_lr(self, quad: QuadLike, cp1: Vec2, cp2: Vec2, n: float, z: float = 0.0, a: float = 1.0):
38
+ _draw_curved_lr(self.id, *flatten_quad(quad), z, a, n, *cp1.tuple, *cp2.tuple)
39
+
40
+
41
+ @native_function(Op.HasSkinSprite)
42
+ def _has_skin_sprite(sprite_id: int) -> bool:
43
+ raise NotImplementedError
44
+
45
+
46
+ @native_function(Op.Draw)
47
+ def _draw(
48
+ sprite_id: int,
49
+ x1: float,
50
+ y1: float,
51
+ x2: float,
52
+ y2: float,
53
+ x3: float,
54
+ y3: float,
55
+ x4: float,
56
+ y4: float,
57
+ z: float,
58
+ a: float,
59
+ ):
60
+ raise NotImplementedError
61
+
62
+
63
+ @native_function(Op.DrawCurvedB)
64
+ def _draw_curved_b(
65
+ sprite_id: int,
66
+ x1: float,
67
+ y1: float,
68
+ x2: float,
69
+ y2: float,
70
+ x3: float,
71
+ y3: float,
72
+ x4: float,
73
+ y4: float,
74
+ z: float,
75
+ a: float,
76
+ n: int,
77
+ p: float,
78
+ q: float,
79
+ ):
80
+ raise NotImplementedError
81
+
82
+
83
+ @native_function(Op.DrawCurvedT)
84
+ def _draw_curved_t(
85
+ sprite_id: int,
86
+ x1: float,
87
+ y1: float,
88
+ x2: float,
89
+ y2: float,
90
+ x3: float,
91
+ y3: float,
92
+ x4: float,
93
+ y4: float,
94
+ z: float,
95
+ a: float,
96
+ n: int,
97
+ p: float,
98
+ q: float,
99
+ ):
100
+ raise NotImplementedError
101
+
102
+
103
+ @native_function(Op.DrawCurvedL)
104
+ def _draw_curved_l(
105
+ sprite_id: int,
106
+ x1: float,
107
+ y1: float,
108
+ x2: float,
109
+ y2: float,
110
+ x3: float,
111
+ y3: float,
112
+ x4: float,
113
+ y4: float,
114
+ z: float,
115
+ a: float,
116
+ n: int,
117
+ p: float,
118
+ q: float,
119
+ ):
120
+ raise NotImplementedError
121
+
122
+
123
+ @native_function(Op.DrawCurvedR)
124
+ def _draw_curved_r(
125
+ sprite_id: int,
126
+ x1: float,
127
+ y1: float,
128
+ x2: float,
129
+ y2: float,
130
+ x3: float,
131
+ y3: float,
132
+ x4: float,
133
+ y4: float,
134
+ z: float,
135
+ a: float,
136
+ n: int,
137
+ p: float,
138
+ q: float,
139
+ ):
140
+ raise NotImplementedError
141
+
142
+
143
+ @native_function(Op.DrawCurvedBT)
144
+ def _draw_curved_bt(
145
+ sprite_id: int,
146
+ x1: float,
147
+ y1: float,
148
+ x2: float,
149
+ y2: float,
150
+ x3: float,
151
+ y3: float,
152
+ x4: float,
153
+ y4: float,
154
+ z: float,
155
+ a: float,
156
+ n: int,
157
+ p1: float,
158
+ q1: float,
159
+ p2: float,
160
+ q2: float,
161
+ ):
162
+ raise NotImplementedError
163
+
164
+
165
+ @native_function(Op.DrawCurvedLR)
166
+ def _draw_curved_lr(
167
+ sprite_id: int,
168
+ x1: float,
169
+ y1: float,
170
+ x2: float,
171
+ y2: float,
172
+ x3: float,
173
+ y3: float,
174
+ x4: float,
175
+ y4: float,
176
+ z: float,
177
+ a: float,
178
+ n: int,
179
+ p1: float,
180
+ q1: float,
181
+ p2: float,
182
+ q2: float,
183
+ ):
184
+ raise NotImplementedError
185
+
186
+
187
+ @dataclass
188
+ class SkinSprite:
189
+ name: str
190
+
191
+
192
+ def skin_sprite(name: str) -> Any:
193
+ return SkinSprite(name)
194
+
195
+
196
+ type Skin = NewType("Skin", Any)
197
+
198
+
199
+ @dataclass_transform()
200
+ def skin[T](cls: type[T]) -> T | Skin:
201
+ if len(cls.__bases__) != 1:
202
+ raise ValueError("Skin class must not inherit from any class (except object)")
203
+ instance = cls()
204
+ names = []
205
+ for i, (name, annotation) in enumerate(get_field_specifiers(cls).items()):
206
+ if get_origin(annotation) is not Annotated:
207
+ raise TypeError(f"Invalid annotation for skin: {annotation}")
208
+ annotation_type = annotation.__args__[0]
209
+ annotation_values = annotation.__metadata__
210
+ if annotation_type is not Sprite:
211
+ raise TypeError(f"Invalid annotation for skin: {annotation}, expected annotation of type Sprite")
212
+ if len(annotation_values) != 1 or not isinstance(annotation_values[0], SkinSprite):
213
+ raise TypeError(f"Invalid annotation for skin: {annotation}, expected a single string annotation value")
214
+ sprite_name = annotation_values[0].name
215
+ names.append(sprite_name)
216
+ setattr(instance, name, Sprite(i))
217
+ instance._sprites_ = names
218
+ instance._is_comptime_value_ = True
219
+ return instance
220
+
221
+
222
+ class StandardSprite:
223
+ NOTE_HEAD_NEUTRAL = Annotated[Sprite, skin_sprite("#NOTE_HEAD_NEUTRAL")]
224
+ NOTE_HEAD_RED = Annotated[Sprite, skin_sprite("#NOTE_HEAD_RED")]
225
+ NOTE_HEAD_GREEN = Annotated[Sprite, skin_sprite("#NOTE_HEAD_GREEN")]
226
+ NOTE_HEAD_BLUE = Annotated[Sprite, skin_sprite("#NOTE_HEAD_BLUE")]
227
+ NOTE_HEAD_YELLOW = Annotated[Sprite, skin_sprite("#NOTE_HEAD_YELLOW")]
228
+ NOTE_HEAD_PURPLE = Annotated[Sprite, skin_sprite("#NOTE_HEAD_PURPLE")]
229
+ NOTE_HEAD_CYAN = Annotated[Sprite, skin_sprite("#NOTE_HEAD_CYAN")]
230
+
231
+ NOTE_TICK_NEUTRAL = Annotated[Sprite, skin_sprite("#NOTE_TICK_NEUTRAL")]
232
+ NOTE_TICK_RED = Annotated[Sprite, skin_sprite("#NOTE_TICK_RED")]
233
+ NOTE_TICK_GREEN = Annotated[Sprite, skin_sprite("#NOTE_TICK_GREEN")]
234
+ NOTE_TICK_BLUE = Annotated[Sprite, skin_sprite("#NOTE_TICK_BLUE")]
235
+ NOTE_TICK_YELLOW = Annotated[Sprite, skin_sprite("#NOTE_TICK_YELLOW")]
236
+ NOTE_TICK_PURPLE = Annotated[Sprite, skin_sprite("#NOTE_TICK_PURPLE")]
237
+ NOTE_TICK_CYAN = Annotated[Sprite, skin_sprite("#NOTE_TICK_CYAN")]
238
+
239
+ NOTE_TAIL_NEUTRAL = Annotated[Sprite, skin_sprite("#NOTE_TAIL_NEUTRAL")]
240
+ NOTE_TAIL_RED = Annotated[Sprite, skin_sprite("#NOTE_TAIL_RED")]
241
+ NOTE_TAIL_GREEN = Annotated[Sprite, skin_sprite("#NOTE_TAIL_GREEN")]
242
+ NOTE_TAIL_BLUE = Annotated[Sprite, skin_sprite("#NOTE_TAIL_BLUE")]
243
+ NOTE_TAIL_YELLOW = Annotated[Sprite, skin_sprite("#NOTE_TAIL_YELLOW")]
244
+ NOTE_TAIL_PURPLE = Annotated[Sprite, skin_sprite("#NOTE_TAIL_PURPLE")]
245
+ NOTE_TAIL_CYAN = Annotated[Sprite, skin_sprite("#NOTE_TAIL_CYAN")]
246
+
247
+ NOTE_CONNECTION_NEUTRAL = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_NEUTRAL")]
248
+ NOTE_CONNECTION_RED = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_RED")]
249
+ NOTE_CONNECTION_GREEN = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_GREEN")]
250
+ NOTE_CONNECTION_BLUE = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_BLUE")]
251
+ NOTE_CONNECTION_YELLOW = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_YELLOW")]
252
+ NOTE_CONNECTION_PURPLE = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_PURPLE")]
253
+ NOTE_CONNECTION_CYAN = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_CYAN")]
254
+
255
+ NOTE_CONNECTION_NEUTRAL_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_NEUTRAL_SEAMLESS")]
256
+ NOTE_CONNECTION_RED_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_RED_SEAMLESS")]
257
+ NOTE_CONNECTION_GREEN_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_GREEN_SEAMLESS")]
258
+ NOTE_CONNECTION_BLUE_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_BLUE_SEAMLESS")]
259
+ NOTE_CONNECTION_YELLOW_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_YELLOW_SEAMLESS")]
260
+ NOTE_CONNECTION_PURPLE_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_PURPLE_SEAMLESS")]
261
+ NOTE_CONNECTION_CYAN_SEAMLESS = Annotated[Sprite, skin_sprite("#NOTE_CONNECTION_CYAN_SEAMLESS")]
262
+
263
+ SIMULTANEOUS_CONNECTION_NEUTRAL = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_NEUTRAL")]
264
+ SIMULTANEOUS_CONNECTION_RED = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_RED")]
265
+ SIMULTANEOUS_CONNECTION_GREEN = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_GREEN")]
266
+ SIMULTANEOUS_CONNECTION_BLUE = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_BLUE")]
267
+ SIMULTANEOUS_CONNECTION_YELLOW = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_YELLOW")]
268
+ SIMULTANEOUS_CONNECTION_PURPLE = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_PURPLE")]
269
+ SIMULTANEOUS_CONNECTION_CYAN = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_CYAN")]
270
+
271
+ SIMULTANEOUS_CONNECTION_NEUTRAL_SEAMLESS = Annotated[
272
+ Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_NEUTRAL_SEAMLESS")
273
+ ]
274
+ SIMULTANEOUS_CONNECTION_RED_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_RED_SEAMLESS")]
275
+ SIMULTANEOUS_CONNECTION_GREEN_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_GREEN_SEAMLESS")]
276
+ SIMULTANEOUS_CONNECTION_BLUE_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_BLUE_SEAMLESS")]
277
+ SIMULTANEOUS_CONNECTION_YELLOW_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_YELLOW_SEAMLESS")]
278
+ SIMULTANEOUS_CONNECTION_PURPLE_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_PURPLE_SEAMLESS")]
279
+ SIMULTANEOUS_CONNECTION_CYAN_SEAMLESS = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_CONNECTION_CYAN_SEAMLESS")]
280
+
281
+ DIRECTIONAL_MARKER_NEUTRAL = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_NEUTRAL")]
282
+ DIRECTIONAL_MARKER_RED = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_RED")]
283
+ DIRECTIONAL_MARKER_GREEN = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_GREEN")]
284
+ DIRECTIONAL_MARKER_BLUE = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_BLUE")]
285
+ DIRECTIONAL_MARKER_YELLOW = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_YELLOW")]
286
+ DIRECTIONAL_MARKER_PURPLE = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_PURPLE")]
287
+ DIRECTIONAL_MARKER_CYAN = Annotated[Sprite, skin_sprite("#DIRECTIONAL_MARKER_CYAN")]
288
+
289
+ SIMULTANEOUS_MARKER_NEUTRAL = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_NEUTRAL")]
290
+ SIMULTANEOUS_MARKER_RED = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_RED")]
291
+ SIMULTANEOUS_MARKER_GREEN = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_GREEN")]
292
+ SIMULTANEOUS_MARKER_BLUE = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_BLUE")]
293
+ SIMULTANEOUS_MARKER_YELLOW = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_YELLOW")]
294
+ SIMULTANEOUS_MARKER_PURPLE = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_PURPLE")]
295
+ SIMULTANEOUS_MARKER_CYAN = Annotated[Sprite, skin_sprite("#SIMULTANEOUS_MARKER_CYAN")]
296
+
297
+ STAGE_MIDDLE = Annotated[Sprite, skin_sprite("#STAGE_MIDDLE")]
298
+ STAGE_LEFT_BORDER = Annotated[Sprite, skin_sprite("#STAGE_LEFT_BORDER")]
299
+ STAGE_RIGHT_BORDER = Annotated[Sprite, skin_sprite("#STAGE_RIGHT_BORDER")]
300
+ STAGE_TOP_BORDER = Annotated[Sprite, skin_sprite("#STAGE_TOP_BORDER")]
301
+ STAGE_BOTTOM_BORDER = Annotated[Sprite, skin_sprite("#STAGE_BOTTOM_BORDER")]
302
+
303
+ STAGE_LEFT_BORDER_SEAMLESS = Annotated[Sprite, skin_sprite("#STAGE_LEFT_BORDER_SEAMLESS")]
304
+ STAGE_RIGHT_BORDER_SEAMLESS = Annotated[Sprite, skin_sprite("#STAGE_RIGHT_BORDER_SEAMLESS")]
305
+ STAGE_TOP_BORDER_SEAMLESS = Annotated[Sprite, skin_sprite("#STAGE_TOP_BORDER_SEAMLESS")]
306
+ STAGE_BOTTOM_BORDER_SEAMLESS = Annotated[Sprite, skin_sprite("#STAGE_BOTTOM_BORDER_SEAMLESS")]
307
+
308
+ STAGE_TOP_LEFT_CORNER = Annotated[Sprite, skin_sprite("#STAGE_TOP_LEFT_CORNER")]
309
+ STAGE_TOP_RIGHT_CORNER = Annotated[Sprite, skin_sprite("#STAGE_TOP_RIGHT_CORNER")]
310
+ STAGE_BOTTOM_LEFT_CORNER = Annotated[Sprite, skin_sprite("#STAGE_BOTTOM_LEFT_CORNER")]
311
+ STAGE_BOTTOM_RIGHT_CORNER = Annotated[Sprite, skin_sprite("#STAGE_BOTTOM_RIGHT_CORNER")]
312
+
313
+ LANE = Annotated[Sprite, skin_sprite("#LANE")]
314
+ LANE_SEAMLESS = Annotated[Sprite, skin_sprite("#LANE_SEAMLESS")]
315
+ LANE_ALTERNATIVE = Annotated[Sprite, skin_sprite("#LANE_ALTERNATIVE")]
316
+ LANE_ALTERNATIVE_SEAMLESS = Annotated[Sprite, skin_sprite("#LANE_ALTERNATIVE_SEAMLESS")]
317
+
318
+ JUDGMENT_LINE = Annotated[Sprite, skin_sprite("#JUDGMENT_LINE")]
319
+ NOTE_SLOT = Annotated[Sprite, skin_sprite("#NOTE_SLOT")]
320
+ STAGE_COVER = Annotated[Sprite, skin_sprite("#STAGE_COVER")]
321
+
322
+ GRID_NEUTRAL = Annotated[Sprite, skin_sprite("#GRID_NEUTRAL")]
323
+ GRID_RED = Annotated[Sprite, skin_sprite("#GRID_RED")]
324
+ GRID_GREEN = Annotated[Sprite, skin_sprite("#GRID_GREEN")]
325
+ GRID_BLUE = Annotated[Sprite, skin_sprite("#GRID_BLUE")]
326
+ GRID_YELLOW = Annotated[Sprite, skin_sprite("#GRID_YELLOW")]
327
+ GRID_PURPLE = Annotated[Sprite, skin_sprite("#GRID_PURPLE")]
328
+ GRID_CYAN = Annotated[Sprite, skin_sprite("#GRID_CYAN")]
329
+
330
+
331
+ @skin
332
+ class EmptySkin:
333
+ pass