roblox-opencode 1.0.0

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 (248) hide show
  1. package/README.md +122 -0
  2. package/commands/setup-game.md +108 -0
  3. package/commands/sync-check.md +53 -0
  4. package/core/roblox-core.md +93 -0
  5. package/dist/server.js +167 -0
  6. package/package.json +35 -0
  7. package/skills/roblox-analytics/SKILL.md +277 -0
  8. package/skills/roblox-analytics/references/event-batcher.luau +75 -0
  9. package/skills/roblox-animation-vfx/SKILL.md +1325 -0
  10. package/skills/roblox-architecture/SKILL.md +863 -0
  11. package/skills/roblox-architecture/references/combat-systems.md +1381 -0
  12. package/skills/roblox-code-review/SKILL.md +687 -0
  13. package/skills/roblox-data/SKILL.md +889 -0
  14. package/skills/roblox-data/references/inventory-systems.md +1729 -0
  15. package/skills/roblox-debug/SKILL.md +99 -0
  16. package/skills/roblox-gui/SKILL.md +1103 -0
  17. package/skills/roblox-gui-fusion/SKILL.md +150 -0
  18. package/skills/roblox-gui-fusion/references/inventory.luau +427 -0
  19. package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -0
  20. package/skills/roblox-gui-fusion/references/shop.luau +411 -0
  21. package/skills/roblox-luau-mastery/SKILL.md +1519 -0
  22. package/skills/roblox-monetization/SKILL.md +1084 -0
  23. package/skills/roblox-monetization/references/process-receipt.luau +131 -0
  24. package/skills/roblox-networking/SKILL.md +669 -0
  25. package/skills/roblox-networking/references/remote-validator.luau +193 -0
  26. package/skills/roblox-publish-checklist/SKILL.md +128 -0
  27. package/skills/roblox-runtime/SKILL.md +753 -0
  28. package/skills/roblox-sharp-edges/SKILL.md +295 -0
  29. package/skills/roblox-sync/SKILL.md +126 -0
  30. package/skills/roblox-testing/SKILL.md +943 -0
  31. package/skills/roblox-tooling/SKILL.md +150 -0
  32. package/vendor/LICENSES/ProfileStore-LICENSE +201 -0
  33. package/vendor/LICENSES/RbxUtil-LICENSE +7 -0
  34. package/vendor/LICENSES/promise-LICENSE +21 -0
  35. package/vendor/LICENSES/t-LICENSE +21 -0
  36. package/vendor/LICENSES/testez-LICENSE +201 -0
  37. package/vendor/README.md +84 -0
  38. package/vendor/fusion/Animation/ExternalTime.luau +84 -0
  39. package/vendor/fusion/Animation/Spring.luau +322 -0
  40. package/vendor/fusion/Animation/Stopwatch.luau +128 -0
  41. package/vendor/fusion/Animation/Tween.luau +187 -0
  42. package/vendor/fusion/Animation/getTweenDuration.luau +27 -0
  43. package/vendor/fusion/Animation/getTweenRatio.luau +47 -0
  44. package/vendor/fusion/Animation/lerpType.luau +164 -0
  45. package/vendor/fusion/Animation/packType.luau +100 -0
  46. package/vendor/fusion/Animation/springCoefficients.luau +80 -0
  47. package/vendor/fusion/Animation/unpackType.luau +103 -0
  48. package/vendor/fusion/Colour/Oklab.luau +70 -0
  49. package/vendor/fusion/Colour/sRGB.luau +55 -0
  50. package/vendor/fusion/External.luau +168 -0
  51. package/vendor/fusion/ExternalDebug.luau +70 -0
  52. package/vendor/fusion/Graph/Observer.luau +114 -0
  53. package/vendor/fusion/Graph/castToGraph.luau +29 -0
  54. package/vendor/fusion/Graph/change.luau +81 -0
  55. package/vendor/fusion/Graph/depend.luau +33 -0
  56. package/vendor/fusion/Graph/evaluate.luau +56 -0
  57. package/vendor/fusion/Instances/Attribute.luau +58 -0
  58. package/vendor/fusion/Instances/AttributeChange.luau +47 -0
  59. package/vendor/fusion/Instances/AttributeOut.luau +63 -0
  60. package/vendor/fusion/Instances/Child.luau +21 -0
  61. package/vendor/fusion/Instances/Children.luau +148 -0
  62. package/vendor/fusion/Instances/Hydrate.luau +33 -0
  63. package/vendor/fusion/Instances/New.luau +53 -0
  64. package/vendor/fusion/Instances/OnChange.luau +50 -0
  65. package/vendor/fusion/Instances/OnEvent.luau +54 -0
  66. package/vendor/fusion/Instances/Out.luau +69 -0
  67. package/vendor/fusion/Instances/applyInstanceProps.luau +149 -0
  68. package/vendor/fusion/Instances/defaultProps.luau +194 -0
  69. package/vendor/fusion/LICENSE +21 -0
  70. package/vendor/fusion/Logging/formatError.luau +49 -0
  71. package/vendor/fusion/Logging/messages.luau +52 -0
  72. package/vendor/fusion/Logging/parseError.luau +25 -0
  73. package/vendor/fusion/Memory/checkLifetime.luau +134 -0
  74. package/vendor/fusion/Memory/deriveScope.luau +24 -0
  75. package/vendor/fusion/Memory/deriveScopeImpl.luau +45 -0
  76. package/vendor/fusion/Memory/doCleanup.luau +79 -0
  77. package/vendor/fusion/Memory/innerScope.luau +34 -0
  78. package/vendor/fusion/Memory/legacyCleanup.luau +18 -0
  79. package/vendor/fusion/Memory/needsDestruction.luau +17 -0
  80. package/vendor/fusion/Memory/poisonScope.luau +34 -0
  81. package/vendor/fusion/Memory/scopePool.luau +55 -0
  82. package/vendor/fusion/Memory/scoped.luau +27 -0
  83. package/vendor/fusion/Memory/whichLivesLonger.luau +75 -0
  84. package/vendor/fusion/RobloxExternal.luau +98 -0
  85. package/vendor/fusion/State/Computed.luau +139 -0
  86. package/vendor/fusion/State/For/Disassembly.luau +211 -0
  87. package/vendor/fusion/State/For/ForTypes.luau +30 -0
  88. package/vendor/fusion/State/For/init.luau +110 -0
  89. package/vendor/fusion/State/ForKeys.luau +94 -0
  90. package/vendor/fusion/State/ForPairs.luau +97 -0
  91. package/vendor/fusion/State/ForValues.luau +94 -0
  92. package/vendor/fusion/State/Value.luau +88 -0
  93. package/vendor/fusion/State/castToState.luau +26 -0
  94. package/vendor/fusion/State/peek.luau +31 -0
  95. package/vendor/fusion/State/updateAll.luau +1 -0
  96. package/vendor/fusion/Types.luau +314 -0
  97. package/vendor/fusion/Utility/Contextual.luau +91 -0
  98. package/vendor/fusion/Utility/Safe.luau +23 -0
  99. package/vendor/fusion/Utility/isSimilar.luau +29 -0
  100. package/vendor/fusion/Utility/merge.luau +35 -0
  101. package/vendor/fusion/Utility/nameOf.luau +35 -0
  102. package/vendor/fusion/Utility/never.luau +14 -0
  103. package/vendor/fusion/Utility/nicknames.luau +11 -0
  104. package/vendor/fusion/Utility/xtypeof.luau +27 -0
  105. package/vendor/fusion/init.luau +82 -0
  106. package/vendor/profilestore/init.luau +2243 -0
  107. package/vendor/promise/init.luau +1982 -0
  108. package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -0
  109. package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -0
  110. package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -0
  111. package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -0
  112. package/vendor/rbxutil/buffer-util/Types.luau +60 -0
  113. package/vendor/rbxutil/buffer-util/index.d.ts +153 -0
  114. package/vendor/rbxutil/buffer-util/init.luau +41 -0
  115. package/vendor/rbxutil/buffer-util/package.json +16 -0
  116. package/vendor/rbxutil/buffer-util/wally.toml +9 -0
  117. package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -0
  118. package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -0
  119. package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -0
  120. package/vendor/rbxutil/comm/Client/init.luau +135 -0
  121. package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -0
  122. package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -0
  123. package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -0
  124. package/vendor/rbxutil/comm/Server/init.luau +140 -0
  125. package/vendor/rbxutil/comm/Types.luau +18 -0
  126. package/vendor/rbxutil/comm/Util.luau +27 -0
  127. package/vendor/rbxutil/comm/init.luau +35 -0
  128. package/vendor/rbxutil/comm/wally.toml +13 -0
  129. package/vendor/rbxutil/component/init.luau +759 -0
  130. package/vendor/rbxutil/component/init.test.luau +311 -0
  131. package/vendor/rbxutil/component/wally.toml +14 -0
  132. package/vendor/rbxutil/concur/init.luau +542 -0
  133. package/vendor/rbxutil/concur/init.test.luau +364 -0
  134. package/vendor/rbxutil/concur/wally.toml +8 -0
  135. package/vendor/rbxutil/enum-list/init.luau +101 -0
  136. package/vendor/rbxutil/enum-list/init.test.luau +91 -0
  137. package/vendor/rbxutil/enum-list/wally.toml +8 -0
  138. package/vendor/rbxutil/find/index.d.ts +20 -0
  139. package/vendor/rbxutil/find/init.luau +44 -0
  140. package/vendor/rbxutil/find/package.json +17 -0
  141. package/vendor/rbxutil/find/wally.toml +8 -0
  142. package/vendor/rbxutil/input/Gamepad.luau +559 -0
  143. package/vendor/rbxutil/input/Keyboard.luau +124 -0
  144. package/vendor/rbxutil/input/Mouse.luau +278 -0
  145. package/vendor/rbxutil/input/PreferredInput.luau +91 -0
  146. package/vendor/rbxutil/input/Touch.luau +120 -0
  147. package/vendor/rbxutil/input/init.luau +33 -0
  148. package/vendor/rbxutil/input/wally.toml +12 -0
  149. package/vendor/rbxutil/loader/index.d.ts +15 -0
  150. package/vendor/rbxutil/loader/init.luau +137 -0
  151. package/vendor/rbxutil/loader/wally.toml +8 -0
  152. package/vendor/rbxutil/log/index.d.ts +38 -0
  153. package/vendor/rbxutil/log/init.luau +746 -0
  154. package/vendor/rbxutil/log/wally.toml +8 -0
  155. package/vendor/rbxutil/net/init.luau +190 -0
  156. package/vendor/rbxutil/net/wally.toml +8 -0
  157. package/vendor/rbxutil/option/index.d.ts +44 -0
  158. package/vendor/rbxutil/option/init.luau +489 -0
  159. package/vendor/rbxutil/option/init.test.luau +342 -0
  160. package/vendor/rbxutil/option/wally.toml +8 -0
  161. package/vendor/rbxutil/pid/index.d.ts +53 -0
  162. package/vendor/rbxutil/pid/init.luau +195 -0
  163. package/vendor/rbxutil/pid/package.json +16 -0
  164. package/vendor/rbxutil/pid/wally.toml +9 -0
  165. package/vendor/rbxutil/quaternion/index.d.ts +117 -0
  166. package/vendor/rbxutil/quaternion/init.luau +570 -0
  167. package/vendor/rbxutil/quaternion/package.json +16 -0
  168. package/vendor/rbxutil/quaternion/wally.toml +9 -0
  169. package/vendor/rbxutil/query/index.d.ts +43 -0
  170. package/vendor/rbxutil/query/init.luau +117 -0
  171. package/vendor/rbxutil/query/package.json +18 -0
  172. package/vendor/rbxutil/query/wally.toml +9 -0
  173. package/vendor/rbxutil/sequent/index.d.ts +28 -0
  174. package/vendor/rbxutil/sequent/init.luau +340 -0
  175. package/vendor/rbxutil/sequent/package.json +16 -0
  176. package/vendor/rbxutil/sequent/wally.toml +9 -0
  177. package/vendor/rbxutil/ser/init.luau +175 -0
  178. package/vendor/rbxutil/ser/init.test.luau +50 -0
  179. package/vendor/rbxutil/ser/wally.toml +11 -0
  180. package/vendor/rbxutil/shake/index.d.ts +36 -0
  181. package/vendor/rbxutil/shake/init.luau +532 -0
  182. package/vendor/rbxutil/shake/init.test.luau +267 -0
  183. package/vendor/rbxutil/shake/package.json +16 -0
  184. package/vendor/rbxutil/shake/wally.toml +9 -0
  185. package/vendor/rbxutil/signal/index.d.ts +100 -0
  186. package/vendor/rbxutil/signal/init.luau +432 -0
  187. package/vendor/rbxutil/signal/init.test.luau +190 -0
  188. package/vendor/rbxutil/signal/package.json +17 -0
  189. package/vendor/rbxutil/signal/wally.toml +9 -0
  190. package/vendor/rbxutil/silo/TableWatcher.luau +65 -0
  191. package/vendor/rbxutil/silo/Util.luau +55 -0
  192. package/vendor/rbxutil/silo/init.luau +338 -0
  193. package/vendor/rbxutil/silo/init.test.luau +215 -0
  194. package/vendor/rbxutil/silo/wally.toml +8 -0
  195. package/vendor/rbxutil/spring/index.d.ts +40 -0
  196. package/vendor/rbxutil/spring/init.luau +97 -0
  197. package/vendor/rbxutil/spring/package.json +17 -0
  198. package/vendor/rbxutil/spring/wally.toml +8 -0
  199. package/vendor/rbxutil/stream/index.d.ts +88 -0
  200. package/vendor/rbxutil/stream/init.luau +597 -0
  201. package/vendor/rbxutil/stream/package.json +18 -0
  202. package/vendor/rbxutil/stream/wally.toml +9 -0
  203. package/vendor/rbxutil/streamable/Streamable.luau +202 -0
  204. package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -0
  205. package/vendor/rbxutil/streamable/init.luau +8 -0
  206. package/vendor/rbxutil/streamable/wally.toml +12 -0
  207. package/vendor/rbxutil/symbol/init.luau +56 -0
  208. package/vendor/rbxutil/symbol/init.test.luau +37 -0
  209. package/vendor/rbxutil/symbol/wally.toml +8 -0
  210. package/vendor/rbxutil/table-util/init.luau +938 -0
  211. package/vendor/rbxutil/table-util/init.test.luau +439 -0
  212. package/vendor/rbxutil/table-util/wally.toml +8 -0
  213. package/vendor/rbxutil/task-queue/index.d.ts +27 -0
  214. package/vendor/rbxutil/task-queue/init.luau +97 -0
  215. package/vendor/rbxutil/task-queue/wally.toml +8 -0
  216. package/vendor/rbxutil/timer/index.d.ts +81 -0
  217. package/vendor/rbxutil/timer/init.luau +249 -0
  218. package/vendor/rbxutil/timer/init.test.luau +73 -0
  219. package/vendor/rbxutil/timer/wally.toml +11 -0
  220. package/vendor/rbxutil/tree/index.d.ts +15 -0
  221. package/vendor/rbxutil/tree/init.luau +137 -0
  222. package/vendor/rbxutil/tree/wally.toml +8 -0
  223. package/vendor/rbxutil/trove/index.d.ts +46 -0
  224. package/vendor/rbxutil/trove/init.luau +787 -0
  225. package/vendor/rbxutil/trove/init.test.luau +203 -0
  226. package/vendor/rbxutil/trove/wally.toml +8 -0
  227. package/vendor/rbxutil/typed-remote/init.luau +196 -0
  228. package/vendor/rbxutil/typed-remote/wally.toml +8 -0
  229. package/vendor/rbxutil/wait-for/index.d.ts +17 -0
  230. package/vendor/rbxutil/wait-for/init.luau +257 -0
  231. package/vendor/rbxutil/wait-for/init.test.luau +182 -0
  232. package/vendor/rbxutil/wait-for/wally.toml +11 -0
  233. package/vendor/t/t.lua +1350 -0
  234. package/vendor/testez/Context.lua +26 -0
  235. package/vendor/testez/Expectation.lua +311 -0
  236. package/vendor/testez/ExpectationContext.lua +38 -0
  237. package/vendor/testez/LifecycleHooks.lua +89 -0
  238. package/vendor/testez/Reporters/TeamCityReporter.lua +102 -0
  239. package/vendor/testez/Reporters/TextReporter.lua +106 -0
  240. package/vendor/testez/Reporters/TextReporterQuiet.lua +97 -0
  241. package/vendor/testez/TestBootstrap.lua +147 -0
  242. package/vendor/testez/TestEnum.lua +28 -0
  243. package/vendor/testez/TestPlan.lua +304 -0
  244. package/vendor/testez/TestPlanner.lua +40 -0
  245. package/vendor/testez/TestResults.lua +112 -0
  246. package/vendor/testez/TestRunner.lua +188 -0
  247. package/vendor/testez/TestSession.lua +243 -0
  248. package/vendor/testez/init.lua +40 -0
@@ -0,0 +1,267 @@
1
+ local RunService = game:GetService("RunService")
2
+ local ServerScriptService = game:GetService("ServerScriptService")
3
+
4
+ local Test = require(ServerScriptService.TestRunner.Test)
5
+
6
+ local function AwaitStop(shake): number
7
+ local start = os.clock()
8
+ shake:Update()
9
+ while shake:IsShaking() do
10
+ task.wait()
11
+ shake:Update()
12
+ end
13
+ return os.clock() - start
14
+ end
15
+
16
+ return function(ctx: Test.TestContext)
17
+ local Shake = require(script.Parent)
18
+
19
+ ctx:Describe("Construct", function()
20
+ ctx:Test("should construct a new shake instance", function()
21
+ ctx:Expect(function()
22
+ local _shake = Shake.new()
23
+ end)
24
+ :Not()
25
+ :ToThrow()
26
+ end)
27
+ end)
28
+
29
+ ctx:Describe("Static Functions", function()
30
+ ctx:Test("should get next render name", function()
31
+ local r1 = Shake.NextRenderName()
32
+ local r2 = Shake.NextRenderName()
33
+ local r3 = Shake.NextRenderName()
34
+ ctx:Expect(r1):ToBeA("string")
35
+ ctx:Expect(r2):ToBeA("string")
36
+ ctx:Expect(r3):ToBeA("string")
37
+ ctx:Expect(r1):Not():ToBe(r2)
38
+ ctx:Expect(r2):Not():ToBe(r3)
39
+ ctx:Expect(r3):Not():ToBe(r1)
40
+ end)
41
+
42
+ ctx:Test("should perform inverse square", function()
43
+ local vector = Vector3.new(10, 10, 10)
44
+ local distance = 10
45
+ local expectedIntensity = 1 / (distance * distance)
46
+ local expectedVector = vector * expectedIntensity
47
+ local vectorInverseSq = Shake.InverseSquare(vector, distance)
48
+ ctx:Expect(typeof(vectorInverseSq)):ToBe("Vector3")
49
+ ctx:Expect(vectorInverseSq):ToBe(expectedVector)
50
+ end)
51
+ end)
52
+
53
+ ctx:Describe("Cloning", function()
54
+ ctx:Test("should clone a shake instance", function()
55
+ local shake1 = Shake.new()
56
+ shake1.Amplitude = 5
57
+ shake1.Frequency = 2
58
+ shake1.FadeInTime = 3
59
+ shake1.FadeOutTime = 4
60
+ shake1.SustainTime = 6
61
+ shake1.Sustain = true
62
+ shake1.PositionInfluence = Vector3.new(1, 2, 3)
63
+ shake1.RotationInfluence = Vector3.new(3, 2, 1)
64
+ shake1.TimeFunction = function()
65
+ return os.clock()
66
+ end
67
+ local shake2 = shake1:Clone()
68
+ ctx:Expect(shake2):ToBeA("table")
69
+ ctx:Expect(getmetatable(shake2)):ToBe(getmetatable(shake1))
70
+ ctx:Expect(shake2):Not():ToBe(shake1)
71
+ local clonedFields = {
72
+ "Amplitude",
73
+ "Frequency",
74
+ "FadeInTime",
75
+ "FadeOutTime",
76
+ "SustainTime",
77
+ "Sustain",
78
+ "PositionInfluence",
79
+ "RotationInfluence",
80
+ }
81
+ for _, field in clonedFields do
82
+ ctx:Expect(shake1[field]):ToBe(shake2[field])
83
+ end
84
+ ctx:Expect(shake1.TimeFunction == shake2.TimeFunction):ToBe(true)
85
+ end)
86
+
87
+ ctx:Test("should clone a shake instance but ignore running state", function()
88
+ local shake1 = Shake.new()
89
+ shake1:Start()
90
+ local shake2 = shake1:Clone()
91
+ ctx:Expect(shake1:IsShaking()):ToBe(true)
92
+ ctx:Expect(shake2:IsShaking()):ToBe(false)
93
+ end)
94
+ end)
95
+
96
+ ctx:Describe("Shaking", function()
97
+ ctx:Test("should start", function()
98
+ local shake = Shake.new()
99
+ ctx:Expect(shake:IsShaking()):ToBe(false)
100
+ shake:Start()
101
+ ctx:Expect(shake:IsShaking()):ToBe(true)
102
+ end)
103
+
104
+ ctx:Test("should stop", function()
105
+ local shake = Shake.new()
106
+ shake:Start()
107
+ ctx:Expect(shake:IsShaking()):ToBe(true)
108
+ shake:Stop()
109
+ ctx:Expect(shake:IsShaking()):ToBe(false)
110
+ end)
111
+
112
+ ctx:Test("should shake for nearly no time", function()
113
+ local shake = Shake.new()
114
+ shake.FadeInTime = 0
115
+ shake.FadeOutTime = 0
116
+ shake.SustainTime = 0
117
+ shake:Start()
118
+ local duration = AwaitStop(shake)
119
+ ctx:Expect(duration):ToBeNear(0, 0.05)
120
+ end)
121
+
122
+ ctx:Test("should shake for fade in time", function()
123
+ local shake = Shake.new()
124
+ shake.FadeInTime = 0.1
125
+ shake.FadeOutTime = 0
126
+ shake.SustainTime = 0
127
+ shake:Start()
128
+ local duration = AwaitStop(shake)
129
+ ctx:Expect(duration):ToBeNear(0.1, 0.05)
130
+ end)
131
+
132
+ ctx:Test("should shake for fade out time", function()
133
+ local shake = Shake.new()
134
+ shake.FadeInTime = 0
135
+ shake.FadeOutTime = 0.1
136
+ shake.SustainTime = 0
137
+ shake:Start()
138
+ local duration = AwaitStop(shake)
139
+ ctx:Expect(duration):ToBeNear(0.1, 0.05)
140
+ end)
141
+
142
+ ctx:Test("should shake for sustain time", function()
143
+ local shake = Shake.new()
144
+ shake.FadeInTime = 0
145
+ shake.FadeOutTime = 0
146
+ shake.SustainTime = 0.1
147
+ shake:Start()
148
+ local duration = AwaitStop(shake)
149
+ ctx:Expect(duration):ToBeNear(0.1, 0.05)
150
+ end)
151
+
152
+ ctx:Test("should shake for fade in and sustain time", function()
153
+ local shake = Shake.new()
154
+ shake.FadeInTime = 0.1
155
+ shake.FadeOutTime = 0
156
+ shake.SustainTime = 0.1
157
+ shake:Start()
158
+ local duration = AwaitStop(shake)
159
+ ctx:Expect(duration):ToBeNear(0.2, 0.05)
160
+ end)
161
+
162
+ ctx:Test("should shake for fade out and sustain time", function()
163
+ local shake = Shake.new()
164
+ shake.FadeInTime = 0
165
+ shake.FadeOutTime = 0.1
166
+ shake.SustainTime = 0.1
167
+ shake:Start()
168
+ local duration = AwaitStop(shake)
169
+ ctx:Expect(duration):ToBeNear(0.2, 0.05)
170
+ end)
171
+
172
+ ctx:Test("should shake for fade in and fade out time", function()
173
+ local shake = Shake.new()
174
+ shake.FadeInTime = 0.1
175
+ shake.FadeOutTime = 0.1
176
+ shake.SustainTime = 0
177
+ shake:Start()
178
+ local duration = AwaitStop(shake)
179
+ ctx:Expect(duration):ToBeNear(0.2, 0.05)
180
+ end)
181
+
182
+ ctx:Test("should shake for fading and sustain time", function()
183
+ local shake = Shake.new()
184
+ shake.FadeInTime = 0.1
185
+ shake.FadeOutTime = 0.1
186
+ shake.SustainTime = 0.1
187
+ shake:Start()
188
+ local duration = AwaitStop(shake)
189
+ ctx:Expect(duration):ToBeNear(0.3, 0.05)
190
+ end)
191
+
192
+ ctx:Test("should shake indefinitely", function()
193
+ local shake = Shake.new()
194
+ shake.FadeInTime = 0
195
+ shake.FadeOutTime = 0
196
+ shake.SustainTime = 0
197
+ shake.Sustain = true
198
+ shake:Start()
199
+ local shakeTime = 0.1
200
+ task.delay(shakeTime, function()
201
+ shake:StopSustain()
202
+ end)
203
+ local duration = AwaitStop(shake)
204
+ ctx:Expect(duration):ToBeNear(shakeTime, 0.05)
205
+ end)
206
+
207
+ ctx:Test("should shake indefinitely and fade out", function()
208
+ local shake = Shake.new()
209
+ shake.FadeInTime = 0
210
+ shake.FadeOutTime = 0.1
211
+ shake.SustainTime = 0
212
+ shake.Sustain = true
213
+ shake:Start()
214
+ local shakeTime = 0.1
215
+ task.delay(shakeTime, function()
216
+ shake:StopSustain()
217
+ end)
218
+ local duration = AwaitStop(shake)
219
+ ctx:Expect(duration):ToBeNear(0.2, 0.05)
220
+ end)
221
+
222
+ ctx:Test("should shake indefinitely and fade out with fade in time", function()
223
+ local shake = Shake.new()
224
+ shake.FadeInTime = 0.1
225
+ shake.FadeOutTime = 0.1
226
+ shake.SustainTime = 0
227
+ shake.Sustain = true
228
+ shake:Start()
229
+ local shakeTime = 0.3
230
+ task.delay(shakeTime, function()
231
+ shake:StopSustain()
232
+ end)
233
+ local duration = AwaitStop(shake)
234
+ ctx:Expect(duration):ToBeNear(0.4, 0.05)
235
+ end)
236
+
237
+ ctx:Test("should connect to signal", function()
238
+ local shake = Shake.new()
239
+ shake.SustainTime = 0.1
240
+ shake:Start()
241
+ local signaled = false
242
+ local connection = shake:OnSignal(RunService.Heartbeat, function()
243
+ signaled = true
244
+ end)
245
+ ctx:Expect(typeof(connection)):ToBe("RBXScriptConnection")
246
+ ctx:Expect(connection.Connected):ToBe(true)
247
+ AwaitStop(shake)
248
+ ctx:Expect(signaled):ToBe(true)
249
+ ctx:Expect(connection.Connected):ToBe(false)
250
+ end)
251
+
252
+ -- RenderStepped only works on the client:
253
+ if RunService:IsClient() and RunService:IsRunning() then
254
+ ctx:Test("should bind to render step", function()
255
+ local shake = Shake.new()
256
+ shake.SustainTime = 0.1
257
+ shake:Start()
258
+ local bound = false
259
+ shake:BindToRenderStep("ShakeTest", Enum.RenderPriority.Last.Value, function()
260
+ bound = true
261
+ end)
262
+ AwaitStop(shake)
263
+ ctx:Expect(bound):ToBe(true)
264
+ end)
265
+ end
266
+ end)
267
+ end
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "@rbxutil/shake",
3
+ "version": "1.1.0",
4
+ "main": "init.luau",
5
+ "repository": "github:Sleitnick/RbxUtil",
6
+ "license": "MIT",
7
+ "types": "index.d.ts",
8
+ "files": [
9
+ "./",
10
+ "!*.toml",
11
+ "!*.json"
12
+ ],
13
+ "publishConfig": {
14
+ "access": "public"
15
+ }
16
+ }
@@ -0,0 +1,9 @@
1
+ [package]
2
+ name = "sleitnick/shake"
3
+ description = "Shake class for making things shake"
4
+ version = "1.1.0"
5
+ license = "MIT"
6
+ authors = ["Stephen Leitnick"]
7
+ registry = "https://github.com/UpliftGames/wally-index"
8
+ realm = "shared"
9
+ exclude = ["node_modules", "package.json", "**/*.ts"]
@@ -0,0 +1,100 @@
1
+ type SignalParams<T> = Parameters<
2
+ T extends unknown[] ? (...args: T) => never : T extends unknown ? (arg: T) => never : () => never
3
+ >;
4
+ type SignalCallback<T> = (...args: SignalParams<T>) => unknown;
5
+ type SignalWait<T> = T extends unknown[] ? LuaTuple<T> : T;
6
+
7
+ type RBXScriptSignalType<T> = T extends unknown[]
8
+ ? RBXScriptSignal<(...args: T) => void>
9
+ : T extends unknown
10
+ ? RBXScriptSignal<(arg: T) => void>
11
+ : RBXScriptSignal;
12
+
13
+ declare namespace Signal {
14
+ interface Constructor {
15
+ /**
16
+ * Constructs a new Signal.
17
+ */
18
+ new <T extends unknown[] | unknown>(): Signal<T>;
19
+
20
+ /**
21
+ * Creates a new Signal that wraps around a native Roblox signal. The benefit
22
+ * of doing this is the ability to hook into Roblox signals and easily manage
23
+ * them in once place.
24
+ */
25
+ Wrap: <T extends unknown[] | unknown>(rbxScriptSignal: RBXScriptSignalType<T>) => Signal<T>;
26
+
27
+ /**
28
+ * Returns `true` if the given object is a Signal.
29
+ */
30
+ Is: <T>(obj: T) => boolean;
31
+ }
32
+
33
+ export interface Connection {
34
+ /**
35
+ * If `true`, the connection is still connected. This field is read-only.
36
+ *
37
+ * To disconnect a connection, call the connection's `Disconnect()` method.
38
+ */
39
+ readonly Connected: boolean;
40
+
41
+ /**
42
+ * Disconnect the connection.
43
+ */
44
+ Disconnect(): void;
45
+
46
+ /**
47
+ * Alias for `Disconnect()`.
48
+ */
49
+ Destroy(): void;
50
+ }
51
+ }
52
+
53
+ interface Signal<T extends unknown[] | unknown> {
54
+ /**
55
+ * Connects a callback function to the signal. This callback function
56
+ * will be called any time the signal is fired.
57
+ */
58
+ Connect(callback: SignalCallback<T>): Signal.Connection;
59
+
60
+ /**
61
+ * Connects a callback function to the signal which will fire only
62
+ * once and then automatically disconnect itself.
63
+ */
64
+ Once(callback: SignalCallback<T>): Signal.Connection;
65
+
66
+ /**
67
+ * Fires the signal.
68
+ */
69
+ Fire(...args: SignalParams<T>): void;
70
+
71
+ /**
72
+ * Fires the signal using `task.defer` internally. This should only be
73
+ * used if `task.defer` is necessary, as the normal `Fire` method optimizes
74
+ * for thread reuse internally.
75
+ */
76
+ FireDeferred(...args: SignalParams<T>): void;
77
+
78
+ /**
79
+ * Yields the current thread until the signal fires. The arguments fired are
80
+ * returned.
81
+ */
82
+ Wait(): SignalWait<T>;
83
+
84
+ /**
85
+ * Disconnects all connections to the signal.
86
+ */
87
+ DisconnectAll(): void;
88
+
89
+ /**
90
+ * Destroys the signal. This is an alias for `Disconnect()`.
91
+ */
92
+ Destroy(): void;
93
+ }
94
+
95
+ /**
96
+ * Signal class.
97
+ */
98
+ declare const Signal: Signal.Constructor;
99
+
100
+ export = Signal;