roblox-opencode 1.0.0 → 1.0.1

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.
Files changed (246) hide show
  1. package/README.md +112 -122
  2. package/commands/setup-game.md +108 -108
  3. package/commands/sync-check.md +53 -53
  4. package/core/roblox-core.md +93 -93
  5. package/dist/server.js +189 -167
  6. package/package.json +35 -35
  7. package/skills/roblox-analytics/SKILL.md +277 -277
  8. package/skills/roblox-analytics/references/event-batcher.luau +75 -75
  9. package/skills/roblox-animation-vfx/SKILL.md +1325 -1325
  10. package/skills/roblox-architecture/SKILL.md +863 -863
  11. package/skills/roblox-architecture/references/combat-systems.md +1381 -1381
  12. package/skills/roblox-code-review/SKILL.md +686 -686
  13. package/skills/roblox-data/SKILL.md +889 -889
  14. package/skills/roblox-data/references/inventory-systems.md +1729 -1729
  15. package/skills/roblox-debug/SKILL.md +98 -98
  16. package/skills/roblox-gui/SKILL.md +1103 -1103
  17. package/skills/roblox-gui-fusion/SKILL.md +150 -150
  18. package/skills/roblox-gui-fusion/references/inventory.luau +427 -427
  19. package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -579
  20. package/skills/roblox-gui-fusion/references/shop.luau +411 -411
  21. package/skills/roblox-luau-mastery/SKILL.md +1519 -1519
  22. package/skills/roblox-monetization/SKILL.md +1084 -1084
  23. package/skills/roblox-monetization/references/process-receipt.luau +131 -131
  24. package/skills/roblox-networking/SKILL.md +669 -669
  25. package/skills/roblox-networking/references/remote-validator.luau +193 -193
  26. package/skills/roblox-publish-checklist/SKILL.md +127 -127
  27. package/skills/roblox-runtime/SKILL.md +753 -753
  28. package/skills/roblox-sharp-edges/SKILL.md +294 -294
  29. package/skills/roblox-sync/SKILL.md +126 -126
  30. package/skills/roblox-testing/SKILL.md +943 -943
  31. package/skills/roblox-tooling/SKILL.md +149 -149
  32. package/vendor/LICENSES/ProfileStore-LICENSE +201 -201
  33. package/vendor/LICENSES/RbxUtil-LICENSE +7 -7
  34. package/vendor/LICENSES/promise-LICENSE +20 -20
  35. package/vendor/LICENSES/t-LICENSE +21 -21
  36. package/vendor/LICENSES/testez-LICENSE +200 -200
  37. package/vendor/README.md +83 -83
  38. package/vendor/fusion/Animation/ExternalTime.luau +83 -83
  39. package/vendor/fusion/Animation/Spring.luau +321 -321
  40. package/vendor/fusion/Animation/Stopwatch.luau +127 -127
  41. package/vendor/fusion/Animation/Tween.luau +187 -187
  42. package/vendor/fusion/Animation/getTweenDuration.luau +27 -27
  43. package/vendor/fusion/Animation/getTweenRatio.luau +47 -47
  44. package/vendor/fusion/Animation/lerpType.luau +163 -163
  45. package/vendor/fusion/Animation/packType.luau +99 -99
  46. package/vendor/fusion/Animation/springCoefficients.luau +80 -80
  47. package/vendor/fusion/Animation/unpackType.luau +102 -102
  48. package/vendor/fusion/Colour/Oklab.luau +70 -70
  49. package/vendor/fusion/Colour/sRGB.luau +54 -54
  50. package/vendor/fusion/External.luau +167 -167
  51. package/vendor/fusion/ExternalDebug.luau +69 -69
  52. package/vendor/fusion/Graph/Observer.luau +113 -113
  53. package/vendor/fusion/Graph/castToGraph.luau +28 -28
  54. package/vendor/fusion/Graph/change.luau +80 -80
  55. package/vendor/fusion/Graph/depend.luau +32 -32
  56. package/vendor/fusion/Graph/evaluate.luau +55 -55
  57. package/vendor/fusion/Instances/Attribute.luau +57 -57
  58. package/vendor/fusion/Instances/AttributeChange.luau +46 -46
  59. package/vendor/fusion/Instances/AttributeOut.luau +63 -63
  60. package/vendor/fusion/Instances/Child.luau +21 -21
  61. package/vendor/fusion/Instances/Children.luau +147 -147
  62. package/vendor/fusion/Instances/Hydrate.luau +32 -32
  63. package/vendor/fusion/Instances/New.luau +52 -52
  64. package/vendor/fusion/Instances/OnChange.luau +49 -49
  65. package/vendor/fusion/Instances/OnEvent.luau +53 -53
  66. package/vendor/fusion/Instances/Out.luau +69 -69
  67. package/vendor/fusion/Instances/applyInstanceProps.luau +148 -148
  68. package/vendor/fusion/Instances/defaultProps.luau +194 -194
  69. package/vendor/fusion/LICENSE +21 -21
  70. package/vendor/fusion/Logging/formatError.luau +48 -48
  71. package/vendor/fusion/Logging/messages.luau +51 -51
  72. package/vendor/fusion/Logging/parseError.luau +24 -24
  73. package/vendor/fusion/Memory/checkLifetime.luau +133 -133
  74. package/vendor/fusion/Memory/deriveScope.luau +23 -23
  75. package/vendor/fusion/Memory/deriveScopeImpl.luau +44 -44
  76. package/vendor/fusion/Memory/doCleanup.luau +78 -78
  77. package/vendor/fusion/Memory/innerScope.luau +33 -33
  78. package/vendor/fusion/Memory/legacyCleanup.luau +17 -17
  79. package/vendor/fusion/Memory/needsDestruction.luau +16 -16
  80. package/vendor/fusion/Memory/poisonScope.luau +33 -33
  81. package/vendor/fusion/Memory/scopePool.luau +54 -54
  82. package/vendor/fusion/Memory/scoped.luau +26 -26
  83. package/vendor/fusion/Memory/whichLivesLonger.luau +74 -74
  84. package/vendor/fusion/RobloxExternal.luau +97 -97
  85. package/vendor/fusion/State/Computed.luau +138 -138
  86. package/vendor/fusion/State/For/Disassembly.luau +210 -210
  87. package/vendor/fusion/State/For/ForTypes.luau +30 -30
  88. package/vendor/fusion/State/For/init.luau +109 -109
  89. package/vendor/fusion/State/ForKeys.luau +93 -93
  90. package/vendor/fusion/State/ForPairs.luau +96 -96
  91. package/vendor/fusion/State/ForValues.luau +93 -93
  92. package/vendor/fusion/State/Value.luau +87 -87
  93. package/vendor/fusion/State/castToState.luau +25 -25
  94. package/vendor/fusion/State/peek.luau +30 -30
  95. package/vendor/fusion/Types.luau +314 -314
  96. package/vendor/fusion/Utility/Contextual.luau +90 -90
  97. package/vendor/fusion/Utility/Safe.luau +22 -22
  98. package/vendor/fusion/Utility/isSimilar.luau +29 -29
  99. package/vendor/fusion/Utility/merge.luau +35 -35
  100. package/vendor/fusion/Utility/nameOf.luau +34 -34
  101. package/vendor/fusion/Utility/never.luau +13 -13
  102. package/vendor/fusion/Utility/nicknames.luau +10 -10
  103. package/vendor/fusion/Utility/xtypeof.luau +26 -26
  104. package/vendor/fusion/init.luau +82 -82
  105. package/vendor/profilestore/init.luau +2242 -2242
  106. package/vendor/promise/init.luau +1982 -1982
  107. package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -25
  108. package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -228
  109. package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -269
  110. package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -223
  111. package/vendor/rbxutil/buffer-util/Types.luau +60 -60
  112. package/vendor/rbxutil/buffer-util/index.d.ts +153 -153
  113. package/vendor/rbxutil/buffer-util/init.luau +41 -41
  114. package/vendor/rbxutil/buffer-util/package.json +16 -16
  115. package/vendor/rbxutil/buffer-util/wally.toml +9 -9
  116. package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -232
  117. package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -156
  118. package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -109
  119. package/vendor/rbxutil/comm/Client/init.luau +135 -135
  120. package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -295
  121. package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -211
  122. package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -211
  123. package/vendor/rbxutil/comm/Server/init.luau +140 -140
  124. package/vendor/rbxutil/comm/Types.luau +18 -18
  125. package/vendor/rbxutil/comm/Util.luau +27 -27
  126. package/vendor/rbxutil/comm/init.luau +35 -35
  127. package/vendor/rbxutil/comm/wally.toml +13 -13
  128. package/vendor/rbxutil/component/init.luau +759 -759
  129. package/vendor/rbxutil/component/init.test.luau +311 -311
  130. package/vendor/rbxutil/component/wally.toml +14 -14
  131. package/vendor/rbxutil/concur/init.luau +542 -542
  132. package/vendor/rbxutil/concur/init.test.luau +364 -364
  133. package/vendor/rbxutil/concur/wally.toml +8 -8
  134. package/vendor/rbxutil/enum-list/init.luau +101 -101
  135. package/vendor/rbxutil/enum-list/init.test.luau +91 -91
  136. package/vendor/rbxutil/enum-list/wally.toml +8 -8
  137. package/vendor/rbxutil/find/index.d.ts +20 -20
  138. package/vendor/rbxutil/find/init.luau +44 -44
  139. package/vendor/rbxutil/find/package.json +17 -17
  140. package/vendor/rbxutil/find/wally.toml +8 -8
  141. package/vendor/rbxutil/input/Gamepad.luau +559 -559
  142. package/vendor/rbxutil/input/Keyboard.luau +124 -124
  143. package/vendor/rbxutil/input/Mouse.luau +278 -278
  144. package/vendor/rbxutil/input/PreferredInput.luau +91 -91
  145. package/vendor/rbxutil/input/Touch.luau +120 -120
  146. package/vendor/rbxutil/input/init.luau +33 -33
  147. package/vendor/rbxutil/input/wally.toml +12 -12
  148. package/vendor/rbxutil/loader/index.d.ts +15 -15
  149. package/vendor/rbxutil/loader/init.luau +137 -137
  150. package/vendor/rbxutil/loader/wally.toml +8 -8
  151. package/vendor/rbxutil/log/index.d.ts +38 -38
  152. package/vendor/rbxutil/log/init.luau +746 -746
  153. package/vendor/rbxutil/log/wally.toml +8 -8
  154. package/vendor/rbxutil/net/init.luau +190 -190
  155. package/vendor/rbxutil/net/wally.toml +8 -8
  156. package/vendor/rbxutil/option/index.d.ts +44 -44
  157. package/vendor/rbxutil/option/init.luau +489 -489
  158. package/vendor/rbxutil/option/init.test.luau +342 -342
  159. package/vendor/rbxutil/option/wally.toml +8 -8
  160. package/vendor/rbxutil/pid/index.d.ts +53 -53
  161. package/vendor/rbxutil/pid/init.luau +195 -195
  162. package/vendor/rbxutil/pid/package.json +16 -16
  163. package/vendor/rbxutil/pid/wally.toml +9 -9
  164. package/vendor/rbxutil/quaternion/index.d.ts +117 -117
  165. package/vendor/rbxutil/quaternion/init.luau +570 -570
  166. package/vendor/rbxutil/quaternion/package.json +16 -16
  167. package/vendor/rbxutil/quaternion/wally.toml +9 -9
  168. package/vendor/rbxutil/query/index.d.ts +43 -43
  169. package/vendor/rbxutil/query/init.luau +117 -117
  170. package/vendor/rbxutil/query/package.json +18 -18
  171. package/vendor/rbxutil/query/wally.toml +9 -9
  172. package/vendor/rbxutil/sequent/index.d.ts +28 -28
  173. package/vendor/rbxutil/sequent/init.luau +340 -340
  174. package/vendor/rbxutil/sequent/package.json +16 -16
  175. package/vendor/rbxutil/sequent/wally.toml +9 -9
  176. package/vendor/rbxutil/ser/init.luau +175 -175
  177. package/vendor/rbxutil/ser/init.test.luau +50 -50
  178. package/vendor/rbxutil/ser/wally.toml +11 -11
  179. package/vendor/rbxutil/shake/index.d.ts +36 -36
  180. package/vendor/rbxutil/shake/init.luau +532 -532
  181. package/vendor/rbxutil/shake/init.test.luau +267 -267
  182. package/vendor/rbxutil/shake/package.json +16 -16
  183. package/vendor/rbxutil/shake/wally.toml +9 -9
  184. package/vendor/rbxutil/signal/index.d.ts +100 -100
  185. package/vendor/rbxutil/signal/init.luau +432 -432
  186. package/vendor/rbxutil/signal/init.test.luau +190 -190
  187. package/vendor/rbxutil/signal/package.json +17 -17
  188. package/vendor/rbxutil/signal/wally.toml +9 -9
  189. package/vendor/rbxutil/silo/TableWatcher.luau +65 -65
  190. package/vendor/rbxutil/silo/Util.luau +55 -55
  191. package/vendor/rbxutil/silo/init.luau +338 -338
  192. package/vendor/rbxutil/silo/init.test.luau +215 -215
  193. package/vendor/rbxutil/silo/wally.toml +8 -8
  194. package/vendor/rbxutil/spring/index.d.ts +40 -40
  195. package/vendor/rbxutil/spring/init.luau +97 -97
  196. package/vendor/rbxutil/spring/package.json +17 -17
  197. package/vendor/rbxutil/spring/wally.toml +8 -8
  198. package/vendor/rbxutil/stream/index.d.ts +88 -88
  199. package/vendor/rbxutil/stream/init.luau +597 -597
  200. package/vendor/rbxutil/stream/package.json +18 -18
  201. package/vendor/rbxutil/stream/wally.toml +9 -9
  202. package/vendor/rbxutil/streamable/Streamable.luau +202 -202
  203. package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -80
  204. package/vendor/rbxutil/streamable/init.luau +8 -8
  205. package/vendor/rbxutil/streamable/wally.toml +12 -12
  206. package/vendor/rbxutil/symbol/init.luau +56 -56
  207. package/vendor/rbxutil/symbol/init.test.luau +37 -37
  208. package/vendor/rbxutil/symbol/wally.toml +8 -8
  209. package/vendor/rbxutil/table-util/init.luau +938 -938
  210. package/vendor/rbxutil/table-util/init.test.luau +439 -439
  211. package/vendor/rbxutil/task-queue/index.d.ts +27 -27
  212. package/vendor/rbxutil/task-queue/init.luau +97 -97
  213. package/vendor/rbxutil/task-queue/wally.toml +8 -8
  214. package/vendor/rbxutil/timer/index.d.ts +81 -81
  215. package/vendor/rbxutil/timer/init.luau +249 -249
  216. package/vendor/rbxutil/timer/init.test.luau +73 -73
  217. package/vendor/rbxutil/timer/wally.toml +11 -11
  218. package/vendor/rbxutil/tree/index.d.ts +15 -15
  219. package/vendor/rbxutil/tree/init.luau +137 -137
  220. package/vendor/rbxutil/tree/wally.toml +8 -8
  221. package/vendor/rbxutil/trove/index.d.ts +46 -46
  222. package/vendor/rbxutil/trove/init.luau +787 -787
  223. package/vendor/rbxutil/trove/init.test.luau +203 -203
  224. package/vendor/rbxutil/trove/wally.toml +8 -8
  225. package/vendor/rbxutil/typed-remote/init.luau +196 -196
  226. package/vendor/rbxutil/typed-remote/wally.toml +8 -8
  227. package/vendor/rbxutil/wait-for/index.d.ts +17 -17
  228. package/vendor/rbxutil/wait-for/init.luau +257 -257
  229. package/vendor/rbxutil/wait-for/init.test.luau +182 -182
  230. package/vendor/rbxutil/wait-for/wally.toml +11 -11
  231. package/vendor/t/t.lua +1350 -1350
  232. package/vendor/testez/Context.lua +26 -26
  233. package/vendor/testez/Expectation.lua +311 -311
  234. package/vendor/testez/ExpectationContext.lua +38 -38
  235. package/vendor/testez/LifecycleHooks.lua +89 -89
  236. package/vendor/testez/Reporters/TeamCityReporter.lua +101 -101
  237. package/vendor/testez/Reporters/TextReporter.lua +105 -105
  238. package/vendor/testez/Reporters/TextReporterQuiet.lua +96 -96
  239. package/vendor/testez/TestBootstrap.lua +146 -146
  240. package/vendor/testez/TestEnum.lua +27 -27
  241. package/vendor/testez/TestPlan.lua +304 -304
  242. package/vendor/testez/TestPlanner.lua +39 -39
  243. package/vendor/testez/TestResults.lua +111 -111
  244. package/vendor/testez/TestRunner.lua +188 -188
  245. package/vendor/testez/TestSession.lua +243 -243
  246. package/vendor/testez/init.lua +39 -39
@@ -1,47 +1,47 @@
1
- --!strict
2
- --!nolint LocalUnused
3
- --!nolint LocalShadow
4
- local task = nil -- Disable usage of Roblox's task scheduler
5
-
6
- --[[
7
- Given a `tweenInfo` and `currentTime`, returns a ratio which can be used to
8
- tween between two values over time.
9
- ]]
10
-
11
- local TweenService = game:GetService("TweenService")
12
-
13
- local function getTweenRatio(
14
- tweenInfo: TweenInfo,
15
- currentTime: number
16
- ): number
17
- local delay = tweenInfo.DelayTime
18
- local duration = tweenInfo.Time
19
- local reverses = tweenInfo.Reverses
20
- local numCycles = 1 + tweenInfo.RepeatCount
21
- local easeStyle = tweenInfo.EasingStyle
22
- local easeDirection = tweenInfo.EasingDirection
23
- local cycleDuration = delay + duration
24
- if reverses then
25
- cycleDuration += duration
26
- end
27
- -- If currentTime is infinity, then presumably the tween should be over.
28
- -- This avoids NaN when the duration of an infinitely repeating tween is given.
29
- if currentTime == math.huge then
30
- return 1
31
- end
32
- if currentTime >= cycleDuration * numCycles and tweenInfo.RepeatCount > -1 then
33
- return 1
34
- end
35
- local cycleTime = currentTime % cycleDuration
36
- if cycleTime <= delay then
37
- return 0
38
- end
39
- local tweenProgress = (cycleTime - delay) / duration
40
- if tweenProgress > 1 then
41
- tweenProgress = 2 - tweenProgress
42
- end
43
- local ratio = TweenService:GetValue(tweenProgress, easeStyle, easeDirection)
44
- return ratio
45
- end
46
-
47
- return getTweenRatio
1
+ --!strict
2
+ --!nolint LocalUnused
3
+ --!nolint LocalShadow
4
+ local task = nil -- Disable usage of Roblox's task scheduler
5
+
6
+ --[[
7
+ Given a `tweenInfo` and `currentTime`, returns a ratio which can be used to
8
+ tween between two values over time.
9
+ ]]
10
+
11
+ local TweenService = game:GetService("TweenService")
12
+
13
+ local function getTweenRatio(
14
+ tweenInfo: TweenInfo,
15
+ currentTime: number
16
+ ): number
17
+ local delay = tweenInfo.DelayTime
18
+ local duration = tweenInfo.Time
19
+ local reverses = tweenInfo.Reverses
20
+ local numCycles = 1 + tweenInfo.RepeatCount
21
+ local easeStyle = tweenInfo.EasingStyle
22
+ local easeDirection = tweenInfo.EasingDirection
23
+ local cycleDuration = delay + duration
24
+ if reverses then
25
+ cycleDuration += duration
26
+ end
27
+ -- If currentTime is infinity, then presumably the tween should be over.
28
+ -- This avoids NaN when the duration of an infinitely repeating tween is given.
29
+ if currentTime == math.huge then
30
+ return 1
31
+ end
32
+ if currentTime >= cycleDuration * numCycles and tweenInfo.RepeatCount > -1 then
33
+ return 1
34
+ end
35
+ local cycleTime = currentTime % cycleDuration
36
+ if cycleTime <= delay then
37
+ return 0
38
+ end
39
+ local tweenProgress = (cycleTime - delay) / duration
40
+ if tweenProgress > 1 then
41
+ tweenProgress = 2 - tweenProgress
42
+ end
43
+ local ratio = TweenService:GetValue(tweenProgress, easeStyle, easeDirection)
44
+ return ratio
45
+ end
46
+
47
+ return getTweenRatio
@@ -1,164 +1,164 @@
1
- --!strict
2
- --!nolint LocalUnused
3
- --!nolint LocalShadow
4
- local task = nil -- Disable usage of Roblox's task scheduler
5
-
6
- --[[
7
- Linearly interpolates the given animatable types by a ratio.
8
- If the types are different or not animatable, then the first value will be
9
- returned for ratios below 0.5, and the second value for 0.5 and above.
10
- ]]
11
-
12
- local Package = script.Parent.Parent
13
- local Oklab = require(Package.Colour.Oklab)
14
-
15
- local function lerpType(
16
- from: unknown,
17
- to: unknown,
18
- ratio: number
19
- ): unknown
20
- local typeString = typeof(from)
21
-
22
- if typeof(to) == typeString then
23
- -- both types must match for interpolation to make sense
24
- if typeString == "number" then
25
- local to, from = to :: number, from :: number
26
- return (to - from) * ratio + from
27
-
28
- elseif typeString == "CFrame" then
29
- local to, from = to :: CFrame, from :: CFrame
30
- return from:Lerp(to, ratio)
31
-
32
- elseif typeString == "Color3" then
33
- local to, from = to :: Color3, from :: Color3
34
- local fromLab = Oklab.fromSRGB(from)
35
- local toLab = Oklab.fromSRGB(to)
36
- return Oklab.toSRGB(
37
- fromLab:Lerp(toLab, ratio),
38
- false
39
- )
40
-
41
- elseif typeString == "ColorSequenceKeypoint" then
42
- local to, from = to :: ColorSequenceKeypoint, from :: ColorSequenceKeypoint
43
- local fromLab = Oklab.fromSRGB(from.Value)
44
- local toLab = Oklab.fromSRGB(to.Value)
45
- return ColorSequenceKeypoint.new(
46
- (to.Time - from.Time) * ratio + from.Time,
47
- Oklab.toSRGB(
48
- fromLab:Lerp(toLab, ratio),
49
- false
50
- )
51
- )
52
-
53
- elseif typeString == "DateTime" then
54
- local to, from = to :: DateTime, from :: DateTime
55
- return DateTime.fromUnixTimestampMillis(
56
- (to.UnixTimestampMillis - from.UnixTimestampMillis) * ratio + from.UnixTimestampMillis
57
- )
58
-
59
- elseif typeString == "NumberRange" then
60
- local to, from = to :: NumberRange, from :: NumberRange
61
- return NumberRange.new(
62
- (to.Min - from.Min) * ratio + from.Min,
63
- (to.Max - from.Max) * ratio + from.Max
64
- )
65
-
66
- elseif typeString == "NumberSequenceKeypoint" then
67
- local to, from = to :: NumberSequenceKeypoint, from :: NumberSequenceKeypoint
68
- return NumberSequenceKeypoint.new(
69
- (to.Time - from.Time) * ratio + from.Time,
70
- (to.Value - from.Value) * ratio + from.Value,
71
- (to.Envelope - from.Envelope) * ratio + from.Envelope
72
- )
73
-
74
- elseif typeString == "PhysicalProperties" then
75
- local to, from = to :: PhysicalProperties, from :: PhysicalProperties
76
- return PhysicalProperties.new(
77
- (to.Density - from.Density) * ratio + from.Density,
78
- (to.Friction - from.Friction) * ratio + from.Friction,
79
- (to.Elasticity - from.Elasticity) * ratio + from.Elasticity,
80
- (to.FrictionWeight - from.FrictionWeight) * ratio + from.FrictionWeight,
81
- (to.ElasticityWeight - from.ElasticityWeight) * ratio + from.ElasticityWeight
82
- )
83
-
84
- elseif typeString == "Ray" then
85
- local to, from = to :: Ray, from :: Ray
86
- return Ray.new(
87
- from.Origin:Lerp(to.Origin, ratio),
88
- from.Direction:Lerp(to.Direction, ratio)
89
- )
90
-
91
- elseif typeString == "Rect" then
92
- local to, from = to :: Rect, from :: Rect
93
- return Rect.new(
94
- from.Min:Lerp(to.Min, ratio),
95
- from.Max:Lerp(to.Max, ratio)
96
- )
97
-
98
- elseif typeString == "Region3" then
99
- local to, from = to :: Region3, from :: Region3
100
- -- FUTURE: support rotated Region3s if/when they become constructable
101
- local position = from.CFrame.Position:Lerp(to.CFrame.Position, ratio)
102
- local halfSize = from.Size:Lerp(to.Size, ratio) / 2
103
- return Region3.new(position - halfSize, position + halfSize)
104
-
105
- elseif typeString == "Region3int16" then
106
- local to, from = to :: Region3int16, from :: Region3int16
107
- return Region3int16.new(
108
- Vector3int16.new(
109
- (to.Min.X - from.Min.X) * ratio + from.Min.X,
110
- (to.Min.Y - from.Min.Y) * ratio + from.Min.Y,
111
- (to.Min.Z - from.Min.Z) * ratio + from.Min.Z
112
- ),
113
- Vector3int16.new(
114
- (to.Max.X - from.Max.X) * ratio + from.Max.X,
115
- (to.Max.Y - from.Max.Y) * ratio + from.Max.Y,
116
- (to.Max.Z - from.Max.Z) * ratio + from.Max.Z
117
- )
118
- )
119
-
120
- elseif typeString == "UDim" then
121
- local to, from = to :: UDim, from :: UDim
122
- return UDim.new(
123
- (to.Scale - from.Scale) * ratio + from.Scale,
124
- (to.Offset - from.Offset) * ratio + from.Offset
125
- )
126
-
127
- elseif typeString == "UDim2" then
128
- local to, from = to :: UDim2, from :: UDim2
129
- return from:Lerp(to, ratio)
130
-
131
- elseif typeString == "Vector2" then
132
- local to, from = to :: Vector2, from :: Vector2
133
- return from:Lerp(to, ratio)
134
-
135
- elseif typeString == "Vector2int16" then
136
- local to, from = to :: Vector2int16, from :: Vector2int16
137
- return Vector2int16.new(
138
- (to.X - from.X) * ratio + from.X,
139
- (to.Y - from.Y) * ratio + from.Y
140
- )
141
-
142
- elseif typeString == "Vector3" then
143
- local to, from = to :: Vector3, from :: Vector3
144
- return from:Lerp(to, ratio)
145
-
146
- elseif typeString == "Vector3int16" then
147
- local to, from = to :: Vector3int16, from :: Vector3int16
148
- return Vector3int16.new(
149
- (to.X - from.X) * ratio + from.X,
150
- (to.Y - from.Y) * ratio + from.Y,
151
- (to.Z - from.Z) * ratio + from.Z
152
- )
153
- end
154
- end
155
-
156
- -- fallback case: the types are different or not animatable
157
- if ratio < 0.5 then
158
- return from
159
- else
160
- return to
161
- end
162
- end
163
-
1
+ --!strict
2
+ --!nolint LocalUnused
3
+ --!nolint LocalShadow
4
+ local task = nil -- Disable usage of Roblox's task scheduler
5
+
6
+ --[[
7
+ Linearly interpolates the given animatable types by a ratio.
8
+ If the types are different or not animatable, then the first value will be
9
+ returned for ratios below 0.5, and the second value for 0.5 and above.
10
+ ]]
11
+
12
+ local Package = script.Parent.Parent
13
+ local Oklab = require(Package.Colour.Oklab)
14
+
15
+ local function lerpType(
16
+ from: unknown,
17
+ to: unknown,
18
+ ratio: number
19
+ ): unknown
20
+ local typeString = typeof(from)
21
+
22
+ if typeof(to) == typeString then
23
+ -- both types must match for interpolation to make sense
24
+ if typeString == "number" then
25
+ local to, from = to :: number, from :: number
26
+ return (to - from) * ratio + from
27
+
28
+ elseif typeString == "CFrame" then
29
+ local to, from = to :: CFrame, from :: CFrame
30
+ return from:Lerp(to, ratio)
31
+
32
+ elseif typeString == "Color3" then
33
+ local to, from = to :: Color3, from :: Color3
34
+ local fromLab = Oklab.fromSRGB(from)
35
+ local toLab = Oklab.fromSRGB(to)
36
+ return Oklab.toSRGB(
37
+ fromLab:Lerp(toLab, ratio),
38
+ false
39
+ )
40
+
41
+ elseif typeString == "ColorSequenceKeypoint" then
42
+ local to, from = to :: ColorSequenceKeypoint, from :: ColorSequenceKeypoint
43
+ local fromLab = Oklab.fromSRGB(from.Value)
44
+ local toLab = Oklab.fromSRGB(to.Value)
45
+ return ColorSequenceKeypoint.new(
46
+ (to.Time - from.Time) * ratio + from.Time,
47
+ Oklab.toSRGB(
48
+ fromLab:Lerp(toLab, ratio),
49
+ false
50
+ )
51
+ )
52
+
53
+ elseif typeString == "DateTime" then
54
+ local to, from = to :: DateTime, from :: DateTime
55
+ return DateTime.fromUnixTimestampMillis(
56
+ (to.UnixTimestampMillis - from.UnixTimestampMillis) * ratio + from.UnixTimestampMillis
57
+ )
58
+
59
+ elseif typeString == "NumberRange" then
60
+ local to, from = to :: NumberRange, from :: NumberRange
61
+ return NumberRange.new(
62
+ (to.Min - from.Min) * ratio + from.Min,
63
+ (to.Max - from.Max) * ratio + from.Max
64
+ )
65
+
66
+ elseif typeString == "NumberSequenceKeypoint" then
67
+ local to, from = to :: NumberSequenceKeypoint, from :: NumberSequenceKeypoint
68
+ return NumberSequenceKeypoint.new(
69
+ (to.Time - from.Time) * ratio + from.Time,
70
+ (to.Value - from.Value) * ratio + from.Value,
71
+ (to.Envelope - from.Envelope) * ratio + from.Envelope
72
+ )
73
+
74
+ elseif typeString == "PhysicalProperties" then
75
+ local to, from = to :: PhysicalProperties, from :: PhysicalProperties
76
+ return PhysicalProperties.new(
77
+ (to.Density - from.Density) * ratio + from.Density,
78
+ (to.Friction - from.Friction) * ratio + from.Friction,
79
+ (to.Elasticity - from.Elasticity) * ratio + from.Elasticity,
80
+ (to.FrictionWeight - from.FrictionWeight) * ratio + from.FrictionWeight,
81
+ (to.ElasticityWeight - from.ElasticityWeight) * ratio + from.ElasticityWeight
82
+ )
83
+
84
+ elseif typeString == "Ray" then
85
+ local to, from = to :: Ray, from :: Ray
86
+ return Ray.new(
87
+ from.Origin:Lerp(to.Origin, ratio),
88
+ from.Direction:Lerp(to.Direction, ratio)
89
+ )
90
+
91
+ elseif typeString == "Rect" then
92
+ local to, from = to :: Rect, from :: Rect
93
+ return Rect.new(
94
+ from.Min:Lerp(to.Min, ratio),
95
+ from.Max:Lerp(to.Max, ratio)
96
+ )
97
+
98
+ elseif typeString == "Region3" then
99
+ local to, from = to :: Region3, from :: Region3
100
+ -- FUTURE: support rotated Region3s if/when they become constructable
101
+ local position = from.CFrame.Position:Lerp(to.CFrame.Position, ratio)
102
+ local halfSize = from.Size:Lerp(to.Size, ratio) / 2
103
+ return Region3.new(position - halfSize, position + halfSize)
104
+
105
+ elseif typeString == "Region3int16" then
106
+ local to, from = to :: Region3int16, from :: Region3int16
107
+ return Region3int16.new(
108
+ Vector3int16.new(
109
+ (to.Min.X - from.Min.X) * ratio + from.Min.X,
110
+ (to.Min.Y - from.Min.Y) * ratio + from.Min.Y,
111
+ (to.Min.Z - from.Min.Z) * ratio + from.Min.Z
112
+ ),
113
+ Vector3int16.new(
114
+ (to.Max.X - from.Max.X) * ratio + from.Max.X,
115
+ (to.Max.Y - from.Max.Y) * ratio + from.Max.Y,
116
+ (to.Max.Z - from.Max.Z) * ratio + from.Max.Z
117
+ )
118
+ )
119
+
120
+ elseif typeString == "UDim" then
121
+ local to, from = to :: UDim, from :: UDim
122
+ return UDim.new(
123
+ (to.Scale - from.Scale) * ratio + from.Scale,
124
+ (to.Offset - from.Offset) * ratio + from.Offset
125
+ )
126
+
127
+ elseif typeString == "UDim2" then
128
+ local to, from = to :: UDim2, from :: UDim2
129
+ return from:Lerp(to, ratio)
130
+
131
+ elseif typeString == "Vector2" then
132
+ local to, from = to :: Vector2, from :: Vector2
133
+ return from:Lerp(to, ratio)
134
+
135
+ elseif typeString == "Vector2int16" then
136
+ local to, from = to :: Vector2int16, from :: Vector2int16
137
+ return Vector2int16.new(
138
+ (to.X - from.X) * ratio + from.X,
139
+ (to.Y - from.Y) * ratio + from.Y
140
+ )
141
+
142
+ elseif typeString == "Vector3" then
143
+ local to, from = to :: Vector3, from :: Vector3
144
+ return from:Lerp(to, ratio)
145
+
146
+ elseif typeString == "Vector3int16" then
147
+ local to, from = to :: Vector3int16, from :: Vector3int16
148
+ return Vector3int16.new(
149
+ (to.X - from.X) * ratio + from.X,
150
+ (to.Y - from.Y) * ratio + from.Y,
151
+ (to.Z - from.Z) * ratio + from.Z
152
+ )
153
+ end
154
+ end
155
+
156
+ -- fallback case: the types are different or not animatable
157
+ if ratio < 0.5 then
158
+ return from
159
+ else
160
+ return to
161
+ end
162
+ end
163
+
164
164
  return lerpType
@@ -1,100 +1,100 @@
1
- --!strict
2
- --!nolint LocalUnused
3
- --!nolint LocalShadow
4
- local task = nil -- Disable usage of Roblox's task scheduler
5
-
6
- --[[
7
- Packs an array of numbers into a given animatable data type.
8
- If the type is not animatable, nil will be returned.
9
- ]]
10
-
11
- local Package = script.Parent.Parent
12
- local Types = require(Package.Types)
13
- local Oklab = require(Package.Colour.Oklab)
14
-
15
- local function packType(
16
- numbers: {number},
17
- typeString: string
18
- ): Types.Animatable?
19
- if typeString == "number" then
20
- return numbers[1]
21
-
22
- elseif typeString == "CFrame" then
23
- return
24
- CFrame.new(numbers[1], numbers[2], numbers[3]) *
25
- CFrame.fromAxisAngle(
26
- Vector3.new(numbers[4], numbers[5], numbers[6]).Unit,
27
- numbers[7]
28
- )
29
-
30
- elseif typeString == "Color3" then
31
- return Oklab.toSRGB(
32
- Vector3.new(numbers[1], numbers[2], numbers[3]),
33
- false
34
- )
35
-
36
- elseif typeString == "ColorSequenceKeypoint" then
37
- return ColorSequenceKeypoint.new(
38
- numbers[4],
39
- Oklab.toSRGB(
40
- Vector3.new(numbers[1], numbers[2], numbers[3]),
41
- false
42
- )
43
- )
44
-
45
- elseif typeString == "DateTime" then
46
- return DateTime.fromUnixTimestampMillis(numbers[1])
47
-
48
- elseif typeString == "NumberRange" then
49
- return NumberRange.new(numbers[1], numbers[2])
50
-
51
- elseif typeString == "NumberSequenceKeypoint" then
52
- return NumberSequenceKeypoint.new(numbers[2], numbers[1], numbers[3])
53
-
54
- elseif typeString == "PhysicalProperties" then
55
- return PhysicalProperties.new(numbers[1], numbers[2], numbers[3], numbers[4], numbers[5])
56
-
57
- elseif typeString == "Ray" then
58
- return Ray.new(
59
- Vector3.new(numbers[1], numbers[2], numbers[3]),
60
- Vector3.new(numbers[4], numbers[5], numbers[6])
61
- )
62
-
63
- elseif typeString == "Rect" then
64
- return Rect.new(numbers[1], numbers[2], numbers[3], numbers[4])
65
-
66
- elseif typeString == "Region3" then
67
- -- FUTURE: support rotated Region3s if/when they become constructable
68
- local position = Vector3.new(numbers[1], numbers[2], numbers[3])
69
- local halfSize = Vector3.new(numbers[4] / 2, numbers[5] / 2, numbers[6] / 2)
70
- return Region3.new(position - halfSize, position + halfSize)
71
-
72
- elseif typeString == "Region3int16" then
73
- return Region3int16.new(
74
- Vector3int16.new(numbers[1], numbers[2], numbers[3]),
75
- Vector3int16.new(numbers[4], numbers[5], numbers[6])
76
- )
77
-
78
- elseif typeString == "UDim" then
79
- return UDim.new(numbers[1], numbers[2])
80
-
81
- elseif typeString == "UDim2" then
82
- return UDim2.new(numbers[1], numbers[2], numbers[3], numbers[4])
83
-
84
- elseif typeString == "Vector2" then
85
- return Vector2.new(numbers[1], numbers[2])
86
-
87
- elseif typeString == "Vector2int16" then
88
- return Vector2int16.new(numbers[1], numbers[2])
89
-
90
- elseif typeString == "Vector3" then
91
- return Vector3.new(numbers[1], numbers[2], numbers[3])
92
-
93
- elseif typeString == "Vector3int16" then
94
- return Vector3int16.new(numbers[1], numbers[2], numbers[3])
95
- else
96
- return nil
97
- end
98
- end
99
-
1
+ --!strict
2
+ --!nolint LocalUnused
3
+ --!nolint LocalShadow
4
+ local task = nil -- Disable usage of Roblox's task scheduler
5
+
6
+ --[[
7
+ Packs an array of numbers into a given animatable data type.
8
+ If the type is not animatable, nil will be returned.
9
+ ]]
10
+
11
+ local Package = script.Parent.Parent
12
+ local Types = require(Package.Types)
13
+ local Oklab = require(Package.Colour.Oklab)
14
+
15
+ local function packType(
16
+ numbers: {number},
17
+ typeString: string
18
+ ): Types.Animatable?
19
+ if typeString == "number" then
20
+ return numbers[1]
21
+
22
+ elseif typeString == "CFrame" then
23
+ return
24
+ CFrame.new(numbers[1], numbers[2], numbers[3]) *
25
+ CFrame.fromAxisAngle(
26
+ Vector3.new(numbers[4], numbers[5], numbers[6]).Unit,
27
+ numbers[7]
28
+ )
29
+
30
+ elseif typeString == "Color3" then
31
+ return Oklab.toSRGB(
32
+ Vector3.new(numbers[1], numbers[2], numbers[3]),
33
+ false
34
+ )
35
+
36
+ elseif typeString == "ColorSequenceKeypoint" then
37
+ return ColorSequenceKeypoint.new(
38
+ numbers[4],
39
+ Oklab.toSRGB(
40
+ Vector3.new(numbers[1], numbers[2], numbers[3]),
41
+ false
42
+ )
43
+ )
44
+
45
+ elseif typeString == "DateTime" then
46
+ return DateTime.fromUnixTimestampMillis(numbers[1])
47
+
48
+ elseif typeString == "NumberRange" then
49
+ return NumberRange.new(numbers[1], numbers[2])
50
+
51
+ elseif typeString == "NumberSequenceKeypoint" then
52
+ return NumberSequenceKeypoint.new(numbers[2], numbers[1], numbers[3])
53
+
54
+ elseif typeString == "PhysicalProperties" then
55
+ return PhysicalProperties.new(numbers[1], numbers[2], numbers[3], numbers[4], numbers[5])
56
+
57
+ elseif typeString == "Ray" then
58
+ return Ray.new(
59
+ Vector3.new(numbers[1], numbers[2], numbers[3]),
60
+ Vector3.new(numbers[4], numbers[5], numbers[6])
61
+ )
62
+
63
+ elseif typeString == "Rect" then
64
+ return Rect.new(numbers[1], numbers[2], numbers[3], numbers[4])
65
+
66
+ elseif typeString == "Region3" then
67
+ -- FUTURE: support rotated Region3s if/when they become constructable
68
+ local position = Vector3.new(numbers[1], numbers[2], numbers[3])
69
+ local halfSize = Vector3.new(numbers[4] / 2, numbers[5] / 2, numbers[6] / 2)
70
+ return Region3.new(position - halfSize, position + halfSize)
71
+
72
+ elseif typeString == "Region3int16" then
73
+ return Region3int16.new(
74
+ Vector3int16.new(numbers[1], numbers[2], numbers[3]),
75
+ Vector3int16.new(numbers[4], numbers[5], numbers[6])
76
+ )
77
+
78
+ elseif typeString == "UDim" then
79
+ return UDim.new(numbers[1], numbers[2])
80
+
81
+ elseif typeString == "UDim2" then
82
+ return UDim2.new(numbers[1], numbers[2], numbers[3], numbers[4])
83
+
84
+ elseif typeString == "Vector2" then
85
+ return Vector2.new(numbers[1], numbers[2])
86
+
87
+ elseif typeString == "Vector2int16" then
88
+ return Vector2int16.new(numbers[1], numbers[2])
89
+
90
+ elseif typeString == "Vector3" then
91
+ return Vector3.new(numbers[1], numbers[2], numbers[3])
92
+
93
+ elseif typeString == "Vector3int16" then
94
+ return Vector3int16.new(numbers[1], numbers[2], numbers[3])
95
+ else
96
+ return nil
97
+ end
98
+ end
99
+
100
100
  return packType