sonolus.py 0.1.0__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 (75) hide show
  1. sonolus/__init__.py +0 -0
  2. sonolus/backend/__init__.py +0 -0
  3. sonolus/backend/allocate.py +51 -0
  4. sonolus/backend/blocks.py +756 -0
  5. sonolus/backend/excepthook.py +37 -0
  6. sonolus/backend/finalize.py +69 -0
  7. sonolus/backend/flow.py +92 -0
  8. sonolus/backend/interpret.py +333 -0
  9. sonolus/backend/ir.py +89 -0
  10. sonolus/backend/mode.py +24 -0
  11. sonolus/backend/node.py +40 -0
  12. sonolus/backend/ops.py +197 -0
  13. sonolus/backend/optimize.py +9 -0
  14. sonolus/backend/passes.py +6 -0
  15. sonolus/backend/place.py +90 -0
  16. sonolus/backend/simplify.py +30 -0
  17. sonolus/backend/utils.py +48 -0
  18. sonolus/backend/visitor.py +880 -0
  19. sonolus/build/__init__.py +0 -0
  20. sonolus/build/cli.py +170 -0
  21. sonolus/build/collection.py +293 -0
  22. sonolus/build/compile.py +90 -0
  23. sonolus/build/defaults.py +32 -0
  24. sonolus/build/engine.py +149 -0
  25. sonolus/build/level.py +23 -0
  26. sonolus/build/node.py +43 -0
  27. sonolus/build/project.py +94 -0
  28. sonolus/py.typed +0 -0
  29. sonolus/script/__init__.py +0 -0
  30. sonolus/script/archetype.py +651 -0
  31. sonolus/script/array.py +241 -0
  32. sonolus/script/bucket.py +192 -0
  33. sonolus/script/callbacks.py +105 -0
  34. sonolus/script/comptime.py +146 -0
  35. sonolus/script/containers.py +247 -0
  36. sonolus/script/debug.py +70 -0
  37. sonolus/script/effect.py +132 -0
  38. sonolus/script/engine.py +101 -0
  39. sonolus/script/globals.py +234 -0
  40. sonolus/script/graphics.py +141 -0
  41. sonolus/script/icon.py +73 -0
  42. sonolus/script/internal/__init__.py +5 -0
  43. sonolus/script/internal/builtin_impls.py +144 -0
  44. sonolus/script/internal/context.py +365 -0
  45. sonolus/script/internal/descriptor.py +17 -0
  46. sonolus/script/internal/error.py +15 -0
  47. sonolus/script/internal/generic.py +197 -0
  48. sonolus/script/internal/impl.py +69 -0
  49. sonolus/script/internal/introspection.py +14 -0
  50. sonolus/script/internal/native.py +38 -0
  51. sonolus/script/internal/value.py +144 -0
  52. sonolus/script/interval.py +98 -0
  53. sonolus/script/iterator.py +211 -0
  54. sonolus/script/level.py +52 -0
  55. sonolus/script/math.py +92 -0
  56. sonolus/script/num.py +382 -0
  57. sonolus/script/options.py +194 -0
  58. sonolus/script/particle.py +158 -0
  59. sonolus/script/pointer.py +30 -0
  60. sonolus/script/project.py +17 -0
  61. sonolus/script/range.py +58 -0
  62. sonolus/script/record.py +293 -0
  63. sonolus/script/runtime.py +526 -0
  64. sonolus/script/sprite.py +332 -0
  65. sonolus/script/text.py +404 -0
  66. sonolus/script/timing.py +42 -0
  67. sonolus/script/transform.py +118 -0
  68. sonolus/script/ui.py +160 -0
  69. sonolus/script/values.py +43 -0
  70. sonolus/script/vec.py +48 -0
  71. sonolus_py-0.1.0.dist-info/METADATA +10 -0
  72. sonolus_py-0.1.0.dist-info/RECORD +75 -0
  73. sonolus_py-0.1.0.dist-info/WHEEL +4 -0
  74. sonolus_py-0.1.0.dist-info/entry_points.txt +2 -0
  75. sonolus_py-0.1.0.dist-info/licenses/LICENSE +21 -0
sonolus/script/text.py ADDED
@@ -0,0 +1,404 @@
1
+ class StandardText:
2
+ Post = "#POST"
3
+ Playlist = "#PLAYLIST"
4
+ Level = "#LEVEL"
5
+ Skin = "#SKIN"
6
+ Background = "#BACKGROUND"
7
+ Effect = "#EFFECT"
8
+ Particle = "#PARTICLE"
9
+ Engine = "#ENGINE"
10
+ Replay = "#REPLAY"
11
+ Room = "#ROOM"
12
+ Grade = "#GRADE"
13
+ ArcadeScore = "#ARCADE_SCORE"
14
+ AccuracyScore = "#ACCURACY_SCORE"
15
+ Combo = "#COMBO"
16
+ Perfect = "#PERFECT"
17
+ Great = "#GREAT"
18
+ Good = "#GOOD"
19
+ Miss = "#MISS"
20
+ Keywords = "#KEYWORDS"
21
+ Name = "#NAME"
22
+ Rating = "#RATING"
23
+ RatingMinimum = "#RATING_MINIMUM"
24
+ RatingMaximum = "#RATING_MAXIMUM"
25
+ Title = "#TITLE"
26
+ Subtitle = "#SUBTITLE"
27
+ Artists = "#ARTISTS"
28
+ Time = "#TIME"
29
+ Author = "#AUTHOR"
30
+ Genre = "#GENRE"
31
+ Type = "#TYPE"
32
+ Category = "#CATEGORY"
33
+ Language = "#LANGUAGE"
34
+ Difficulty = "#DIFFICULTY"
35
+ Version = "#VERSION"
36
+ Length = "#LENGTH"
37
+ LengthMinimum = "#LENGTH_MINIMUM"
38
+ LengthMaximum = "#LENGTH_MAXIMUM"
39
+ AdditionalInformation = "#ADDITIONAL_INFORMATION"
40
+ Timezone = "#TIMEZONE"
41
+ Region = "#REGION"
42
+ Content = "#CONTENT"
43
+ Comment = "#COMMENT"
44
+ Review = "#REVIEW"
45
+ Reply = "#REPLY"
46
+ Message = "#MESSAGE"
47
+ Role = "#ROLE"
48
+ Permission = "#PERMISSION"
49
+ User = "#USER"
50
+ Speed = "#SPEED"
51
+ Mirror = "#MIRROR"
52
+ Random = "#RANDOM"
53
+ Hidden = "#HIDDEN"
54
+ JudgmentStrict = "#JUDGMENT_STRICT"
55
+ JudgmentLoose = "#JUDGMENT_LOOSE"
56
+ EffectAuto = "#EFFECT_AUTO"
57
+ Stage = "#STAGE"
58
+ StagePosition = "#STAGE_POSITION"
59
+ StageSize = "#STAGE_SIZE"
60
+ StageRotation = "#STAGE_ROTATION"
61
+ StageDirection = "#STAGE_DIRECTION"
62
+ StageAlpha = "#STAGE_ALPHA"
63
+ StageAnimation = "#STAGE_ANIMATION"
64
+ StageTilt = "#STAGE_TILT"
65
+ StageCoverVertical = "#STAGE_COVER_VERTICAL"
66
+ StageCoverHorizontal = "#STAGE_COVER_HORIZONTAL"
67
+ StageCoverAlpha = "#STAGE_COVER_ALPHA"
68
+ StageAspectratioLock = "#STAGE_ASPECTRATIO_LOCK"
69
+ StageEffect = "#STAGE_EFFECT"
70
+ StageEffectPosition = "#STAGE_EFFECT_POSITION"
71
+ StageEffectSize = "#STAGE_EFFECT_SIZE"
72
+ StageEffectRotation = "#STAGE_EFFECT_ROTATION"
73
+ StageEffectDirection = "#STAGE_EFFECT_DIRECTION"
74
+ StageEffectAlpha = "#STAGE_EFFECT_ALPHA"
75
+ Lane = "#LANE"
76
+ LanePosition = "#LANE_POSITION"
77
+ LaneSize = "#LANE_SIZE"
78
+ LaneRotation = "#LANE_ROTATION"
79
+ LaneDirection = "#LANE_DIRECTION"
80
+ LaneAlpha = "#LANE_ALPHA"
81
+ LaneAnimation = "#LANE_ANIMATION"
82
+ LaneEffect = "#LANE_EFFECT"
83
+ LaneEffectPosition = "#LANE_EFFECT_POSITION"
84
+ LaneEffectSize = "#LANE_EFFECT_SIZE"
85
+ LaneEffectRotation = "#LANE_EFFECT_ROTATION"
86
+ LaneEffectDirection = "#LANE_EFFECT_DIRECTION"
87
+ LaneEffectAlpha = "#LANE_EFFECT_ALPHA"
88
+ Judgeline = "#JUDGELINE"
89
+ JudgelinePosition = "#JUDGELINE_POSITION"
90
+ JudgelineSize = "#JUDGELINE_SIZE"
91
+ JudgelineRotation = "#JUDGELINE_ROTATION"
92
+ JudgelineDirection = "#JUDGELINE_DIRECTION"
93
+ JudgelineAlpha = "#JUDGELINE_ALPHA"
94
+ JudgelineAnimation = "#JUDGELINE_ANIMATION"
95
+ JudgelineEffect = "#JUDGELINE_EFFECT"
96
+ JudgelineEffectPosition = "#JUDGELINE_EFFECT_POSITION"
97
+ JudgelineEffectSize = "#JUDGELINE_EFFECT_SIZE"
98
+ JudgelineEffectRotation = "#JUDGELINE_EFFECT_ROTATION"
99
+ JudgelineEffectDirection = "#JUDGELINE_EFFECT_DIRECTION"
100
+ JudgelineEffectAlpha = "#JUDGELINE_EFFECT_ALPHA"
101
+ Slot = "#SLOT"
102
+ SlotPosition = "#SLOT_POSITION"
103
+ SlotSize = "#SLOT_SIZE"
104
+ SlotRotation = "#SLOT_ROTATION"
105
+ SlotDirection = "#SLOT_DIRECTION"
106
+ SlotAlpha = "#SLOT_ALPHA"
107
+ SlotAnimation = "#SLOT_ANIMATION"
108
+ SlotEffect = "#SLOT_EFFECT"
109
+ SlotEffectPosition = "#SLOT_EFFECT_POSITION"
110
+ SlotEffectSize = "#SLOT_EFFECT_SIZE"
111
+ SlotEffectRotation = "#SLOT_EFFECT_ROTATION"
112
+ SlotEffectDirection = "#SLOT_EFFECT_DIRECTION"
113
+ SlotEffectAlpha = "#SLOT_EFFECT_ALPHA"
114
+ Note = "#NOTE"
115
+ NoteSpeed = "#NOTE_SPEED"
116
+ NoteSpeedRandom = "#NOTE_SPEED_RANDOM"
117
+ NotePosition = "#NOTE_POSITION"
118
+ NoteSize = "#NOTE_SIZE"
119
+ NoteRotation = "#NOTE_ROTATION"
120
+ NoteDirection = "#NOTE_DIRECTION"
121
+ NoteColor = "#NOTE_COLOR"
122
+ NoteAlpha = "#NOTE_ALPHA"
123
+ NoteAnimation = "#NOTE_ANIMATION"
124
+ NoteEffect = "#NOTE_EFFECT"
125
+ NoteEffectPosition = "#NOTE_EFFECT_POSITION"
126
+ NoteEffectSize = "#NOTE_EFFECT_SIZE"
127
+ NoteEffectRotation = "#NOTE_EFFECT_ROTATION"
128
+ NoteEffectDirection = "#NOTE_EFFECT_DIRECTION"
129
+ NoteEffectColor = "#NOTE_EFFECT_COLOR"
130
+ NoteEffectAlpha = "#NOTE_EFFECT_ALPHA"
131
+ Marker = "#MARKER"
132
+ MarkerPosition = "#MARKER_POSITION"
133
+ MarkerSize = "#MARKER_SIZE"
134
+ MarkerRotation = "#MARKER_ROTATION"
135
+ MarkerDirection = "#MARKER_DIRECTION"
136
+ MarkerColor = "#MARKER_COLOR"
137
+ MarkerAlpha = "#MARKER_ALPHA"
138
+ MarkerAnimation = "#MARKER_ANIMATION"
139
+ Connector = "#CONNECTOR"
140
+ ConnectorPosition = "#CONNECTOR_POSITION"
141
+ ConnectorSize = "#CONNECTOR_SIZE"
142
+ ConnectorRotation = "#CONNECTOR_ROTATION"
143
+ ConnectorDirection = "#CONNECTOR_DIRECTION"
144
+ ConnectorColor = "#CONNECTOR_COLOR"
145
+ ConnectorAlpha = "#CONNECTOR_ALPHA"
146
+ ConnectorAnimation = "#CONNECTOR_ANIMATION"
147
+ Simline = "#SIMLINE"
148
+ SimlinePosition = "#SIMLINE_POSITION"
149
+ SimlineSize = "#SIMLINE_SIZE"
150
+ SimlineRotation = "#SIMLINE_ROTATION"
151
+ SimlineDirection = "#SIMLINE_DIRECTION"
152
+ SimlineColor = "#SIMLINE_COLOR"
153
+ SimlineAlpha = "#SIMLINE_ALPHA"
154
+ SimlineAnimation = "#SIMLINE_ANIMATION"
155
+ None_ = "#NONE"
156
+ Any = "#ANY"
157
+ All = "#ALL"
158
+ Others = "#OTHERS"
159
+ Short = "#SHORT"
160
+ Long = "#LONG"
161
+ High = "#HIGH"
162
+ Mid = "#MID"
163
+ Low = "#LOW"
164
+ Small = "#SMALL"
165
+ Medium = "#MEDIUM"
166
+ Large = "#LARGE"
167
+ Left = "#LEFT"
168
+ Right = "#RIGHT"
169
+ Up = "#UP"
170
+ Down = "#DOWN"
171
+ Front = "#FRONT"
172
+ Back = "#BACK"
173
+ Center = "#CENTER"
174
+ Top = "#TOP"
175
+ Bottom = "#BOTTOM"
176
+ TopLeft = "#TOP_LEFT"
177
+ TopCenter = "#TOP_CENTER"
178
+ TopRight = "#TOP_RIGHT"
179
+ CenterLeft = "#CENTER_LEFT"
180
+ CenterRight = "#CENTER_RIGHT"
181
+ BottomLeft = "#BOTTOM_LEFT"
182
+ BottomCenter = "#BOTTOM_CENTER"
183
+ BottomRight = "#BOTTOM_RIGHT"
184
+ Clockwise = "#CLOCKWISE"
185
+ Counterclockwise = "#COUNTERCLOCKWISE"
186
+ Forward = "#FORWARD"
187
+ Backward = "#BACKWARD"
188
+ Default = "#DEFAULT"
189
+ Neutral = "#NEUTRAL"
190
+ Red = "#RED"
191
+ Green = "#GREEN"
192
+ Blue = "#BLUE"
193
+ Yellow = "#YELLOW"
194
+ Purple = "#PURPLE"
195
+ Cyan = "#CYAN"
196
+ Simple = "#SIMPLE"
197
+ Easy = "#EASY"
198
+ Normal = "#NORMAL"
199
+ Hard = "#HARD"
200
+ Expert = "#EXPERT"
201
+ Master = "#MASTER"
202
+ Pro = "#PRO"
203
+ Technical = "#TECHNICAL"
204
+ Special = "#SPECIAL"
205
+ KeywordsPlaceholder = "#KEYWORDS_PLACEHOLDER"
206
+ NamePlaceholder = "#NAME_PLACEHOLDER"
207
+ RatingPlaceholder = "#RATING_PLACEHOLDER"
208
+ RatingMinimumPlaceholder = "#RATING_MINIMUM_PLACEHOLDER"
209
+ RatingMaximumPlaceholder = "#RATING_MAXIMUM_PLACEHOLDER"
210
+ TitlePlaceholder = "#TITLE_PLACEHOLDER"
211
+ SubtitlePlaceholder = "#SUBTITLE_PLACEHOLDER"
212
+ ArtistsPlaceholder = "#ARTISTS_PLACEHOLDER"
213
+ TimePlaceholder = "#TIME_PLACEHOLDER"
214
+ AuthorPlaceholder = "#AUTHOR_PLACEHOLDER"
215
+ GenrePlaceholder = "#GENRE_PLACEHOLDER"
216
+ TypePlaceholder = "#TYPE_PLACEHOLDER"
217
+ CategoryPlaceholder = "#CATEGORY_PLACEHOLDER"
218
+ LanguagePlaceholder = "#LANGUAGE_PLACEHOLDER"
219
+ DifficultyPlaceholder = "#DIFFICULTY_PLACEHOLDER"
220
+ LengthPlaceholder = "#LENGTH_PLACEHOLDER"
221
+ LengthMinimumPlaceholder = "#LENGTH_MINIMUM_PLACEHOLDER"
222
+ LengthMaximumPlaceholder = "#LENGTH_MAXIMUM_PLACEHOLDER"
223
+ AdditionalInformationPlaceholder = "#ADDITIONAL_INFORMATION_PLACEHOLDER"
224
+ TimezonePlaceholder = "#TIMEZONE_PLACEHOLDER"
225
+ RegionPlaceholder = "#REGION_PLACEHOLDER"
226
+ ContentPlaceholder = "#CONTENT_PLACEHOLDER"
227
+ CommentPlaceholder = "#COMMENT_PLACEHOLDER"
228
+ ReviewPlaceholder = "#REVIEW_PLACEHOLDER"
229
+ ReplyPlaceholder = "#REPLY_PLACEHOLDER"
230
+ MessagePlaceholder = "#MESSAGE_PLACEHOLDER"
231
+ RolePlaceholder = "#ROLE_PLACEHOLDER"
232
+ PermissionPlaceholder = "#PERMISSION_PLACEHOLDER"
233
+ UserPlaceholder = "#USER_PLACEHOLDER"
234
+ PercentageUnit = "#PERCENTAGE_UNIT"
235
+ SecondUnit = "#SECOND_UNIT"
236
+ MillisecondUnit = "#MILLISECOND_UNIT"
237
+ Tap = "#TAP"
238
+ TapHold = "#TAP_HOLD"
239
+ TapRelease = "#TAP_RELEASE"
240
+ TapFlick = "#TAP_FLICK"
241
+ TapSlide = "#TAP_SLIDE"
242
+ Hold = "#HOLD"
243
+ HoldSlide = "#HOLD_SLIDE"
244
+ HoldFollow = "#HOLD_FOLLOW"
245
+ Release = "#RELEASE"
246
+ Flick = "#FLICK"
247
+ Slide = "#SLIDE"
248
+ SlideFlick = "#SLIDE_FLICK"
249
+ Avoid = "#AVOID"
250
+ Jiggle = "#JIGGLE"
251
+ Newest = "#NEWEST"
252
+ Oldest = "#OLDEST"
253
+ Recommended = "#RECOMMENDED"
254
+ Popular = "#POPULAR"
255
+ Featured = "#FEATURED"
256
+ Competitive = "#COMPETITIVE"
257
+ Holiday = "#HOLIDAY"
258
+ Limited = "#LIMITED"
259
+ Following = "#FOLLOWING"
260
+ Announcement = "#ANNOUNCEMENT"
261
+ Information = "#INFORMATION"
262
+ Help = "#HELP"
263
+ Maintenance = "#MAINTENANCE"
264
+ Event = "#EVENT"
265
+ Update = "#UPDATE"
266
+ Search = "#SEARCH"
267
+ Advanced = "#ADVANCED"
268
+ Related = "#RELATED"
269
+ SameAuthor = "#SAME_AUTHOR"
270
+ SameArtists = "#SAME_ARTISTS"
271
+ SameRating = "#SAME_RATING"
272
+ SameCategory = "#SAME_CATEGORY"
273
+ SameDifficulty = "#SAME_DIFFICULTY"
274
+ SameGenre = "#SAME_GENRE"
275
+ SameVersion = "#SAME_VERSION"
276
+ OtherAuthors = "#OTHER_AUTHORS"
277
+ OtherArtists = "#OTHER_ARTISTS"
278
+ OtherRatings = "#OTHER_RATINGS"
279
+ OtherCategories = "#OTHER_CATEGORIES"
280
+ OtherDifficulties = "#OTHER_DIFFICULTIES"
281
+ OtherGenres = "#OTHER_GENRES"
282
+ OtherVersions = "#OTHER_VERSIONS"
283
+ Draft = "#DRAFT"
284
+ Reviewing = "#REVIEWING"
285
+ Published = "#PUBLISHED"
286
+ Verifying = "#VERIFYING"
287
+ Verified = "#VERIFIED"
288
+ Removed = "#REMOVED"
289
+ Public = "#PUBLIC"
290
+ Private = "#PRIVATE"
291
+ Locked = "#LOCKED"
292
+ Pop = "#POP"
293
+ Rock = "#ROCK"
294
+ Hiphop = "#HIPHOP"
295
+ Country = "#COUNTRY"
296
+ Electronic = "#ELECTRONIC"
297
+ Metal = "#METAL"
298
+ Classical = "#CLASSICAL"
299
+ Folk = "#FOLK"
300
+ Indie = "#INDIE"
301
+ Anime = "#ANIME"
302
+ Vocaloid = "#VOCALOID"
303
+ Remix = "#REMIX"
304
+ Instrumental = "#INSTRUMENTAL"
305
+ ShortVersion = "#SHORT_VERSION"
306
+ LongVersion = "#LONG_VERSION"
307
+ LiveVersion = "#LIVE_VERSION"
308
+ Report = "#REPORT"
309
+ Reason = "#REASON"
310
+ IllegalActivities = "#ILLEGAL_ACTIVITIES"
311
+ Cheating = "#CHEATING"
312
+ Afk = "#AFK"
313
+ Spamming = "#SPAMMING"
314
+ VerbalAbuse = "#VERBAL_ABUSE"
315
+ InappropriateLanguage = "#INAPPROPRIATE_LANGUAGE"
316
+ NegativeAttitude = "#NEGATIVE_ATTITUDE"
317
+ Dnf = "#DNF"
318
+ Suggestions = "#SUGGESTIONS"
319
+ SuggestionsPerPlayer = "#SUGGESTIONS_PER_PLAYER"
320
+ MatchScoring = "#MATCH_SCORING"
321
+ MatchTiebreaker = "#MATCH_TIEBREAKER"
322
+ MatchCount = "#MATCH_COUNT"
323
+ MatchLimit = "#MATCH_LIMIT"
324
+ RoundScoring = "#ROUND_SCORING"
325
+ RoundTiebreaker = "#ROUND_TIEBREAKER"
326
+ RoundCount = "#ROUND_COUNT"
327
+ RoundLimit = "#ROUND_LIMIT"
328
+ TeamScoring = "#TEAM_SCORING"
329
+ TeamTiebreaker = "#TEAM_TIEBREAKER"
330
+ TeamCount = "#TEAM_COUNT"
331
+ TeamLimit = "#TEAM_LIMIT"
332
+ Qualified = "#QUALIFIED"
333
+ Disqualified = "#DISQUALIFIED"
334
+ Ranking = "#RANKING"
335
+ Score = "#SCORE"
336
+ Player = "#PLAYER"
337
+ Spectator = "#SPECTATOR"
338
+ Referee = "#REFEREE"
339
+ Eliminated = "#ELIMINATED"
340
+ Finalist = "#FINALIST"
341
+ Finished = "#FINISHED"
342
+ Winner = "#WINNER"
343
+ GoldMedal = "#GOLD_MEDAL"
344
+ SilverMedal = "#SILVER_MEDAL"
345
+ BronzeMedal = "#BRONZE_MEDAL"
346
+ Team1 = "#TEAM_1"
347
+ Team2 = "#TEAM_2"
348
+ Team3 = "#TEAM_3"
349
+ Team4 = "#TEAM_4"
350
+ Team5 = "#TEAM_5"
351
+ Team6 = "#TEAM_6"
352
+ Team7 = "#TEAM_7"
353
+ Team8 = "#TEAM_8"
354
+ TeamRed = "#TEAM_RED"
355
+ TeamGreen = "#TEAM_GREEN"
356
+ TeamBlue = "#TEAM_BLUE"
357
+ TeamYellow = "#TEAM_YELLOW"
358
+ TeamPurple = "#TEAM_PURPLE"
359
+ TeamCyan = "#TEAM_CYAN"
360
+ TeamWhite = "#TEAM_WHITE"
361
+ TeamBlack = "#TEAM_BLACK"
362
+ Upload = "#UPLOAD"
363
+ Submit = "#SUBMIT"
364
+ Edit = "#EDIT"
365
+ Like = "#LIKE"
366
+ Liked = "#LIKED"
367
+ Dislike = "#DISLIKE"
368
+ Disliked = "#DISLIKED"
369
+ Bookmark = "#BOOKMARK"
370
+ Bookmarked = "#BOOKMARKED"
371
+ Delete = "#DELETE"
372
+ Restore = "#RESTORE"
373
+ Confirm = "#CONFIRM"
374
+ Cancel = "#CANCEL"
375
+ Increase = "#INCREASE"
376
+ Decrease = "#DECREASE"
377
+ Upvote = "#UPVOTE"
378
+ Upvoted = "#UPVOTED"
379
+ Downvote = "#DOWNVOTE"
380
+ Downvoted = "#DOWNVOTED"
381
+ Agree = "#AGREE"
382
+ Agreed = "#AGREED"
383
+ Disagree = "#DISAGREE"
384
+ Disagreed = "#DISAGREED"
385
+ Lock = "#LOCK"
386
+ Unlock = "#UNLOCK"
387
+ Pin = "#PIN"
388
+ Unpin = "#UNPIN"
389
+ Follow = "#FOLLOW"
390
+ Unfollow = "#UNFOLLOW"
391
+ Subscribe = "#SUBSCRIBE"
392
+ Unsubscribe = "#UNSUBSCRIBE"
393
+ Publish = "#PUBLISH"
394
+ Unpublish = "#UNPUBLISH"
395
+ Show = "#SHOW"
396
+ Hide = "#HIDE"
397
+ Allow = "#ALLOW"
398
+ Disallow = "#DISALLOW"
399
+ Approve = "#APPROVE"
400
+ Deny = "#DENY"
401
+ Accept = "#ACCEPT"
402
+ Reject = "#REJECT"
403
+ Star = "#STAR"
404
+ Starred = "#STARRED"
@@ -0,0 +1,42 @@
1
+ from sonolus.backend.ops import Op
2
+ from sonolus.script.internal.native import native_function
3
+
4
+
5
+ @native_function(Op.BeatToBPM)
6
+ def beat_to_bpm(beat: float) -> float:
7
+ raise NotImplementedError
8
+
9
+
10
+ @native_function(Op.BeatToTime)
11
+ def beat_to_time(beat: float) -> float:
12
+ raise NotImplementedError
13
+
14
+
15
+ @native_function(Op.BeatToStartingBeat)
16
+ def beat_to_starting_beat(beat: float) -> float:
17
+ raise NotImplementedError
18
+
19
+
20
+ @native_function(Op.BeatToStartingTime)
21
+ def beat_to_starting_time(beat: float) -> float:
22
+ raise NotImplementedError
23
+
24
+
25
+ @native_function(Op.TimeToScaledTime)
26
+ def time_to_scaled_time(time: float) -> float:
27
+ raise NotImplementedError
28
+
29
+
30
+ @native_function(Op.TimeToStartingScaledTime)
31
+ def time_to_starting_scaled_time(time: float) -> float:
32
+ raise NotImplementedError
33
+
34
+
35
+ @native_function(Op.TimeToStartingTime)
36
+ def time_to_starting_time(time: float) -> float:
37
+ raise NotImplementedError
38
+
39
+
40
+ @native_function(Op.TimeToTimeScale)
41
+ def time_to_timescale(time: float) -> float:
42
+ raise NotImplementedError
@@ -0,0 +1,118 @@
1
+ # fmt: off
2
+ from typing import Self
3
+
4
+ from sonolus.script.graphics import Quad
5
+ from sonolus.script.math import cos, sin
6
+ from sonolus.script.record import Record
7
+ from sonolus.script.vec import Vec2
8
+
9
+
10
+ class Transform2d(Record):
11
+ a00: float
12
+ a01: float
13
+ a02: float
14
+ a10: float
15
+ a11: float
16
+ a12: float
17
+ a20: float
18
+ a21: float
19
+
20
+ @classmethod
21
+ def new(cls) -> Self:
22
+ return cls(
23
+ 1, 0, 0,
24
+ 0, 1, 0,
25
+ 0, 0,
26
+ )
27
+
28
+ def _compose(self,
29
+ b00: float, b01: float, b02: float,
30
+ b10: float, b11: float, b12: float,
31
+ b20: float, b21: float,
32
+ ) -> Self:
33
+ """Multiply the matrix with another matrix on the left."""
34
+ a00 = self.a00 * b00 + self.a10 * b01 + self.a20 * b02
35
+ a01 = self.a01 * b00 + self.a11 * b01 + self.a21 * b02
36
+ a02 = self.a02 * b00 + self.a12 * b01 + b02
37
+ a10 = self.a00 * b10 + self.a10 * b11 + self.a20 * b12
38
+ a11 = self.a01 * b10 + self.a11 * b11 + self.a21 * b12
39
+ a12 = self.a02 * b10 + self.a12 * b11 + b12
40
+ a20 = self.a00 * b20 + self.a10 * b21 + b20
41
+ a21 = self.a01 * b20 + self.a11 * b21 + b21
42
+ a22 = self.a02 * b20 + self.a12 * b21 + 1
43
+ self.a00 = a00 / a22
44
+ self.a01 = a01 / a22
45
+ self.a02 = a02 / a22
46
+ self.a10 = a10 / a22
47
+ self.a11 = a11 / a22
48
+ self.a12 = a12 / a22
49
+ self.a20 = a20 / a22
50
+ self.a21 = a21 / a22
51
+ return self
52
+
53
+ def translate(self, x: float = 0, y: float = 0) -> Self:
54
+ return self._compose(
55
+ 1, 0, x,
56
+ 0, 1, y,
57
+ 0, 0,
58
+ )
59
+
60
+ def scale(self, x: float = 1, y: float = 1) -> Self:
61
+ return self._compose(
62
+ x, 0, 0,
63
+ 0, y, 0,
64
+ 0, 0,
65
+ )
66
+
67
+ def rotate(self, angle: float) -> Self:
68
+ c = cos(angle)
69
+ s = sin(angle)
70
+ return self._compose(
71
+ c, -s, 0,
72
+ s, c, 0,
73
+ 0, 0,
74
+ )
75
+
76
+ def shear_x(self, m: float) -> Self:
77
+ """Shear along the x-axis."""
78
+ return self._compose(
79
+ 1, m, 0,
80
+ 0, 1, 0,
81
+ 0, 0,
82
+ )
83
+
84
+ def shear_y(self, m: float) -> Self:
85
+ """Shear along the y-axis."""
86
+ return self._compose(
87
+ 1, 0, 0,
88
+ m, 1, 0,
89
+ 0, 0,
90
+ )
91
+
92
+ def perspective_vanish_y(self, y: float) -> Self:
93
+ return self._compose(
94
+ 1, 0, 0,
95
+ 0, 1, 0,
96
+ 0, 1 / y,
97
+ )
98
+
99
+ def compose(self, other: Self) -> Self:
100
+ return self._compose(
101
+ other.a00, other.a01, other.a02,
102
+ other.a10, other.a11, other.a12,
103
+ other.a20, other.a21,
104
+ )
105
+
106
+ def transform_vec(self, v: Vec2) -> Vec2:
107
+ x = self.a00 * v.x + self.a01 * v.y + self.a02
108
+ y = self.a10 * v.x + self.a11 * v.y + self.a12
109
+ w = self.a20 * v.x + self.a21 * v.y + 1
110
+ return Vec2(x / w, y / w)
111
+
112
+ def transform_quad(self, quad: Quad) -> Quad:
113
+ return Quad(
114
+ bl=self.transform_vec(quad.bl),
115
+ br=self.transform_vec(quad.br),
116
+ tl=self.transform_vec(quad.tl),
117
+ tr=self.transform_vec(quad.tr),
118
+ )