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.
- package/README.md +122 -0
- package/commands/setup-game.md +108 -0
- package/commands/sync-check.md +53 -0
- package/core/roblox-core.md +93 -0
- package/dist/server.js +167 -0
- package/package.json +35 -0
- package/skills/roblox-analytics/SKILL.md +277 -0
- package/skills/roblox-analytics/references/event-batcher.luau +75 -0
- package/skills/roblox-animation-vfx/SKILL.md +1325 -0
- package/skills/roblox-architecture/SKILL.md +863 -0
- package/skills/roblox-architecture/references/combat-systems.md +1381 -0
- package/skills/roblox-code-review/SKILL.md +687 -0
- package/skills/roblox-data/SKILL.md +889 -0
- package/skills/roblox-data/references/inventory-systems.md +1729 -0
- package/skills/roblox-debug/SKILL.md +99 -0
- package/skills/roblox-gui/SKILL.md +1103 -0
- package/skills/roblox-gui-fusion/SKILL.md +150 -0
- package/skills/roblox-gui-fusion/references/inventory.luau +427 -0
- package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -0
- package/skills/roblox-gui-fusion/references/shop.luau +411 -0
- package/skills/roblox-luau-mastery/SKILL.md +1519 -0
- package/skills/roblox-monetization/SKILL.md +1084 -0
- package/skills/roblox-monetization/references/process-receipt.luau +131 -0
- package/skills/roblox-networking/SKILL.md +669 -0
- package/skills/roblox-networking/references/remote-validator.luau +193 -0
- package/skills/roblox-publish-checklist/SKILL.md +128 -0
- package/skills/roblox-runtime/SKILL.md +753 -0
- package/skills/roblox-sharp-edges/SKILL.md +295 -0
- package/skills/roblox-sync/SKILL.md +126 -0
- package/skills/roblox-testing/SKILL.md +943 -0
- package/skills/roblox-tooling/SKILL.md +150 -0
- package/vendor/LICENSES/ProfileStore-LICENSE +201 -0
- package/vendor/LICENSES/RbxUtil-LICENSE +7 -0
- package/vendor/LICENSES/promise-LICENSE +21 -0
- package/vendor/LICENSES/t-LICENSE +21 -0
- package/vendor/LICENSES/testez-LICENSE +201 -0
- package/vendor/README.md +84 -0
- package/vendor/fusion/Animation/ExternalTime.luau +84 -0
- package/vendor/fusion/Animation/Spring.luau +322 -0
- package/vendor/fusion/Animation/Stopwatch.luau +128 -0
- package/vendor/fusion/Animation/Tween.luau +187 -0
- package/vendor/fusion/Animation/getTweenDuration.luau +27 -0
- package/vendor/fusion/Animation/getTweenRatio.luau +47 -0
- package/vendor/fusion/Animation/lerpType.luau +164 -0
- package/vendor/fusion/Animation/packType.luau +100 -0
- package/vendor/fusion/Animation/springCoefficients.luau +80 -0
- package/vendor/fusion/Animation/unpackType.luau +103 -0
- package/vendor/fusion/Colour/Oklab.luau +70 -0
- package/vendor/fusion/Colour/sRGB.luau +55 -0
- package/vendor/fusion/External.luau +168 -0
- package/vendor/fusion/ExternalDebug.luau +70 -0
- package/vendor/fusion/Graph/Observer.luau +114 -0
- package/vendor/fusion/Graph/castToGraph.luau +29 -0
- package/vendor/fusion/Graph/change.luau +81 -0
- package/vendor/fusion/Graph/depend.luau +33 -0
- package/vendor/fusion/Graph/evaluate.luau +56 -0
- package/vendor/fusion/Instances/Attribute.luau +58 -0
- package/vendor/fusion/Instances/AttributeChange.luau +47 -0
- package/vendor/fusion/Instances/AttributeOut.luau +63 -0
- package/vendor/fusion/Instances/Child.luau +21 -0
- package/vendor/fusion/Instances/Children.luau +148 -0
- package/vendor/fusion/Instances/Hydrate.luau +33 -0
- package/vendor/fusion/Instances/New.luau +53 -0
- package/vendor/fusion/Instances/OnChange.luau +50 -0
- package/vendor/fusion/Instances/OnEvent.luau +54 -0
- package/vendor/fusion/Instances/Out.luau +69 -0
- package/vendor/fusion/Instances/applyInstanceProps.luau +149 -0
- package/vendor/fusion/Instances/defaultProps.luau +194 -0
- package/vendor/fusion/LICENSE +21 -0
- package/vendor/fusion/Logging/formatError.luau +49 -0
- package/vendor/fusion/Logging/messages.luau +52 -0
- package/vendor/fusion/Logging/parseError.luau +25 -0
- package/vendor/fusion/Memory/checkLifetime.luau +134 -0
- package/vendor/fusion/Memory/deriveScope.luau +24 -0
- package/vendor/fusion/Memory/deriveScopeImpl.luau +45 -0
- package/vendor/fusion/Memory/doCleanup.luau +79 -0
- package/vendor/fusion/Memory/innerScope.luau +34 -0
- package/vendor/fusion/Memory/legacyCleanup.luau +18 -0
- package/vendor/fusion/Memory/needsDestruction.luau +17 -0
- package/vendor/fusion/Memory/poisonScope.luau +34 -0
- package/vendor/fusion/Memory/scopePool.luau +55 -0
- package/vendor/fusion/Memory/scoped.luau +27 -0
- package/vendor/fusion/Memory/whichLivesLonger.luau +75 -0
- package/vendor/fusion/RobloxExternal.luau +98 -0
- package/vendor/fusion/State/Computed.luau +139 -0
- package/vendor/fusion/State/For/Disassembly.luau +211 -0
- package/vendor/fusion/State/For/ForTypes.luau +30 -0
- package/vendor/fusion/State/For/init.luau +110 -0
- package/vendor/fusion/State/ForKeys.luau +94 -0
- package/vendor/fusion/State/ForPairs.luau +97 -0
- package/vendor/fusion/State/ForValues.luau +94 -0
- package/vendor/fusion/State/Value.luau +88 -0
- package/vendor/fusion/State/castToState.luau +26 -0
- package/vendor/fusion/State/peek.luau +31 -0
- package/vendor/fusion/State/updateAll.luau +1 -0
- package/vendor/fusion/Types.luau +314 -0
- package/vendor/fusion/Utility/Contextual.luau +91 -0
- package/vendor/fusion/Utility/Safe.luau +23 -0
- package/vendor/fusion/Utility/isSimilar.luau +29 -0
- package/vendor/fusion/Utility/merge.luau +35 -0
- package/vendor/fusion/Utility/nameOf.luau +35 -0
- package/vendor/fusion/Utility/never.luau +14 -0
- package/vendor/fusion/Utility/nicknames.luau +11 -0
- package/vendor/fusion/Utility/xtypeof.luau +27 -0
- package/vendor/fusion/init.luau +82 -0
- package/vendor/profilestore/init.luau +2243 -0
- package/vendor/promise/init.luau +1982 -0
- package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -0
- package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -0
- package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -0
- package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -0
- package/vendor/rbxutil/buffer-util/Types.luau +60 -0
- package/vendor/rbxutil/buffer-util/index.d.ts +153 -0
- package/vendor/rbxutil/buffer-util/init.luau +41 -0
- package/vendor/rbxutil/buffer-util/package.json +16 -0
- package/vendor/rbxutil/buffer-util/wally.toml +9 -0
- package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -0
- package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -0
- package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -0
- package/vendor/rbxutil/comm/Client/init.luau +135 -0
- package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -0
- package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -0
- package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -0
- package/vendor/rbxutil/comm/Server/init.luau +140 -0
- package/vendor/rbxutil/comm/Types.luau +18 -0
- package/vendor/rbxutil/comm/Util.luau +27 -0
- package/vendor/rbxutil/comm/init.luau +35 -0
- package/vendor/rbxutil/comm/wally.toml +13 -0
- package/vendor/rbxutil/component/init.luau +759 -0
- package/vendor/rbxutil/component/init.test.luau +311 -0
- package/vendor/rbxutil/component/wally.toml +14 -0
- package/vendor/rbxutil/concur/init.luau +542 -0
- package/vendor/rbxutil/concur/init.test.luau +364 -0
- package/vendor/rbxutil/concur/wally.toml +8 -0
- package/vendor/rbxutil/enum-list/init.luau +101 -0
- package/vendor/rbxutil/enum-list/init.test.luau +91 -0
- package/vendor/rbxutil/enum-list/wally.toml +8 -0
- package/vendor/rbxutil/find/index.d.ts +20 -0
- package/vendor/rbxutil/find/init.luau +44 -0
- package/vendor/rbxutil/find/package.json +17 -0
- package/vendor/rbxutil/find/wally.toml +8 -0
- package/vendor/rbxutil/input/Gamepad.luau +559 -0
- package/vendor/rbxutil/input/Keyboard.luau +124 -0
- package/vendor/rbxutil/input/Mouse.luau +278 -0
- package/vendor/rbxutil/input/PreferredInput.luau +91 -0
- package/vendor/rbxutil/input/Touch.luau +120 -0
- package/vendor/rbxutil/input/init.luau +33 -0
- package/vendor/rbxutil/input/wally.toml +12 -0
- package/vendor/rbxutil/loader/index.d.ts +15 -0
- package/vendor/rbxutil/loader/init.luau +137 -0
- package/vendor/rbxutil/loader/wally.toml +8 -0
- package/vendor/rbxutil/log/index.d.ts +38 -0
- package/vendor/rbxutil/log/init.luau +746 -0
- package/vendor/rbxutil/log/wally.toml +8 -0
- package/vendor/rbxutil/net/init.luau +190 -0
- package/vendor/rbxutil/net/wally.toml +8 -0
- package/vendor/rbxutil/option/index.d.ts +44 -0
- package/vendor/rbxutil/option/init.luau +489 -0
- package/vendor/rbxutil/option/init.test.luau +342 -0
- package/vendor/rbxutil/option/wally.toml +8 -0
- package/vendor/rbxutil/pid/index.d.ts +53 -0
- package/vendor/rbxutil/pid/init.luau +195 -0
- package/vendor/rbxutil/pid/package.json +16 -0
- package/vendor/rbxutil/pid/wally.toml +9 -0
- package/vendor/rbxutil/quaternion/index.d.ts +117 -0
- package/vendor/rbxutil/quaternion/init.luau +570 -0
- package/vendor/rbxutil/quaternion/package.json +16 -0
- package/vendor/rbxutil/quaternion/wally.toml +9 -0
- package/vendor/rbxutil/query/index.d.ts +43 -0
- package/vendor/rbxutil/query/init.luau +117 -0
- package/vendor/rbxutil/query/package.json +18 -0
- package/vendor/rbxutil/query/wally.toml +9 -0
- package/vendor/rbxutil/sequent/index.d.ts +28 -0
- package/vendor/rbxutil/sequent/init.luau +340 -0
- package/vendor/rbxutil/sequent/package.json +16 -0
- package/vendor/rbxutil/sequent/wally.toml +9 -0
- package/vendor/rbxutil/ser/init.luau +175 -0
- package/vendor/rbxutil/ser/init.test.luau +50 -0
- package/vendor/rbxutil/ser/wally.toml +11 -0
- package/vendor/rbxutil/shake/index.d.ts +36 -0
- package/vendor/rbxutil/shake/init.luau +532 -0
- package/vendor/rbxutil/shake/init.test.luau +267 -0
- package/vendor/rbxutil/shake/package.json +16 -0
- package/vendor/rbxutil/shake/wally.toml +9 -0
- package/vendor/rbxutil/signal/index.d.ts +100 -0
- package/vendor/rbxutil/signal/init.luau +432 -0
- package/vendor/rbxutil/signal/init.test.luau +190 -0
- package/vendor/rbxutil/signal/package.json +17 -0
- package/vendor/rbxutil/signal/wally.toml +9 -0
- package/vendor/rbxutil/silo/TableWatcher.luau +65 -0
- package/vendor/rbxutil/silo/Util.luau +55 -0
- package/vendor/rbxutil/silo/init.luau +338 -0
- package/vendor/rbxutil/silo/init.test.luau +215 -0
- package/vendor/rbxutil/silo/wally.toml +8 -0
- package/vendor/rbxutil/spring/index.d.ts +40 -0
- package/vendor/rbxutil/spring/init.luau +97 -0
- package/vendor/rbxutil/spring/package.json +17 -0
- package/vendor/rbxutil/spring/wally.toml +8 -0
- package/vendor/rbxutil/stream/index.d.ts +88 -0
- package/vendor/rbxutil/stream/init.luau +597 -0
- package/vendor/rbxutil/stream/package.json +18 -0
- package/vendor/rbxutil/stream/wally.toml +9 -0
- package/vendor/rbxutil/streamable/Streamable.luau +202 -0
- package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -0
- package/vendor/rbxutil/streamable/init.luau +8 -0
- package/vendor/rbxutil/streamable/wally.toml +12 -0
- package/vendor/rbxutil/symbol/init.luau +56 -0
- package/vendor/rbxutil/symbol/init.test.luau +37 -0
- package/vendor/rbxutil/symbol/wally.toml +8 -0
- package/vendor/rbxutil/table-util/init.luau +938 -0
- package/vendor/rbxutil/table-util/init.test.luau +439 -0
- package/vendor/rbxutil/table-util/wally.toml +8 -0
- package/vendor/rbxutil/task-queue/index.d.ts +27 -0
- package/vendor/rbxutil/task-queue/init.luau +97 -0
- package/vendor/rbxutil/task-queue/wally.toml +8 -0
- package/vendor/rbxutil/timer/index.d.ts +81 -0
- package/vendor/rbxutil/timer/init.luau +249 -0
- package/vendor/rbxutil/timer/init.test.luau +73 -0
- package/vendor/rbxutil/timer/wally.toml +11 -0
- package/vendor/rbxutil/tree/index.d.ts +15 -0
- package/vendor/rbxutil/tree/init.luau +137 -0
- package/vendor/rbxutil/tree/wally.toml +8 -0
- package/vendor/rbxutil/trove/index.d.ts +46 -0
- package/vendor/rbxutil/trove/init.luau +787 -0
- package/vendor/rbxutil/trove/init.test.luau +203 -0
- package/vendor/rbxutil/trove/wally.toml +8 -0
- package/vendor/rbxutil/typed-remote/init.luau +196 -0
- package/vendor/rbxutil/typed-remote/wally.toml +8 -0
- package/vendor/rbxutil/wait-for/index.d.ts +17 -0
- package/vendor/rbxutil/wait-for/init.luau +257 -0
- package/vendor/rbxutil/wait-for/init.test.luau +182 -0
- package/vendor/rbxutil/wait-for/wally.toml +11 -0
- package/vendor/t/t.lua +1350 -0
- package/vendor/testez/Context.lua +26 -0
- package/vendor/testez/Expectation.lua +311 -0
- package/vendor/testez/ExpectationContext.lua +38 -0
- package/vendor/testez/LifecycleHooks.lua +89 -0
- package/vendor/testez/Reporters/TeamCityReporter.lua +102 -0
- package/vendor/testez/Reporters/TextReporter.lua +106 -0
- package/vendor/testez/Reporters/TextReporterQuiet.lua +97 -0
- package/vendor/testez/TestBootstrap.lua +147 -0
- package/vendor/testez/TestEnum.lua +28 -0
- package/vendor/testez/TestPlan.lua +304 -0
- package/vendor/testez/TestPlanner.lua +40 -0
- package/vendor/testez/TestResults.lua +112 -0
- package/vendor/testez/TestRunner.lua +188 -0
- package/vendor/testez/TestSession.lua +243 -0
- 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;
|